軟件開發(fā)中的原則

一. 開閉原則

開閉原則(Open Closed Principle,OCP)由勃蘭特·梅耶(Bertrand Meyer)提出,他在 1988 年的著作《面向對象軟件構造》(Object Oriented Software Construction)中提出:軟件實體應當對擴展開放,對修改關閉(Software entities should be open for extension狮荔,but closed for modification)殖氏,這就是開閉原則的經(jīng)典定義受葛。

一下這些可以看作實體:

  1. 項目中劃分出的模塊
  2. 類與接口
  3. 方法
    開閉原則是面向對象程序設計的終極目標偎谁,它使軟件實體擁有一定的適應性和靈活性的同時具備穩(wěn)定性和延續(xù)性巡雨。具體來說铐望,其作用如下正蛙。
    舉個例子:


    image.png

    如果A類有一個方法乒验,用來實現(xiàn):開二輪雅迪去上學锻全。
    現(xiàn)在想實現(xiàn)一個功能鳄厌,開法拉利去上學了嚎。如果在A方法內(nèi)修改歪泳,不符合開閉原則。
    如果單獨又定義了一個方法邀窃,實現(xiàn)開法拉利上學瞬捕,(在方法層面上)就符合開閉原則肪虎。

再舉一個例子:
如果A類中有方法abc功能是上學上學扇救,如果我不動A的代碼(更改b橢圓方法中的內(nèi)容)實現(xiàn)游泳去上學迅腔。
那么本次功能改動沧烈,在A類的層面锌雀,符合開閉原則腋逆,因為A類可以做到牍汹,對修改關閉慎菲,對拓展開放露该,因為我們沒有改動A類,就實現(xiàn)了擴展包警。

image.png
  1. 對軟件測試的影響
    軟件遵守開閉原則的話特铝,軟件測試時只需要對擴展的代碼進行測試就可以了,因為原有的測試代碼仍然能夠正常運行灵莲。
  2. 可以提高代碼的可復用性
    粒度越小政冻,被復用的可能性就越大赠幕;在面向對象的程序設計中榕堰,根據(jù)原子和抽象編程可以提高代碼的可復用性竖慧。
  3. 可以提高軟件的可維護性
    遵守開閉原則的軟件,其穩(wěn)定性高和延續(xù)性強逆屡,從而易于擴展和維護。

可以通過“抽象約束砍的、封裝變化”的指導方法,實現(xiàn)開閉原則
通過接口或者抽象類為軟件實體定義一個相對穩(wěn)定的抽象層莺治,而將相同的可變因素封裝在相同的具體實現(xiàn)類中

二. 里氏替換原則

1床佳、里氏替換原則的定義

里氏替換原則(Liskov Substitution Principle搁进,LSP)由麻省理工學院計算機科學實驗室的里斯科夫(Liskov)女士在 1987 年的“面向對象技術的高峰會議”(OOPSLA)上發(fā)表的一篇文章《數(shù)據(jù)抽象和層次》(Data Abstraction and Hierarchy)里提出來的影兽,她提出:繼承必須確保超類所擁有的性質(zhì)在子類中仍然成立(Inheritance should ensure that any property proved about supertype objects also holds for subtype objects)驮吱。

里氏替換原則主要闡述了有關繼承的一些原則茧妒,也就是什么時候應該使用繼承萧吠,什么時候不應該使用繼承左冬,以及其中蘊含的原理纸型。里氏替換原是繼承復用的基礎,它反映了基類與子類之間的關系除破,是對開閉原則的補充牧氮,是對實現(xiàn)抽象化的具體步驟的規(guī)范。

2. 里氏替換原則的作用

1>里氏替換原則是實現(xiàn)開閉原則的重要方式之一瑰枫。
2>它克服了繼承中重寫父類造成的可復用性變差的缺點踱葛。
3>它是動作正確性的保證。即類的擴展不會給已有的系統(tǒng)引入新的錯誤光坝,降低了代碼出錯的可能性尸诽。
4>加強程序的健壯性,同時變更時可以做到非常好的兼容性盯另,提高程序的維護性性含、可擴展性,降低需求變更時引入的風險鸳惯。

3.里氏替換原則的實現(xiàn)方法

里氏替換原則通俗來講就是:子類可以擴展父類的功能商蕴,但不能改變父類原有的功能。也就是說:子類繼承父類時芝发,除添加新的方法完成新增功能外绪商,盡量不要重寫父類的方法。

4. 根據(jù)上述理解后德,對里氏替換原則的定義可以總結如下:

子類可以實現(xiàn)父類的抽象方法部宿,但不能覆蓋父類的非抽象方法
子類中可以增加自己特有的方法
當子類的方法重載父類的方法時,方法的前置條件(即方法的輸入?yún)?shù))要比父類的方法更寬松
當子類的方法實現(xiàn)父類的方法時(重寫/重載或實現(xiàn)抽象方法)瓢湃,方法的后置條件(即方法的的輸出/返回值)要比父類的方法更嚴格或相等
里氏代換原則告訴我們理张,在軟件中將一個基類對象替換成它的子類對象,程序將不會產(chǎn)生任何錯誤和異常绵患,反過來則不成立
此原則可以檢驗你寫的繼承是否用對了雾叭。

