有些事非做不可,并不是為了幸福,而是減緩?fù)纯啵捎诓蛔觯瑒t更痛苦――這便是無(wú)奈。
夏中義 《文心獨(dú)白》
博客又有1陣子沒(méi)更新了,最近認(rèn)真思考了阿里上市的成功的地方:選擇和堅(jiān)持。其實(shí)http://www.jyygyx.com/cxrs/并沒(méi)有絕對(duì)的對(duì)與錯(cuò),也沒(méi)有絕對(duì)的成功與失敗。正如“有些人活著,他已死了”云云,我總是拿對(duì)與錯(cuò)來(lái)讓自己選擇,其實(shí)就是根本的毛病。決定走1條路,就繼續(xù)走下去,終點(diǎn)雖然不知道在哪里,那就縱情享受沿途的風(fēng)景,和珍惜與身旁的陪伴著的人的分分鐘鐘!
扯得有點(diǎn)遠(yuǎn),回歸主題。之前討論了軟件質(zhì)量之道的各個(gè)方面,但是也都是1些虛話(huà),達(dá)不到真實(shí)的目的。既然如此,還不如針對(duì)上1篇文章結(jié)尾部份的流程圖的每一個(gè)部份,進(jìn)行詳細(xì)的描寫(xiě),到達(dá)人人可用的效果,使之發(fā)揚(yáng)光大。
按部就班,首先先說(shuō)1下各個(gè)工具的用處和使用方法,然后再說(shuō)明如何用Ant進(jìn)行管理,最后再統(tǒng)1加到CruiseControl中進(jìn)行調(diào)度。
SourceMonitor是1款免費(fèi)的軟件,運(yùn)行在Windows平臺(tái)下。它可對(duì)多種語(yǔ)言寫(xiě)就的代碼進(jìn)行度量,包括C、C++、C#、Java、VB、Delphi和HTML,并且針對(duì)不同的語(yǔ)言,輸出不同的代碼度量值。
像其他代碼度量工具1樣,SourceMonitor只關(guān)注代碼,并為編碼人員提供及時(shí)的反饋,它不是1款項(xiàng)目管理工具,不關(guān)注項(xiàng)目實(shí)行中從功能分析到設(shè)計(jì)編碼,再到測(cè)試這全部進(jìn)程。
SourceMonitor只是1個(gè)“度量”工具,但是通過(guò)基本的度量,可以從代碼表面層次發(fā)現(xiàn)1些根本的,基礎(chǔ)的問(wèn)題,所以將其作為介紹的第1個(gè)工具,也應(yīng)當(dāng)做為最基礎(chǔ)的1個(gè)工具來(lái)為軟件質(zhì)量把關(guān)。
說(shuō)到SourceMonitor的度量,對(duì)不同的語(yǔ)言提供不同方面的度量,這里僅針對(duì)C++進(jìn)行介紹,其提供了以下幾方面的度量。(關(guān)于其他語(yǔ)言,請(qǐng)參考SourceMonitor的幫助文檔Explanation of Language Metrics章節(jié))
1. 總行數(shù)(Lines)
包括空行在內(nèi)的代碼行數(shù)。
2. 語(yǔ)句數(shù)(Statements)
在C++中,語(yǔ)句是以分號(hào)結(jié)尾的。分支語(yǔ)句if,循環(huán)語(yǔ)句for、while,跳轉(zhuǎn)語(yǔ)句goto都被計(jì)算在內(nèi),預(yù)處理語(yǔ)句#include、#define和#undef也被計(jì)算在內(nèi),對(duì)其他的預(yù)處理語(yǔ)句則不作計(jì)算,在#else和#endif、#elif和#endif之間的語(yǔ)句將被疏忽。
3. 分支語(yǔ)句比例(Percent Branch Statements)
該值表示分支語(yǔ)句占語(yǔ)句數(shù)目的比例,這里的“分支語(yǔ)句”指的是使程序不順序履行的語(yǔ)句,包括if、else、for、while、break、continue、goto、switch、case、default和return。需要注意的是,do不被計(jì)算在內(nèi),由于其對(duì)應(yīng)的while已計(jì)算了。另外,異常處理的catch也被作為1個(gè)分支計(jì)算。
4. 注釋比例(Percent Lines with Comments)
該值唆使注釋行(包括/*……*/和//……情勢(shì)的注釋?zhuān)┱伎傂袛?shù)的比例。1般公司會(huì)對(duì)每一個(gè)文檔的header或footer部份進(jìn)行特殊的聲明注釋?zhuān)梢栽俟こ虒傩灾性O(shè)置過(guò)濾,不計(jì)算在內(nèi)。
5. 類(lèi)個(gè)數(shù)(Classes)
包括class,struct和template在內(nèi)的個(gè)數(shù)。
6. 平均每一個(gè)類(lèi)方法數(shù)(Methods per Class)
平均每一個(gè)類(lèi)的方法數(shù),即包括內(nèi)聯(lián)和非內(nèi)聯(lián)的,template函數(shù)在內(nèi)的類(lèi)方法數(shù)除以所有類(lèi)的個(gè)數(shù)。
7. 函數(shù)個(gè)數(shù)(Functions)
所有函數(shù)的個(gè)數(shù)。
8. 平均每一個(gè)函數(shù)包括的語(yǔ)句數(shù)目(Average Statements per Method)
總的函數(shù)語(yǔ)句數(shù)目除以函數(shù)數(shù)目得到該值。
9. 函數(shù)圈復(fù)雜度(Function Complexity)
圈復(fù)雜度唆使1個(gè)函數(shù)可履行路徑的數(shù)目,以下語(yǔ)句為圈復(fù)雜度的值貢獻(xiàn)1:if/else/for/while語(yǔ)句,3元運(yùn)算符語(yǔ)句,if/for/while判斷條件中的"&&"或“||”,switch語(yǔ)句,后接break/goto/ return/throw/continue語(yǔ)句的case語(yǔ)句,catch/except語(yǔ)句等。對(duì)應(yīng)有最大圈復(fù)雜度(Max Complexity)和平均圈復(fù)雜度(Avg Complexity)。
10. 函數(shù)深度(Block Depth)
函數(shù)深度唆使函數(shù)中分支嵌套的層數(shù)。對(duì)應(yīng)有最大深度(Max Depth)和平均深度(Avg Depth)。
下面介紹如何使用SourceMonitor建立工程,針對(duì)不同的Solution活著Project建立Checkpoint。
1. 安裝SourceMonitor,這個(gè)不詳細(xì)介紹,下載安裝便可。
2. 打開(kāi)SourceMonitor,建立工程。
3. 選擇語(yǔ)言,并點(diǎn)擊下1步。
4. 為當(dāng)前工程命名,并選擇工程文件保存路徑。
5. 選擇當(dāng)前工程要度量解析的文件,可以通過(guò)配置文件列表(XML)或指定路徑自動(dòng)搜索方式添加。
6. 選擇相干的配置,可以直接下1步疏忽,如果有相干需要進(jìn)行選擇設(shè)定。
7. 指定當(dāng)前Checkpoint的名稱(chēng)。
8. 查看配置項(xiàng),并肯定。
9. 確認(rèn)要度量的文件列表。
10. 工程建立終了,并完成第1個(gè)度量點(diǎn)。
11. 雙擊檢查點(diǎn),查看各個(gè)文件的度量值。
12. 雙擊某個(gè)文件,查看詳細(xì)信息。
這樣,基本的1個(gè)工程就建立終了了,其他的功能,例如設(shè)置各個(gè)指標(biāo)的默許值,大家可以自己嘗試1下。
由于SourceMonitor是代碼度量最基礎(chǔ)的1個(gè)模塊,所以每一個(gè)http://www.jyygyx.com都可能會(huì)將其作為代碼評(píng)測(cè)的1個(gè)經(jīng)常使用功能項(xiàng)添加到熟習(xí)的編輯器中。這樣每寫(xiě)完1段代碼,都可以履行檢測(cè)1下當(dāng)前文件是不是滿(mǎn)足度量指標(biāo)。
1. 設(shè)置外部工具。
2. 添加并配置選項(xiàng)
Title: SourceMonitor
Command: 安裝SourceMonitor的目錄
Arguments: /DC++ $(ItemPath)
Initial directory: $(SolutionPath)
3. 添加快捷鍵
選擇剛才添加SourceMonitor是ExternalTools里面第幾個(gè),例如說(shuō)我剛才添加的位置為第6個(gè),則選擇Command6,并指定快捷鍵(我默許指定為Alt + 1,這個(gè)根據(jù)個(gè)人喜好來(lái),但是盡可能別造成快捷鍵沖突)。
4. 打開(kāi)某個(gè)文件,按快捷鍵履行SourceMonitor,結(jié)果就顯示出來(lái)了。
由于很多公司都會(huì)開(kāi)發(fā)2次語(yǔ)言,來(lái)合適自己工具的使用。這類(lèi)語(yǔ)言可能跟C或某些語(yǔ)言很相似,但是用Visual Studio這類(lèi)龐大的工具來(lái)打開(kāi),效力不是很高,所以有可能選擇使用1些輕量級(jí)的編輯器,例如說(shuō)UltraEdit這類(lèi),那末添加方法跟Visual Studio類(lèi)似,以下。
1. 工具欄配置添加新工具。
2. 進(jìn)行參數(shù)設(shè)置
名稱(chēng): SourceMonitor
命令行: "D:SourceMonitorSourceMonitor.exe" /DC++"%f"
工作目錄: %p
3. 點(diǎn)擊履行,或通過(guò)快捷鍵履行。
如果使用其他工具,則可以參考工具的幫助文檔,修改/DC++后的文件名稱(chēng)參數(shù)和工作目錄參數(shù)便可。
又到了最后關(guān)鍵的1步了,談1下近期的1些感悟吧。有些事情不了解的時(shí)候,總會(huì)從消極的角度的方面去斟酌問(wèn)題。
例如說(shuō),之前我對(duì)多線(xiàn)程不是很了解,我便會(huì)極力的保護(hù)自己“不懂多線(xiàn)程”這個(gè)缺點(diǎn),從而去從消極的角度及方面評(píng)判多線(xiàn)程。但是最近處理大范圍數(shù)據(jù)文件時(shí)(大概2000萬(wàn)個(gè)以上),我卻深深的體會(huì)到了多線(xiàn)程的各個(gè)方面的優(yōu)勢(shì),也學(xué)會(huì)了更多的知識(shí),雖然也寫(xiě)出了讓大牛們嘲笑的“自旋鎖”代碼,看過(guò)《Imperfect C++》關(guān)于多線(xiàn)程的那1節(jié)后,立馬酡顏了,利用周末的時(shí)間,完全修改了這個(gè)“問(wèn)題”。
另外,再接觸這方面的知識(shí)時(shí),就會(huì)從不同的角度上去理解及思考,也發(fā)現(xiàn)了更多更有趣的內(nèi)容,例如怎樣用C++11的異步,把界面和處理扔到不同的線(xiàn)程中去,又怎樣把Log扔到對(duì)應(yīng)的Log打印窗口中去,真是其樂(lè)無(wú)窮啊。
上周末,又看了1遍《星際寶貝》,也總結(jié)了最近各個(gè)不盡人意的方面,發(fā)現(xiàn)自己之前實(shí)在是太過(guò)自我為中心,有很多問(wèn)題不知道從自己找緣由,而不斷的責(zé)備他人(真心的對(duì)被我傷害的人說(shuō)聲對(duì)不起)。還是應(yīng)當(dāng)時(shí)時(shí)刻刻警省自己,如果“壞蛋”成份要滿(mǎn)了,那就暫時(shí)放下所有的事,“醫(yī)治”好了再繼續(xù),不要由于自己而出錯(cuò)!