「筆記」設計模式之美 - 導讀篇

爲什麼要學習設計模式

  • 應對面試中的設計模式相關問題
  • 告別寫被人吐槽的爛代碼
    • Talk is cheap,show me the code ;代碼能力是一個程序員最基礎的能力,是基本功
      • 是展示一個程序員基礎素養的最直接的衡量標準,你寫的代碼,實際上就是你名片
    • 爛代碼的情況,比如命名不規範、類設計不合理、分層不清晰、沒有模塊化概念、代碼結構混亂、高度耦合等等
      • 維護起來非常費勁,添加或者修改一個功能,常常會牽一髮而動全身
  • 提高複雜代碼的設計和開發能力
  • 讓讀源碼、學框架事半功倍
    • 有些人看源碼的時候,經常會遇到看不懂、看不下去的問題,是因爲積累的基本功還不夠
    • 優秀開源代碼爲了保證代碼的擴展性、靈活性、可維護性等,會使用到很多設計模式、設計原則或者設計思想
    • 如果你對設計模式、原則、思想非常瞭解,一眼就能參透作者的設計思路、設計初衷,就可以把腦容量釋放出來
    • 沒有積累深厚的基本功,就算把這臺戰鬥機擺在你面前,你也不能完全參透它的精髓,只是瞭解個皮毛而已
  • 爲你的職場發展做鋪墊
    • 希望在職場有更高的成就、更好的發展,那就要重視基本功的訓練、基礎知識的積累
    • 當成長到一定階段之後,你勢必要承擔一些指導培養初級員工、新人,以及 code review 的工作
      • 如果你自己都對“什麼是好的代碼?如何寫出好的代碼?”不瞭解,那又該如何指導別人,如何讓人家信服呢
    • 如果你是一個技術 leader,負責一個項目整體的開發工作時,就需要爲開發進度、開發效率和項目質量負責
      • 不希望團隊堆砌垃圾代碼,讓整個項目無法維護,添加修改功能時特別費勁,影響開發效率
      • 代碼質量低還會導致線上 bug 頻發,排查困難(導致團隊都都陷入成天修改無意義的低級 bug 中
    • 當負責招聘時,如果你要考察候選人的設計能力、代碼能力,那設計模式相關的問題便是一個很好的考察點

如何評判代碼質量的好壞

  • 代碼質量評價的主觀性,使得這種主觀評價的準確度,跟工程師自身經驗有極大的關係
  • 如何評價代碼質量的高低
    • 代碼質量的評價有很強的主觀性,描述代碼質量的詞彙也有很多,比如可讀性、可維護性、靈活、優雅、簡潔等
      • 這些詞彙是從不同的維度去評價代碼質量的
      • 它們之間有互相作用,並不是獨立的,比如,代碼的可讀性好、可擴展性好就意味着代碼的可維護性好
    • 代碼質量高低是一個綜合各種因素得到的結論。我們並不能通過單一的維度去評價一段代碼的好壞
  • 最常用的評價標準
    • 可維護性(maintainability)
      • 維護:無外乎就是修改 bug、修改老的代碼、添加新的代碼之類的工作
      • 代碼易維護:在不破壞原有代碼設計、不引入新的 bug 的情況下,能夠快速地修改或者添加代碼
        • 代碼的可讀性好、簡潔、可擴展性好,就會使得代碼易維護
        • 代碼分層清晰、模塊化好、高內聚低耦合、遵從基於接口而非實現編程的設計原則等等也使得易維護
        • 項目代碼量、業務的複雜程度、利用到的技術的複雜程度、文檔是否全面、團隊成員水平等有關
      • 代碼不易維護:修改或者添加代碼需要冒着極大的引入新 bug 的風險,並且需要花費很長的時間才能完成
    • 可讀性(readability)
      • 代碼的可讀性應該是評價代碼質量最重要的指標之一
        • 代碼被閱讀的次數遠遠超過被編寫和執行的次數
        • 代碼的可讀性在非常大程度上會影響代碼的可維護性
      • 如何評價一段代碼的可讀性
        • 是否符合編碼規範、命名是否達意、註釋是否詳盡、函數是否長短合適、模塊劃分是否清晰、是否符合高內聚低耦合等等
      • code review 是一個很好的測驗代碼可讀性的手段
        • 如果你的同事可以輕鬆地讀懂你寫的代碼,那說明你的代碼可讀性很好
    • 可擴展性(extensibility)
      • 可擴展性也是一個評價代碼質量非常重要的標準,它表示我們的代碼應對未來需求變化的能力
      • 跟可讀性一樣,代碼是否易擴展也很大程度上決定代碼是否易維護
      • 可擴展性:在不修改或少量修改原有代碼的情況下,通過擴展的方式添加新的功能代碼
        • 說直白點就是,代碼預留了一些功能擴展點
    • 靈活性(flexibility)
      • 靈活性是一個挺抽象的評價標準,要給靈活性下個定義也是挺難的
      • 如果一段代碼易擴展、易複用或者易用,我們都可以稱這段代碼寫得比較靈活
    • 簡潔性(simplicity)
      • 儘量保持代碼簡單。代碼簡單、邏輯清晰,也就意味着易讀、易維護
      • 思從深而行從簡,真正的高手能雲淡風輕地用最簡單的方法解決最複雜的問題
    • 可複用性(reusability)
      • 代碼的可複用性可以簡單地理解爲,儘量減少重複代碼的編寫,複用已有的代碼
        • 在講到面向對象特性的時候,繼承、多態存在的目的之一,就是爲了提高代碼的可複用性
        • 當講到設計原則的時候,我們會講到單一職責原則也跟代碼的可複用性相關
        • 當講到重構技巧的時候,我們會講到解耦、高內聚、模塊化等都能提高代碼的可複用性
      • 可複用性也是一個非常重要的代碼評價標準,是很多設計原則、思想、模式等所要達到的最終效果
    • 可測試性(testability)
      • 代碼可測試性的好壞,能從側面上非常準確地反應代碼質量的好壞
      • 碼的可測試性差,比較難寫單元測試,那基本上就能說明代碼設計得有問題
  • 如何才能寫出高質量的代碼
    • 要寫出高質量代碼,我們就需要掌握一些更加細化、更加能落地的編程方法論
      • 面向對象中的繼承、多態能讓我們寫出可複用的代碼
      • 編碼規範能讓我們寫出可讀性好的代碼
      • 設計原則可以讓我們寫出可複用、靈活、可讀性好、易擴展、易維護的代碼
        • 例如單一職責、DRY、基於接口而非實現、裏式替換原則等
      • 設計模式可以讓我們寫出易擴展的代碼
      • 持續重構可以時刻保持代碼的可維護性

面向對象、設計原則、設計模式、編程規範、重構,這五者有何關係

  • img
  • 五者之間的聯繫
    • 面向對象編程其具有豐富的特性,可以實現很多複雜的設計思路,是很多設計原則、設計模式等編碼實現的基礎
    • 設計原則是指導我們代碼設計的一些經驗總結,對於某些場景下,是否應該應用某種設計模式,具有指導意義
      • 開閉原則 是很多設計模式(策略、模板等)的指導原則
    • 設計模式是針對軟件開發中經常遇到的一些設計問題,總結出來的一套解決方案或者設計思路
      • 應用設計模式的主要目的是提高代碼的可擴展性
      • 從抽象程度上來講,設計原則比設計模式更抽象,設計模式更加具體、更加可執行
    • 編程規範主要解決的是代碼的可讀性問題
      • 編碼規範相對於設計原則、設計模式,更加具體、更加偏重代碼細節、更加能落地
      • 持續的小重構依賴的理論基礎主要就是編程規範
    • 重構作爲保持代碼質量不下降的有效手段,利用的就是面向對象、設計原則、設計模式、編碼規範這些理論
  • 這五者都是保持或者提高代碼質量的方法論,本質上都是服務於編寫高質量代碼這一件事的
    • 在某個場景下,該不該用這個設計模式,那就看能不能提高代碼的可擴展性
    • 要不要重構,那就看重代碼是否存在可讀、可維護問題等
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章