面向对象的软件设计
理解复杂系统
-
软件的复杂性是一种常态。
-
系统越复杂就越容易崩溃
-
软件复杂性的几个方面
-
问题域的复杂
-
管理开发过程的复杂性
-
软件中随处可见的灵活性
-
软件是离散的,而现实是连续的
-
复杂系统的特质
-
复杂系统往往以层次结构存在
-
相对本原
- 使用哪些作为系统的基础组件比较随意,取决于系统观察者的判断(系统对于每个人的理解是不同的)
-
分离关注
- 组件内部的联系比组件间的联系更紧密(组件内的内聚性,组件间的耦合性 ,也就是高内聚,低耦合)
-
共同模式
- 层次结构通常只是由少数不同类型的子系统按照不同的组合和安排方式构成的 (设计模式)
-
稳定的中间形式
- 如果存在稳定的中间形式,从简单系统到复杂系统的演变会更快
如何处理复杂系统
- 分解
- 算法分级(关注点在于顺序)
- 面向对象分解(关注点在于自身结构)
- 使用抽象
- 层次结构是非常重要的
什么是面向对象
-
OOP(面向对象编程)
重用性、灵活性、扩展性
-
OOD(面向对象设计)
类图、时序图等
-
OOA(面向对象分析)
构建真实世界模型
面向对象的几大要素
- 抽象
- 提供清晰定义的概念边界
- 封装
- 封装关注这些行为的实现
- 封装提供信息隐藏
- 系统的每一部分不应该依赖于其它部分的实现细节
- 封装的作用是分离抽象的概念及其实现
- 模块化
- 减少复杂性
- 层次化
- 层次结构是抽象的一种分级或排序
- 类结构和对象结构都属于层次机构
- 类型(次要)
- 表达抽象概念
- 类是类型的一种实现
- 多态是动态类型和继承相互作用的产物
- 静态类型,动态类型,弱类型,强类型
- 并发(次要)
- 每个对象都是独立运行的个体
什么是对象
- 对象具有状态,定义良好的行为和唯一标识符
对象的状态
- 对象的状态包括对象的所有属性
- 对象状态包括每个属性的当前值(动态的)
对象的行为
- 对象在状态改变和消息传递方面的反应的方式(就是方法,,改变对象数据)
- 一个对象的状态代表了其行为的累计效果(通过方法多次调用后,最终形成的效果)
- 对象可以扮演多个不同的角色
- 对象自动机
- 主动对象
- 被动对象
对象之间的联系
- 关联
- 消息发送(通常是单向的)
- 聚合
- 关联具有更松的耦合,聚合适合表现很强的整体和部分的关系
类的本质
- 类是一个对象的本质和抽象
- 类是一组对象,他们拥有共同行为,结构和语义
- 类是必要的,但非充分的
类之间的关系
-
关联
- 客户和销售员
-
继承
- is和a的关系,,,什么是什么 比如 白马是一匹马
class User{ } class AdminUser extends User{ }
-
聚合
class Book{ Author author; }
-
依赖
class Pay{ public void pay(Money money){ //一个类的方法使用到了别的类 money.getCount(); } } class Money{ public void getCount(){ } }
良好的设计品质
- 低耦合(A的变动基本不影响B)
- 高内聚
- 完整性(保护抽象的全部有意义的功能)
- 充分性(最小接口)
- 基础性
面向对象分类设计
- 增量式,迭代式
- 类和对象要处于正确的抽象层次
- 类提升,类分解
- 识别机制(设计模式)
- 机制即模式
- 机制是对象间的协作关系
- 是一种动态行为