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