標籤:
《代碼閱讀方法與實踐之讀書筆記之一》
閱讀代碼是程式員的基本技能,同時也是軟體開發、維護、演化、審查和重用過程中不可或缺的組成部分。《代碼閱讀方法與實踐之讀書筆記之一》這本書圍繞代碼閱讀,詳細論述了相關的知識與技能。我希望通過仔細閱讀並學習本書,可以快速地提高My Code閱讀的技能與技巧,進而從現有的優秀代碼、演算法、構架、設計中汲取營養,提高自身的開發與設計能力。此次讀了此書的前四章,以下是我從中汲取到的寶貴養分:
從第一章《導論》一節中我體會到了我們要養成一個經常花時間閱讀別人編寫的高品質代碼的習慣,因為閱讀高品質的代碼可以提高我們的編寫代碼的水準; 要有選擇地閱讀代碼,同時,還要有自己的目標;要注意並重視代碼中特殊的非功能性需求,這些需求也許會導致特定的實現風格;如果在現有的代碼上工作時,要與作者或維護人員進行必須的協調,以避免重複勞動或因此而產生厭惡情緒;在尋找BUG時,要從問題的表現形式到問題的根源來分析代碼,不要誤入歧途;尋找bug,這種情況下,關鍵的思想是使用工具,我們要充分利用調試器,編譯器給出的警告或輸出的符號代碼,系統調用跟蹤器,資料庫結構化查詢語言(SQL)的日誌機制、包轉儲工具和Windows的訊息偵查程式,定出BUG的位置;當向系統中增加新功能時,首先的任務就是找到實作類別似特性的代碼,將它作為待實現功能的模板;在移植代碼或修改介面時, 可以通過編譯器直接定位出問題涉及的範圍,從而減少代碼閱讀的工作量;閱讀代碼尋找重構機會時,先從系統的構架開始,然後逐步細化,能夠獲得最大的效益;軟體組件一般要經過逐漸地擴充,並重複改寫以適用於兩個或三個不同系統之後,才會成為可重用的組件;在複查軟體系統時,要注意,系統是由很多部分組成的,不僅僅只是執行語句,還要注意分析以下內容:檔案和目錄結構、產生和配置過程、使用者介面和系統的文檔,可以將軟體複查作為一個學習、講授、援之以手和接受協助的機會。
從第二章《基本編程元素》中我再次溫習了之前學習的知識:分析一個程式時, main是一個好的起始點;層疊if-else if-...-else序列可以看作是由互斥選擇項組成的選擇結構.;在分析重要的程式時, 最好首先識別出重要的組成部分.;解決困難的代碼要從容易的部分入手;要養成遇到庫元素就去閱讀相關文檔的習慣,這將會增強我們的閱讀和編寫代碼的能力;.for (i=0; i<n; i++)形式的迴圈執行n次;高效的演算法和特殊的最佳化確實有可能使得代碼更為複雜, 從而更難理解, 但這並不意味著使代碼更為緊湊和不易讀會提高它的效率;do迴圈的迴圈體至少執行一次;每次只分析一個控制結構, 將它的內容看作是一個黑盒;return, goto, break和continue語句, 還有異常, 都會影響結構化的執行流程.,由於這些語句一般都會終止或重新開始進行中的迴圈,因此要單獨推理它們的行為。
第三章進階《C資料類型》讓我對C語言又有了更進一步的認識:只有瞭解特定語言構造所服務的功能之後, 才能夠更好地理解使用它們的代碼;在C程式中, 指標一般用來構造鏈式資料結構|動態分配的資料結構|實現引用調用|訪問和迭代資料元素|傳遞數組參數|引用函數|作為其他值的別名|代表字串|以及直接存取系統記憶體;指向數組元素地址的指標, 可以訪問位於特定索引位置的元素;C語言中的結構將多個資料元素集合在一起, 使得它們可以作為一個整體來使用, 用來從函數中返回多個資料元素|構造鏈式資料結構|映射資料在硬體裝置|網路連結和儲存介質上的組織方式|實現抽象資料類型|以及以物件導向的方式編程;共用體在C程式中主要用於最佳化儲存空間的利用|實現多態|以及訪問資料不同的內部表達方式;動態分配的內在塊可以電焊工地釋放, 或在程式結束時釋放, 或由記憶體回收行程來完成回收,在棧上分配的記憶體塊當分配它的函數退出後釋放;可以將typedef聲明理解成變數定義: 變數的名稱就是類型的名稱,變數的類型就是與該名稱對應的類型。
我從第四章《C資料結構》中擷取到以下精華:C語言中, 一般使用內建的數群組類型實現向量, 不再對底層實現進行抽象;運算式sizeof(x)總會得到用memset或memcpy處理數組x(不是指標)所需的正確位元組數;不對稱區間中元素的數目等於高位邊界與低位邊界的差;動態分配的矩陣一般儲存為指向數組列的指標或指向元素指標的指標,這兩種類型都可以按照二維數組進行訪問;數組可以通過儲存供程式內的抽象機(abstract machine)或虛擬機器(virtual machine)使用的資料或代碼, 控製程序的運作;如果結構中含有指向結構自身|名為next的元素, 一般說來, 該結構定義的是單向鏈表的結點;包含指向自身的next和prev指標的結構可能是雙向鏈表的結點;圖的結點常常順序地儲存在數組中, 連結到鏈表中, 或通過圖的邊連結起來;.在無向圖中, 表達資料時應該將所有的結點看作是等同的, 類似地, 進行處理任務的代碼也不應該基於它們的方向來區分邊;在非連通圖中, 執行遍曆代碼應該能夠接通孤立的子圖;處理包含迴路的圖時, 遍曆代碼應該避免在處理圖的迴路進入迴圈;複雜的圖結構中, 可能隱藏著其他類型的獨立結構。
《代碼閱讀方法與實踐之讀書筆記之一》