Posted on 2005-01-13 20:55
zhoulch's blog 阅读(730)
评论(1) 编辑 收藏 所属分类:
Soft Engineering
越复杂的东西越容易出错,自动步枪的威力强于狼牙棒,但步枪会卡壳,狼牙棒却不会。同样对于软件开发也一样,一个进行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,务必降低代码模块的复杂性。