2. 重新学习面向对象
- 为什么要学习面向对象
- 认识复杂系统
- 抽象
- 封装和模块化
- 层次结构
- 面向对象基础
- 面向对象分析
- 识别元素
- 识别关系
- 识别协作
- 细化
为什么要学面向对象
- 应对面试中的问题
- 告别烂代码(比如运用面向对象设计模式)
- 提供源代码的阅读能力(很多的开源框架和产品,由于复杂度高,都有着良好的面向对象设计)
- 提高复杂代码的开发能力和设计能力
认识复杂系统
什么是复杂系统
复杂的系统是有很多高度相关,高度互联或高度复杂的元素或实体所组成的的系统。
- 简单系统
- 中等复杂
- 复杂
- 问题域的复杂性
- 管理开发过程的困难性
- 软件中随处可能出现的灵活性
- 描述离散系统行为的问题
OO如何应对复杂系统
- 通过抽象,提取本质,关键元素(对象交互)
- 通过对类的封装实现信息隐藏和逻辑分割
- 通过屋里模块封装对系统进行物理分割
- 通过层次结构进一步降低复杂度
应对变化
- 单一职责
- 接口隔离原则
- 开闭原则
- 里氏替换原则
- 依赖倒置原则
抽象
- 实体抽象:一个对象,代表了问题域或者解决方案域实体的一个有用的模型
- 动作抽象:一个对象,提供了一组通用的操作所有这些操作都执行同类的功能
- 虚拟机抽象:一个对象,机种了某种高层控制要用到的所有操作,或者这些曹组将利用某种更低层的操作集
- 偶然抽象,一个对象,封装了一组相互间没有关系的操作
提升抽象能力的活动:阅读与总结/命名训练/建模训练
分类
- 经典分类:
- 概念聚集:对某个事物先进行概念描述,然后根据概念描述进行分类
- 原型理论:明确概念对事物进行分组
过程抽象
通过功能意图的挖掘来寻找多个替代过程
封装
抽象和封装是互补的概念:抽像关注的是对象可观察的行为,封装是关注这种行为
封装是一个过程,
- 关注点分离
模块化
- CCP共同闭包
- CRP共同复用
- 高内聚,低耦合
层级结构
系统的层次结构是一组实体的层次结构
- 分解:把系统当成一个实体,分解成更多,更小的实体
- 体系:把系统内的实体按某个层次和位阶来进行排列,这些层级是上下顺序排列起来的
层级分解:分解+体系
类与对象
对象:有清楚定义边界的事物。对象是一个具有状态,行为和标识符的实体,结构和行为类型的对象,定义在他们共同的类中。
- 一个可以触摸或可以看见的东西
- 在治理上可以理解的东西
- 可以知道思考或行为的东西
对象的
- 状态
- 行为
- 一个对象的状态代表了它的行为积累的结果
- 对象标识符
- 对象之间的关系
- 链接
- 聚合
类是一种对象,他们拥有共同的行为,结构和语义。
类之间的关系
- 关联
- 继承
- 聚合
面向对象分析
面向对象分解是面向对象分析加上面向对象设计的一个过程;这种过程利用从问题域的词汇表中找到的类和对象来分析需求。
面向对象分解最后得到类,需要经历一下四个过程:
- 识别元素:确定一些关键元素,这些元素将在特定的抽象层次上描述解决方案
- 识别协作:确定元素间的协作,其目的是描述已识别的元素之间是如何协同工作,以提供系统的行为需求。
- 识别关系
- 识别语境
- 经典方法
- 行为分析
- 领域分析
- 用例分析
- 结构化分析
- OPM对象过程分析
面向过程分解
对一个已知的系统进行实体分解
不管是过程分解还是对象分解。本质上都是为了应对复杂实物的分析和理解,在过程分解中我们同样可以运用抽象,封装和层次结构等手段来帮忙进行系统分析和设计。
过程聚集
在分类方法中的概念聚集方法,可以指导我们将同一类的方法聚合为一个更高层次的过程。
过程的抽象与实现
抽象与实现对应了泛化与特化两个动作。配置这个过程是配置资源和配置权限的抽象,对【配置资源和配置权限进行泛化得到了“配置”这个过程。
模块化的建议
模块是一种物力维度的封装,它强调的部署层面的分离,满足信息隐藏的同时还能更好的支持复用。在我们配置资源和配置权限这两个过程进行进一步的特化之后得到了针对Action和Entity的不同配置过程。
高内聚和低耦合,对好的模块提出封装要求。
ERP,CCP与CRP对模块的封装提供了具体指导
REP:复用,发布等同原则,重用的粒度就是发布的粒度
CCP:共同闭包原则,所有可能被一起修改的类集种放在一起,两个总是被修改的类应该放入同一组文件
CRP:共同复用原则,所有可能被一起复用的类集种放在一起,两个总是被复用的类应该放入同一组文件