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

          越復(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ù)正確的合作就可以寫出一個(gè)可靠的FFT程序。也就是說(shuō)把復(fù)雜的問(wèn)題變成很多個(gè)簡(jiǎn)單的問(wèn)題。

          在平時(shí)的程序設(shè)計(jì)中,很難對(duì)復(fù)雜有個(gè)明確的定義和劃分界限。是以代碼長(zhǎng)度?還是以算法的復(fù)雜?而且如果由人工來(lái)完成,那么由于人的惰性,寫完程序就已經(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ù)雜性。

          Feedback

          # re: 利用devMetrics衡量程序的復(fù)雜度,從而提高軟件質(zhì)量   回復(fù)  更多評(píng)論   

          2005-01-13 22:42 by dudu
          在管理頁(yè)面=》選項(xiàng)=》Preferences 中可以取消日歷的顯示。

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 温宿县| 阳山县| 集贤县| 阳东县| 青岛市| 腾冲县| 古交市| 乡宁县| 广西| 永州市| 天全县| 额尔古纳市| 孝昌县| 崇左市| 南澳县| 郎溪县| 祁门县| 桂东县| 瑞昌市| 积石山| 洱源县| 鱼台县| 永修县| 正宁县| 修文县| 桓台县| 高陵县| 古田县| 巴塘县| 钟祥市| 仲巴县| 福建省| 株洲县| 新闻| 崇州市| 琼结县| 清徐县| 铁岭县| 江西省| 嘉祥县| 南平市|