隨筆-14  評論-25  文章-1  trackbacks-0
          如同Tom DeMacro說的:無法控制的東西就不能管理,無法測量的東西就無法控制。
          軟件的度量對于設計者和開發者非常重要,之前只是對這些有一個簡單的了解。今天看來,了解的還遠遠不夠。
          • Cyclomatic Complexity (圈復雜性)
          • Response for Class (類的響應)
          • Weighted methods per class (每個類重量方法)
          一個系統中的所有類的這三個度量能夠說明這個系統的設計上的一些問題(不是全部),這三個度量越大越不好。
          如果一個類這三個度量很高,證明了這個類需要重構了。

          以第一個度量來說,有下面的一個表格:

          CC Value

          Risk

          1-10

          Low risk program

          11-20

          Moderate risk

          21-50

          High risk

          >50

          Most complex and highly unstable method


          CC數值高,可以通過減少if else(switch case也算)判斷來達到目的;
          可以通過減少類與其他類的調用來減少RFC;
          通過分割大方法和大類來達到減少WMPC.

          而Uncle Bob和Jdepend的度量標準應該算是另一個度量系統。

          • 關系內聚性(H)
          用包中的每個類平均的內部關系數目作為包內聚性的一種表示方式。用于表示包和它的所有類之間的關系。
          H=(R+1)/N
          R:包內類的關系數目(與包外部的類沒有關系)
          N:包內類的數量

          • Number of Classes (Cc)
          被分析package的具體和抽象類(和接口)的數量,用于衡量package的可擴展性。

          • Afferent Couplings (Ca)
          依賴于被分析package的其他package的數量,用于衡量pacakge的職責。
          • Efferent Couplings (Ce)
          被分析package的類所依賴的其他package的數量,用于衡量package的獨立性。
          • Abstractness (A)
          被分析package中的抽象類和接口與所在package所有類數量的比例,取值范圍為0-1。
          A=Cc/N
          • Instability (I)
          用于衡量package的不穩定性,取值范圍為0-1。I=0表示最穩定,I=1表示最不穩定。
          I=Ce/(Ce+Ca)
          • Distance (D)
          ??? ??? ? 被分析package和理想曲線A+I=1的垂直距離,用于衡量package在穩定性和抽象性之間的平衡。理想??? ??? ? 的package要么完全是抽象類和穩定(x=0,y=1),要么完全是具體類和不穩定(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數值的減少來體現,反之就可以認為是設計和架構的退化。


          讀過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,依據是公式(1)。公式(2)應該是公式(1)的簡化版。
          Cyclomatic ComplexityCC) = no of decision points + no of logical operations +1        (1)

          Cyclomatic Complexity (CC) = number of decision points +1 (2)

          參考了JDepend的參數和Uncle Bob的《
          Agile Software Development: Principles, Patterns, and Practices(敏捷軟件開發:原則、模式與實踐)
          posted on 2006-06-07 10:52 混沌中立 閱讀(1514) 評論(3)  編輯  收藏 所屬分類: 非技術

          評論:
          # re: OO設計中的度量 2006-06-07 18:29 | bayers
          有沒有直接計算的工具?  回復  更多評論
            
          # re: OO設計中的度量 2006-06-08 11:18 | BlueDavy
          Together or maven site goal  回復  更多評論
            
          # re: OO設計中的度量 2006-06-09 09:12 | 混沌中立
          eclipse+JDepend4Eclipse

          就可以了  回復  更多評論
            
          主站蜘蛛池模板: 兴隆县| 伽师县| 石柱| 肇东市| 吉水县| 海兴县| 韶山市| 湖南省| 民丰县| 镇康县| 五家渠市| 洛南县| 郓城县| 凤台县| 成安县| 贺州市| 遵化市| 炉霍县| 土默特左旗| 安宁市| 宁河县| 平邑县| 合江县| 鄯善县| 关岭| 凤阳县| 山东省| 商水县| 梁河县| 蒙山县| 广州市| 宕昌县| 黄平县| 西昌市| 永川市| 田阳县| 抚顺县| 崇信县| 大冶市| 台东市| 神木县|