The principles of class design:
SRP(Single Responsibility Principle)單一職責原則:
一個類應該有且僅有一個職責。所謂一個類的職責是指引起該類變化的原因,如果一個類具有一個以上的職責,那麼就會有多個不同的原因引起該類變化,其實就是耦合了多個互不相關的職責,就會降低這個類的內聚性。
OCP(Open - Colse Principle) 開放-封閉原則:
軟體實體(類、模組、函數等等)應該是可以對模組進行快速擴充的,但是不可修改的。
遵循OCP原則的模組具有兩個主要特徵.他們是:
1. "對於擴充是開放的"(Open for extension)
這意味著模組的行為是可以擴充的。當應用的需求改變是,我們可以擴充,使其具有滿足哪些改變的新行為。換句話說,
我們可以改變模組的功能。
2. "對於更改是封閉的"(Close for modification)"。
對模組進行擴充時,不必改動模組的原始碼或者二進位代碼。模組的二進位代碼可執行版本,無論時可串連的庫、dll或者
java的.jar檔案都無需改動。
OCP背後的機制主要是抽象(abstraction)和多態(polymorphism)。
LSP(Liskov Substitution Principle) 裡氏替換原則:
子類型(subtype)必須能夠替換掉他們的基底類型(base type)。 若對每個類型S的對象O1,都存在一個類型T的對象O2,使
得在所有針對T編寫的程式P中,用O1替換O2後,程式P行為功能不變,則S是T的子類型。
DIP(Dependency-Inversion Principles) 依賴倒置原則:
1.高層模組不應該依賴於低層模組。二者都應該依賴於抽象。
2.抽象不應該依賴於細節, 細節應該依賴於抽象。
由DIP可知:
任何變數都不應該持有一個指向具體類的指標或者引用.
任何類都不應該從具體類派生。
任何方法都不應該複寫它的基類中的已經實現的方法。
ISP (Interface Segregation Principles) 介面隔離原則:
不要強迫客戶依賴於它們不用的方法。介面屬於客戶,不屬於它所在的類階層。
如果強迫客戶程式依賴於那些它們不使用的方法,那麼這些客戶程式就面臨著由於這些未使用方法的改變所帶來的變更。這
無意中導致了所有客戶程式之間的耦合。換句話說,如果一個客戶程式依賴於一個含有它不使用的方法的類,但是其他客戶
程式卻要使用該方法,那麼當其他客戶要求這個類改變時,就會影響到這個客戶程式。我們希望儘可能地避免這種耦合,因
此我們希望分離介面。
The principles of package cohesion:
REP (Reuse Release Equivalence Principle) 重用發布等價原則: 重用粒度就是發布粒度.
一個包的重用粒度(granule of reuse)和發布粒度(granule of release)一樣大。我們所重用的任何東西都必須同時被發布
和跟蹤。如果一個包中的軟體是用來重用的,那麼它就不能再包含不是為了重用目的而設計的軟體。一個包中的軟體要麼都
是可重用,要麼都是不可重用。
CRP(Common Reuse Principle)共同重用原則:
一個包中的所有類應該是共同重用的。如果重用了包中的一個類,那麼就要重用包中的所有類。相互之間沒有緊密練習的類
不應該放在同一包裡。
CCP(Common Closure Principle) 共同封閉原則:
包中的所有類對於同一類性質的變化應該是共同封閉的。一個變化若對一個包產生影響,則將對該包中的所有類產生影響,
而對於其他的包不造成任何影響。 如果兩個類之間有非常緊密的綁定關係,不管是再物理上的還是概念上的,那麼他們總
是會一同進行變化,因而他們應該屬於同一包中。這樣做會減少軟體的發布、重新驗證、重新發布的工作量。
The principles of package coupling:
ADP(Acyclic Dependencies Principle)無環依賴原則:
在包的依賴關係圖中不允許出現環。出現了環,實際上把環內的包合成了一個大包。這種環使得對模組的隔離變得非常難;
單元測試和發布變得非常困難而且易於出錯;包的構建沒有恰當的順序。
解除依賴環: 使用DIP原則,依賴於抽象;或重新建立所要依賴的包。
SDP (Stable Dependencies Principle )穩定依賴原則: 朝著穩定的方向進行依賴。
對於任何包而言,如果它是可變的,就不應該讓一個難以更改的包依賴於它!否則,可變的包同樣也會難以更改。
計算包的位置穩定性:
(Ca)輸入耦合度(Afferent Coupling): 指處於該包的外部並依賴於該包內的類的類的數目。
(Ce)輸出耦合度(Efferent Coupling): 指處於該包的內部並依賴於該包外的類的類的數目。
(不穩定性I)
I = Ce/(Ca + Ce)
SDP規定一個包的I度量值應該大於它所依賴的包的I的量度值(也就是說,I度量應該順著依賴的方向減少)。
SAP (Stable Abstractions Principle)穩定抽象原則:
包的抽象程度應該和其穩定程度一致。該原則把包的穩定性和抽象性聯絡起來。它規定,一個穩定的包應該也是抽象的,這樣
它的穩定性就使其可以靈活擴充。另一方面,一個不穩定的包應該是具體的,因為它的不穩定性使得其內部的具體代碼易於修
改。