第九章 偽代碼編程過程


本章從微觀上關注編程過程——也就是關注創建單獨的類及其子程序的特定步驟。本章還將講述偽代碼編程過程,這種編程有助於減少設計和編寫文檔所需的工作量,同時提高這兩項的工作質量。

創建類和子程序的步驟概述

先對一個類做總體設計,列出這個類內部的特定子程序,創建這些子程序,然后從整體上復查這個類的創建結果。

創建一個類的步驟

創建一個類的關鍵步驟如下:

  1. 創建類的總體設計;
  2. 創建類中的子程序;
  3. 復審並測試整個類。

創建子程序的步驟

創建子程序涉及到的活動:

  1. 設計子程序;
  2. 檢查設計;
  3. 編寫子程序的代碼;
  4. 檢查代碼。

偽代碼

有效使用偽代碼的指導原則:

  • 用類似英語的語句來精確描述特定的步驟;
  • 避免使用目標編程語言中的語法元素;
  • 在本意層面上編寫偽代碼;
  • 在一個足夠低的層次上編寫偽代碼,以便可以近乎自動地從它生成代碼。

一段不好的偽代碼示例

increment resource number by 1
allocate a dlg struct using malloc
if malloc() returns NULL then return 1
invoke OSrsrc_init to initialize a resource for the operating system
*hRsrePtr = resource number
return 0

一段好的偽代碼

keep track of current number of resource in use
	if another resource is available
		allocate a dialig box struture
		if a dialog box struture could be allocted
			note that one more resource is in use
			initialize the resource
			store the resource number at the location provided by the caller
		endif
	endif
return ture if a new resource was created; else return false

使用好的偽代碼風格可以可到如下好處:

  • 使得評審更加容易;
  • 支持反復迭代精化的思想;
  • 使變更變得更加容易;
  • 減少給代碼做注釋的工作量;
  • 比其他形式的設計文檔更容易維護。

通過偽代碼編程過程創建子程序

與創建子程序有關的活動:

  • 設計子程序;
  • 編寫子程序代碼;
  • 檢查代碼;
  • 收尾工作;
  • 按照需要重復上述步驟。

設計子程序

涉及子程序的工作:

  1. 檢查先決條件;
  2. 定義子程序要解決的問題;
    • 這一子程序將要隱藏的信息;
    • 傳給這個子程序的各項輸入;
    • 從該子程序得到的輸出;
    • 在調用程序之前確保有關的條件成立;
    • 在子程序將控制權交回調用方程序之前,確保其后條件的成立。
  3. 為子程序命名;
  4. 決定如何測試子程序;
  5. 在標准庫中搜尋可用的功能;
  6. 考慮錯誤處理;
  7. 考慮效率問題;
  8. 研究算法和數據類型;
  9. 編寫偽代碼;
  10. 考慮數據;
  11. 檢查偽代碼;
  12. 在為代碼中驗證一些想法,留下最好的想法。

編寫子程序的代碼

構建子程序的步驟如下圖;

具體步驟如下:

  1. 寫出子程序的聲明;
  2. 把偽代碼轉變為高層次的注釋;
  3. 在每條注釋下面填充代碼;
  4. 檢查代碼是否需要進一步分解;
    • 將這段注釋下面的代碼重構成一個新的子程序;
    • 遞歸地應用偽代碼編程過程;
  5. 在腦海里檢查程序中的錯誤;
  6. 編譯子程序;
  7. 在調試器中逐行執行代碼;
  8. 測試代碼;
  9. 消除程序中的錯誤

根據需要重復上述步驟。

偽代碼編程過程的替代方案

偽代碼編程過程是創建類和子程序的最佳方法,下面還有其他的一些方法:

  • 測試先行開發;
  • 重構;
  • 契約式設計;
  • 東拼西湊。

核對表:偽代碼編程過程

  • [ ] 是否檢查過已滿足所有的先決條件?
  • [ ] 定義好這個類要解決的問題了嗎?
  • [ ] 高層次的設計是否足夠清晰?能給這個類和其中每一個子程序起一個好的名字嗎?
  • [ ] 考慮過該如何測試這個類及其中每一個子程序嗎?
  • [ ] 關於效率的問題,你主要從穩定的接口和可讀的實現這兩個角度考慮嗎?還是主要從滿足資源和速度的預期目標的角度考慮過呢?
  • [ ] 在標准庫函數或其他代碼庫中尋找過可用的子程序或者組建了嗎?
  • [ ] 在參考書籍中查找過有用的算法了嗎?
  • [ ] 是否用詳盡的偽代碼設計好每一個子程序?
  • [ ] 你在腦海里檢查過偽代碼嗎?這些偽代碼容易理解嗎?
  • [ ] 關注過那些可能會讓你重返設計的警告信息了嗎?
  • [ ] 是否把偽代碼正確翻譯成代碼了?
  • [ ] 你反復使用偽代碼編程過程了嗎?有沒有根據需要把一些子程序分成更小的子程序?
  • [ ] 在作出假定的時候有沒有對他們加以說明?
  • [ ] 已經刪除掉那些冗余的注釋了嗎?
  • [ ] 你是否采取了幾次迭代中最好的那個結果?還是在第一次迭代之后就停止了?
  • [ ] 你完全理解你的代碼了嗎?這些代碼是否容易理解?

要點

  • 創建類和子程序通常都是一個迭代過程。在創建子程序的過程中獲得的認識常常會反過來影響類的設計;
  • 編寫好的偽代碼需要使用易懂的英語,要避免使用特定的編程語言中才有的特性,同時要在意圖層面上編寫偽代碼(即描述做什么,而不是怎么去做);
  • 偽代碼編程過程是一個行之有效的做詳細設計的工具,它同時讓編碼工作更容易。偽代碼會直接轉化為注釋,從而確保了注釋的准確性和實用性;
  • 不要只停留在你所想到的第一個設計方案上。反復使用偽代碼做出多種方案,然后選出其中最佳的一種方案再開始編碼;
  • 每一步完成后都要檢查你的工作成果,還要鼓勵其他人來幫你檢查。這樣你就會在投入精力最少的時候,用最低的成本發現錯誤。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM