天天看點

03 _ 面向對象、設計原則、設計模式、程式設計規範、重構,這五者有何關系?

在上一節課中,我們講到,要具備編寫高品質代碼的能力,你需要學習一些程式設計方法論,其中就包含面向對象(我們可以把它看成一種設計思想)、設計原則、設計模式、程式設計規範、重構技巧等。而我們整個專欄的内容也是圍繞着這幾塊展開講解的。是以,今天我就先來簡單介紹一下這幾個概念,并且說一說它們之間的聯系。

今天的内容相當于專欄的一個教學大綱,或者說學習架構。它能讓你對整個專欄所涉及的知識點,有一個全局性的了解,能幫你将後面零散的知識更系統地組織在大腦裡。

話不多說,我們就一塊來看一下,接下來的這8個月我們到底要學習哪些内容吧!

現在,主流的程式設計範式或者是程式設計風格有三種,它們分别是面向過程、面向對象和函數式程式設計。面向對象這種程式設計風格又是這其中最主流的。現在比較流行的程式設計語言大部分都是面向對象程式設計語言。大部分項目也都是基于面向對象程式設計風格開發的。面向對象程式設計因為其具有豐富的特性(封裝、抽象、繼承、多态),可以實作很多複雜的設計思路,是很多設計原則、設計模式編碼實作的基礎。

是以,在專欄的最開始,我們會詳細地講解面向對象程式設計的相關的知識,為學習後面的内容做鋪墊。對于這部分内容,你需要掌握下面這7個大的知識點。

面向對象的四大特性:封裝、抽象、繼承、多态

面向對象程式設計與面向過程程式設計的差別和聯系

面向對象分析、面向對象設計、面向對象程式設計

接口和抽象類的差別以及各自的應用場景

基于接口而非實作程式設計的設計思想

多用組合少用繼承的設計思想

面向過程的貧血模型和面向對象的充血模型

設計原則是指導我們代碼設計的一些經驗總結。設計原則這塊兒的知識有一個非常大的特點,那就是這些原則聽起來都比較抽象,定義描述都比較模糊,不同的人會有不同的解讀。是以,如果單純地去記憶定義,對于程式設計、設計能力的提高,意義并不大。對于每一種設計原則,我們需要掌握它的設計初衷,能解決哪些程式設計問題,有哪些應用場景。隻有這樣,我們才能在項目中靈活恰當地應用這些原則。

對于這一部分内容,你需要透徹了解并且掌握,如何應用下面這樣幾個常用的設計原則。

solid原則-srp單一職責原則

solid原則-ocp開閉原則

solid原則-lsp裡式替換原則

solid原則-isp接口隔離原則

solid原則-dip依賴倒置原則

dry原則、kiss原則、yagni原則、lod法則

設計模式是針對軟體開發中經常遇到的一些設計問題,總結出來的一套解決方案或者設計思路。大部分設計模式要解決的都是代碼的可擴充性問題。設計模式相對于設計原則來說,沒有那麼抽象,而且大部分都不難了解,代碼實作也并不複雜。這一塊的學習難點是了解它們都能解決哪些問題,掌握典型的應用場景,并且懂得不過度應用。

經典的設計模式有23種。随着程式設計語言的演進,一些設計模式(比如singleton)也随之過時,甚至成了反模式,一些則被内置在程式設計語言中(比如iterator),另外還有一些新的模式誕生(比如monostate)。

在專欄中,我們會重點講解23種經典的設計模式。它們又可以分為三大類:建立型、結構型、行為型。對于這23種設計模式的學習,我們要有側重點,因為有些模式是比較常用的,有些模式是很少被用到的。對于常用的設計模式,我們要花多點時間了解掌握。對于不常用的設計模式,我們隻需要稍微了解即可。

我按照類型和是否常用,對專欄中講到的這些設計模式,進行了簡單的分類,具體如下所示。

常用的有:單例模式、工廠模式(工廠方法和抽象工廠)、建造者模式。

不常用的有:原型模式。

常用的有:代理模式、橋接模式、裝飾者模式、擴充卡模式。

不常用的有:門面模式、組合模式、享元模式。

常用的有:觀察者模式、模闆模式、政策模式、職責鍊模式、疊代器模式、狀态模式。

不常用的有:通路者模式、備忘錄模式、指令模式、解釋器模式、中介模式。

程式設計規範主要解決的是代碼的可讀性問題。編碼規範相對于設計原則、設計模式,更加具體、更加偏重代碼細節。即便你可能對設計原則不熟悉、對設計模式不了解,但你最起碼要掌握基本的編碼規範,比如,如何給變量、類、函數命名,如何寫代碼注釋,函數不宜過長、參數不能過多等等。

