聊一聊開閉原則(OCP).


簡述

在面向對象編程領域中,開閉原則規定“軟件中的對象(類,模塊,函數等等)應該對於擴展是開放的,但是對於修改是封閉的”,這意味着一個實體是允許在不改變它的源代碼的前提下變更它的行為。<百度百科>

最早提出(梅耶開閉原則)

開閉原則最早是出現在軟件行業術語里。一個叫伯特蘭·邁耶的法國人在他的1988年《面向對象軟件構造》中提出。一個類一旦完成,那么只能因為發生錯誤而修改它,新的特點或者新的功能應該是通過不同的類去實現。他呢主張通過extends的方式去來重寫原有的功能,已經實現過的功能應該是封閉的,注意是繼承而不一定是實現

重新定義(多態開閉原則)

到了20世紀90年代,開閉原則被廣泛的重新定義由於抽象化接口的使用,在這中間實現可以被改變,多種實現可以被創建,並且多態化的替換不同的實現。即我們有一個接口(抽象類)多個不同的實現,應對多個不同的場景,但是約定是一樣的!
同樣是吃飯比賽,有很多不同的吃法!這個已經接近現在編程的思想了!已經可以面向接口編程!

深入探討

OCP的兩個特點

對外擴展開放(Open for extension)

當我們的需求要改變時,那么我們可以對功能進行擴展,使得滿足新的功能。

對內修改關閉

對關注點進行擴展時,不必修改已有的核心代碼,而達到擴展新功能的目的。
來源:敏捷軟件開發-OCP

上面提到,軟件中的對象,從大到小無非就是模塊、類、函數。通過開閉原則的思想,即是已經完成的通過測試的軟件對象我們不應該是修改它,而是去擴展它!

那么到底什么是修改?在我們平時的開發過程,修改一個類的提交很正常!修改一個方法也很正常!那么怎么定義是擴展還是修改?很顯示這種定位是非常的困難!所謂國有國法、家有家規!我們可以借鑒前人的思想來斷定一些比較難以界定的問題。

抽象

由程序員的編碼經驗和所在的業務經驗所得出的結論,抽出不可變化的(即共同的),對外擴展出抽象方法!但做到這一點是不容易的,誰也不能100%的確定哪塊業務不會更改,哪塊業務不會變動!既然不可能,那就向盡可能的方向上去走!就算你是一個小白,當你第二次修改相同的代碼塊時,應該考慮在不修改原使代碼的前提下通過重寫、多態、繼承、組合等方式重新實現一次?這樣才能疊加自身的編程buffer!
通常我們都會認為,只要代碼能跑我就不會動,只要能加兩行代碼我就不會重新的去實現!但是有的時候盡管我們做了很多的過度的設計,也可能他代碼寫上去一輩子也不會動,但是還是用了某某設計模式去實現它,使得變的擴展性更強!我想這種做法是值提提倡的、因為它給我們自身帶來了很多的想法!假如某一天就用上了呢?這誰也說不定!有時候多想想是好的!

關閉修改、對外擴展?

  • 如果某功能有一個bug,那么我們在原來的代碼上打補丁,這種修改我認為是被允許的!

  • 如果要開發一個新功能,但是與已經存在的代碼80%的實現相同,投機取巧的我加了個入參,然后在原代碼里接着寫 if else代碼塊,那么我認為是不可取的!

  • 某一天我要在某個類里加個屬性,而不是修改某個屬性我也認為是可取的!

  • 還有很多...

大概什么是修改、什么是擴展,我想真的自己切身體會才能明白其中的道理!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM