OOD-對象設(shè)計原則(類的設(shè)計原則,包的內(nèi)聚性設(shè)計原則,包之間的耦合性設(shè)計原則)
請解釋什么是對象設(shè)計原則(類的設(shè)計原則,包的內(nèi)聚性設(shè)計原則,包之間的耦合性設(shè)計原則)?
(1)類的設(shè)計原則
[1]單一職責原則(Single Responsibility Principle, SRP)
所謂職責,是指類變化的原因。此原則規(guī)定一個類應(yīng)該只有一個發(fā)生變化的原因。
如果一個類有多于一個的動機被改變,那么這個類就具有多于一個的職責,實際上就是耦合了多個不相關(guān)的職責,從而降低了這個類的內(nèi)聚性。
[2]開—閉原則(Open-Close Principle.OCP)
一個類應(yīng)當對擴展開放,對修改關(guān)閉?!皩U展開放(Open for Extension)"意味著類的行為是可以擴展的,當應(yīng)用程序的需求改變時,可以對類進行擴展,使其具有滿足改變的行為。“對修改關(guān)閉(Close for Modification)”意味著不用修改類,就能擴展這個類的新行為。
[3]里氏替換原則(Liskov Substitution Principle,LSP)
任何基類出現(xiàn)的地方,子類一定可以出現(xiàn)。LSP是繼承復用的基石。只有當衍生類可以替換基類,軟件單位的功能不受到影響時,基類才能真正被復用,而衍生類也能夠在基類的基礎(chǔ)上增加新的行為。
Liskov 于1987 年提出了一個關(guān)于繼承的原則 Inheritance should ensure that any property proved about supertype objects also holds for subtype objects.—“繼承必須確保超類所擁有的性質(zhì)在子類中仍然成立”。也就是說,當一個子類的實例能夠替換任何其超類的實例時,它們之間才具有is-A關(guān)系。
[4]依賴倒置原則(Dependence-Inversion Principle,DIP)
系統(tǒng)抽象化的具體實現(xiàn),要求對抽象進行編程,不要對實現(xiàn)進行編程,這樣就降低了客戶與實現(xiàn)模塊間的耦合。
依賴倒置原則是很多面向?qū)ο蠹夹g(shù)的根基。它特別適合用于構(gòu)件可復用的軟件框架,有利于編寫彈性、易于變化的代碼;此外,由于抽象和細節(jié)彼此隔離,代碼也便于維護。
[5]接口隔離原則(Interface Segregation Principle,ISP)
客戶端不應(yīng)該依賴它不需要的接口,一個類對另一個類的依賴應(yīng)該建立在最小的接口上。要求接口的方法盡量少,接口盡量細化。
接口隔離原則和單一職責原則很相似,區(qū)別在于觀察角度不同。前者是從調(diào)用者的角度來看;而后者從類或自身方法的角度來看。
[6]迪米特原則(Law of Demeter,LoD)
迪米特原則又叫最少知識原則(Least Knowledge Principle,LKP),也就是說,一個對象應(yīng)當對其他對象有盡可能少地了解,即“不和陌生人說話”。降低系統(tǒng)的耦合度,使一個模塊的修改盡量少地影響其他模塊,擴展會相對容易。
[7]組合/聚合復用原則(Composition/Aggregation Reuse Principle,C/ARP)。
在面向?qū)ο蟮脑O(shè)計中,如果直接繼承基類,會破壞封裝,因為繼承將基類的實現(xiàn)細節(jié)暴露給子類;如果基類的實現(xiàn)發(fā)生改變,則子類的實現(xiàn)也不得不發(fā)生改變;從基類繼承而來的實現(xiàn)是靜態(tài)的,不可能在運行時發(fā)生改變,沒有足夠的靈活性。
組合/聚合復用原則指出,在實際開發(fā)設(shè)計中盡量使用合成/聚合,不要使用類繼承。
(2)包的內(nèi)聚性設(shè)計原則
[1]共同重用原則(Common Reuse Principle,CRP)
一個包中的所有類應(yīng)該是共同重用的,也就是說,如果重復用了包中的一個類,就要重用包中的所有類。換句話說,相互之間沒有緊密聯(lián)系的類不應(yīng)該放在同一個包中。
[2]共同封閉原則(Common Closure Principle,CCP)
包中的所有類對于同一種性質(zhì)的變化應(yīng)該是共同封閉的。一個變化若對一個封閉的包產(chǎn)生影響,則將對該包中的所有類產(chǎn)生影響,而對于其他包則不造成任何影響,這樣會減少軟件的發(fā)布、重新驗證和重新發(fā)布的工作量。
(3)包之間的耦合性設(shè)計原則
[1]無環(huán)依賴原則(Acyclic Dependencies Principle,ADP)
包之間的依賴結(jié)構(gòu)必須是一個直接的無環(huán)圖形(DAG)。換成另一個說法是,包之間的依賴不能是一個環(huán)狀形式,否則對類的隔離會變得非常難。
[2]穩(wěn)定依賴原則(Stable Dependencies Principle,SDP)
對于任何包而言,如果它是可變的,就不應(yīng)該讓一個難以更改的包依賴它。否則,可變的包也會難以更改。
[3]穩(wěn)定抽象原則(Stable Abstractions Principle,ASP)
包的抽象程度應(yīng)該和其穩(wěn)定程度一致。穩(wěn)定的包應(yīng)該是抽象的,它的穩(wěn)定性使其靈活擴展。一個包的抽象程度越高,它的穩(wěn)定性越高。反之,它的穩(wěn)定性就低。
明確對象設(shè)計任務(wù)后,在對象設(shè)計原則的指導下使用程序設(shè)計工具才能實施對象設(shè)計??傊?,在對象設(shè)計階段繼續(xù)完善面向?qū)ο蠓椒ㄖ械?個基礎(chǔ)模型:對象模型、功能模型以及動態(tài)模型。
作者主頁
https://blog.csdn.net/weixin_61964996