標籤:c a get width com 使用
一般認為函數指具有傳回值的子程式,過程指沒有傳回值的子程式。C++中把所有子程式成為函數,其實那些傳回值為void的
函數在語義上也是過程。函數與過程的區別更多是語義上的區別,而不是文法的區別。
語言純化論者認為一個函數應該只有一個傳回值,這和數學函數一樣。即函數只接受輸入(參數),通過參數運算返回結果
。 除此之外的效果被稱為函數的副作用,比如修改全域變數。
function sum1(x, y) {
return x+y
}
function sum2(x, y) {
alert(x+y)
}
sum1是一個函數,它有輸入並返回結果;sum2則是過程,接受輸入,處理輸入(列印輸出結果),但沒有返回結果。
好的子程式需要遵循以下原則
高內聚
好的命名
長度適中
合理的參數
一、高內聚性
內聚性是電腦科學裡很重要的一個概念,由Larry Konstantin在1974年的一篇論文提出。它由分為以下
1. 功能內聚(Functional cohesion,最高)
最好最強的一種內聚性,即一個子程式僅執行一個操作,有的書也稱“只做一件事,做好一件事”。這種子程式執行的操作
與其名稱多數是相符的,如sum執行相加,deletePage刪除頁面。
2. 順序上的內聚(Sequential cohesion)
指子程式內需按特定順序執行操作,這些步驟需要共用資料,且在全部執行後才完成子程式的完整功能。比如需要先計算A,
再使用A計算B,接著取B計算C。
3. 通訊上的內聚(Communicational cohesion)
是指子程式不同操作使用了相同資料,但不存在任何聯絡。
4. 臨時的內聚性(Temporal cohesion)
是指含有一些因為需要同時執行才放到一起的操作的子程式。
5. 邏輯上的內聚性(Logical cohesion)
是指若干操作被放入同一個程式中,通過傳入的控制標誌選擇執行其中的一項操作。
6. 偶熱的內聚性(Coincidental cohesion 最低)
指子程式中各個操作直接沒有可以看到的內聯,也稱為“無內聚性”或“混亂的內聚性”。
二、好的命名
好的命名能清晰的描述子程式所做的一切。以下是一些命名注意事項
1. 描述子程式所完成的功能
2. 避免使用無意義的、類比或表達不清的詞
3. 不要僅通過數字來區分不同的子程式名
4. 根據需要確定子程式名字的長度
5. 對傳回值要有所描述
6. 一般是動詞+名詞形式
7. 使用對仗詞,如add/remove, begin/end, first/last, get/put, up/down/, show/hide, open/close。
三、長度適中
“子程式/函數的第一要素就是短小,第二條規則還是短小”,鮑勃大叔如此說。理論上認為子程式的長度最大長度通常是一
屏代碼,大約50-150行。
一項對子程式的研究發現,平均100-150行代碼的子程式需要修改的幾率最低(Lind and Vairavan 1989)。
IBM一項研究發現,最容易出錯的是那些超過500行代碼的子程式。超過500行後,子程式的出錯率和程式碼數成正比。在面向
對象編程中,一大部分子程式都是訪問器子程式(getter),它們都非常短小。任何時候覆雜演算法總會導致較長的子程式,
這種情況下允許長度增加到100到200行。
四、合理的參數
子程式之間的介面是程式中最易出錯的地方,Basili和Perrricone所做的一項研究發現程式中39%的錯誤都是屬於內部介面錯
誤。也就是子程式間互相通訊時所發生的錯誤。應該按以下原則處理
1. 按照輸入-修改-輸出的順序排列參數。不要隨機地按字母順序排列參數,而應先列出輸入參數,然後是即作為輸入又作為
輸出的參數,最後是輸出的參數。比如Ada就要專門的關鍵字in,out。
procedure InvertMatrix {
originalMatrix: in Matrix;
resultMatrix: out Matrix;
}
2. 如果幾個子程式都用了類似的一些參數,應該讓這些參數的排列順序一致。
dom = {
setWidth: function(elem, value) {
// ...
},
setHeight: function(elem, value) {
// ...
}
}
3. 使用所有的參數,既然定義了該參數就應該使用它,如果不用它就應該刪掉它。
4. 把狀態或出錯的變數放在後面,狀態和那些用於指示發生錯誤的變數應放在參數表最後。它們只是程式的附屬功能且只用
於輸出的參數。
5. 不要把子程式的參數用於工作變數
function process(inputVal) {
inputVal = inputVal - 10;
return inputVal
}
這段JS代碼中,省略了一個變數聲明,inputVal很容易讓人誤解,即是輸入又是輸出,改為如下
function process(inputVal) {
var outputVal = inputVal - 10;
return outputVal
}
6. 子程式的參數個數限制在7個以內。鮑勃大叔說的更極端 “最理想的參數數量是零,其次是單參數函數,再次是雙參數函
數,應盡量避免三參數函數”。心理學研究發現,人類很難記住超過7個單位的資訊。這一發現已應用在各個領域。