模式起源於建築業而非軟體業,下面是最早研究模式的 Christopher Alexander 博士對模式下的定義:
A pattern is a successful or efficient solution to a recurring problem within a content.
模式是在特定環境下人們解決某類重複出現問題的一套成功或有效的解決方案。
在軟體業當中,最經典的設計模式研究人員莫過於「四人組」(GoF),他們對設計模式的定義如下:
Design patterns are descriptions of comminicating objects and classes that are customized to solve a general design problem in a particular context.
設計模式是在特定環境下為解決某一通用軟體設計問題提供的一套客製化的解決方案,該方案描述了物件和類之間的相互作用。
設計模式是和資料結構與演演算法同層次的知識點,利用資料結構與演演算法可以寫出高效的程式碼,利用設計模式可以寫出可延伸、可讀、可維護的高質量程式碼。
在軟體業當中,設計模式也可以看作是軟體模式中的一部分,負責優化編碼、實現高質量程式碼的一部分。
設計模式和軟體模式類似,基本結構主要由 4 個部分構成:
掌握設計模式之後,在以下場景的作用非常大:
學習設計模式就是為了提高程式碼的質量,在學習設計模式之前,應當先了解編碼質量的概念和評價標準。
程式碼質量是一個綜合各種標準得到的結論,不能通過單一的維度去評價一段程式碼寫得好壞。即使是可延伸性非常好的程式碼,但是可讀性非常差,並不能評價這段程式碼質量高。
對編碼質量的常見評價標準非常多,而它們又存在著包含、重疊、相互影響的關係,如一段程式碼的可讀性、可延伸性非常好,也意味著這段程式碼的可維護性非常好。
在日常開發中,通常是無法客觀地去評價程式碼的質量高低,對於同一段程式碼,高階開發工程師可能覺得可讀性非常好,而初級開發工程師就會覺得難以閱讀,他們的評價標準肯定是不一樣的。
程式碼質量的評價詞語非常多,但使用時應儘量避免過於抽象或過於細節的評價,儘量使用較為精準的詞語。
如下是常用的幾個評價標準:
其中可維護性、可讀性、可延伸性是最重要的三個評價標準。
內聚指的是一個模組內部各成分之間相關聯程度的度量。所謂高內聚,就是相近的功能應該放在一個模組內,不相近的功能不要放在一個模組內。
耦合指的是兩個模組之間的關聯程度。所謂鬆耦合指的是,兩個模組之間的依賴關係簡單清晰,即使兩個模組有依賴關係,一個模組的改動不會或者很少影響到另一個模組。
高內聚和鬆耦合通常是一起出現的,高內聚有助於鬆耦合,鬆耦合又需要高內聚的支援。高內聚和鬆耦合的程式在可維護性、可讀性、可延伸性上都會好很多。
要想編寫高質量的程式碼,可以從設計風格、設計原則、設計模式、程式設計規範、重構技巧等等方向著手。
現在主流的程式設計風格分為三種:程式導向、物件導向、函數語言程式設計。
物件導向程式設計是其中相對流行的風格,而且大部分的設計原則、設計模式都是基於物件導向程式設計實現的。
設計原則可以指導程式碼設計,它們都非常抽象,通常是在開發時給予指導意義。
常見的設計原則有 SOLID 原則、DRP 原則、KISS 原則、YAGNI 原則、LOD 原則等。
大部分設計模式解決的是程式碼的可延伸性問題。
在設計模式領域,狹義的設計模式就是指 GoF 的《設計模式:可複用物件導向軟體設計的基礎》一書中包含的 23 種經典的設計模式。
這 23 種設計模式根據目的(模式是用來做什麼的)可分為 3 種型別:建立型、結構型、行為型:
按照我自己對這些設計模式的理解程度對設計模式做排序,它們的詳細分類如下:
程式設計規範已經深入到編碼當中,是一種更具體的解決程式碼可讀性問題的方法。
程式設計規範更注重程式碼細節,比如,如何給變數、類、函數命令,如何寫程式碼註釋,函數不宜過長、引數不宜過多等。
重構是程式碼開發中非常重要的一個環節,持續重構是保持程式碼質量不下降的有效手段。
其實重構已經不算是方法論了,而是一種行為,通常重構是基於設計風格、設計原則、設計模式、程式設計規範這些理論才能做得更好。