高質量的子程式1

2021-08-02 21:40:29 字數 2027 閱讀 8795

建立子程式最主要的目的是提高程式的可管理性,其次,節省**空間也只是乙個次要原因:提高可讀性,可靠性和可修改性等原因都更重要一些。

我們先來看乙個低質量的子程式的例子:

void handlestuffle( corp_data & inputrec, int crntqtr, emp_data emprec, double & estimrevenue, double 

ytdrevenue, int screenx, int screeny, color_type & newcolor, color_type & prevcolor, statustype & status, int expensetype )

updatecorpdatabase( emprec );

estimrevenue = ytdrevenue * 4.0 / (double) crntqtr;

newcolor = prevcolor;

status = success;

if ( expensetype == 1)

else if ( expensetype == 2)

else if ( expensetype == 3)

}

以下列出該段**存在的問題:

子程式有個差勁的名字。讓人一點兒也看不出這個子程式究竟是做什麼的;

沒有說明文件;

布局不好,過於隨意;

這個子程式的輸入變數 inputrec 的值被改變了。如果它是乙個輸入變數,她的值就不應該被修改(而且在c++中它應該被定義為 const)。如果變數的值就是要被修改的,那就不要把它命名為 inputrec;

這個子程式讀寫了全域性變數,它從 corpexpense 中讀取數值,寫入 profit 。它應該更直接地與其他子程式通訊,而不是去讀寫全域性變數。

沒有單一的目的。它初始化了一些變數,向資料庫寫入資料,又做了一些計算。從這些事情之間看不出任何聯絡。子程式應該有單一而明確的目的。

沒有注意防範錯誤資料。如果 crntqtr = 0,那麼表示式 ytdrevenue * 4.0 / (double) crntqtr 將會導致除零錯誤。

使用了若干神秘數值。100,  4.0,  12,  2,  3 等。

未使用其中一些引數:screenx 和 screeny 都沒有被引用過。

乙個引數傳遞方式有誤:prevcolor 被標為引用引數,單在這個字程式內卻未對其賦值。

引數太多。合理的引數個數,其上限大概是 7 個左右,而這裡有 11 個。而且引數的排布方式也難以理解。

引數順序混亂且未經注釋。

建立子程式的正當理由:

降低複雜度。

引入中間,易懂的抽象。把一段**放入乙個命名恰當的子程式內,是說明這段**用意最好的方法之一。被良好命名的子程式提供了更高層次的抽象,從而使**更具可讀性,也更容易理解,同事也降低了原來包含**的程式的複雜度。

避免**重複。這是建立子程式最普遍的原因。

支援子類化。覆蓋(override)簡短而規整的子程式所需新**的數量,要比覆蓋冗長而邋遢的子程式更少。

隱藏順序。把處理事件的順序隱藏起來是個好主意,比讓它們在系統內到處散步要好很多。

隱藏指標操作。

提高可移植性。

簡化複雜的布林判斷。

改善效能。

內聚性:

對於子程式來說,內聚性是指子程式中各種操作之間聯絡的緊密程度。像 cosine() (余弦函式)這樣 的函式就是極端內聚的,因為整個程式只完成一項功能。而 consineandtan()(余弦與正切)這個函式的內聚性相對較弱,因為它完成了多於一項的操作。

關於內聚性的幾個層次:

功能的內聚性。是最強也是最好 的一種內聚性,也就是說讓乙個子程式僅執行一項操作。

順序上的內聚性。指子程式內包包含有需要按的定順序執行的操作,這些步驟需要共享資料,而且只有在全部執行完畢後才完成了一項完整的功能。

通訊上的內聚性。指乙個子程式的不同操作使用了同樣的資料,但不存在其他任何聯絡。

臨時的內聚性。含有一些因為需要同時執行才放到一起的操作的子程式。典型的例子有:startup(), shutdown() 等。

高質量的子程式

1.什麼是子程式?子程式是為實現乙個特定的目的而編寫的乙個可被呼叫的方法或過程。2.建立子程式的理由 除此之外還有很多其他的理由比如 隔離複雜度,隱藏實現細節,限制變化帶來的影響,隱藏全域性資料,形成 控制點,促成可重用 達到特定的重構牧的等等。在子程式層上設計 內聚性 指子程式中各種操作之間聯絡的...

10高質量的子程式概述

1.子程式 子程式是為實現乙個特定的目的而編寫的乙個可被呼叫的方法或過程。例如 c 中的函式 funtion j a 中的方法 method 對於某些使用方式,c 和 c 中的巨集 macro 也可以認為是子程式。你可以把建立高質量子程式的很多技術應用到所有這些情況中。2.高質量的子程式 拋開計算機...

第七章 高質量的子程式

子程式是為實現乙個特定的目的而編寫的乙個可被呼叫的方法 method 或過程 procedure 這裡列出一些建立子程式的正當理由 除此之外,建立類的很多理由也是建立子程式的理由 關於內聚性的討論一般會涉及到內聚性的幾個層次。理解一些概念比記住一些特定的術語更加重要。好的程式名字能清晰地描述子程式所...