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