Posted on 2005-01-13 20:55
zhoulch's blog 閱讀(734)
評(píng)論(1) 編輯 收藏 所屬分類:
Soft Engineering
越復(fù)雜的東西越容易出錯(cuò),自動(dòng)步槍的威力強(qiáng)于狼牙棒,但步槍會(huì)卡殼,狼牙棒卻不會(huì)。同樣對(duì)于軟件開(kāi)發(fā)也一樣,一個(gè)進(jìn)行FFT變換的程序肯定比一個(gè)計(jì)算10以內(nèi)加法的程序要復(fù)雜,也更容易出錯(cuò)。
軟件的復(fù)雜有兩種,一種是由于問(wèn)題域自身的復(fù)雜所造成的,比如FFT肯定比10以內(nèi)加法要復(fù)雜,這個(gè)是我們無(wú)法避免的。我所關(guān)心的是第二種復(fù)雜,就是人為造成的復(fù)雜。
一個(gè)計(jì)算FFT的程序,我可以把它化為若干的函數(shù)來(lái)執(zhí)行,每個(gè)函數(shù)只做一件很簡(jiǎn)單的事,這樣每個(gè)函數(shù)單獨(dú)都可以由于自身的簡(jiǎn)單,而充分保證自己的可靠和正確。那么我只要能夠讓各個(gè)函數(shù)正確的合作就可以寫(xiě)出一個(gè)可靠的FFT程序。也就是說(shuō)把復(fù)雜的問(wèn)題變成很多個(gè)簡(jiǎn)單的問(wèn)題。
在平時(shí)的程序設(shè)計(jì)中,很難對(duì)復(fù)雜有個(gè)明確的定義和劃分界限。是以代碼長(zhǎng)度?還是以算法的復(fù)雜?而且如果由人工來(lái)完成,那么由于人的惰性,寫(xiě)完程序就已經(jīng)可以手工了,很少有人會(huì)去檢查程序中各個(gè)模塊的復(fù)雜性,就更不會(huì)去主動(dòng)重構(gòu)代碼,來(lái)降低他的復(fù)雜度了。
今天看到一個(gè)工具devMetrics,是在VS.NET下對(duì)代碼復(fù)雜性進(jìn)行分析的工具。我用它對(duì)才完成的GisMediator進(jìn)行分析。結(jié)果如下
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 |
確實(shí),fDecodeSchema、fSchemaTreeSearch、fGisFlexGridSetContextMenu、fGisFlexGridSetCellStyle都是幾個(gè)很重要,而且很復(fù)雜的函數(shù)模塊。尤其是fGisFlexGridSetContextMenu,復(fù)雜度已經(jīng)到了31,可見(jiàn)其已經(jīng)很復(fù)雜且臃腫了。看來(lái)有必要對(duì)這幾個(gè)函數(shù)進(jìn)行重構(gòu)了。
簡(jiǎn)單就是美,這點(diǎn)在計(jì)算機(jī)軟件設(shè)計(jì)上也是不破的真理。過(guò)于復(fù)雜的程序,一則難以復(fù)用,二則難以維護(hù)。
以后對(duì)于自己的程序,可以經(jīng)常利用devMetrics,務(wù)必降低代碼模塊的復(fù)雜性。