// 摘自代碼大全2第九章
創(chuàng)建類和子程序的步驟概述.
1 開始
2 創(chuàng)建類的總體設(shè)計(jì)
3 創(chuàng)建類中的子程序
4 復(fù)查并測(cè)試整個(gè)類
5 完成
其中3與4之間要進(jìn)行交互,這種交互主要是針對(duì)審查子程序進(jìn)行的,并且2與3之間也要進(jìn)行交互,這種交互主要針對(duì)子程序在類中的總體設(shè)計(jì).
一個(gè)思想是:細(xì)化跟迭代,并且即使反饋直到類功能和子程序功能都清晰,再到5.
創(chuàng)建一個(gè)類的步驟
1)創(chuàng)建類的總體設(shè)計(jì):
設(shè)計(jì)一個(gè)類的過程中包含一些特有的設(shè)計(jì)任務(wù)--定義類的特定職責(zé),定義類所要隱藏的秘密,以及精確地定義類的接口所代表的抽象概念,決定這個(gè)類是否要從其他類派生而來,以及是否允許其它類再?gòu)乃缮?指出這個(gè)類中關(guān)鍵的公用方法,標(biāo)識(shí)并設(shè)計(jì)出類所需用到的重要數(shù)據(jù)成員.
2)創(chuàng)建類中的子程序
在前述第一個(gè)步驟中標(biāo)識(shí)出類的主要子程序之后,還需要?jiǎng)?chuàng)建這些子程序.在編寫各個(gè)程序時(shí)通常還會(huì)引出更多的或重要,或次要的子程序,創(chuàng)建這些新加入的子程序的過程往往還會(huì)反過來波及類的總體設(shè)計(jì)
3)復(fù)審并測(cè)試整個(gè)類
通常情況下,子程序在創(chuàng)建的同時(shí)也經(jīng)過了測(cè)試,在整個(gè)類可以工作之后,應(yīng)該再對(duì)其整體進(jìn)行復(fù)查和測(cè)試,以便發(fā)現(xiàn)那些在子程序的獨(dú)立測(cè)試層次上無(wú)法測(cè)出的問題.
在創(chuàng)建類的過程中,2),3)還是要求反復(fù)進(jìn)行的,直到類的總體設(shè)計(jì)是最優(yōu)的.
創(chuàng)建子程序的步驟
創(chuàng)建子程序的過程中涉及到的主要活動(dòng): 設(shè)計(jì)子程序,檢查設(shè)計(jì),編寫子程序的代碼,檢查代碼.
1 開始
2 設(shè)計(jì)子程序(主要借助于偽代碼)
3 檢查設(shè)計(jì)(主要是檢查偽代碼)
4 編寫子程序的代碼
5 復(fù)審并測(cè)試代碼
6 完成
其中2與3是要進(jìn)行交互的,主要是保證偽代碼的質(zhì)量,4與5也是要進(jìn)行交互的,這樣主要保證子程序的質(zhì)量.
偽代碼
偽代碼的指導(dǎo)原則:
1) 用類似英語(yǔ)的語(yǔ)句來精確描述特定的操作
2) 避免使用目標(biāo)編程語(yǔ)言中的語(yǔ)法元素
3) 在本意的層面上編寫代碼,用偽代碼去描述解決問題的方法的意圖,而不是去寫如何在目標(biāo)語(yǔ)言中實(shí)現(xiàn)這個(gè)方法.
4) 在一個(gè)足夠低的層次上編寫代碼,以便可以近乎自動(dòng)地從它生成代碼.
通過偽代碼編程過程創(chuàng)建子程序
檢查先決條件
在動(dòng)手去做子程序本身的任何工作之前,應(yīng)該先查看一下該子程序要做的工作是不是已經(jīng)定義好了,是不是能夠與整體設(shè)計(jì)相匹配.另外要結(jié)合項(xiàng)目的需求,檢查這個(gè)子程序是否真正必須的,至少是間接需要的.
定義子程序要解決的問題
陳述出該子程序?qū)⒁鉀Q的問題,敘述要足夠詳細(xì),以便能去創(chuàng)建這個(gè)子程序,如果高層的設(shè)計(jì)已經(jīng)足夠詳細(xì),那么這項(xiàng)工作可能已經(jīng)完成了,在這個(gè)高層的設(shè)計(jì)里至少應(yīng)該詳細(xì)說明下列信息.
1) 這一子程序?qū)⒁[藏的信息
2) 傳給這個(gè)子程序的各項(xiàng)輸入
3) 從該子程序得到的輸出
4) 在調(diào)用程序之前確保有關(guān)的前條件成立(輸入數(shù)據(jù)的取值位于特定范圍之中,有關(guān)的流已經(jīng)初始化,文件已經(jīng)打開或者關(guān)閉,緩沖區(qū)已經(jīng)填滿或者清空)
5) 在子程序?qū)⒖刂茩?quán)交回調(diào)用方程序之前,確保其后條件的成立(如輸出數(shù)據(jù)位于特定范圍之內(nèi),流已經(jīng)初始化,文件已經(jīng)打開或者關(guān)閉,緩沖區(qū)已填滿或清空)
其中4和5一般通過判斷前驅(qū)和后繼條件來進(jìn)行的。前者是保證調(diào)用的條件是否成立,而后者是保證程序的返回值是否是合法的。
為子程序命名
一般地子程序已經(jīng)有一個(gè)清晰的,無(wú)二義性的名字,如果在命名這個(gè)子程序的名字的時(shí)候,有點(diǎn)困難,那么就說明,對(duì)該子程序的設(shè)計(jì)不是很清楚,而要去改善設(shè)計(jì)了。
決定如何測(cè)試子程序
在編寫一個(gè)子程序的時(shí)候,要想一想怎么才能測(cè)試它。這在以后的C/C++測(cè)試中都可以部署單元測(cè)試工具Xunit.
在標(biāo)準(zhǔn)庫(kù)中搜尋可用的功能
想用提高代碼的質(zhì)量和生產(chǎn)率,有一個(gè)最重要的途徑就是重用好的代碼。
考慮錯(cuò)誤處理
考慮在子程序中可能出錯(cuò)的環(huán)節(jié),子程序可以用多種方式來處理錯(cuò)誤,應(yīng)該特別注意去選擇處理錯(cuò)誤的方式。
考慮效率問題
主要是兩個(gè)方面的考慮,一是效率,而另一方面是性能。
研究算法和數(shù)據(jù)類型
如果在可用的程序庫(kù)里沒有所需的功能,它也許會(huì)在某本算法書中介紹過,決定從頭開始編寫一段復(fù)雜的代碼之前,查一下算法書看看有什么可用的內(nèi)容。如果采用一個(gè)已有明確定義的算法,則要保證這個(gè)算法正確地轉(zhuǎn)換為你所用的編程語(yǔ)言。
編寫偽代碼
前面的那些步驟主要是為確定一個(gè)思路,這在真正編寫程序的時(shí)候是很有幫助的,在完成前面的準(zhǔn)備工作以后,就可以開始用高層次的偽代碼來寫程序。
一般是從寫子程序的注釋開始進(jìn)行編制,主要是說明子程序的功能和目的。
考慮數(shù)據(jù)
在整個(gè)過程中的幾個(gè)不同環(huán)節(jié)對(duì)子程序所用的數(shù)據(jù)進(jìn)行設(shè)計(jì)。
檢查偽代碼
在寫完偽代碼并設(shè)計(jì)完數(shù)據(jù)之后,花上幾分鐘時(shí)間復(fù)雜你寫的偽代碼,然后拋揩這些代碼,想想你該如何向別人解釋這些代碼。
在偽代碼中試驗(yàn)一些想法,留下最好的想法
在你開始編寫代碼之前,應(yīng)盡可能用偽代碼去嘗試更多的想法。
編寫子程序的代碼
1 以偽代碼開始
2 寫出子程序的聲明
3 編寫第一條和最后一條語(yǔ)句,然后將偽代碼轉(zhuǎn)換為高層次的注釋。
4 每條注釋下面填充代碼
5 檢查代碼
6 收尾工作
7 完成
其中3,4,5可以按照需求進(jìn)行重復(fù)。
寫出子程序的聲明
首先要寫出子程序的接口聲明,即C++中的函數(shù)聲明
把偽代碼轉(zhuǎn)變?yōu)楦邔哟蔚淖⑨?br>接下來,把第一條和最后一條語(yǔ)句寫出來,在C++中也就是"{"和"}".然后將偽代碼轉(zhuǎn)變成注釋.
在每條注釋下面填充代碼
在偽代碼注釋中的每一句話下面填寫代碼。
檢查代碼是否需要進(jìn)一步分解
方法1:把這段注釋下面的代碼重構(gòu)(refactor)成一個(gè)新的子程序。
方法2:遞歸地應(yīng)用偽代碼編程過程。
檢查代碼
1) 在腦海里檢查程序中的錯(cuò)誤。
理解每行代碼所起的作用,理解為什么需要這行代碼,沒有什么東西會(huì)僅僅因?yàn)樗瓷先タ尚芯褪钦_的。
編譯子程序
完成檢查之后,就可以編譯這個(gè)程序了。
最大地發(fā)揮編譯子程序所產(chǎn)生的指導(dǎo)建議
1)把編譯器的警告級(jí)別調(diào)到最高,通過讓編譯器來檢測(cè)錯(cuò)誤,你可以很容易地查出大量細(xì)微的錯(cuò)誤。
2)使用驗(yàn)證工具,可以通過使用類似lint這樣的工具來對(duì)C語(yǔ)言這類語(yǔ)言的編譯器所做的檢查結(jié)果進(jìn)行補(bǔ)充檢查。
3)消除產(chǎn)生錯(cuò)誤消息和警告的所有根源。
在調(diào)試器中逐步執(zhí)行代碼
程序編譯通過了之后,要在調(diào)試器中逐行執(zhí)行,以確保每行代碼都在按照你所期望的方式執(zhí)行。
測(cè)試代碼
使用你在開發(fā)該子程序期間計(jì)劃寫的或者已寫成的測(cè)試用例來測(cè)試代碼。你可能需要開發(fā)一些腳手架來支持你的測(cè)試用例
消除程序中的錯(cuò)誤
一旦檢測(cè)到錯(cuò)誤,就一定要把它除掉。
收尾工作
檢查子程序的接口
確定所有的輸入,輸出數(shù)據(jù)都參與了計(jì)算,并且所有的參數(shù)也都用到了。
檢查整體的設(shè)計(jì)質(zhì)量
檢查子程序中的變量
檢查子程序的語(yǔ)句和邏輯
檢查子程序的布局
檢查子程序的文檔
除去冗余的注釋。
小結(jié):
之前一直在寫程序,但是發(fā)現(xiàn)時(shí)不時(shí)思路很亂,也沒有有層次地,有系統(tǒng)地去思考這些類和子程序的設(shè)計(jì),只是去實(shí)現(xiàn)一個(gè)功能,并且能夠達(dá)到所要的目的就可以了,后來發(fā)現(xiàn)經(jīng)常出問題,很常見的就是考慮不周全,在編制代碼以后,才開始反悔,后悔當(dāng)初的設(shè)計(jì),然后對(duì)程序產(chǎn)生了消極的情緒,讓我感覺不爽,看了代碼大全,發(fā)現(xiàn)提供了可行的方法.而且思路比以前清晰多了,感覺這個(gè)方法很有效,所以記錄在這里.