开放与封闭 -电脑资料

电脑资料 时间:2019-01-01 我要投稿
【www.unjs.com - 电脑资料】

    软件工程中的开放与封闭原则是一个开发前的指南,当你进行工程开发时要依据这个原则,

开放与封闭

    开放封闭就是对扩展开放对修改封闭,目的是指导开发一个当需求增加时,不需要修改原有代码而进行代码扩展即可实现。为什么不去修改原代码呢?

    举一个badCase:

    开发一个库,里面定义了加法,用户调用你这个库实现了他的1+1的需求,这时候业务扩大了另一个客户需要加法的同时也希望能够使用减法,作为一个合格的开发产品,你不会说为这个公司再单独开发一个库,首选当然是将原有库进行修改,将其开发成一个功能强大的产品,那么问题来了,当你要加入减法的时候,你的第一个只需要加法的客户肯定不愿意因为你的变化,他也要修改自己的代码,他的产品好好的因为你要修改产品,相信我你会失去他的。那么怎么办呢?当然是库升级的时候客户A仍然可以在不改动代码的情况下去使用库,客户B呢可以同时用你的库去实现减法。

    所以你的问题就来了,我们在开发只有加法功能的V1.0的时候就要考虑到将来可能存在的扩展,和在不影响原有使用的基础上进行扩展,那么你就要考虑哪里封闭那里开放。这个过程你可以以各种SDK为对象想一下,当SDK或者各种语言api升级的时候是如何做到,他们是怎么保证老产品继续工作而新产品可以使用新功能的。

    看到这大概明白原理了,下面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>

    现在你要加一个乘法,如果你在interface里面直接加上cheng();那么客户端代码也必须加上cheng()这个方法才能工作,

电脑资料

开放与封闭》(https://www.unjs.com)。你强行客户去升级她的产品,他不会高兴的。

    应该怎么做呢?

    我想到两种:

<code class="hljs" php="">class operate{    jia();    jian();}class newOperate extends operate{    cheng();}</code>

    当需求变更时,让老客户去继续使用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>

    另一种方法是把所有的操作加减乘除都作为子类让客户选择进行使用,当需要一个开根号时,新加一个开跟号类即可。

    以上就是我所理解的开放封闭原则。

最新文章