如同Tom DeMacro說的:無法控制的東西就不能管理,無法測量的東西就無法控制。
軟件的度量對于設計者和開發(fā)者非常重要,之前只是對這些有一個簡單的了解。今天看來,了解的還遠遠不夠。
- Cyclomatic Complexity (圈復雜性)
- Response for Class (類的響應)
- Weighted methods per class (每個類重量方法)
一個系統(tǒng)中的所有類的這三個度量能夠說明這個系統(tǒng)的設計上的一些問題(不是全部),這三個度量越大越不好。
如果一個類這三個度量很高,證明了這個類需要重構了。
以第一個度量來說,有下面的一個表格:
CC Value | Risk |
1-10 | Low
risk program |
11-20 | Moderate
risk |
21-50 | High
risk |
>50 | Most
complex and highly unstable method |
CC數(shù)值高,可以通過減少if else(switch case也算)判斷來達到目的;
可以通過減少類與其他類的調用來減少RFC;
通過分割大方法和大類來達到減少WMPC.
而Uncle Bob和Jdepend的度量標準應該算是另一個度量系統(tǒng)。
用包中的每個類平均的內部關系數(shù)目作為包內聚性的一種表示方式。用于表示包和它的所有類之間的關系。
H=(R+1)/N
R:包內類的關系數(shù)目(與包外部的類沒有關系)
N:包內類的數(shù)量
被分析package的具體和抽象類(和接口)的數(shù)量,用于衡量package的可擴展性。
依賴于被分析package的其他package的數(shù)量,用于衡量pacakge的職責。
被分析package的類所依賴的其他package的數(shù)量,用于衡量package的獨立性。
被分析package中的抽象類和接口與所在package所有類數(shù)量的比例,取值范圍為0-1。
A=Cc/N
用于衡量package的不穩(wěn)定性,取值范圍為0-1。I=0表示最穩(wěn)定,I=1表示最不穩(wěn)定。
I=Ce/(Ce+Ca)
??? ??? ? 被分析package和理想曲線A+I=1的垂直距離,用于衡量package在穩(wěn)定性和抽象性之間的平衡。理想??? ??? ? 的package要么完全是抽象類和穩(wěn)定(x=0,y=1),要么完全是具體類和不穩(wěn)定(x=1,y=0)。
??? ??? ? 取值范圍為0-1,D=0表示完全符合理想標準,D=1表示package最大程度地偏離了理想標準。
??? ?? ?? D = |A+I-1|/0.70710678
??? ?? ?? 注:0.70710678*0.70710678 =2,既為“根號2“
我認為D是一個綜合的度量,架構和設計的改善可以通過D數(shù)值的減少來體現(xiàn),反之就可以認為是設計和架構的退化。
讀過http://javaboutique.internet.com/tutorials/metrics/index.html之后的一些想法
另一篇中文的內容相近的文章可以參考http://www.jdon.com/artichect/coupling.htm
不過第二篇的中文文章中間關于Cyclomatic Complexity,有一個情況遺漏了
public void findApplications(String id, String name){
if(id!=null && name!=null) {
//do something
}else{
//do something
}
}
這種情況的CC不是2+1,而是2+1+1,依據(jù)是公式(1)。公式(2)應該是公式(1)的簡化版。
Cyclomatic Complexity
(CC) = no of decision points + no of logical operations +1 (1)
Cyclomatic Complexity (CC) = number of decision points +1 (2)
參考了JDepend的參數(shù)和Uncle Bob的《
Agile Software Development: Principles, Patterns, and Practices》
(敏捷軟件開發(fā):原則、模式與實踐)
posted on 2006-06-07 10:52
混沌中立 閱讀(1512)
評論(3) 編輯 收藏 所屬分類:
非技術