SOLID
? ? ? ? 作為開篇审胚,這篇文章主要來介紹SOLID原則吓揪。 SOLID 原則提供了五條指導思想包帚,如果我們遵從它們的話镣典, 將可以顯著的提升我們軟件可維護性兔毙。
? ? ? ? SOLID原則是針對面向?qū)ο缶幊毯驮O計的五大依賴關系管理。SOLID首字母縮寫詞兄春,是由Robert Cecil Martin (也被稱為 “Bob叔叔” )提出的澎剥。每個字母代表另外一個三個字母的首字母縮寫, 用來描述一個原則赶舆。
? ? ? ? 當我們處理在一份依賴關系很糟糕的軟件時哑姚,代碼可能會變得僵化,脆弱芜茵,難以重用叙量。我們勢必會改變現(xiàn)有功能或添加新的功能,而僵化的代碼會讓這變得舉步維艱九串。脆弱的代碼很容易造成bug的產(chǎn)生绞佩,常見的情況是你一個區(qū)域的代碼發(fā)生變化時候,造成你其他模塊出現(xiàn)bug猪钮。如果你遵從SOLID原則品山,那么你可以編寫出更靈活更健壯的代碼,并且具有更高的重用性烤低。
Single Responsibility Principle
? ? ? ? 單一職責原則(SRP)聲明:“引起類變化的因素永遠不要多余一個”肘交。這意味著你需要設計你的類,使得每個類都只有一個目的扑馁。這并不意味著每個類應該只有一個方法涯呻,而是說類中所有的方法都要與該類的主要功能相關。那些有多個職責的類檐蚜,應該被分成新的類魄懂。
? ? ? ? 當一個類具有了多項職責,它需要被更改的可能性也隨之增加闯第。每次一個類的修改也會使得bug產(chǎn)生的風險增加市栗。而通過集中職責與一點會使得風險被有效的限制。
Open / Closed Principle
? ? ? ? 開閉原則(OCP)指出:“軟件實體(classes, modules, functions etc.)應該對拓展開放,對修改關閉”填帽。該規(guī)則的“封閉”部分規(guī)定蛛淋,一旦模塊被開發(fā)和測試完成,代碼被修改的原因應該只有修復bug這一種情況篡腌。 “開放”部分說褐荷,您應該能夠擴展現(xiàn)有代碼(而不是修改之前的代碼)以引入新功能。與SRP一樣嘹悼,該原理通過限制對現(xiàn)有代碼的更改來降低引入新錯誤的風險叛甫。
Liskov Substitution Principle
? ? ? 里氏替換原則(LSP)聲明:“所有引用基類的地方必須能透明地使用其子類的對象”。如果你創(chuàng)建了一個給定類型關系的類杨伙,那么你應該可以提供該類型或任意該類型子類的對象其监,而不會出現(xiàn)意外的結(jié)果,并且沒有依賴的類知道被提供依賴類的確切類型限匣。如果必須檢查依賴關系的類型抖苦,以便可以根據(jù)類型修改行為,或者如果子類型產(chǎn)生意外的規(guī)則或副作用米死,則代碼可能變得更加復雜锌历,僵化和脆弱。
Dependency Inversion Principle?
? ? ? ? 依賴倒置原則(DIP)有兩條聲明峦筒。第一個是高級模塊不應該依賴于低級模塊究西。兩者都應該依賴于抽象。第二部分規(guī)則是抽象不應該依賴于細節(jié)勘天。細節(jié)應該依賴于抽象怔揩。
? ? ? ? DIP主要涉及到應用中層次化的概念,其中較低級別的模塊處理細節(jié)的功能脯丝,較高級別的模塊使用較低級別的類來實現(xiàn)更大的任務。該原則規(guī)定了在類之間存在依賴關系的情況下伏伐,應使用抽象(如接口)來定義它們宠进,而不是直接引用類。 這減少了由較低級別模塊的變化導致的錯誤藐翎,導致較高層的錯誤材蹬。 DIP經(jīng)常在依賴注入中被使用。
? ? ? Interface Segregation Principle ?
接口分離原則(ISP)指出:“客戶端不應該強制依賴那些他們沒有使用到的接口”吝镣。這個規(guī)則意味著當一個類依賴另一個類時堤器,接口中可以被依賴類顯示的成員的數(shù)量應該被最小化。通常當您創(chuàng)建一個具有大量方法和屬性的類時末贾,該類將被其他類使用闸溃,并且只訪問其一個或兩個成員。隨著他們意識到的成員數(shù)量的增加,這些類更加緊密地耦合在一起辉川。當您遵循ISP時表蝙,大類實現(xiàn)了多個更小的接口,根據(jù)用途對功能進行分組乓旗。依賴關系與那些相關聯(lián)用于松耦合府蛇,增加健壯性,靈活性以及可復用性屿愚。