﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-zhoulch-随笔分类-Soft Engineering</title><link>http://www.blogjava.net/zhoulch/category/66.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 02 Mar 2007 03:36:52 GMT</lastBuildDate><pubDate>Fri, 02 Mar 2007 03:36:52 GMT</pubDate><ttl>60</ttl><item><title>利用devMetrics衡量程序的复杂度，从而提高软件质量 </title><link>http://www.blogjava.net/zhoulch/archive/2005/01/13/278.html</link><dc:creator>zhoulch's blog</dc:creator><author>zhoulch's blog</author><pubDate>Thu, 13 Jan 2005 12:55:00 GMT</pubDate><guid>http://www.blogjava.net/zhoulch/archive/2005/01/13/278.html</guid><wfw:comment>http://www.blogjava.net/zhoulch/comments/278.html</wfw:comment><comments>http://www.blogjava.net/zhoulch/archive/2005/01/13/278.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/zhoulch/comments/commentRss/278.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhoulch/services/trackbacks/278.html</trackback:ping><description><![CDATA[<p>越复杂的东西越容易出错，自动步枪的威力强于狼牙棒，但步枪会卡壳，狼牙棒却不会。同样对于软件开发也一样，一个进行FFT变换的程序肯定比一个计算10以内加法的程序要复杂，也更容易出错。</p> <p>软件的复杂有两种，一种是由于问题域自身的复杂所造成的，比如FFT肯定比10以内加法要复杂，这个是我们无法避免的。我所关心的是第二种复杂，就是人为造成的复杂。</p> <p>一个计算FFT的程序，我可以把它化为若干的函数来执行，每个函数只做一件很简单的事，这样每个函数单独都可以由于自身的简单，而充分保证自己的可靠和正确。那么我只要能够让各个函数正确的合作就可以写出一个可靠的FFT程序。也就是说把复杂的问题变成很多个简单的问题。</p> <p>在平时的程序设计中，很难对复杂有个明确的定义和划分界限。是以代码长度？还是以算法的复杂？而且如果由人工来完成，那么由于人的惰性，写完程序就已经可以手工了，很少有人会去检查程序中各个模块的复杂性，就更不会去主动重构代码，来降低他的复杂度了。</p> <p>今天看到一个工具devMetrics，是在VS.NET下对代码复杂性进行分析的工具。我用它对才完成的GisMediator进行分析。结果如下</p> <p> <table cellspacing="0" cellpadding="0" width="80%" border="1"> <tbody> <tr> <th colspan="3">Member Locations</th> <th colspan="4">Member Measures</th></tr> <tr> <th>Project</th> <th>Class</th> <th>Member</th> <th>Statements</th> <th>Comments</th> <th>Comment Ratio</th> <th>Complexity</th></tr> <tr> <td class="Name"><a title="D:\Work\Visual Studio Projects\GisMediator\GisMediator\GisMediator.csproj" name="GisMediator"><font color="#003399">GisMediator</font></a></td> <td class="Name" title="GisXmlNode">GisXmlNode</td> <td class="Name" title="GisXmlNode">GisXmlNode</td> <td class="Number">11</td> <td class="Number">0</td> <td class="Number">0.0</td> <td class="Number">2</td></tr> <tr> <td class="Name"><a title="D:\Work\Visual Studio Projects\GisMediator\GisMediator\GisMediator.csproj" name="GisMediator"><font color="#003399">GisMediator</font></a></td> <td class="Name" title="GisXmlNode">GisXmlNode</td> <td class="Name" title="GisXmlNode">GisXmlNode</td> <td class="Number">24</td> <td class="Number">6</td> <td class="Number">0.3</td> <td class="Number">7</td></tr> <tr> <td class="Name"><a title="D:\Work\Visual Studio Projects\GisMediator\GisMediator\GisMediator.csproj" name="GisMediator"><font color="#003399">GisMediator</font></a></td> <td class="Name" title="GisXmlNode">GisXmlNode</td> <td class="Name" title="fGisXmlNodeUnLoad">fGisXmlNodeUnLoad</td> <td class="Number">7</td> <td class="Number">1</td> <td class="Number">0.1</td> <td class="Number">4</td></tr> <tr> <td class="Name"><a title="D:\Work\Visual Studio Projects\GisMediator\GisMediator\GisMediator.csproj" name="GisMediator"><font color="#003399">GisMediator</font></a></td> <td class="Name" title="GisXmlTree">GisXmlTree</td> <td class="Name" title="GisXmlTree">GisXmlTree</td> <td class="Number">5</td> <td class="Number">0</td> <td class="Number">0.0</td> <td class="Number">1</td></tr> <tr> <td class="Name"><a title="D:\Work\Visual Studio Projects\GisMediator\GisMediator\GisMediator.csproj" name="GisMediator"><font color="#003399">GisMediator</font></a></td> <td class="Name" title="GisSchemaElement">GisSchemaElement</td> <td class="Name" title="GisSchemaElement">GisSchemaElement</td> <td class="Number">10</td> <td class="Number">1</td> <td class="Number">0.1</td> <td class="Number">3</td></tr> <tr> <td class="Name"><a title="D:\Work\Visual Studio Projects\GisMediator\GisMediator\GisMediator.csproj" name="GisMediator"><font color="#003399">GisMediator</font></a></td> <td class="Name" title="GisSchemaSimpleType">GisSchemaSimpleType</td> <td class="Name" title="GisSchemaSimpleType">GisSchemaSimpleType</td> <td class="Number">20</td> <td class="Number">2</td> <td class="Number">0.1</td> <td class="Number">5</td></tr> <tr> <td class="Name"><a title="D:\Work\Visual Studio Projects\GisMediator\GisMediator\GisMediator.csproj" name="GisMediator"><font color="#003399">GisMediator</font></a></td> <td class="Name" title="GisSchemaComplexType">GisSchemaComplexType</td> <td class="Name" title="GisSchemaComplexType">GisSchemaComplexType</td> <td class="Number">15</td> <td class="Number">1</td> <td class="Number">0.1</td> <td class="Number">5</td></tr> <tr> <td class="Name"><a title="D:\Work\Visual Studio Projects\GisMediator\GisMediator\GisMediator.csproj" name="GisMediator"><font color="#003399">GisMediator</font></a></td> <td class="Name" title="GisSchemaComplexType">GisSchemaComplexType</td> <td class="Name" title="GisSchemaComplexTypeCompareSequenceBig">GisSchemaComplexTypeCompare...</td> <td class="Number">14</td> <td class="Number">0</td> <td class="Number">0.0</td> <td class="Number">8</td></tr> <tr> <td class="Name"><a title="D:\Work\Visual Studio Projects\GisMediator\GisMediator\GisMediator.csproj" name="GisMediator"><font color="#003399">GisMediator</font></a></td> <td class="Name" title="GisSchemaTree">GisSchemaTree</td> <td class="Name" title="GisSchemaTree">GisSchemaTree</td> <td class="Number">13</td> <td class="Number">1</td> <td class="Number">0.1</td> <td class="Number">2</td></tr> <tr> <td class="Name"><a title="D:\Work\Visual Studio Projects\GisMediator\GisMediator\GisMediator.csproj" name="GisMediator"><font color="#003399">GisMediator</font></a></td> <td class="Name" title="GisSchemaTree">GisSchemaTree</td> <td class="Name" title="fDecodeSchema">fDecodeSchema</td> <td class="Number">53</td> <td class="Number">14</td> <td class="Number">0.3</td> <td class="Number">24</td></tr> <tr> <td class="Name"><a title="D:\Work\Visual Studio Projects\GisMediator\GisMediator\GisMediator.csproj" name="GisMediator"><font color="#003399">GisMediator</font></a></td> <td class="Name" title="GisSchemaTree">GisSchemaTree</td> <td class="Name" title="fCompileSchema">fCompileSchema</td> <td class="Number">4</td> <td class="Number">0</td> <td class="Number">0.0</td> <td class="Number">1</td></tr> <tr> <td class="Name"><a title="D:\Work\Visual Studio Projects\GisMediator\GisMediator\GisMediator.csproj" name="GisMediator"><font color="#003399">GisMediator</font></a></td> <td class="Name" title="GisSchemaTree">GisSchemaTree</td> <td class="Name" title="SchemaValidationHandler">SchemaValidationHandler</td> <td class="Number">1</td> <td class="Number">1</td> <td class="Number">1.0</td> <td class="Number">1</td></tr> <tr> <td class="Name"><a title="D:\Work\Visual Studio Projects\GisMediator\GisMediator\GisMediator.csproj" name="GisMediator"><font color="#003399">GisMediator</font></a></td> <td class="Name" title="GisSchemaTree">GisSchemaTree</td> <td class="Name" title="fSchemaTreeSearch">fSchemaTreeSearch</td> <td class="Number">14</td> <td class="Number">0</td> <td class="Number">0.0</td> <td class="Number">11</td></tr> <tr> <td class="Name"><a title="D:\Work\Visual Studio Projects\GisMediator\GisMediator\GisMediator.csproj" name="GisMediator"><font color="#003399">GisMediator</font></a></td> <td class="Name" title="GisMainForm">GisMainForm</td> <td class="Name" title="GisMainForm">GisMainForm</td> <td class="Number">2</td> <td class="Number">3</td> <td class="Number">1.5</td> <td class="Number">1</td></tr> <tr> <td class="Name"><a title="D:\Work\Visual Studio Projects\GisMediator\GisMediator\GisMediator.csproj" name="GisMediator"><font color="#003399">GisMediator</font></a></td> <td class="Name" title="GisMainForm">GisMainForm</td> <td class="Name" title="Dispose">Dispose</td> <td class="Number">7</td> <td class="Number">3</td> <td class="Number">0.4</td> <td class="Number">3</td></tr> <tr> <td class="Name"><a title="D:\Work\Visual Studio Projects\GisMediator\GisMediator\GisMediator.csproj" name="GisMediator"><font color="#003399">GisMediator</font></a></td> <td class="Name" title="GisMainForm">GisMainForm</td> <td class="Name" title="InitializeComponent">InitializeComponent</td> <td class="Number">80</td> <td class="Number">46</td> <td class="Number">0.6</td> <td class="Number">1</td></tr> <tr> <td class="Name"><a title="D:\Work\Visual Studio Projects\GisMediator\GisMediator\GisMediator.csproj" name="GisMediator"><font color="#003399">GisMediator</font></a></td> <td class="Name" title="GisMainForm">GisMainForm</td> <td class="Name" title="Main">Main</td> <td class="Number">2</td> <td class="Number">3</td> <td class="Number">1.5</td> <td class="Number">1</td></tr> <tr> <td class="Name"><a title="D:\Work\Visual Studio Projects\GisMediator\GisMediator\GisMediator.csproj" name="GisMediator"><font color="#003399">GisMediator</font></a></td> <td class="Name" title="GisMainForm">GisMainForm</td> <td class="Name" title="GisMainForm_Load">GisMainForm_Load</td> <td class="Number">4</td> <td class="Number">0</td> <td class="Number">0.0</td> <td class="Number">1</td></tr> <tr> <td class="Name"><a title="D:\Work\Visual Studio Projects\GisMediator\GisMediator\GisMediator.csproj" name="GisMediator"><font color="#003399">GisMediator</font></a></td> <td class="Name" title="GisMainForm">GisMainForm</td> <td class="Name" title="GisMainForm_Closing">GisMainForm_Closing</td> <td class="Number">10</td> <td class="Number">0</td> <td class="Number">0.0</td> <td class="Number">10</td></tr> <tr> <td class="Name"><a title="D:\Work\Visual Studio Projects\GisMediator\GisMediator\GisMediator.csproj" name="GisMediator"><font color="#003399">GisMediator</font></a></td> <td class="Name" title="GisMainForm">GisMainForm</td> <td class="Name" title="GisMainMenu_New_Click">GisMainMenu_New_Click</td> <td class="Number">9</td> <td class="Number">2</td> <td class="Number">0.2</td> <td class="Number">1</td></tr> <tr> <td class="Name"><a title="D:\Work\Visual Studio Projects\GisMediator\GisMediator\GisMediator.csproj" name="GisMediator"><font color="#003399">GisMediator</font></a></td> <td class="Name" title="GisMainForm">GisMainForm</td> <td class="Name" title="GisMainMenu_Open_Click">GisMainMenu_Open_Click</td> <td class="Number">13</td> <td class="Number">3</td> <td class="Number">0.2</td> <td class="Number">3</td></tr> <tr> <td class="Name"><a title="D:\Work\Visual Studio Projects\GisMediator\GisMediator\GisMediator.csproj" name="GisMediator"><font color="#003399">GisMediator</font></a></td> <td class="Name" title="GisMainForm">GisMainForm</td> <td class="Name" title="GisMainMenu_Save_Click">GisMainMenu_Save_Click</td> <td class="Number">2</td> <td class="Number">0</td> <td class="Number">0.0</td> <td class="Number">1</td></tr> <tr> <td class="Name"><a title="D:\Work\Visual Studio Projects\GisMediator\GisMediator\GisMediator.csproj" name="GisMediator"><font color="#003399">GisMediator</font></a></td> <td class="Name" title="GisMainForm">GisMainForm</td> <td class="Name" title="GisMainMenu_SaveAs_Click">GisMainMenu_SaveAs_Click</td> <td class="Number">7</td> <td class="Number">0</td> <td class="Number">0.0</td> <td class="Number">3</td></tr> <tr> <td class="Name"><a title="D:\Work\Visual Studio Projects\GisMediator\GisMediator\GisMediator.csproj" name="GisMediator"><font color="#003399">GisMediator</font></a></td> <td class="Name" title="GisMainForm">GisMainForm</td> <td class="Name" title="GisMainMenu_Print_Click">GisMainMenu_Print_Click</td> <td class="Number">3</td> <td class="Number">0</td> <td class="Number">0.0</td> <td class="Number">1</td></tr> <tr> <td class="Name"><a title="D:\Work\Visual Studio Projects\GisMediator\GisMediator\GisMediator.csproj" name="GisMediator"><font color="#003399">GisMediator</font></a></td> <td class="Name" title="GisMainForm">GisMainForm</td> <td class="Name" title="GisMainMenu_Exit_Click">GisMainMenu_Exit_Click</td> <td class="Number">2</td> <td class="Number">0</td> <td class="Number">0.0</td> <td class="Number">1</td></tr> <tr> <td class="Name"><a title="D:\Work\Visual Studio Projects\GisMediator\GisMediator\GisMediator.csproj" name="GisMediator"><font color="#003399">GisMediator</font></a></td> <td class="Name" title="GisMainForm">GisMainForm</td> <td class="Name" title="GisFlexGrid_Initialize">GisFlexGrid_Initialize</td> <td class="Number">18</td> <td class="Number">1</td> <td class="Number">0.1</td> <td class="Number">1</td></tr> <tr> <td class="Name"><a title="D:\Work\Visual Studio Projects\GisMediator\GisMediator\GisMediator.csproj" name="GisMediator"><font color="#003399">GisMediator</font></a></td> <td class="Name" title="GisMainForm">GisMainForm</td> <td class="Name" title="fGisFlexGridSetCellStyle">fGisFlexGridSetCellStyle</td> <td class="Number">26</td> <td class="Number">0</td> <td class="Number">0.0</td> <td class="Number">13</td></tr> <tr> <td class="Name"><a title="D:\Work\Visual Studio Projects\GisMediator\GisMediator\GisMediator.csproj" name="GisMediator"><font color="#003399">GisMediator</font></a></td> <td class="Name" title="GisMainForm">GisMainForm</td> <td class="Name" title="fGisFlexGridSetContextMenu">fGisFlexGridSetContextMenu</td> <td class="Number">80</td> <td class="Number">6</td> <td class="Number">0.1</td> <td class="Number">31</td></tr> <tr> <td class="Name"><a title="D:\Work\Visual Studio Projects\GisMediator\GisMediator\GisMediator.csproj" name="GisMediator"><font color="#003399">GisMediator</font></a></td> <td class="Name" title="GisMainForm">GisMainForm</td> <td class="Name" title="GisFlexGrid_DoubleClick">GisFlexGrid_DoubleClick</td> <td class="Number">11</td> <td class="Number">0</td> <td class="Number">0.0</td> <td class="Number">5</td></tr> <tr> <td class="Name"><a title="D:\Work\Visual Studio Projects\GisMediator\GisMediator\GisMediator.csproj" name="GisMediator"><font color="#003399">GisMediator</font></a></td> <td class="Name" title="GisMainForm">GisMainForm</td> <td class="Name" title="GisFlexGrid_BeforeMouseDown">GisFlexGrid_BeforeMouseDown</td> <td class="Number">20</td> <td class="Number">0</td> <td class="Number">0.0</td> <td class="Number">7</td></tr> <tr> <td class="Name"><a title="D:\Work\Visual Studio Projects\GisMediator\GisMediator\GisMediator.csproj" name="GisMediator"><font color="#003399">GisMediator</font></a></td> <td class="Name" title="GisMainForm">GisMainForm</td> <td class="Name" title="GisFlexGrid_AfterEdit">GisFlexGrid_AfterEdit</td> <td class="Number">2</td> <td class="Number">0</td> <td class="Number">0.0</td> <td class="Number">1</td></tr> <tr> <td class="Name"><a title="D:\Work\Visual Studio Projects\GisMediator\GisMediator\GisMediator.csproj" name="GisMediator"><font color="#003399">GisMediator</font></a></td> <td class="Name" title="GisMainForm">GisMainForm</td> <td class="Name" title="fGisFlexGrid_ContextMenu_Insert">fGisFlexGrid_ContextMenu_In...</td> <td class="Number">32</td> <td class="Number">6</td> <td class="Number">0.2</td> <td class="Number">10</td></tr> <tr> <td class="Name"><a title="D:\Work\Visual Studio Projects\GisMediator\GisMediator\GisMediator.csproj" name="GisMediator"><font color="#003399">GisMediator</font></a></td> <td class="Name" title="GisMainForm">GisMainForm</td> <td class="Name" title="fGisFlexGrid_ContextMenu_Delete">fGisFlexGrid_ContextMenu_De...</td> <td class="Number">12</td> <td class="Number">2</td> <td class="Number">0.2</td> <td class="Number">2</td></tr> <tr> <td class="Name"><a title="D:\Work\Visual Studio Projects\GisMediator\GisMediator\GisMediator.csproj" name="GisMediator"><font color="#003399">GisMediator</font></a></td> <td class="Name" title="GisMainForm">GisMainForm</td> <td class="Name" title="fGisReadXmlFile">fGisReadXmlFile</td> <td class="Number">8</td> <td class="Number">2</td> <td class="Number">0.3</td> <td class="Number">2</td></tr> <tr> <td class="Name"><a title="D:\Work\Visual Studio Projects\GisMediator\GisMediator\GisMediator.csproj" name="GisMediator"><font color="#003399">GisMediator</font></a></td> <td class="Name" title="GisMainForm">GisMainForm</td> <td class="Name" title="fGisXmlToFlexGrid">fGisXmlToFlexGrid</td> <td class="Number">22</td> <td class="Number">7</td> <td class="Number">0.3</td> <td class="Number">8</td></tr> <tr> <td class="Name"><a title="D:\Work\Visual Studio Projects\GisMediator\GisMediator\GisMediator.csproj" name="GisMediator"><font color="#003399">GisMediator</font></a></td> <td class="Name" title="GisMainForm">GisMainForm</td> <td class="Name" title="fGisWriteXmlFile">fGisWriteXmlFile</td> <td class="Number">11</td> <td class="Number">3</td> <td class="Number">0.3</td> <td class="Number">2</td></tr> <tr> <td class="Name"><a title="D:\Work\Visual Studio Projects\GisMediator\GisMediator\GisMediator.csproj" name="GisMediator"><font color="#003399">GisMediator</font></a></td> <td class="Name" title="GisMainForm">GisMainForm</td> <td class="Name" title="fGisFlexGridToXml">fGisFlexGridToXml</td> <td class="Number">23</td> <td class="Number">3</td> <td class="Number">0.1</td> <td class="Number">7</td></tr> <tr> <td class="Name"><a title="D:\Work\Visual Studio Projects\GisMediator\GisMediator\GisMediator.csproj" name="GisMediator"><font color="#003399">GisMediator</font></a></td> <td class="Name" title="GisMainForm">GisMainForm</td> <td class="Name" title="fGisElementNameMapping">fGisElementNameMapping</td> <td class="Number">24</td> <td class="Number">2</td> <td class="Number">0.1</td> <td class="Number">5</td></tr></tbody></table></p> <p>确实，fDecodeSchema、fSchemaTreeSearch、fGisFlexGridSetContextMenu、fGisFlexGridSetCellStyle都是几个很重要，而且很复杂的函数模块。尤其是fGisFlexGridSetContextMenu，复杂度已经到了31，可见其已经很复杂且臃肿了。看来有必要对这几个函数进行重构了。</p> <p>简单就是美，这点在计算机软件设计上也是不破的真理。过于复杂的程序，一则难以复用，二则难以维护。</p> <p>以后对于自己的程序，可以经常利用devMetrics，务必降低代码模块的复杂性。</p><img src ="http://www.blogjava.net/zhoulch/aggbug/278.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhoulch/" target="_blank">zhoulch's blog</a> 2005-01-13 20:55 <a href="http://www.blogjava.net/zhoulch/archive/2005/01/13/278.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>