1. 程式人生 > >《代碼大全》閱讀筆記-13-不常見的數據類型

《代碼大全》閱讀筆記-13-不常見的數據類型

可能 div 編程實踐 控制 程序 清單 和數 class 傳遞

只有萬不得已時才使用全局數據

!!!就近原則!!!註釋緊隨代碼,變量緊隨使用它們的地方 ——Tacey

訪問器子程序的優勢

  • 你獲得了對數據的集中控制
  • 你可以確保對變量的所有引用都得到了保護
  • 自動獲取信息隱藏的普遍益處
  • 訪問器子程序可以很容易轉變為抽象數據類型

如何使用訪問器子程序:

  • 要求所有的代碼通過訪問器子程序來存儲數據:比如,所有全局以g_開頭,除了訪問器,其他代碼都不得訪問
  • 不要把所有的全局數據都扔在一處:盡量把全局數據和訪問器子程序打包到適合的類裏面
  • 用鎖定來控制對全局變量的訪問:鎖定要求使用或者更新一個全局變量值之前,該變量必須被簽出,完成使用之後再簽入。(加鎖)
  • 在訪問器子程序裏構建一個抽象層
  • 對一項數據的所有訪問都應該在同一個層次上(操作一致性)

降低全局數據的風險:

  • 創建一種命名規則來突出全局變量
  • 為全部的全局變量創建一份註釋良好的清單
  • 不要用全局變量來存放中間結果
  • 不要把所有的數據都放在一個大對象中並導出傳遞,以說明你沒有使用全局變量

核對表(使用不常見數據類型的註意事項)

結構體

  • 你使用結構體而不是使用單純的變量來組織和操作相關的數據嗎?
  • 你考慮創建一個類來代替使用結構體嗎?

全局數據

  • 所有的變量是否都是局部的或者是類範圍的?除非絕對必要才是全局的?
  • 變量的命名規則能把局部數據、類數據和全局數據區分開嗎?
  • 你對所有的全局變量都加以文檔說明嗎?
  • 避免使用偽全局數據,即被四處傳遞且包含有雜亂數據的巨大對象嗎?
  • 用訪問子程序來取代全局數據嗎?
  • 把訪問子程序和數據組織到類裏面嗎?
  • 訪問器子程序提供了一個在底層數據類型實現之上的抽象層嗎?
  • 所有相關的訪問器子程序都位於同一抽象層嗎?

指針

  • 把指針操作隔離在子程序裏嗎?
  • 指針引用合法嗎?或者說指針有可能成為空懸指針嗎?
  • 代碼在使用指針之前檢查他的有效性嗎?
  • 在使用指針所指向的變量之前檢查其有效性嗎?
  • 指針用完後被設置為空值嗎?
  • 就可讀性而言,代碼用了所有需要使用的指針變量嗎?
  • 鏈表中的指針是按正確的順序加以釋放嗎?
  • 程序分配了一片保留的內存後備區域,一遍在耗盡內存的時候能夠優雅地退出嗎?
  • 是不是在沒有其他方法可用的情況下最終才使用指針的?

要點

  • 結構體可以使得程序更簡單、更容易理解,以及更容易維護
  • 每當你打算使用結構體的時候,考慮采用類是不是會工作的更好。
  • 指針很容易出錯。用訪問子程序或類以及防禦式編程實踐來保護自己的代碼。
  • 避免使用全局變量,不只是因為它們危險,還是因為你可以用其他更好的方法取代它們。
  • 如果你不得不使用全局變量,那麽就通過訪問子程序來使用它。訪問器子程序能為你帶來全局變量所能帶來的一切優點,還有一些額外的好處。

《代碼大全》閱讀筆記-13-不常見的數據類型