引用:一位10年Java工作經驗的架構師聊Java和工作經驗
1.單一職責原則(Single?Responsibility?Principle?-?SRP)
原文:There?should?never?be?more?than?one?reason?for?a?class?to?change.
譯文:永遠不應該有多于一個原因來改變某個類。
理解:對于一個類而言实昨,應該僅有一個引起它變化的原因衅枫。說白了就是稚照,不同的類具備不同的職責唠椭,各施其責描孟。這就好比一個團隊益兄,大家分工協(xié)作戒洼,互不影響,各做各的事情枢劝。
應用:當我們做系統(tǒng)設計時井联,如果發(fā)現(xiàn)有一個類擁有了兩種的職責,那就問自己一個問題:可以將這個類分成兩個類嗎您旁?如果真的有必要烙常,那就分吧。千萬不要讓一個類干的事情太多鹤盒!
2.開放封閉原則(Open?Closed?Principle?-?OCP)
原文:Software?entities?like?classes,?modules?and?functions?should?be?open?for?extension?but?closed?for?modifications.
譯文:軟件實體蚕脏,如:類侦副、模塊與函數(shù),對于擴展應該是開放的驼鞭,但對于修改應該是封閉的秦驯。
理解:簡言之,對擴展開放挣棕,對修改封閉译隘。換句話說,可以去擴展類穴张,但不要去修改類细燎。
應用:當需求有改動两曼,要修改代碼了皂甘,此時您要做的是,盡量用繼承或組合的方式來擴展類的功能悼凑,而不是直接修改類的代碼偿枕。當然,如果能夠確保對整體架構不會產生任何影響户辫,那么也沒必要搞得那么復雜了渐夸,直接改這個類吧。
3.里氏替換原則(Liskov?Substitution?Principle?-?LSP)
原文:Functions?that?use?pointers?or?references?to?base?classes?must?be?able?to?use?objects?of?derived?classes?without?knowing?it.
譯文:使用基類的指針或引用的函數(shù)渔欢,必須是在不知情的情況下墓塌,能夠使用派生類的對象。
理解:父類能夠替換子類奥额,但子類不一定能替換父類苫幢。也就是說,在代碼中可以將父類全部替換為子類垫挨,程序不會報錯韩肝,也不會在運行時出現(xiàn)任何異常,但反過來卻不一定成立九榔。
應用:在繼承類時哀峻,務必重寫(Override)父類中所有的方法,尤其需要注意父類的?protected?方法(它們往往是讓您重寫的)哲泊,子類盡量不要暴露自己的?public?方法供外界調用剩蟀。
該原則由麻省理工學院的?Barbara?Liskov?女士提出,她是美國第一位獲取計算機博士學位的女性切威,曾經也獲得過計算機圖靈獎喻旷。
4.最少知識原則(Least?Knowledge?Principle?-?LKP)
原文:Only?talk?to?you?immediate?friends.
譯文:只與你最直接的朋友交流。
理解:盡量減少對象之間的交互牢屋,從而減小類之間的耦合且预。簡言之槽袄,一定要做到:低耦合,高內聚锋谐。
應用:在做系統(tǒng)設計時遍尺,不要讓一個類依賴于太多的其他類,需盡量減小依賴關系涮拗,否則乾戏,您死都不知道自己怎么死的。
該原則也稱為“迪米特法則(Law?of?Demeter)”三热,由?Ian?Holland?提出鼓择。這個人不太愿意和陌生人說話,只和他走得最近的朋友們交流就漾。
5.接口隔離原則(Interface?Segregation?Principle?-?ISP)
原文:The?dependency?of?one?class?to?another?one?should?depend?on?the?smallest?possible?interface.
譯文:一個類與另一個類之間的依賴性呐能,應該依賴于盡可能小的接口。
理解:不要對外暴露沒有實際意義的接口抑堡。也就是說摆出,接口是給別人調用的,那就不要去為難別人了首妖,盡可能保證接口的實用性吧偎漫。她好,我也好有缆。
應用:當需要對外暴露接口時象踊,需要再三斟酌,如果真的沒有必要對外提供的棚壁,就刪了吧杯矩。一旦您提供了,就意味著灌曙,您將來要多做一件事情菊碟,何苦要給自己找事做呢。
6.?依賴倒置原則(Dependence?Inversion?Principle?-?DIP)
原文:High?level?modules?should?not?depends?upon?low?level?modules.?Both?should?depend?upon?abstractions.?Abstractions?should?not?depend?upon?details.?Details?should?depend?upon?abstractions.
譯文:高層模塊不應該依賴于低層模塊在刺,它們應該依賴于抽象逆害。抽象不應該依賴于細節(jié),細節(jié)應該依賴于抽象蚣驼。
理解:應該面向接口編程魄幕,不應該面向實現(xiàn)類編程。面向實現(xiàn)類編程颖杏,相當于就是論事纯陨,那是正向依賴(正常人思維);面向接口編程,相當于通過事物表象來看本質翼抠,那是反向依賴咙轩,即依賴倒置(程序員思維)。
應用:并不是說阴颖,所有的類都要有一個對應的接口活喊,而是說,如果有接口量愧,那就盡量使用接口來編程吧钾菊。