面向对象下的信息隐藏
15-面向对象下的信息隐藏
信息隐藏的含义
1)封装类的职责,隐藏职责的实现
2)预计将会发生的变更,抽象它的接口,隐藏它的内部实现机制
基本思想:每个模块隐藏一个重要的设计决策,即每个模块承担一定的职责,对外表现为一份契约,即隐藏实现,抽象出接口。
信息隐藏的决策
职责的实现、实现的变更。
信息隐藏的目的
为了做到模块与模块之间尽可能的独立,以实现软件的可拓展性和可伸缩性。
封装的含义:
1.集中信息与行为。
2.分离对外接口和内部实现。
封装的实现细节:
①封装数据和行为。
1.除非职责需要,不要给所有变量都提供getter和setter,更不要随便定义成public。
2.getter和setter不一定单纯与成员变量一一对应,可加入约束检查和数据转换,也可以获取间接信息。
3.取名不要暴露内部实现。
②封装内部结构。
1.不要暴露数据结构的实现决策。
③封装其他对象的引用。
1.委托而不是提供自己拥有其他对象的引用。(迪米特)
2.构造一个新对象返回,这样外界操作就不会影响到原对象。
④封装类型信息。
1.隐藏具体子类的类别而提供共性类别(多态满足LSP)
⑤封装潜在变更。
1.类的实现中有地方会发生变更,则将其独立为方法或类并提供稳定接口给原类使用。(DIP)
变更设计的原则
OCP开闭原则
好的设计应该对“扩展”开放,好的设计应该对“修改”关闭。即发生变更时,好的设计只需要添加新的代码就能实现变更。
一般都是一个类出现了逻辑上并立的模块,而且以后可能新增模块,一般改成策略模式。
DIP依赖倒置原则
抽象不应该依赖于细节,细节应该依赖于抽象;高层模块不依赖于低层模块,他们都应依赖于抽象。
好的设计应该是依赖于抽象,针对抽象的接口编程
关系
OCP开闭原则是面向对象设计的目标,DIP依赖倒置原则是主要的实现手段,LSP里氏替换原则是DIP依赖倒置原则的基础
LSP(保证)->DIP(实现机制)->OCP(目标)
多态也是OCP的实现机制之一
DIP注意事项
没有任何一个软件是100%封闭的,也没有100%OCP的程序
DIP是有代价的,增加了系统的复杂度。不要强行使用DIP,否则会导致过度的设计