相關(guān)資訊
本類常用軟件
-
福建農(nóng)村信用社手機銀行客戶端下載下載量:584204
-
Windows優(yōu)化大師下載量:416898
-
90美女秀(視頻聊天軟件)下載量:366961
-
廣西農(nóng)村信用社手機銀行客戶端下載下載量:365699
-
快播手機版下載量:325855
軟件自身是一種固化的思維,因此從本質(zhì)上來看,軟件是不可度量的。
但這并不意味著軟件不需要度量,而只是說軟件中的度量大多都有一定限度。
應(yīng)用各種度量數(shù)據(jù)的時候一旦跨過這種限度,結(jié)果就會適得其反。
在這篇文章里,我們將考查一下現(xiàn)有的,對軟件進行度量的方法(注意:這篇里主要考察別人的方法,不是我自己的)。
可能不全面,不足的地方歡迎大家進行補充。
對軟件“直觀可見的質(zhì)量屬性”的度量比較簡單,比如:Bug率,性能等,這里就不提了。
這里主要關(guān)注的是軟件的內(nèi)在的,不直觀可見的質(zhì)量屬性。
- 圈復(fù)雜度
圈復(fù)雜度主要用于度量函數(shù)或方法,從《代碼大全》中可以找到圈復(fù)雜度的描述。
關(guān)于圈復(fù)雜度:Tom McCabe曾經(jīng)建議使用下面的方法來度量復(fù)雜度。在這一方法中為了計算復(fù)雜度首先要計算子程序中的決策點(decision points),規(guī)則如下:
- 從函數(shù)第一行一致往下通過程序
- 一旦遇到以下關(guān)鍵字或者同類的詞就加1:if,while,repeat,for,and,or
- 給case語句中的每一種情況加1 --Steve McConell 《代碼大全》
很多靜態(tài)分析工具都直接提供對圈復(fù)雜度的度量,而圈復(fù)雜度本身歧義性很小,是非常難得的指標(biāo),高于15的代碼基本很難看懂。
但圈復(fù)雜度更適合用于度量編碼的結(jié)果,對高層設(shè)計則不太適用。
- 響應(yīng)集
響應(yīng)集是指類的各個方法直接調(diào)用的函數(shù)數(shù)目。響應(yīng)集無疑的應(yīng)該盡可能的小,根據(jù)得墨忒耳法則:某個對象的任何方法都應(yīng)該只調(diào)用屬于以下情形的方法。
class Demeter
{
private:
A* a;
int func();
public:
//...
void example(B& b);
void Demeter::example(B& b)
{
C c;
int f = func(); //<---- 類自己的方法
b.invert(); //<----傳入?yún)?shù)的方法,當(dāng)然參數(shù)本身也可能是函數(shù)
a = new A();
a->setActive();// <---創(chuàng)建的對象所擁有的方法
c.print(); // <---創(chuàng)建的,并歸自己所有的對象的方法
}
};
---摘自《程序員修煉之道》
- 關(guān)系內(nèi)聚性(H)
在度量包時可以用包內(nèi)部類的數(shù)目除以包內(nèi)類的總數(shù),其比值用來表示包得內(nèi)聚性。如果用R表示包內(nèi)部得類關(guān)系數(shù)目,用N表示包內(nèi)類總數(shù)。那么:
H = (R+1)/N
- 不穩(wěn)定性(I)
不穩(wěn)定性由輸入耦合度(Ca)與輸出耦合度(Ce)計算而來。
包得輸入耦合度是指處于包外部,但依賴于包內(nèi)類的數(shù)目。
包得輸出耦合度是指包內(nèi)部的依賴于包外部類的類數(shù)目。
這樣I = Ce / (Ca+ Ce)
- 抽象性(A)
包的抽象性用抽象類的數(shù)目和包中所有類的數(shù)目進行計算。
假如說包中類的總數(shù)是Nc, 抽象類的數(shù)目是Na ,那么抽象度A = Na/Nc
關(guān)系內(nèi)聚性(H),不穩(wěn)定性(H),抽象性(H)的進一步說明,請參見《敏捷軟件開發(fā):原則,模式與實踐》一書。
這些度量指標(biāo)無疑是有意義的,都可以用來評價軟件寫的好還是壞,但卻不解決這樣一個問題:
如果一個方案在關(guān)系內(nèi)聚性(H),不穩(wěn)定性(H),抽象性(H)上都有好的表現(xiàn),復(fù)雜度有沒有提高?如果說復(fù)雜度因此而提高了,那么這種額外支出的復(fù)雜度值不值得?
如果我們認(rèn)為復(fù)雜度是軟件的根本問題,那么在滿足需求的前提下,使軟件簡單化就是最關(guān)鍵的使命(比靈活性等重要)。既如此,究竟應(yīng)該如何度量軟件的復(fù)雜度呢?
這是一個需要進一步展開的話題,我完善后會進一步和大家分享。