开闭原则(对修改封闭,对扩展开放)
概述
对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,提高程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类。
案例讲解
案例一
下面以 搜狗输入法 的皮肤为例介绍开闭原则的应用。
UML图如下
分析:
搜狗输入法 的皮肤是背景图片、窗口颜色和声音等元素的组合。用户可以根据自己的喜爱更换自己的输入法的皮肤,也可以从网上下载新的皮肤。这些皮肤有共同的特点,可以为其定义一个抽象类(AbstractSkin),而每个具体的皮肤(DefaultSpecificSkin和HeimaSpecificSkin)是其子类。用户窗体可以根据需要选择或者增加新的主题,而不需要修改原代码,所以它是满足开闭原则的。
案例二
网上的作业题
if (x == 2) f(); //... 却因为粗心写成了: if (x=2) f();//... 结果花了很久才找出这个运行错误。 一个进口电机故障,好久找不出故障,聘请外方工程师过来迅速定位后,就收了100万美元;。。。 联系上面的例子,阐明编写代码时为何要“对修改封闭”,在遗产系统再工程时,“对扩展开放”?
我的答案:
对于小明写的代码,在语法上面没有问题,所以可以通过编译,但是在运行过程中出现bug,这就是为啥在写程序的时候要尽可能的,把错误控制在编译之前和对每一模块进行测试,而且写代码的时候需要做到对修改封闭,因为擅自修改代码,会导致这样的情况出现,就是一块功能没问题了,但是另一块地方又有问题了。
第二个例子中,工程师可以很快找到故障是因为,工程师和电机遵守了开闭原则,因为这是一个进口的电机,在国内使用或多或少都有点点问题,需要扩展相关的功能,所以再遗产系统再工程的时候需要做到,对扩展开放,这样才可以根据最新的情况增添功能。