程序設(shè)計(jì)原則-開閉原則
掃描二維碼
隨時(shí)隨地手機(jī)看文章
前言
軟件開發(fā)設(shè)計(jì)中最大的難題就是應(yīng)對需求的變化,而各種各樣的需求變化又是不可預(yù)料的,我們要為這種不可預(yù)料的變化做好準(zhǔn)備,這本身是一件十分痛苦的事情,通常涉及到功能的變更、擴(kuò)展和刪除等,所幸前輩們已經(jīng)給我們提出了經(jīng)典的六大設(shè)計(jì)原則和23種設(shè)計(jì)模式來“封裝”未來的變化。
在程序設(shè)計(jì)領(lǐng)域, SOLID(單一功能、開閉原則、里氏替換、接口隔離以及依賴反轉(zhuǎn))是由羅伯特·C·馬丁在21世紀(jì)早期引入的記憶術(shù)首字母縮略字,指代了面向?qū)ο缶幊毯兔嫦驅(qū)ο笤O(shè)計(jì)的五個(gè)基本原則。六大設(shè)計(jì)原則中多了一個(gè)“迪米特法則”。
本文只針對六大設(shè)計(jì)原則的開閉原則進(jìn)行介紹。
六大設(shè)計(jì)原則和23種設(shè)計(jì)模式主要適用于面向?qū)ο蟮木幊陶Z言,而非面向過程語言,即C語言。
熟練理解6大設(shè)計(jì)原則后,在面向過程語言中也能有一定的借鑒。
定義
在面向?qū)ο缶幊填I(lǐng)域中,開閉原則 (The Open/Closed Principle, OCP) 規(guī)定“軟件中的對象(類,模塊,函數(shù)等等)應(yīng)該對于擴(kuò)展是開放的,但是對于修改是封閉的”,這意味著一個(gè)實(shí)體是允許在不改變它的源代碼的前提下變更它的行為。該特性在產(chǎn)品化的環(huán)境中是特別有價(jià)值的,在這種環(huán)境中,改變源代碼需要代碼審查,單元測試以及諸如此類的用以確保產(chǎn)品使用品質(zhì)的過程。遵循這種原則的代碼在擴(kuò)展時(shí)并不發(fā)生改變,因此無需上述的過程。
對擴(kuò)展開放:模塊對擴(kuò)展開放,就意味著需求變化時(shí),可以對模塊擴(kuò)展,使其具有滿足那些改變的新行為。換句話說,模塊通過擴(kuò)展的方式去應(yīng)對需求的變化。
對修改關(guān)閉:模塊對修改關(guān)閉,表示當(dāng)需求變化時(shí),關(guān)閉對模塊源代碼的修改,當(dāng)然這里的“關(guān)閉”應(yīng)該是盡可能不修改的意思,也就是說,應(yīng)該盡量在不修改源代碼的基礎(chǔ)上面擴(kuò)展組件。
原則
在軟件的生命周期內(nèi),因?yàn)樽兓?、升級和維護(hù)等原因需要對軟件原有代碼進(jìn)行修改時(shí),可能會給舊代碼中引入錯(cuò)誤,也可能會使我們不得不對整個(gè)功能進(jìn)行重構(gòu),并且需要原有代碼經(jīng)過重新測試。
此原則的核心就是對擴(kuò)展開放和對更改封閉;面對需求,對程序的改動(dòng)是通過增加新代碼進(jìn)行的,而不是更改現(xiàn)有的代碼。這就是“開放-封閉原則”的精神所在。
該原則就要求在最開始設(shè)計(jì)程序的時(shí)候,盡量考慮更加全面,并且在實(shí)際編程中不斷去優(yōu)化甚至重構(gòu)之前的實(shí)現(xiàn)方式(當(dāng)然在時(shí)間較為充裕的情況下),并不是僅僅功能實(shí)現(xiàn)后就不管不顧了。
有很多的設(shè)計(jì)方式就是根據(jù)這些設(shè)計(jì)原則慢慢總結(jié)歸納的,比如表驅(qū)動(dòng)編程、狀態(tài)機(jī)編程等,在盡量不影響原有的程序下,添加數(shù)據(jù)或者刪除數(shù)據(jù)。修改后甚至代碼只需要測試新增的數(shù)據(jù)是否有效等。
優(yōu)點(diǎn)
-
對軟件測試友好
軟件遵守開閉原則的話,軟件測試時(shí)只需要對擴(kuò)展的代碼進(jìn)行測試就可以了,因?yàn)樵械臏y試代碼仍然能夠正常運(yùn)行。
-
可復(fù)用性好
我們可以在軟件完成以后,仍然可以對軟件進(jìn)行擴(kuò)展,加入新的功能,非常靈活。因此,這個(gè)軟件系統(tǒng)就可以通過不斷地增加新的組件,來滿足不斷變化的需求。
-
可維護(hù)性好
由于程序代碼的基礎(chǔ)框架考慮完善,基本上很少去修改這部分核心的代碼內(nèi)容,因此,我們不用擔(dān)心軟件系統(tǒng)中原有核心代碼的穩(wěn)定性,這就使變化中的軟件系統(tǒng)有一定的穩(wěn)定性和延續(xù)性。
總結(jié)
在最開始設(shè)計(jì)程序的時(shí)候,盡量考慮更加全面,并且在實(shí)際編程中不斷去優(yōu)化甚至重構(gòu)之前的實(shí)現(xiàn)方式,但是?。。?!考慮的時(shí)候也要適當(dāng)進(jìn)行取舍,思考設(shè)計(jì)的代碼以后是否會用到,或者擴(kuò)展功能時(shí)需要,有時(shí)候考慮太多反而限制了實(shí)際的編程進(jìn)度,在思考初步基本框架后,就可以開始編程,在編程過程中思考。
通常程序設(shè)計(jì),特別是對于功能擴(kuò)展,需要多年的程序設(shè)計(jì)經(jīng)驗(yàn)、同時(shí)有這個(gè)行業(yè)多年的業(yè)務(wù)要求經(jīng)驗(yàn),這樣才會在開發(fā)過程中想象到之后大概率會存在哪些需求,從而搭建這部分的基礎(chǔ)框架。