對于編碼規範,考慮到很多書籍已經講得很好了(比如《重構》《代碼大全》《代碼整潔之道》等)。而且,每條編碼規範都非常簡單、非常明确,比較偏向于記憶,你隻要照着來做可以。它不像設計原則,需要融入很多個人的了解和思考。是以,在這個專欄中,我并沒有花太多的篇幅來講解所有的編碼規範,而是總結了我認為的最能改善代碼品質的20條規範。如果你暫時沒有時間去看那些經典的書籍,看我這些就夠了。

除此之外,專欄并沒有将編碼規範單獨作為一個子產品來講解,而是跟重構放到了一起。之是以這樣做,那是因為我把重構分為大重構和小重構兩種類型,而小重構利用的知識基本上就是編碼規範。

除了編碼規範,我們還會介紹一些代碼的壞味道,讓你知道什麼樣的代碼是不符合規範的,應該如何優化。參照編碼規範,你可以寫出可讀性好的代碼;參照代碼的壞味道,你可以找出代碼存在的可讀性問題。

在軟體開發中,隻要軟體在不停地疊代,就沒有一勞永逸的設計。随着需求的變化,代碼的不停堆砌,原有的設計必定會存在這樣那樣的問題。針對這些問題,我們就需要進行代碼重構。重構是軟體開發中非常重要的一個環節。持續重構是保持代碼品質不下降的有效手段,能有效避免代碼腐化到無可救藥的地步。

而重構的工具就是我們前面羅列的那些面向對象設計思想、設計原則、設計模式、編碼規範。實際上,設計思想、設計原則、設計模式一個最重要的應用場景就是在重構的時候。我們前面講過,雖然使用設計模式可以提高代碼的可擴充性,但過度不恰當地使用,也會增加代碼的複雜度,影響代碼的可讀性。在開發初期,除非特别必須,我們一定不要過度設計,應用複雜的設計模式。而是當代碼出現問題的時候,我們再針對問題,應用原則和模式進行重構。這樣就能有效避免前期的過度設計。

對于重構這部分内容,你需要掌握以下幾個知識點:

重構的目的(why)、對象(what)、時機(when)、方法(how);

保證重構不出錯的技術手段:單元測試和代碼的可測試性;

兩種不同規模的重構:大重構(大規模高層次)和小重構(小規模低層次)。

希望你學完這部分内容之後,不僅僅是掌握一些重構技巧、套路,更重要的是建立持續重構意識,把重構當作開發的一部分,融入到日常的開發中。

關于面向對象、設計原則、設計模式、程式設計規範和代碼重構,這五者的關系我們前面稍微提到了一些,我這裡再總結梳理一下。

面向對象程式設計因為其具有豐富的特性(封裝、抽象、繼承、多态),可以實作很多複雜的設計思路,是很多設計原則、設計模式等編碼實作的基礎。

設計原則是指導我們代碼設計的一些經驗總結,對于某些場景下,是否應該應用某種設計模式,具有指導意義。比如,“開閉原則”是很多設計模式(政策、模闆等)的指導原則。

設計模式是針對軟體開發中經常遇到的一些設計問題,總結出來的一套解決方案或者設計思路。應用設計模式的主要目的是提高代碼的可擴充性。從抽象程度上來講,設計原則比設計模式更抽象。設計模式更加具體、更加可執行。

程式設計規範主要解決的是代碼的可讀性問題。編碼規範相對于設計原則、設計模式,更加具體、更加偏重代碼細節、更加能落地。持續的小重構依賴的理論基礎主要就是程式設計規範。

重構作為保持代碼品質不下降的有效手段,利用的就是面向對象、設計原則、設計模式、編碼規範這些理論。

實際上,面向對象、設計原則、設計模式、程式設計規範、代碼重構,這五者都是保持或者提高代碼品質的方法論,本質上都是服務于編寫高品質代碼這一件事的。當我們追本逐源,看清這個本質之後,很多事情怎麼做就清楚了,很多選擇怎麼選也清楚了。比如,在某個場景下,該不該用這個設計模式,那就看能不能提高代碼的可擴充性;要不要重構,那就看重代碼是否存在可讀、可維護問題等。

今天的内容到此就講完了。我畫了一張圖,總結了專欄中所涉及的知識點。在學習後面的課程的時候,你可以經常翻出來看一下,建立全局意識,不至于迷失在零碎的知識點中。

03 _ 面向對象、設計原則、設計模式、程式設計規範、重構,這五者有何關系?

今天課堂讨論的話題有兩個。

在今天講到的内容中,你覺得哪一部分内容對提高代碼品質最有效?為什麼?除了我羅列的這些内容之外,你還知道哪些可以提高代碼品質的方法?

我們知道,最經典的設計模式書籍是gof的《設計模式》,它的中文全稱是《設計模式:可複用面向對象軟體的基礎》,英文全稱是“design patterns: elements of reusable object-oriented software”。為什麼它在标題中會特意提到“面向對象”呢?

歡迎在留言區寫下你的想法,和同學一起交流和分享。如果有收獲,也歡迎你把這篇文章分享給你的朋友。

繼續閱讀