《代碼大全》閱讀筆記-13-不常見的數據類型
阿新 • • 發佈:2018-04-04
可能 div 編程實踐 控制 程序 清單 和數 class 傳遞
只有萬不得已時才使用全局數據
!!!就近原則!!!註釋緊隨代碼,變量緊隨使用它們的地方 ——Tacey
訪問器子程序的優勢
- 你獲得了對數據的集中控制
- 你可以確保對變量的所有引用都得到了保護
- 自動獲取信息隱藏的普遍益處
- 訪問器子程序可以很容易轉變為抽象數據類型
如何使用訪問器子程序:
- 要求所有的代碼通過訪問器子程序來存儲數據:比如,所有全局以g_開頭,除了訪問器,其他代碼都不得訪問
- 不要把所有的全局數據都扔在一處:盡量把全局數據和訪問器子程序打包到適合的類裏面
- 用鎖定來控制對全局變量的訪問:鎖定要求使用或者更新一個全局變量值之前,該變量必須被簽出,完成使用之後再簽入。(加鎖)
- 在訪問器子程序裏構建一個抽象層
- 對一項數據的所有訪問都應該在同一個層次上(操作一致性)
降低全局數據的風險:
- 創建一種命名規則來突出全局變量
- 為全部的全局變量創建一份註釋良好的清單
- 不要用全局變量來存放中間結果
- 不要把所有的數據都放在一個大對象中並導出傳遞,以說明你沒有使用全局變量
核對表(使用不常見數據類型的註意事項)
結構體
- 你使用結構體而不是使用單純的變量來組織和操作相關的數據嗎?
- 你考慮創建一個類來代替使用結構體嗎?
全局數據
- 所有的變量是否都是局部的或者是類範圍的?除非絕對必要才是全局的?
- 變量的命名規則能把局部數據、類數據和全局數據區分開嗎?
- 你對所有的全局變量都加以文檔說明嗎?
- 避免使用偽全局數據,即被四處傳遞且包含有雜亂數據的巨大對象嗎?
- 用訪問子程序來取代全局數據嗎?
- 把訪問子程序和數據組織到類裏面嗎?
- 訪問器子程序提供了一個在底層數據類型實現之上的抽象層嗎?
- 所有相關的訪問器子程序都位於同一抽象層嗎?
指針
- 把指針操作隔離在子程序裏嗎?
- 指針引用合法嗎?或者說指針有可能成為空懸指針嗎?
- 代碼在使用指針之前檢查他的有效性嗎?
- 在使用指針所指向的變量之前檢查其有效性嗎?
- 指針用完後被設置為空值嗎?
- 就可讀性而言,代碼用了所有需要使用的指針變量嗎?
- 鏈表中的指針是按正確的順序加以釋放嗎?
- 程序分配了一片保留的內存後備區域,一遍在耗盡內存的時候能夠優雅地退出嗎?
- 是不是在沒有其他方法可用的情況下最終才使用指針的?
要點
- 結構體可以使得程序更簡單、更容易理解,以及更容易維護
- 每當你打算使用結構體的時候,考慮采用類是不是會工作的更好。
- 指針很容易出錯。用訪問子程序或類以及防禦式編程實踐來保護自己的代碼。
- 避免使用全局變量,不只是因為它們危險,還是因為你可以用其他更好的方法取代它們。
- 如果你不得不使用全局變量,那麽就通過訪問子程序來使用它。訪問器子程序能為你帶來全局變量所能帶來的一切優點,還有一些額外的好處。
《代碼大全》閱讀筆記-13-不常見的數據類型