三. 依賴倒置原則

1.原始定義為:

高層模塊不應該依賴低層模塊,兩者都應該依賴其抽象落蝙;抽象不應該依賴細節(jié)织狐,細節(jié)應該依賴抽象(High level modules shouldnot depend upon low level modules.Both should depend upon abstractions.Abstractions should not depend upon details. Details should depend upon abstractions)。其核心思想是:要面向接口編程筏勒,不要面向實現(xiàn)編程移迫。

依賴倒置原則是實現(xiàn)開閉原則的重要途徑之一,它降低了客戶與實現(xiàn)模塊之間的耦合管行。
由于在軟件設計中厨埋,細節(jié)具有多變性,而抽象層則相對穩(wěn)定捐顷,因此以抽象為基礎搭建起來的架構要比以細節(jié)為基礎搭建起來的架構要穩(wěn)定得多荡陷。這里的抽象指的是接口或者抽象類雨效,而細節(jié)是指具體的實現(xiàn)類。
使用接口或者抽象類的目的是制定好規(guī)范和契約废赞,而不去涉及任何具體的操作徽龟,把展現(xiàn)細節(jié)的任務交給它們的實現(xiàn)類去完成。

2.好處:

依賴倒置原則可以降低類間的耦合性唉地。
依賴倒置原則可以提高系統(tǒng)的穩(wěn)定性据悔。
依賴倒置原則可以減少并行開發(fā)引起的風險。
依賴倒置原則可以提高代碼的可讀性和可維護性耘沼。

3.如何操作:

依賴倒置原則的目的是通過要面向接口的編程來降低類間的耦合性屠尊,所以我們在實際編程中只要遵循以下4點,就能在項目中滿足這個規(guī)則耕拷。
每個類盡量提供接口或抽象類讼昆,或者兩者都具備。
變量的聲明類型盡量是接口或者是抽象類骚烧。
任何類都不應該從具體類派生浸赫。
使用繼承時盡量遵循里氏替換原則。

四. 單一職責原則

1.定義

單一職責原則(Single Responsibility Principle赃绊,SRP)又稱單一功能原則既峡,由羅伯特·C.馬丁(Robert C. Martin)于《敏捷軟件開發(fā):原則碧查、模式和實踐》一書中提出的运敢。這里的職責是指類變化的原因,單一職責原則規(guī)定一個類應該有且僅有一個引起它變化的原因忠售,否則類應該被拆分(There should never be more than one reason for a class to change)传惠。

2. 定義解釋:

該原則提出對象不應該承擔太多職責,如果一個對象承擔了太多的職責稻扬,至少存在以下兩個缺點:
一個職責的變化可能會削弱或者抑制這個類實現(xiàn)其他職責的能力卦方;
當客戶端需要該對象的某一個職責時,不得不將其他不需要的職責全都包含進來泰佳,從而造成冗余代碼或代碼的浪費盼砍。

五.接口隔離原則

接口隔離原則(Interface Segregation Principle,ISP)要求程序員盡量將臃腫龐大的接口拆分成更小的和更具體的接口逝她,讓接口中只包含客戶感興趣的方法浇坐。

2002 年羅伯特·C.馬丁給“接口隔離原則”的定義是:客戶端不應該被迫依賴于它不使用的方法(Clients should not be forced to depend on methods they do not use)。該原則還有另外一個定義:一個類對另一個類的依賴應該建立在最小的接口上(The dependency of one class to another one should depend on the smallest possible interface)黔宛。

以上兩個定義的含義是:要為各個類建立它們需要的專用接口近刘,而不要試圖去建立一個很龐大的接口供所有依賴它的類去調(diào)用。

接口隔離原則和單一職責都是為了提高類的內(nèi)聚性、降低它們之間的耦合性跌宛,體現(xiàn)了封裝的思想,但兩者是不同的:
單一職責原則注重的是職責积仗,而接口隔離原則注重的是對接口依賴的隔離疆拘。
單一職責原則主要是約束類,它針對的是程序中的實現(xiàn)和細節(jié)寂曹;接口隔離原則主要約束接口哎迄,主要針對抽象和程序整體框架的構建。

六.迪米特法則(最少知道原則)

一個軟件實體應當盡可能少地與其他實體發(fā)生相互作用

如果一個系統(tǒng)符合迪米特法則隆圆,那么當其中某一個模塊發(fā)生修改時漱挚,就會盡量少地影響其他模塊,擴展會相對容易渺氧,這是對軟件實體之間通信的限制旨涝,迪米特法則要求限制軟件實體之間通信的寬度和深度。迪米特法則可降低系統(tǒng)的耦合度侣背,使類與類之間保持松散的耦合關系白华。
。在類的結構設計上贩耐,每一個類都應當盡量降低其成員變量和成員函數(shù)的訪問權限弧腥。在類的設計上,只要有可能潮太,一個類型應當設計成不變類管搪。在對其他類的引用上,一個對象對其他對象的引用應當降到最低铡买。

