一、对象是什么
- 语言层面,对象封装了代码和数据
- 规格层面,对象是一系列可以被使用的公共接口
- 概念层面,对象是拥有某种责任的抽象
二、面向对象的八大设计原则
1、 依赖倒置原则(DIP):高层模块不依赖于底层模块(变化),二者都应该依赖于抽象;抽象不应该依赖实现细节,实现细节应该依赖于抽象
1、
MainForm--依赖于--Line & Rect 这不稳定
2、
MainForm--依赖于--shape
Line Rect--依赖于shape 这是稳定的
- 依赖倒置原则的方法就是提出抽象类
2、开放封闭原则:对扩展开放,对更改封闭;类模块是可扩展的,但不可修改
- 改变的代价就是重新修改代码,重新编译,重新部署,重新测试,代价很大
- 当我们在依赖倒置原则的基础上提出了不同的模块之间所依赖的桥梁(抽象)后,就可以通过扩展的方式来应对需求的变化
- 例如shape类提出后,当出现新的Circle需求,扩展即可。
3、单一职责原则:一个类应该仅仅有一个引起它变化的原因,变化的方向隐含着类的责任
- 一个类中最好不要有太多方法,不同的方法对应着不同的责任
4、Liskov(LSP)替换原则:子类必须能够替换它们的基类;继承表达类型的抽象
5、接口隔离原则:不应该强迫客户程序依赖它们不用的方法;接口应该小而完备。
- 如果只是本类使用的方法就置为private,如果是子类要使用的方法就置为protected
- 真正有必要的时候再去暴露为public
6、优先使用对象组合,而不是类继承
- 类继承通常为“白箱复用”,对象组合通常为“黑箱复用”
- 继承在某种程度上破坏了封装性,子类父类耦合度较高
- class A中放一个class B,这样对象组合方法更常用。这只要求被组合对象有良好定义的接口
7、封装变化点:一侧变化,一侧稳定
8、针对接口编程,而不是针对实现编程
- 不将变量类型声明为某个特定的具体类,而是声明为某个接口。
- 客户程序无需获知对象的具体类型,只需要知道对象所具有的接口。
- 减少系统各个部分之间的依赖关系,实现高内聚,低耦合
- 下图违背了针对接口编程原则:
下图则是应用抽象接口
在处理时候,只使用接口的通用方法
在违背依赖倒置原则时,往往就会违背接口编程原则,不同的原则之间或许只是同一问题的不同方面
产业强盛的标志是:接口标准化,其核心就是分工协作,实现复用性。
无论在哪个领域,统一和规划都非常重要。高内聚,低耦合。