今天见一同事参加答辩,问起了一个这样的问题:在软件开发中,结合自己的实例说说如何使软件做到OCP原则。
事实上这是一个非常难回答的问题,不过也是一个可以回答的问题。
什么是OCP?一个软件实体应当对扩展开放,对修改关闭。这个原则说的是,在设计一个模块的时候,应当使这个模块可以在不被修改的前提下被扩展。
如何做到OCP?
第一:类的设计高度抽象化。这个抽象层预见了所有的可能扩展,因此,在任何扩展情况下都不会改变,这就使得系统
的抽象层不需要修改,从而满足“开-闭”原则的对修改关闭。这种使用,其实在开发我们用的已经非常常见了。如,针对
接口编程。无论是DAO层,还是service层,我们都是针对接口来实现的,当然针对接口编程不仅仅是指,类的定义为接口 ,我们在定变量,或参数传递时,也是应先考虑接口来传递。
第二:对可变化的进行封装。
这个“可变性的封装原则”讲的是找到一个系统的可变因素,将之封装起来。在设计 时,考虑设计中什么可能会发变化。这个意思是说,你在做设计时,考虑的是你允许什么发生变化而不让这一变化导致重设计。所以要做到“可变华进行封装”原则,
首先:一种可变性不应当散落在代码的很多角落里,而应当封装到一个对象里面。同一种可变性的不同 表现,则可以用继承来实现。所以,我们在开发中经常会用到继承。继承是一种 实现封装变化的方法。所以,我们可以看到,在设计中,为何总是提出优先考虑使用组合,而非继承。不应当继承 认为是从一般对象生成特殊的对象的方法。
其次:一种可变性不应当与另一种可变性混合在一起。所以,我们会发现在类的结构设计的时候,类的层次结构不会超过两层。
不然意味着将两种不同的可变性混合在一起了。
来看下操作票系统中的应用。我们的设备停送电的主过程基本上是不变的,就是从检修-冷备-热备-运行这么一个过程 ,但是每类设备的
栓修-冷备,冷备-到热备,热备到运行这个过程中所产生的操作步骤是完全不同的。所以这块是变化的,好我们先将这块变化东西封装起来,这样,在我们的程序中,就对每类设备有了一个实现开票具体步骤的类(IBussLogic),我们将抽象出来的开票的主过程也设计成一个类(ABTicketService)