七.合成復用法則

盡量首先使用合成/聚合的方式更鲁,而不是使用繼承。

八.原則 - 學習心得

六大原則中奇钞,開閉原則岁经、里氏替換原則、依賴倒置原則 聯(lián)系比較緊密蛇券,后兩者是實現(xiàn)開閉原則重要前提缀壤,使用中通過抽象化設計具有很好的可拓展性和可維護性。
知道最少原則 可以降低耦合纠亚,減少不必要的交互塘慕,主張設計接口和類要簡單易使用,將復雜的邏輯封裝并提供簡單易用的接口蒂胞。
單一職責原則 使項目中的類和方法根據(jù)職責細分图呢,避免單個類負擔過重。職責越多,被復用的可能性就越小或使用起來越麻煩蛤织。
接口分離原則 將功能復雜的接口細分成多個特定功能的接口赴叹,只做該做的事情,降低耦合指蚜,但是細化粒度不能太細乞巧,容易導致接口過多。單一職責原則強調(diào)單個類內(nèi)部根據(jù)職責細分的設計摊鸡,接口分離原則強調(diào)類之間的耦合绽媒,盡量建立最小的依賴關系。

  • 類結構型模式關心類的組合免猾,由多個類可以組合成一個更大的系統(tǒng)是辕,在類結構型模式中一般只存在繼承關系和實現(xiàn)關系。
  • 對象結構型模式關心類與對象的組合猎提,通過關聯(lián)關系使得在一 個類中定義另一個類的實例對象获三,然后通過該對象調(diào)用其方法。 根據(jù)“合成復用原則”锨苏,在系統(tǒng)中盡量使用關聯(lián)關系來替代繼 承關系石窑,因此大部分結構型模式都是對象結構型模式。
  1. 信號盡量以原始的方式進行傳遞蚓炬。在當前頁面進行加工松逊。
  2. bean對象,在多次需要的地方肯夏,可以采用文件cache的方法傳遞经宏。
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市驯击,隨后出現(xiàn)的幾起案子烁兰,更是在濱河造成了極大的恐慌,老刑警劉巖徊都,帶你破解...
    沈念sama閱讀 221,548評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件沪斟,死亡現(xiàn)場離奇詭異,居然都是意外死亡暇矫,警方通過查閱死者的電腦和手機主之,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來李根,“玉大人槽奕,你說我怎么就攤上這事》拷危” “怎么了粤攒?”我有些...
    開封第一講書人閱讀 167,990評論 0 360
  • 文/不壞的土叔 我叫張陵所森,是天一觀的道長。 經(jīng)常有香客問我夯接,道長焕济,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,618評論 1 296
  • 正文 為了忘掉前任盔几,我火速辦了婚禮晴弃,結果婚禮上,老公的妹妹穿的比我還像新娘问欠。我一直安慰自己,他們只是感情好粒蜈,可當我...
    茶點故事閱讀 68,618評論 6 397
  • 文/花漫 我一把揭開白布顺献。 她就那樣靜靜地躺著,像睡著了一般枯怖。 火紅的嫁衣襯著肌膚如雪注整。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,246評論 1 308
  • 那天度硝,我揣著相機與錄音肿轨,去河邊找鬼。 笑死蕊程,一個胖子當著我的面吹牛椒袍,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播藻茂,決...
    沈念sama閱讀 40,819評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼驹暑,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了辨赐?” 一聲冷哼從身側響起优俘,我...
    開封第一講書人閱讀 39,725評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎掀序,沒想到半個月后帆焕,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,268評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡不恭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,356評論 3 340
  • 正文 我和宋清朗相戀三年叶雹,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片换吧。...
    茶點故事閱讀 40,488評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡浑娜,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出式散,到底是詐尸還是另有隱情筋遭,我是刑警寧澤,帶...
    沈念sama閱讀 36,181評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站漓滔,受9級特大地震影響编饺,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜响驴,卻給世界環(huán)境...
    茶點故事閱讀 41,862評論 3 333
  • 文/蒙蒙 一透且、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧豁鲤,春花似錦秽誊、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至楣号,卻和暖如春最易,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背炫狱。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評論 1 272
  • 我被黑心中介騙來泰國打工藻懒, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人视译。 一個月前我還...
    沈念sama閱讀 48,897評論 3 376
  • 正文 我出身青樓嬉荆,卻偏偏與公主長得像,于是被迫代替她去往敵國和親酷含。 傳聞我的和親對象是個殘疾皇子庵芭,可洞房花燭夜當晚...
    茶點故事閱讀 45,500評論 2 359

推薦閱讀更多精彩內(nèi)容