架构师之路(6)---OOD的开闭原则 王泽宾

2 开闭原则(Open-Closed Principle,OCP)

2.1 什么是开闭原则
    开闭原则是面向对象设计中“可复用设计”的基石,是面向对象设计中最重要的原则之一,其它不少的设计原则都是实现开闭原则的一种手段。

    1988年,Bertrand Meyer在他的著做《Object Oriented Software Construction》中提出了开闭原则,它的原文是这样:“Software entities should be open for extension,but closed for modification”。翻译过来就是:“软件实体应当对扩展开放,对修改关闭”。这句话说得略微有点专业,咱们把它讲得更通俗一点,也就是:软件系统中包含的各类组件,例如模块(Modules)、类(Classes)以及功能(Functions)等等,应该在不修改现有代码的基础上,引入新功能。开闭原则中“开”,是指对于组件功能的扩展是开放的,是容许对其进行功能扩展的;开闭原则中“闭”,是指对于原有代码的修改是封闭的,即不该该修改原有的代码。

2.2 如何实现开闭原则
    实现开闭原则的关键就在于“抽象”。把系统的全部可能的行为抽象成一个抽象底层,这个抽象底层规定出全部的具体实现必须提供的方法的特征。做为系统设计的抽象层,要预见全部可能的扩展,从而使得在任何扩展状况下,系统的抽象底层不需修改;同时,因为能够从抽象底层导出一个或多个新的具体实现,能够改变系统的行为,所以系统设计对扩展是开放的。

    咱们在软件开发的过程当中,一直都是提倡需求导向的。这就要求咱们在设计的时候,要很是清楚地了解用户需求,判断需求中包含的可能的变化,从而明确在什么状况下使用开闭原则。

    关于系统可变的部分,还有一个更具体的对可变性封装原则(Principle of Encapsulation of Variation,  EVP),它从软件工程实现的角度对开闭原则进行了进一步的解释。EVP要求在作系统设计的时候,对系统全部可能发生变化的部分进行评估和分类,每个可变的因素都单独进行封装。

    咱们在实际开发过程的设计开始阶段,就要罗列出来系统全部可能的行为,并把这些行为加入到抽象底层,根本就是不可能的,这么去作也是不经济的,费时费力。另外,在设计开始阶段,对全部的可变因素进行预计和封装也不太现实,也是很难作获得。因此,开闭原则描绘的愿景只是一种理想状况或是极端状态,现实世界中是很难被彻底实现的。咱们只能在某些组件,在某种程度上符合开闭原则的要求。

    经过以上的分析,对于开闭原则,咱们能够得出这样的结论:虽然咱们不可能作到百分之百的封闭,可是在系统设计的时候,咱们仍是要尽可能作到这一点。
    对于软件系统的功能扩展,咱们能够经过继承、重载或者委托等手段实现。以接口为例,它对修改就是是封闭的,而对具体的实现是开放的,咱们能够根据实际的须要提供不一样的实现,因此接口是符合开闭原则的。

2.3 开闭原则可以带来什么好处
    若是一个软件系统符合开闭原则的,那么从软件工程的角度来看,它至少具备这样的好处:

  可复用性好。
    咱们能够在软件完成之后,仍然能够对软件进行扩展,加入新的功能,很是灵活。所以,这个软件系统就能够经过不断地增长新的组件,来知足不断变化的需求。

  可维护性好。
    因为对于已有的软件系统的组件,特别是它的抽象底层不去修改,所以,咱们不用担忧软件系统中原有组件的稳定性,这就使变化中的软件系统有必定的稳定性和延续性。

2.4 开闭原则与其它原则的关系     开闭原则具备理想主义的色彩,它是面向对象设计的终极目标。所以,针对开闭原则的实现方法,一直都有面向对象设计的大师费尽心机,研究开闭原则的实现方式。后面要提到的里氏代换原则(LSP)、依赖倒转原则(DIP)、接口隔离原则(ISP)以及抽象类(Abstract Class)、接口(Interace)等等,均可以看做是开闭原则的实现方法。
相关文章
相关标签/搜索