两种设计思路:
- 分解:面向过程
- 抽象:面向对象
面向对象设计:
- 隔离变化:宏观层面,减小变化带来的影响
- 各负其责:微观层面,强调各个类的“责任”,由于需求变化导致的新增类型不应影响原类型(多态)
对象是什么:
- 语言层面:封装了代码和数据
- 规格层面:一系列可被使用的公共接口
- 概念层面:拥有某种责任的抽象
八大设计原则:
- 依赖倒置:高层模块(稳定)不应依赖于低层模块(变化),二者都依赖于抽象(稳定);抽象(稳定)不应依赖于细节(变化)(如MainForm和line都依赖于shape)
- 开放封闭:对扩展开放,对更改封闭;类模块可扩展但不可修改(桌子厂刷涂料)
- 单一职责:一个类应仅有一个引起它变化的原因,变化的方向隐含着类的责任
- 李氏替换:子类必须能替换它们的基类(is-a),父类的方法子类都要能用,继承关系要与组合关系区分
- 接口隔离:接口小而完备,不要都public,子类protected,本类private
- 优先使用对象组合,而不是类继承:继承本质是类属(组合)关系,简单理解成父-子关系会导致错误使用(高耦合)
- 封装变化点:一侧变化,一侧稳定,不只是表面上的封装代码和数据
- 针对接口编程,而不是针对实现:不要将变量类型声明为具体类(业务类,string不算),而是声明为某个接口(如抽象类shape),实现高内聚,松耦合(举例:秦兵器、活字印刷)
23种设计模式分类:
- 从目的看:
- 创建型:应对需求变化为对象创建带来的冲击
- 结构型:应对需求变化为对象结构带来的冲击
- 行为型:应对需求变化为多个类交互过程中责任划分带来的冲击
- 从范围看:
- 类模式:处理类与子类的静态关系,偏重继承方案
- 对象模式:处理对象间的动态关系,偏重组合方案(一个类中包含另一个类的对象或指针)
从封装变化角度分类:
- 组件协作:Template, Strategy, Observer/Event
- 单一职责:
- 对象创建:
- 对象性能:
- 接口隔离:
- 状态变化:
- 数据结构:
- 行为变化:
- 领域问题:
重构获得模式:
- 面向对象设计模式是“好的面向对象设计”,即可以满足“应对变化,提高复用”的设计
- 现代软件设计的特征是“需求频繁变化”,设计模式应“寻找变化点,然后在变化点处应用设计模式”(封装变化点)(能看出代码哪里是稳定的,哪里是变化的)“什么时候、地点应用设计模式”比“理解设计模式结构本身”更重要
- 设计模式应用不宜先入为主,一上来就使用设计模式是对设计模式的最大误用,没有一步到位的设计模式,敏捷软件开发提倡“Refactoring to Patterns”是目前公认的最好的使用设计模式的方法
重构关键技法:
- 静态->动态
- 早绑定->晚绑定
- 继承->组合
- 编译时依赖->运行时依赖
- 紧耦合->松耦合
推荐书目:
- 《重构——改善既有代码设计》
- 《重构与模式》
来源:https://www.cnblogs.com/cxc1357/p/12271880.html