軟件架構————如何寫好類中的子程序

子程序的優點:

子程序的使用時的程序變得更加易讀,更加易於理解。

子程序用以節約空間和提高性能的最重要的手段。


創建子程序的理由:

1.降低複雜度:可以隱藏一些信息;當內部循環或條件判斷的嵌套層次很深時,這就需要從子程序中提取新的子程序了。

2.引入中間、易懂的抽象

3.避免代碼重複:事實上,如果在兩段子程序內有相似的代碼,就以爲這代碼分解有問題,應該把相似的代碼提取出來,將其中相同部分放入一個基類,然後再把兩段程序中的差異代碼放入派生類中。

4.支持子類話:覆蓋簡短而規整的子程序所需新代碼的數量,要比覆蓋冗長邋遢的子程序更少。

5.隱藏順序:把處理事件隱藏起來是一個好主意。

6.隱藏指針:指針操作的可讀性通常都很差,而且容易出錯。通過把這些操作隔離在子程序內部,就可以把經歷集中於操作的意圖本身,而不是指針操作機制的細節。

7.提高可移植性:可以用子程序來隔離程序中不可移植的部分,從而明確識別和隔離未來的移植工作。

8.簡化複雜的布爾判斷

9.改善性能


似乎過於簡單而沒有必要寫成子程序的操作

對於只有幾行代碼比較簡單的子程序來說,到底有沒有必要將它寫出來?這個還是得根據代碼編寫的需求而定,如果其他函數都用到了這些代碼,那麼最好將其寫入一個子函數中,這樣在後期如果要修改的話不用到各個其他函數中修改,只要在這個簡單的子函數修改即可,這樣可以減少工作量。


在子程序層上設計:

對於子程序而言,內聚I型那個是指子程序中各種操作之間聯繫的緊密程度。而創建子程序的目標就是讓一個子程序只把一件事做好,不再做任何其他事->也稱爲功能的內聚性!

一般來說,其他類型的內聚性都是不可取的。他們都會導致代碼組織的混亂、難於調試、不變修改。如果一個子程序具有不良的內聚性,那最好還是花功夫重新編寫,使其具有更好的內聚性,而不是再花精力精確地診斷問題所在了。


好的子程序名字:

好的子程序名字能清晰地描述子程序所做到的一切。

1.描述子程序所做的所有事情:子程序名字應當描述其所有的輸出結果以及副作用,如果寫的有一些副作用的子程序,就會引起很多又長又笨的名字。解決的方法不是使用某個描述性較弱的子程序名,而應該換一種方式編寫程序,直接了當地解決問題而不是產生副作用。

2.避免使用無意義的、模糊或表達不清的動詞:有時一個子程序中僅有的問題就是其名字表述不清,而子程序本身也許設計的很好;有時動詞之所以模糊是由於子程序執行的操作就是含糊不清的。

3.不要僅通過數字來形成不同的子程序名字:如output1,output2,這樣很難有區分度

4.根據需要確定子程序名字的長度:研究表明,變量名的最佳長度是9到15個

5.給函數命名時要對返回值有所描述:函數有返回值,因此,函數的命名要應該針對其返回值進行。

6.給過程起名時使用語氣強烈的東西加賓語的形式:一個具有功能內聚性的過程通常是針對一個對象執行一種操作。

7.準確使用對仗詞

8.爲常用操作確立命名規則:防止一個項目中不同編程人員設定自己的函數命名,造成不同編程人員要了解其他人員的函數內部實現細節。


子程序可以寫多長?

如果要編寫一段超過200行代碼的子程序,那就要小心了。對於超過200行代碼的子程序來說,沒有哪項研究發現他能降低成本和/或降低錯誤率,而且在超過200行後,遲早會在可讀性方面遇到問題。


如何使用子程序參數:

1.按照一定的順序組織子程序參數排序(輸入-修改-輸出):不要隨機地或按字母順序排列參數,而應該先列出僅作爲輸入用途的參數,然後是即作爲輸入有作爲輸出用途的參數,最後纔是僅作爲輸出用途的參數。

2.考慮自己創建in和out關鍵字

3.如果幾個子程序都用了類似的一些參數,應該讓這些參數的排列順序保持一致。

4.使用所有參數:既然往子程序中傳遞了一個參數,就一定要用到這個參數。

5.把狀態或出錯變量放在最後

6.不要把子程序的參數用作工作變量:把傳入的子程序的參數用作工作變量是很危險的,應該使用局部變量。

7.在接口中對參數的假定加以說明

應該對那些接口參數的假定進行說明呢?

a參數是僅用於輸入的、要被修改的、還是僅用於輸出的

b表示數量的參數的單位

c如果沒有枚舉類型的話,應該說明狀態代碼和錯誤值的含義

d所能接受的數值範圍(如32位數據溢出問題

e不該出現的特定數值(如除數不能爲零

8.把子程序的參數個數限制在大約7個以內

9.考慮對參數採用某種表示輸入、修改、輸出的命名規則

10.爲子程序傳遞用以維持其接口抽象的變量或對象:

子程序的接口要表達何種抽象?如果要表達的抽象是子程序期望3想的定的數據,但這3項數據只是碰巧由同一對象所提供的,那就應該單獨傳遞這3項數。然而,如果子程序接口要表達的抽象是一直擁有某個特定對象,且該子程序要對這一對象執行這樣那樣的操作,如果單獨傳遞3項特定的數據,那就是破壞了接口的抽象。

如果採用傳遞整個對象的做法,並發現自己是創建對象,把被調用子程序所需的3項數據填入該對象,在調用過子程序後又從對象中取出3項數據的值,那就是一個證據,說明應該值傳遞那3個數據而不是整個對象。

如果發現自己常需要修改程序的參數表,而每次修改的參數都是來自於同一個對象,那就說明應該傳遞整個對象而不是個別數據項了。

11.使用具名參數

12.確保實際參數與形式參數相匹配:形式參數是指在子程序中聲明的變量。實際參數是指在實際的子程序調用中用到的變量、常量或表達式。


關於函數的返回值:

檢查所有可能的返回路徑

不要返回指向局部數據的引用或指針


發佈了86 篇原創文章 · 獲贊 10 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章