開(kāi)放與封閉 -電腦資料

電腦資料 時(shí)間:2019-01-01 我要投稿
【clearvueentertainment.com - 電腦資料】

    軟件工程中的開(kāi)放與封閉原則是一個(gè)開(kāi)發(fā)前的指南,當(dāng)你進(jìn)行工程開(kāi)發(fā)時(shí)要依據(jù)這個(gè)原則,

開(kāi)放與封閉

    開(kāi)放封閉就是對(duì)擴(kuò)展開(kāi)放對(duì)修改封閉,目的是指導(dǎo)開(kāi)發(fā)一個(gè)當(dāng)需求增加時(shí),不需要修改原有代碼而進(jìn)行代碼擴(kuò)展即可實(shí)現(xiàn)。為什么不去修改原代碼呢?

    舉一個(gè)badCase:

    開(kāi)發(fā)一個(gè)庫(kù),里面定義了加法,用戶調(diào)用你這個(gè)庫(kù)實(shí)現(xiàn)了他的1+1的需求,這時(shí)候業(yè)務(wù)擴(kuò)大了另一個(gè)客戶需要加法的同時(shí)也希望能夠使用減法,作為一個(gè)合格的開(kāi)發(fā)產(chǎn)品,你不會(huì)說(shuō)為這個(gè)公司再單獨(dú)開(kāi)發(fā)一個(gè)庫(kù),首選當(dāng)然是將原有庫(kù)進(jìn)行修改,將其開(kāi)發(fā)成一個(gè)功能強(qiáng)大的產(chǎn)品,那么問(wèn)題來(lái)了,當(dāng)你要加入減法的時(shí)候,你的第一個(gè)只需要加法的客戶肯定不愿意因?yàn)槟愕淖兓惨薷淖约旱拇a,他的產(chǎn)品好好的因?yàn)槟阋薷漠a(chǎn)品,相信我你會(huì)失去他的。那么怎么辦呢?當(dāng)然是庫(kù)升級(jí)的時(shí)候客戶A仍然可以在不改動(dòng)代碼的情況下去使用庫(kù),客戶B呢可以同時(shí)用你的庫(kù)去實(shí)現(xiàn)減法。

    所以你的問(wèn)題就來(lái)了,我們?cè)陂_(kāi)發(fā)只有加法功能的V1.0的時(shí)候就要考慮到將來(lái)可能存在的擴(kuò)展,和在不影響原有使用的基礎(chǔ)上進(jìn)行擴(kuò)展,那么你就要考慮哪里封閉那里開(kāi)放。這個(gè)過(guò)程你可以以各種SDK為對(duì)象想一下,當(dāng)SDK或者各種語(yǔ)言api升級(jí)的時(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è)方法才能工作,

電腦資料

開(kāi)放與封閉》(http://clearvueentertainment.com)。你強(qiáng)行客戶去升級(jí)她的產(chǎn)品,他不會(huì)高興的。

    應(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è)開(kāi)根號(hào)時(shí),新加一個(gè)開(kāi)跟號(hào)類即可。

    以上就是我所理解的開(kāi)放封閉原則。

最新文章