日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

《代码整洁之道》读后感

發布時間:2023/12/10 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《代码整洁之道》读后感 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近在看Bob大叔的《代碼整潔之道》,收益頗多,有些怕忘記,然更多則是做記錄時,會理解的更加深刻,力求描述清楚,需要對知識更深的理解,遂在此做筆記。共同探討,共同學習。

一 簡潔設計原則

Bob大叔借鑒過多位行業大牛說過的話,總結出構建簡潔之道:

  • 運行所有測試
  • 重構:消除重復,保證表達力,盡可能減少類和方法的數量。
  • 不可重復
  • 表達了程序員的意圖
  • 盡可能減少類和方法的數量
  • 以上規則按照重要程度排列
  • 二 命名必須有有意義

    包含有variable、method、parameter、class、package,甚至是jar文件,war文件,ear文件。那么該怎么命名呢,有很多的規則

  • 名副其實:選一個好名字,也許會花費很多的時間,但省下來的時間比花掉的多,我們讀和寫的比例是遠遠大于5:1的。
  • 避免誤導:必須避免留下掩藏代碼本意的錯誤線索。
  • 做有意義的區分:應以讀者能鑒別不同之處的方式來區分,比如DTO、VO、PO等,讀者一眼便知其來源。
  • 使用讀的出來的名稱。
  • 盡量使用可搜索的名稱。例:int WORK_DAYS_PER_WEEK=5;
  • 避免使用前綴,前綴無意義。
  • 避免思維映射:不應讓讀者把你的名稱翻譯為他們熟知的名稱。
  • 類名優化:避免使用Data、Info這樣的類名。類名不應是動詞。
  • 方法名:方法名應為動詞或動詞短語。如:deletePage、save。
  • 每個概念對應一個詞:我理解和DDD中的業務術語有點類似,對于同樣的名稱要有同樣的認知。
  • 別用雙關語
  • 使用解決方案領域名稱:ArrayList在java中一定是所有程序員都知道的。
  • 使用源自所涉及問題領域的名稱。
  • 添加有意義的語境。
  • 三 函數(method)

    參考類,juc中的ReentrantLock.java,我看完所有的代碼,發現最長的一個method是15行,大多是1到5行代碼就搞定。

  • 短小
  • 只做一件事:判斷函數是否只做一件事,就是看是否還能再拆出一個函數
  • 每個函數一個抽象層級:這一條比較難理解,就比如將大象裝進冰箱一樣,可以分為3個步驟開門->裝大象->關門。而在裝大象之前需要進行判斷冰箱的大小和大象的大小以及冰箱中是否有其他東西,那么3大步驟是一個層級的,其他的是第二層級,還可能有第三層級。簡而言之,就是分層。
  • switch語句:盡量少用,switch語句本身就是用來處理多件事的,而用抽象工廠可能會更好一點。
  • 使用描述性的名稱
  • 參數:零參數最好,其次是一,再次是二,應盡量避免三。
  • 無副作用:不要把另外一件事隱藏到這個函數中,避免函數做不在名稱描述中的第二件事。
  • 分隔指令與詢問:函數要么做什么事,要么回答什么事,但二者不可兼得。
  • 使用異常替代返回錯誤碼
  • Don’t repeat yourself
  • 結構化編程:每個函數都應該只有一個入口,一個出口。
  • 四 注釋

    注釋的恰當用法是彌補我們在用代碼表達意圖時遭遇的失敗。代碼可以表達清楚的事情,就不要用注釋。除非你要寫復雜的并發代碼,或者是通用框架類,否則一般的業務代碼就盡量不要用到注釋。代碼可以被修改,但別人基本不會修改你寫的注釋,這會使得注釋具有誤導性。真實只有一處地方有:代碼。代碼會告訴你它做的事情,唯一準確的信息來源。
    注釋掉的代碼直接刪除,無需留著,源代碼控制工具(git,svn)會幫我們記錄這一切的。

    五 格式

    我們大多數人使用的開發工具(eclipse和idea),已經自帶了格式化規范。在代碼寫完之后,使用快捷鍵格式化一下即可。
    函數如果有調用的關系,則盡量把他們放在一起,而且調用者應該盡可能放在被調用者上邊。
    這里需要提一下的就是代碼規范規則,目前國內Java行業標準有阿里開源的開發規范,已經被很多的公司采用,使用阿里規范作為標準也是不錯的。

    六 對象和數據結構

    對于面向對象編程來說,這一章的內容其實意義不是特別大,因為基本的規則現在已經定義好了。只是Bob大叔當時的代碼理念可能還沒有像現在這么全面。唯一需要說的就是迪米特法則(Law of Demeter),這個我會在附錄中列舉出來。

    七 錯誤處理

  • 使用異常而非返回碼
  • 先寫try/catch/finally語句
  • 使用不可控異常,一層層向上拋出
  • 給出異常發生的環境說明,在拋出異常時,記錄下堆棧信息。
  • 依調用者需要定義異常類
  • 自定義異常類
  • 別返回null值
  • 別傳遞null值
  • 八 邊界

    在和第三方的接口進行交互的時候,極力推薦將應該讓別人知道的方法放出來,而其他對別人無用的接口則封裝起來。
    對第三方的代碼編寫一些測試,以便新版本發布后,還可以繼續使用。
    假定一些dummy數據來作為第三方數據的來源。
    對于第三方的接口,我們可以用Adapter模式來做一些適配。

    九 測試

    測試這一章基本放棄了,因為我們公司不注重測試,也沒有寫過單元測試。但規則還是一樣的。

    十 類

    類應該盡量設計的短小一些。這里會涉及到3個原則,單一職責原則、開閉原則和依賴倒置原則。

    十一 如何建造一個城市

  • 將系統的構造和使用分開
  • 擴容
  • java代理(AOP)
  • 優化決策
  • 明智使用添加了可論證價值的標準
  • 系統需要使用特定語言
  • 十二 迭進

  • 通過迭進設計達到整潔目的
  • 重構
  • 不可重復
  • 保證表達力
  • 盡可能少的類和方法
  • 十三 并發編程

    并發編程用的較少,不發表意見。建議掌握java.util.concurrent、java.util.concurrent.atomic和java.utils.concurrent.locks包。

    十四到十六

    這三章是3個真實的案例,通過代碼實踐了一些思想??蓪φ罩哒碌囊黄鸱治?。

    十七 味道與啟發

    17.1 注釋

  • 不恰當的信息
  • 廢棄的注釋
  • 冗余的注釋
  • 糟糕的注釋
  • 注釋掉的代碼
  • 17.2 環境

  • 需要多少步才能實現的構建
  • 需要多少步才能做到的測試
  • 17.3 函數

  • 過多的參數
  • 輸出參數
  • 標識參數
  • 死函數
  • 17.4 一般性問題

  • 一個源文件中存在多種語言
  • 明顯的行為未被實現
  • 不正確的邊界行為
  • 忽視安全
  • 重復
  • 在錯誤的抽象層級上的代碼
  • 基類依賴于派生類
  • 信息過多
  • 死代碼
  • 垂直分割
  • 前后不一致
  • 混淆視聽
  • 人為耦合
  • 特性依戀
  • 選擇算子參數
  • 晦澀的意圖
  • 位置錯誤的權責
  • 不恰當的靜態方法
  • 使用解釋性變量
  • 函數名稱應該表達其行為
  • 理解算法
  • 把邏輯依賴改為物理依賴
  • 用多態替代if/else或switch/case
  • 遵循標準約定
  • 用命名常量替代魔術數
  • 準確
  • 結構甚于約定
  • 封裝條件
  • 避免否定性條件
  • 函數只做一件事
  • 掩蔽時序耦合
  • 別隨意
  • 封裝邊界條件
  • 函數應該只在一個抽象層級上
  • 在較高層放置可配置數據
  • 避免傳遞瀏覽
  • 17.5 Java

  • 通過使用通配符來避免過長的導入清單
  • 不要繼承常量
  • 常量和枚舉
  • 17.6 名稱

  • 采用描述性名稱
  • 名稱應與抽象層級相符
  • 盡可能使用標準命名法
  • 無歧義的名稱
  • 為較大作用范圍選用較長名稱
  • 避免編碼
  • 名稱應該說明副作用
  • 17.7 測試

  • 測試不足
  • 使用覆蓋率工具
  • 別略過小測試
  • 被忽略的測試就是對不確定事物的疑問
  • 測試邊界條件
  • 全面測試相近的缺陷
  • 測試失敗的模式有啟發性
  • 測試覆蓋率的模式有啟發性
  • 測試應該快速
  • 附錄

    1. 開閉原則:open-close principle

    一個軟件實體諸如類或模塊或函數應該對擴展開放,對修改關閉。用抽象構建框架,用實現擴展細節。

    優點:提高軟件系統的可復用性以及可維護性。

    2. 依賴倒置原則:Dependence Inversion Principle

    程序要依賴于抽象接口,不要依賴于具體實現。簡單的說就是要求對抽象進行編程,不要對實現進行編程,這樣就降低了客戶與實現模塊間的耦合。

    3. 單一職責原則:Single Responsibility Principle

    不要存在多于一個導致類變更的原因

    一個類,接口,方法只負責一項職責

    優點:降低類的復雜度,提高類的可讀性,提高系統的可維護性,降低變更引起的風險。

    4. 接口隔離原則:Interface Segregation Principle

    客戶端不應該依賴它不需要的接口。一個類對另一個類的依賴應該建立在最小的接口上。

    使用多個專門的接口比使用單一的總接口要好。

    一個類對另外一個類的依賴性應當是建立在最小的接口上的。

    優點:1.避免接口污染;2.提高靈活性;3.提供定制服務;4.實現高內聚

    5. 迪米特法則:Law Of Demeter

    一個對象應該對其他對象保持最少的了解。又叫最少知道法則。

    盡量降低類與類之間的耦合。

    優點:降低類之間的耦合。

    6. 里氏替換原則:Liskov Substitution Principle LSP

    里氏替換原則(LSP)是面向對象設計的基本原則之一。 里氏替換原則中說,任何基類可以出現的地方,子類一定可以出現。 LSP是繼承復用的基石,只有當衍生類可以替換掉基類,軟件單位的功能不受到影響時,基類才能真正被復用,而衍生類也能夠在基類的基礎上增加新的行為

    優點:1.約束繼承泛濫,開閉原則的一種體現。

    2.加強程序的健壯性,同時變更時也可以做到非常好的兼容性,提高程序的維護性,擴展性。降低需求變更時引入的風險。

    7. 合成復用原則:Composite Reuse Principle CRP

    它要求在軟件復用時,要盡量先使用組合或者聚合等關聯關系來實現,其次才考慮使用繼承關系來實現。

    優點:

  • 它維持了類的封裝性。因為成分對象的內部細節是新對象看不見的,所以這種復用又稱為“黑箱”復用。
  • 新舊類之間的耦合度低。這種復用所需的依賴較少,新對象存取成分對象的唯一方法是通過成分對象的接口。
  • 復用的靈活性高。這種復用可以在運行時動態進行,新對象可以動態地引用與成分對象類型相同的對象。
  • 總結

    以上是生活随笔為你收集整理的《代码整洁之道》读后感的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。