posts - 6, comments - 6, trackbacks - 0, articles - 14

越复杂的东西越容易出错,自动步枪的威力强于狼牙棒,但步枪会卡壳,狼牙棒却不会。同样对于软件开发也一样,一个进行FFT变换的程序肯定比一个计算10以内加法的程序要复杂,也更容易出错。

软件的复杂有两种,一种是由于问题域自身的复杂所造成的,比如FFT肯定比10以内加法要复杂,这个是我们无法避免的。我所关心的是第二种复杂,就是人为造成的复杂。

一个计算FFT的程序,我可以把它化为若干的函数来执行,每个函数只做一件很简单的事,这样每个函数单独都可以由于自身的简单,而充分保证自己的可靠和正确。那么我只要能够让各个函数正确的合作就可以写出一个可靠的FFT程序。也就是说把复杂的问题变成很多个简单的问题。

在平时的程序设计中,很难对复杂有个明确的定义和划分界限。是以代码长度?还是以算法的复杂?而且如果由人工来完成,那么由于人的惰性,写完程序就已经可以手工了,很少有人会去检查程序中各个模块的复杂性,就更不会去主动重构代码,来降低他的复杂度了。

今天看到一个工具devMetrics,是在VS.NET下对代码复杂性进行分析的工具。我用它对才完成的GisMediator进行分析。结果如下

Member Locations Member Measures
Project Class Member Statements Comments Comment Ratio Complexity
GisMediator GisXmlNode GisXmlNode 11 0 0.0 2
GisMediator GisXmlNode GisXmlNode 24 6 0.3 7
GisMediator GisXmlNode fGisXmlNodeUnLoad 7 1 0.1 4
GisMediator GisXmlTree GisXmlTree 5 0 0.0 1
GisMediator GisSchemaElement GisSchemaElement 10 1 0.1 3
GisMediator GisSchemaSimpleType GisSchemaSimpleType 20 2 0.1 5
GisMediator GisSchemaComplexType GisSchemaComplexType 15 1 0.1 5
GisMediator GisSchemaComplexType GisSchemaComplexTypeCompare... 14 0 0.0 8
GisMediator GisSchemaTree GisSchemaTree 13 1 0.1 2
GisMediator GisSchemaTree fDecodeSchema 53 14 0.3 24
GisMediator GisSchemaTree fCompileSchema 4 0 0.0 1
GisMediator GisSchemaTree SchemaValidationHandler 1 1 1.0 1
GisMediator GisSchemaTree fSchemaTreeSearch 14 0 0.0 11
GisMediator GisMainForm GisMainForm 2 3 1.5 1
GisMediator GisMainForm Dispose 7 3 0.4 3
GisMediator GisMainForm InitializeComponent 80 46 0.6 1
GisMediator GisMainForm Main 2 3 1.5 1
GisMediator GisMainForm GisMainForm_Load 4 0 0.0 1
GisMediator GisMainForm GisMainForm_Closing 10 0 0.0 10
GisMediator GisMainForm GisMainMenu_New_Click 9 2 0.2 1
GisMediator GisMainForm GisMainMenu_Open_Click 13 3 0.2 3
GisMediator GisMainForm GisMainMenu_Save_Click 2 0 0.0 1
GisMediator GisMainForm GisMainMenu_SaveAs_Click 7 0 0.0 3
GisMediator GisMainForm GisMainMenu_Print_Click 3 0 0.0 1
GisMediator GisMainForm GisMainMenu_Exit_Click 2 0 0.0 1
GisMediator GisMainForm GisFlexGrid_Initialize 18 1 0.1 1
GisMediator GisMainForm fGisFlexGridSetCellStyle 26 0 0.0 13
GisMediator GisMainForm fGisFlexGridSetContextMenu 80 6 0.1 31
GisMediator GisMainForm GisFlexGrid_DoubleClick 11 0 0.0 5
GisMediator GisMainForm GisFlexGrid_BeforeMouseDown 20 0 0.0 7
GisMediator GisMainForm GisFlexGrid_AfterEdit 2 0 0.0 1
GisMediator GisMainForm fGisFlexGrid_ContextMenu_In... 32 6 0.2 10
GisMediator GisMainForm fGisFlexGrid_ContextMenu_De... 12 2 0.2 2
GisMediator GisMainForm fGisReadXmlFile 8 2 0.3 2
GisMediator GisMainForm fGisXmlToFlexGrid 22 7 0.3 8
GisMediator GisMainForm fGisWriteXmlFile 11 3 0.3 2
GisMediator GisMainForm fGisFlexGridToXml 23 3 0.1 7
GisMediator GisMainForm fGisElementNameMapping 24 2 0.1 5

确实,fDecodeSchema、fSchemaTreeSearch、fGisFlexGridSetContextMenu、fGisFlexGridSetCellStyle都是几个很重要,而且很复杂的函数模块。尤其是fGisFlexGridSetContextMenu,复杂度已经到了31,可见其已经很复杂且臃肿了。看来有必要对这几个函数进行重构了。

简单就是美,这点在计算机软件设计上也是不破的真理。过于复杂的程序,一则难以复用,二则难以维护。

以后对于自己的程序,可以经常利用devMetrics,务必降低代码模块的复杂性。

Feedback

# re: 利用devMetrics衡量程序的复杂度,从而提高软件质量   回复  更多评论   

2005-01-13 22:42 by dudu
在管理页面=》选项=》Preferences 中可以取消日历的显示。

只有注册用户登录后才能发表评论。


网站导航: