1.如何理解“對(duì)擴(kuò)展開放、修改關(guān)閉”督暂?
SOLID 原則并非單純的 1 個(gè)原則揪垄,而是由 5 個(gè)設(shè)計(jì)原則組成的,它們分別是:單一職責(zé)原則逻翁、開閉原則饥努、里式替換原則、接口隔離原則和依賴反轉(zhuǎn)原則八回,依次對(duì)應(yīng) SOLID 中的 S酷愧、O驾诈、L、I溶浴、D 這 5 個(gè)英文字母乍迄。
開閉原則的英文全稱是 Open Closed Principle,簡(jiǎn)寫為 OCP士败。它的英文描述是:software entities (modules, classes, functions, etc.) should be open for extension , but closed for modification闯两。我們把它翻譯成中文就是:軟件實(shí)體(模塊、類谅将、方法等)應(yīng)該“對(duì)擴(kuò)展開放漾狼、對(duì)修改關(guān)閉”.
添加一個(gè)新的功能,應(yīng)該是通過(guò)在已有代碼基礎(chǔ)上擴(kuò)展代碼(新增模塊饥臂、類逊躁、方法、屬性等)隅熙,而非修改已有代碼(修改模塊稽煤、類、方法猛们、屬性等)的方式來(lái)完成念脯。
關(guān)于定義,我們有兩點(diǎn)要注意弯淘。第一點(diǎn)是,開閉原則并不是說(shuō)完全杜絕修改吉懊,而是以最小的修改代碼的代價(jià)來(lái)完成新功能的開發(fā)庐橙。第二點(diǎn)是,同樣的代碼改動(dòng)借嗽,在粗代碼粒度下态鳖,可能被認(rèn)定為“修改”;在細(xì)代碼粒度下恶导,可能又被認(rèn)定為“擴(kuò)展”浆竭。
2. 如何做到“對(duì)擴(kuò)展開放、修改關(guān)閉”惨寿?
我們要時(shí)刻具備擴(kuò)展意識(shí)邦泄、抽象意識(shí)、封裝意識(shí)(偏頂層的指導(dǎo)思想)裂垦。在寫代碼的時(shí)候顺囊,我們要多花點(diǎn)時(shí)間思考一下,這段代碼未來(lái)可能有哪些需求變更蕉拢,如何設(shè)計(jì)代碼結(jié)構(gòu)特碳,事先留好擴(kuò)展點(diǎn)诚亚,以便在未來(lái)需求變更的時(shí)候,在不改動(dòng)代碼整體結(jié)構(gòu)午乓、做到最小代碼改動(dòng)的情況下站宗,將新的代碼靈活地插入到擴(kuò)展點(diǎn)上。
很多設(shè)計(jì)原則益愈、設(shè)計(jì)思想梢灭、設(shè)計(jì)模式,都是以提高代碼的擴(kuò)展性為最終目的的腕唧。特別是 23 種經(jīng)典設(shè)計(jì)模式或辖,大部分都是為了解決代碼的擴(kuò)展性問(wèn)題而總結(jié)出來(lái)的,都是以開閉原則為指導(dǎo)原則的枣接。最常用來(lái)提高代碼擴(kuò)展性的方法有:多態(tài)颂暇、依賴注入、基于接口而非實(shí)現(xiàn)編程但惶,以及大部分的設(shè)計(jì)模式(比如耳鸯,裝飾、策略膀曾、模板县爬、職責(zé)鏈、狀態(tài))添谊。
3. 討論區(qū)記錄
@下雨天
對(duì)拓展開放是為了應(yīng)對(duì)變化(需求)财喳,對(duì)修改關(guān)閉是為了保證已有代碼的穩(wěn)定性;最終結(jié)果是為了讓系統(tǒng)更有彈性斩狱!
@辣么大
開閉原則:基于接口或抽象實(shí)現(xiàn)“封閉”耳高,基于實(shí)現(xiàn)接口或繼承實(shí)現(xiàn)“開放”(拓展)。通過(guò)“抽象-具體”體現(xiàn)了開閉原則所踊,增加了軟件的可維護(hù)性泌枪。
@Kingram
為什么要遵循開閉原則?
1秕岛、修改原有復(fù)雜的業(yè)務(wù)代碼本來(lái)就存在一定的風(fēng)險(xiǎn)碌燕,同時(shí)耗費(fèi)精力,可能影響到別的你不知道的地方继薛,導(dǎo)致程序運(yùn)行故障修壕。
2、修改代碼同時(shí)單元測(cè)試也要跟著修改惋增,浪費(fèi)時(shí)間精力叠殷。
3、可擴(kuò)展性差的代碼同時(shí)封裝性也會(huì)差诈皿,違背面向?qū)ο笤O(shè)計(jì)原則林束。
補(bǔ)充:但是注意不要過(guò)度設(shè)計(jì)呦