"開(kāi)-閉"原則 (Open-Closed principle, OCP)


“開(kāi)-閉”原則 (Open-Closed principle, OCP)

  • 一個(gè)軟件實(shí)體應(yīng)當(dāng)對(duì)擴(kuò)展開(kāi)放,對(duì)修改關(guān)閉芥被。

Software entities should be open for extension, but closed for modification.
在設(shè)計(jì)一個(gè)模塊的時(shí)候,應(yīng)當(dāng)使這個(gè)模塊可以在不被修改的前提下被擴(kuò)展届腐。

  • “可變性的封裝原則”從工程的角度講解了如何實(shí)現(xiàn)“開(kāi)-閉”原則鸵隧。

“可變性的封裝原則”意味著兩點(diǎn):
* 一種可變性不應(yīng)當(dāng)散落在代碼的很多角落里粉臊,而應(yīng)當(dāng)被封裝到一個(gè)對(duì)象里面鹃两。繼承應(yīng)當(dāng)被看做是封裝變化的方法遗座,而不應(yīng)當(dāng)被認(rèn)為是從一般的對(duì)象生成特殊的對(duì)象方法。
* 一種可變性不應(yīng)當(dāng)與另一種可變性混合在一起俊扳。所有的類圖的繼承結(jié)構(gòu)一般不會(huì)超過(guò)兩層途蒋,不然就意味著將兩種不同的可變性混合在一起。


“開(kāi)-閉”原則與其他原則的關(guān)系:

  • 里氏代換原則是馋记,任何基類可以出現(xiàn)的地方号坡,子類一定可以出現(xiàn)。

里氏代換原則是對(duì)“開(kāi)-閉”原則的補(bǔ)充梯醒。實(shí)現(xiàn)“開(kāi)-閉”原則的關(guān)鍵步驟就是抽象化筋帖,而基類與子類的繼承關(guān)系就是抽象化的具體體現(xiàn),所以里氏代換原則是對(duì)實(shí)現(xiàn)抽象化的具體步驟的規(guī)范冤馏。違反里氏代換原則的,也違背“開(kāi)-閉”原則寄啼,反之不一定成立逮光。

  • 依賴倒轉(zhuǎn)原則是,要依賴于抽象墩划,不要依賴于實(shí)現(xiàn)涕刚。

“開(kāi)-閉”原則是目標(biāo),依賴倒轉(zhuǎn)原則是手段乙帮。

  • 合成/聚合復(fù)用原則是杜漠,要盡量使用合成/聚合,而不是繼承關(guān)系達(dá)到復(fù)用的目的察净。

合成/聚合復(fù)用原則與里氏代換原則相輔相成驾茴,兩者都是實(shí)現(xiàn)“開(kāi)-閉”原則的具體步驟的規(guī)范。

  • 迪米特法則是氢卡,一個(gè)軟件實(shí)體應(yīng)當(dāng)與盡可能少的其他實(shí)體發(fā)生相互作用锈至。

一個(gè)遵守迪米特原則設(shè)計(jì)出來(lái)的系統(tǒng)在功能需要擴(kuò)展時(shí),會(huì)相對(duì)更容易地做到對(duì)修改的關(guān)閉译秦。

  • 接口隔離原則是峡捡,應(yīng)當(dāng)為客戶端提供盡可能小的單獨(dú)的接口击碗,而不是提供大的總接口。

接口隔離原則與廣義的迪米特法則都是對(duì)一個(gè)軟件實(shí)體與其他的軟件實(shí)體的通信的限制们拙。遵循接口隔離原則稍途,會(huì)使一個(gè)軟件系統(tǒng)在功能擴(kuò)展的過(guò)程當(dāng)中,不會(huì)將修改的壓力傳遞到其他的對(duì)象砚婆。


一個(gè)重構(gòu)方法的討論

“將條件轉(zhuǎn)移語(yǔ)句改寫(xiě)成為多態(tài)性”是一條廣為流傳的代碼重構(gòu)做法械拍。
這一做法本身并不能保證“開(kāi)-閉”原則,應(yīng)當(dāng)以“開(kāi)-閉”原則判斷是否需要改寫(xiě)成多態(tài)射沟。條件轉(zhuǎn)移并不是錯(cuò)誤殊者,如果需要,完全可以選擇使用條件轉(zhuǎn)移验夯。
如果一個(gè)條件轉(zhuǎn)移語(yǔ)句確實(shí)封裝了某種商務(wù)邏輯的可變性猖吴,那么將此種可變性封裝起來(lái)就符合“開(kāi)-閉”原則設(shè)計(jì)思想了。如果一個(gè)條件轉(zhuǎn)移語(yǔ)句沒(méi)有涉及重要的商務(wù)邏輯挥转,或者不會(huì)隨著時(shí)間的變化而變化海蔽,也不意味著任何的可擴(kuò)展性,那么它就沒(méi)有涉及任何有意義的可變性绑谣。這時(shí)候?qū)⑦@個(gè)條件轉(zhuǎn)移語(yǔ)句改寫(xiě)成多態(tài)性就是一種沒(méi)有意義的浪費(fèi)党窜。

  • 抽象類應(yīng)當(dāng)擁有盡可能多的共同代碼

在一個(gè)繼承的等級(jí)結(jié)構(gòu)中,共同的代碼應(yīng)當(dāng)盡量向等級(jí)結(jié)構(gòu)的上方移動(dòng)借宵。把重復(fù)的代碼從子類里面移動(dòng)到超類里面幌衣,可以提高代碼的復(fù)用率。在代碼發(fā)生改變時(shí)壤玫,設(shè)計(jì)師只需要修改一個(gè)地方豁护。

  • 抽象類應(yīng)當(dāng)擁有盡可能少的數(shù)據(jù)

與代碼的移動(dòng)方向相反,數(shù)據(jù)的移動(dòng)方向是從抽象類到具體類欲间,向等級(jí)結(jié)構(gòu)的下方移動(dòng)楚里。一個(gè)對(duì)象的數(shù)據(jù)不論是否使用都會(huì)占用資源,所以應(yīng)當(dāng)放到等級(jí)結(jié)構(gòu)的低端猎贴。

  • 什么時(shí)候才應(yīng)當(dāng)使用繼承復(fù)用

1.子類是超類的一個(gè)特殊種類班缎,而不是超類的一個(gè)角色,Is-A才符合繼承關(guān)系她渴。
2.永遠(yuǎn)不會(huì)出現(xiàn)需要將子類換成另一個(gè)類的子類的情況达址。
3.子類具有擴(kuò)展超類的責(zé)任,而不是具有置換掉(Override)和注銷掉(Nullify)超類的責(zé)任趁耗。
4.只有在分類學(xué)角度上有意義時(shí)苏携,才可以使用繼承,不要從工具類繼承对粪。


里氏代換原則 (Liskov Substitution Principle, LSP)

  • 定義嚴(yán)格表達(dá):

如果對(duì)每一個(gè)類型為T(mén)1的對(duì)象O1右冻,都有類型為T(mén)2的對(duì)象O2装蓬,使得以T1定義的所有程序P在所有的對(duì)象O1都代換成O2時(shí),程序P的行為沒(méi)有變化纱扭,那么類型T2是類型T1的子類型牍帚。

簡(jiǎn)單說(shuō),任何基類可以出現(xiàn)的地方乳蛾,子類一定可以出現(xiàn)暗赶。

  • 從代碼重構(gòu)的角度理解:

西方著名的思辨,正方形是否是長(zhǎng)方形的子類的問(wèn)題肃叶。
這個(gè)例子意味著里氏代換與通常的數(shù)學(xué)法則和生活常識(shí)有不可混淆的區(qū)別蹂随。

應(yīng)當(dāng)盡量從抽象類繼承,而不從具體類繼承因惭。


轉(zhuǎn)自:
“開(kāi)-閉”原則
里氏代換原則


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末岳锁,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子蹦魔,更是在濱河造成了極大的恐慌激率,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件勿决,死亡現(xiàn)場(chǎng)離奇詭異乒躺,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)低缩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)嘉冒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人咆繁,你說(shuō)我怎么就攤上這事健爬。” “怎么了么介?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)蜕衡。 經(jīng)常有香客問(wèn)我壤短,道長(zhǎng),這世上最難降的妖魔是什么慨仿? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任久脯,我火速辦了婚禮,結(jié)果婚禮上镰吆,老公的妹妹穿的比我還像新娘帘撰。我一直安慰自己,他們只是感情好万皿,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布摧找。 她就那樣靜靜地躺著核行,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蹬耘。 梳的紋絲不亂的頭發(fā)上芝雪,一...
    開(kāi)封第一講書(shū)人閱讀 49,031評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音综苔,去河邊找鬼惩系。 笑死,一個(gè)胖子當(dāng)著我的面吹牛如筛,可吹牛的內(nèi)容都是我干的堡牡。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼杨刨,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼晤柄!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起拭嫁,我...
    開(kāi)封第一講書(shū)人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤可免,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后做粤,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體浇借,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年怕品,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了妇垢。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡肉康,死狀恐怖闯估,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情吼和,我是刑警寧澤涨薪,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站炫乓,受9級(jí)特大地震影響刚夺,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜末捣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一侠姑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧箩做,春花似錦莽红、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)醉蚁。三九已至,卻和暖如春柳畔,著一層夾襖步出監(jiān)牢的瞬間馍管,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工薪韩, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留确沸,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓俘陷,卻偏偏與公主長(zhǎng)得像罗捎,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子拉盾,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

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

  • 設(shè)計(jì)原則就是在設(shè)計(jì)模式背后更為深層的桨菜、更具有普遍性的、共同的思想原則捉偏,是提高軟件系統(tǒng)的可維護(hù)性和可復(fù)用性的指導(dǎo)原則...
    蘇先生Tongson閱讀 1,148評(píng)論 0 0
  • 我們?cè)趹?yīng)用開(kāi)發(fā)中倒得,一般要求盡量做到可維護(hù)性和可復(fù)用性 應(yīng)用程序的復(fù)用可以提高應(yīng)用程序的開(kāi)發(fā)效率和質(zhì)量,節(jié)約開(kāi)發(fā)成本...
    Yochi閱讀 518評(píng)論 0 0
  • 轉(zhuǎn)自:http://blog.csdn.net/jackfrued/article/details/4492194...
    王帥199207閱讀 8,498評(píng)論 3 93
  • 設(shè)計(jì)模式之六大原則(轉(zhuǎn)載) 關(guān)于設(shè)計(jì)模式的六大設(shè)計(jì)原則的資料網(wǎng)上很多...
    霄霄霄霄閱讀 894評(píng)論 0 1
  • 情不知所起夭禽,一往而深霞掺,生者可以死,死可以生讹躯。 站在26歲時(shí)間長(zhǎng)河的中流菩彬,看過(guò)往。往事如煙潮梯,隨風(fēng)而去骗灶;繁華落盡,歸于...
    L_T_J閱讀 198評(píng)論 0 0