概覽
系統(tǒng)開發(fā)過程中,最難的不是完成系統(tǒng)的開發(fā)工作,而是在于后續(xù)的升級、維護過程中讓系統(tǒng)能夠擁抱變化。擁抱變化也就意味著在滿足需求且不破壞系統(tǒng)穩(wěn)定性的前提下保持高可擴展性、高內(nèi)聚、低耦合,經(jīng)歷各版本的變更之后依然保持清晰、靈活、穩(wěn)定的系統(tǒng)架構(gòu)。當(dāng)然,這是比較理想的情況,但我們必須朝著這個方向去努力,那么遵循面向?qū)ο罅笤瓌t就是我們走向靈活軟件之路所邁出的第一步。
軟件的可維護性和可復(fù)用性。
好的系統(tǒng)設(shè)計應(yīng)該具備如下三個性質(zhì):
- 可擴展性(Extensibility)
- 靈活性(Flexibility)
- 可插入性(Pluggability)
可維護性較低的系統(tǒng)設(shè)計,通常有如下幾個原因:
- 復(fù)用率低(Immobility)
- 黏度過高(Viscosity)
- 脆弱
- 僵硬
面向?qū)ο笤O(shè)計原則
常用的面向?qū)ο笤O(shè)計原則并不是孤立存在的,它們相互依賴,相互補充。
- 開閉原則
- 依賴倒置原則
- 里氏替換原則
- 單一職責(zé)原則
- 接口隔離原則
- 迪米特原則
開閉原則(OCP)
Open Close Principle,縮寫OCP。開閉原則由Bertrand Meyer(勃蘭特·梅耶)于1988年出版的《面向?qū)ο筌浖?gòu)造》一書中提出。抽象化是開閉原則的關(guān)鍵。
定義:軟件中的對象(類、模塊、函數(shù)等)應(yīng)該對于擴展是開放的,對于修改是封閉的。
軟件開發(fā)過程中,最不會變化的就是變化本事。
依賴倒置原則(DIP)
Dependence Inversion Principle,縮寫DIP。
定義:依賴倒置原則指代了一種特定的解耦形式,使得高層次的模塊不依賴于低層次模塊的實現(xiàn)細(xì)節(jié)的目的,依賴模塊被顛倒了。
- 高層模塊不應(yīng)該依賴低層模塊,兩者都應(yīng)該依賴其抽象
- 抽象不應(yīng)該依賴細(xì)節(jié)
- 細(xì)節(jié)應(yīng)該依賴抽象
java語言中,抽象就是指接口或抽象類,兩者都不可以直接被實例化;細(xì)節(jié)就是實現(xiàn)類。高層模塊就是調(diào)用端,低層模塊就是具體實現(xiàn)類。
里氏替換原則(LSP)
Liskov Substitution Principle,縮寫LSP。
定義:所有引用基類的地方必須能透明地使用其子類的對象。
單一職責(zé)原則(SRP)
Single Responsibility Principle,縮寫SRP。
定義:就一個類而言,應(yīng)該僅有一個引起它變化的原因。
接口隔離原則(ISP)
InterfaceSegregation Principles,縮寫ISP。
定義:客戶端不應(yīng)該依賴它不需要的接口。
迪米特原則(LOD)
Law of Demeter,縮寫LOD,也稱為最少知識原則。
定義:一個對象應(yīng)該對其他對象有最少的了解。
Only talk to your immedate friends。只與直接的朋友通信。???每個對象都必然會與其他對象有耦合關(guān)系,兩個對象之間的耦合就稱為朋友關(guān)系,如依賴、關(guān)聯(lián)、組合、聚合等。
類應(yīng)該對自己需要耦合或調(diào)用的類知道得最少,類的內(nèi)部如何實現(xiàn)與調(diào)用者或依賴者沒有關(guān)系,調(diào)用者或者依賴者只需要知道它需要的方法即可,其他的可一概不用管。類與類之間關(guān)系越密切,耦合度越大,當(dāng)一個類發(fā)生改變時,對另一個類的影響也越大。軟件總的原則:低耦合、高內(nèi)聚。