軟件工程中的開放與封閉原則是一個(gè)開發(fā)前的指南,當(dāng)你進(jìn)行工程開發(fā)時(shí)要依據(jù)這個(gè)原則,
開放與封閉
。開放封閉就是對擴(kuò)展開放對修改封閉,目的是指導(dǎo)開發(fā)一個(gè)當(dāng)需求增加時(shí),不需要修改原有代碼而進(jìn)行代碼擴(kuò)展即可實(shí)現(xiàn)。為什么不去修改原代碼呢?
舉一個(gè)badCase:
開發(fā)一個(gè)庫,里面定義了加法,用戶調(diào)用你這個(gè)庫實(shí)現(xiàn)了他的1+1的需求,這時(shí)候業(yè)務(wù)擴(kuò)大了另一個(gè)客戶需要加法的同時(shí)也希望能夠使用減法,作為一個(gè)合格的開發(fā)產(chǎn)品,你不會說為這個(gè)公司再單獨(dú)開發(fā)一個(gè)庫,首選當(dāng)然是將原有庫進(jìn)行修改,將其開發(fā)成一個(gè)功能強(qiáng)大的產(chǎn)品,那么問題來了,當(dāng)你要加入減法的時(shí)候,你的第一個(gè)只需要加法的客戶肯定不愿意因?yàn)槟愕淖兓,他也要修改自己的代碼,他的產(chǎn)品好好的因?yàn)槟阋薷漠a(chǎn)品,相信我你會失去他的。那么怎么辦呢?當(dāng)然是庫升級的時(shí)候客戶A仍然可以在不改動代碼的情況下去使用庫,客戶B呢可以同時(shí)用你的庫去實(shí)現(xiàn)減法。
所以你的問題就來了,我們在開發(fā)只有加法功能的V1.0的時(shí)候就要考慮到將來可能存在的擴(kuò)展,和在不影響原有使用的基礎(chǔ)上進(jìn)行擴(kuò)展,那么你就要考慮哪里封閉那里開放。這個(gè)過程你可以以各種SDK為對象想一下,當(dāng)SDK或者各種語言api升級的時(shí)候是如何做到,他們是怎么保證老產(chǎn)品繼續(xù)工作而新產(chǎn)品可以使用新功能的。
看到這大概明白原理了,下面show me your code.
<code class="hljs" php="">interface operate{ jia(); jian();}</code>
客戶端:
<code class="hljs" php="">class kehusOperate implements operate{ @Override jia(); @Override jian();}</code>
現(xiàn)在你要加一個(gè)乘法,如果你在interface里面直接加上cheng();那么客戶端代碼也必須加上cheng()這個(gè)方法才能工作,
電腦資料
《開放與封閉》(http://www.oriental01.com)。你強(qiáng)行客戶去升級她的產(chǎn)品,他不會高興的。應(yīng)該怎么做呢?
我想到兩種:
<code class="hljs" php="">class operate{ jia(); jian();}class newOperate extends operate{ cheng();}</code>
當(dāng)需求變更時(shí),讓老客戶去繼續(xù)使用operate,而新客戶使用新的類:
old客戶端
<code class="hljs" scala="">class oldKeHu extends operate{ @Override jia(); @Override jian();}</code>
新客戶
<code class="hljs" scala="">class newKeHu extends newOperate{ @Override jia(); @Override jian(); @Override cheng();}</code>
另一種方法是把所有的操作加減乘除都作為子類讓客戶選擇進(jìn)行使用,當(dāng)需要一個(gè)開根號時(shí),新加一個(gè)開跟號類即可。
以上就是我所理解的開放封閉原則。