之前的博客中,模块需要隐藏的决策主要由“职责的实现”and“实现的变更”两类,在面向对象方法中,需要做到的就是:
目录
职责是指类或者对象维护一定的状态信息,并基于状态履行行为职能的能力,类与对象的职责是来源于需求的,否则就不会产生对系统的共线,就没有存在的必要~
按照信息隐藏的思想,一个模块应该通过稳定的接口对外表现其所承载的需求,而隐藏它对需求的内部实现细节。那么类就应该通过接口对外表现它直接和间接承载的需求,而隐藏类内部的构造原理,这恰恰是“封装”想要达到的~
封装通常由两方面的含义:
在面向对象方法中,接口通常描述以下几个内容:
- 对象之间交互的消息(方法名)
- 消息中的参数
- 消息返回结果的类型
- 与状态无关的不变量
- 需要处理的异常
插播一条关于接口的定义:接口是一种规范,用于定义软件系统中各个组件之间的通信方式和数据交换格式。它定义了一组方法、属性和参数,以及它们之间的关系和约束条件,使得不同的组件可以相互协作,实现特定的功能。
对封装的简单理解是隐藏类的属性和数据信息,但这是远远不够的,封装需要隐藏接口之外所有的实现细节:
变更是软件开发面临的最大挑战,也是软件维护成本远高于软件开发成本的主要原因,因此如何在开发阶段就为将来可能得变更进行预啊合计以减少维护成本就成为设计师必须考虑的问题~
开闭原则:
简单来说,开闭原则是指,在发生变更时,好的世界只需要添加新的代码而不需要修改原有的代码,就能实现变更~
(不同语言中的实现有所不同,例如C++使用模版机制、java则使用泛化机制)
按照信息隐藏思想,类要封装潜在的变更,但是实践经验表面,仅仅封装变更是不够的,还需要使用多态或者DIP的方法实现符合OCP的变更,以减少变更带来的幅面影响~
如果在软件开发时未能预计到变更的发生,那么在维护阶段遇到变更时可以使用多态手段,保证OCP满足~