- 你必須知道的.NET(第2版)
- 王濤
- 7字
- 2018-12-27 13:41:52
第2章 OO大原則
2.1 OO原則綜述
本節(jié)將介紹以下內(nèi)容:
·面向?qū)ο蠡驹瓌t討論
·設(shè)計原則的歷史
·學(xué)習(xí)的建議
2.1.1 引言
好的設(shè)計,成就好的作品;僵化的設(shè)計,則會使你的作品大打折扣。在軟件領(lǐng)域更是如此,Bob大叔在其《敏捷軟件開發(fā)——原則、模式與實(shí)踐》一書的序言中就講到“美的東西比丑的東西創(chuàng)建起來更廉價,也更快捷。”可見追求美好的軟件設(shè)計不光是代碼優(yōu)雅的問題,更關(guān)乎生產(chǎn)成本。對于軟件架構(gòu)的研究經(jīng)歷了很長時間的摸索,從面向過程到面向?qū)ο螅瑥脑O(shè)計原則到設(shè)計模式,對于如何設(shè)計更好軟件的探索,從未停止。技術(shù)大師總結(jié)了很多設(shè)計上的經(jīng)典法則,后來者可以站在巨人的肩膀上盡情享受豐富而珍貴的經(jīng)驗。[0]
在第1章“OO大智慧”中,我們分析和討論了面向?qū)ο蠹夹g(shù)的基本要素,對繼承、封裝、多態(tài)和接口等進(jìn)行了基本的討論,如何將這些基本技術(shù)應(yīng)用的得心應(yīng)手,是本章要闡釋的問題和目標(biāo)。面向?qū)ο蟮脑瓌t也正是如何使用繼承、封裝、多態(tài)和接口技術(shù)進(jìn)行優(yōu)良設(shè)計的原則總結(jié)和規(guī)律認(rèn)知,因此這兩章的內(nèi)容相輔相成,互為補(bǔ)充。
2.1.2 講述之前
在將設(shè)計原則和盤推出之前,簡單對設(shè)計進(jìn)行一點(diǎn)思考和討論,這樣就能更加明確的了解設(shè)計原則的意義和目的。
首先,你的軟件系統(tǒng)是否常常有下面的問題或困擾:
僵化。牽一發(fā)而動全身,你的系統(tǒng)不可修改或者擴(kuò)展。
復(fù)雜和重復(fù)。過分復(fù)雜,難于理解,跟蹤你的程序往往不知取向,沒有設(shè)計不可取,過度設(shè)計同樣不可取;或者系統(tǒng)中充滿了重復(fù)的結(jié)構(gòu)和實(shí)現(xiàn)。
不可復(fù)用。過于僵化而不可復(fù)用,不能剝離出獨(dú)立的復(fù)用組件。
不夠穩(wěn)定。常常出錯而又無法妥善解決問題,系統(tǒng)運(yùn)行不夠可靠。
正是這些問題的出現(xiàn),促使人們開始不斷思考對軟件設(shè)計、軟件架構(gòu)和軟件流程等內(nèi)容的關(guān)注,設(shè)計原則也是在這種思考和探索中逐漸歸納總結(jié)而成的,通過靈活的應(yīng)用設(shè)計原則,輔助一定的設(shè)計模式,封裝變化、降低耦合,來實(shí)現(xiàn)軟件的復(fù)用和擴(kuò)展,這正是設(shè)計原則的最終意義。
首先是面向?qū)ο蟆kS著面向?qū)ο缶幊趟枷氲某墒欤纬闪艘苑庋b、繼承和多態(tài)三大要素為主的完整體系,蘊(yùn)涵了以抽象來封裝變化,降低耦合,實(shí)現(xiàn)復(fù)用的精髓,而這三大因素相互聯(lián)系、互相制約:封裝用以隱藏具體實(shí)現(xiàn),保護(hù)內(nèi)部信息;繼承實(shí)現(xiàn)復(fù)用;而多態(tài)改寫對象行為,在繼承基礎(chǔ)上實(shí)現(xiàn)更高級別的抽象。在此基礎(chǔ)上逐漸形成的一些基本的OO原則,例如封裝變化、對接口編程、少繼承多聚合,已經(jīng)具有了面向?qū)ο笤O(shè)計原則的思想,而本節(jié)所述的原則可以看成是對這些思想的系統(tǒng)化引申和歸納。
然后是設(shè)計模式。模式代表了對經(jīng)驗的總結(jié)和提煉,是對重復(fù)發(fā)生的問題進(jìn)行的總結(jié)和最佳解決策略的探索,自GoF的《設(shè)計模式:可復(fù)用面向?qū)ο筌浖幕A(chǔ)》這部巨著誕生以來,對于軟件設(shè)計模式的探索成為每個設(shè)計開發(fā)者的必修課,而面向?qū)ο笤O(shè)計原則可以看做是了解設(shè)計模式的基礎(chǔ),為設(shè)計模式提供了基本的指導(dǎo)。經(jīng)典的23個模式背后,都遵循著這些基本原則,而設(shè)計原則又由設(shè)計模式策略來實(shí)現(xiàn),這就是二者之間的關(guān)系,所以了解原則對于認(rèn)識模式具有絕對的指導(dǎo)意義。
最后,就是設(shè)計原則的故事。Robert C. Martin(Bob大叔)的巨著《敏捷軟件開發(fā)——原則、模式與實(shí)踐》對敏捷設(shè)計原則進(jìn)行了深刻而生動的論述,不同的模式應(yīng)對不同的需求,而設(shè)計原則則代表永恒的靈魂,需要在實(shí)踐中時時刻刻地遵守,創(chuàng)造盡可能優(yōu)雅、靈活的設(shè)計。
“你不必嚴(yán)格遵守這些原則,違背它們也不會被處以宗教刑罰。但你應(yīng)當(dāng)把這些原則看成警鈴,若違背了其中的一條,那么警鈴就會響起。”。
——ARTHUR J.RIEL,《OOD啟思錄》
請記住這些技術(shù)大師的名字和作品,并研習(xí)其中的經(jīng)驗和招式,正是他們讓這個領(lǐng)域變得如此光彩奪目,沿著這些智慧的道路走下去,在品讀經(jīng)典的過程中,你會逐漸找到技術(shù)神燈之下的奧秘。
2.1.3 原則綜述
本章將重點(diǎn)講述最基本的5個設(shè)計原則,分別是:單一職責(zé)原則、開放封閉原則、依賴倒置原則、接口隔離原則和Liskov替換原則,在表2-1中列出了主要的一些面向?qū)ο笤O(shè)計原則及其簡單描述,詳細(xì)的分析將在本章各節(jié)逐步展開。
表2-1 設(shè)計原則
在本書中,我們只對前5大原則進(jìn)行系統(tǒng)論述,關(guān)于合成/聚合復(fù)用原則,在1.2節(jié)“什么是繼承”中已經(jīng)有相關(guān)的論述。
2.1.4 學(xué)習(xí)建議
了解面向?qū)ο蟮脑O(shè)計原則,是個不斷實(shí)踐和研究的過程,對于僵化的代碼和設(shè)計,應(yīng)該在可能的情況下有重構(gòu)的勇氣。當(dāng)然,學(xué)習(xí)和了解理論基礎(chǔ)也是相當(dāng)重要的方面:
深入了解設(shè)計基礎(chǔ)。什么是設(shè)計基礎(chǔ)呢?在我看來,面向?qū)ο蟮幕疽兀嫦驅(qū)ο蟮恼Z言基礎(chǔ)都是一切設(shè)計的基礎(chǔ),沒有繼承、多態(tài)、聚合的深入了解,就無法更好地認(rèn)識設(shè)計原則中的實(shí)現(xiàn)理念。
打好設(shè)計原則的理論基礎(chǔ)。本節(jié)簡單總結(jié)了7種基本的設(shè)計原則,對于這些原則的核心思想和應(yīng)用技巧應(yīng)該建立基本的認(rèn)識。
不斷實(shí)踐和反思。對于設(shè)計原則的實(shí)踐,莫過于對僵化的設(shè)計操刀重構(gòu),要有不斷完善的勇氣和心力,在重構(gòu)的實(shí)踐中思考并形成經(jīng)驗。
了解設(shè)計模式。設(shè)計模式都是對于軟件經(jīng)驗的經(jīng)典總結(jié),模式和原則相輔相成,深入了解常見的設(shè)計模式尤為重要,例如Proxy模式就是對單一職責(zé)原則的一種體現(xiàn)。
具備必要的修養(yǎng)。除了本章將要討論的設(shè)計原則,還有一些通用的軟件規(guī)則對于深入理解設(shè)計原則大有裨益,例如:高內(nèi)聚、低耦合、控制器、受保護(hù)變化等,對于這些通用規(guī)則必須打好基礎(chǔ),在設(shè)計原則的很多方面都有這些基礎(chǔ)規(guī)則的體現(xiàn)。
2.1.5 結(jié)論
請從了解設(shè)計原則開始,重構(gòu)你的系統(tǒng)。將僵化而脆弱的設(shè)計踢出你的代碼,應(yīng)用面向?qū)ο蟮乃枷雭砝砬逍枨螅闹蟹蛛x抽象和具體,應(yīng)用前人的經(jīng)驗來實(shí)現(xiàn)優(yōu)雅的設(shè)計,構(gòu)建靈活、可靠和健壯的軟件。
本章將以適當(dāng)?shù)钠鶃黻P(guān)注軟件設(shè)計原則,以及如何在.NET技術(shù)中實(shí)現(xiàn),通過對5個基本設(shè)計原則的分析與應(yīng)用,從中了解和體會如何使設(shè)計變得優(yōu)雅,如何使軟件更有擴(kuò)展性和穩(wěn)定性,如何避免僵化的設(shè)計架構(gòu)。
- 潮流:UI設(shè)計必修課
- 微服務(wù)與事件驅(qū)動架構(gòu)
- C語言程序設(shè)計基礎(chǔ)與實(shí)驗指導(dǎo)
- 三維圖形化C++趣味編程
- Java開發(fā)入行真功夫
- Spring Cloud、Nginx高并發(fā)核心編程
- 用戶體驗增長:數(shù)字化·智能化·綠色化
- Windows Phone 7.5:Building Location-aware Applications
- 批調(diào)度與網(wǎng)絡(luò)問題的組合算法
- MongoDB,Express,Angular,and Node.js Fundamentals
- Android Wear Projects
- WCF編程(第2版)
- Visual FoxPro程序設(shè)計實(shí)驗教程
- Analytics for the Internet of Things(IoT)
- Learning RxJava