面向对象系统分析与设计(2)
引子
统一建模语言 UML:
- 特点:可视化、实践性强、面向对象的工业标准、多视角多结论、
- 前提:软件系统能被视为相互关联对象的集合
- 误解:
1. 被认为等同于过程或者理论
2. 被认为等同于面向对象的分析与设计
3. 被认为等同于设计指南
- 结构:
1. 基础模块(Building blocks):物、表、关系等
2. 相同的机理(Common mechanisms):要求、修饰、划分、可扩展性
3. 体系(Architecture):用例、过程、实现、部署等
- 使用 UML 的优势:提高质量、更高效。
为什么建模?
- 从现实中抽象:获得必要的细节,过滤掉非必要的细节
- 有助于设计人员处理复杂问题:人类在处理复杂问题时存在局限性
- 集中在关键问题上
- 有助于理解需求、简捷设计、稳定系统的提升
为什么面向对象?
- 更精准地反映现实
- 缩小现实与模型之间的语言鸿沟
- 定位现实的改变
- 可以将现实建模成一系列相互关联的对象。
关键词区分
建模
建模就是从概念到实现的过程
概念
- conceptual
- 关注与问题相关的对象的定义
- 不关心对象的任何实现
规范/特定化/专业化
- specification
- 关注对象是如何促进问题的解决的
- 关注对象的相互关系
- 不关注对象内部的关系
实现
- implementation
- 关注怎么为一个对象写 code
- 关注对象内部、对象之间的方方面面
抽象
- 是一个物理过程,选择一些属性或特点,排除掉一些不相关的属性。
特点:
- 抽象总是基于某种目的
- 一件事物可以有不同种的抽象
- 任何抽象,都无法完全描述现实
不追求完美描述,建模够用就行
抽象也有几种类型,分类、聚合、概括等
分类
- classification
- 按照相同属性的对象实例,分成组
- 具有 member 的关系
聚合
- aggregation
- 忽略 parts 之间的差异,组成一个整体,类图中父类一侧采用空心菱形
- 具有 part 的关系
- 如果两者存在同生共死的关系,称为 composition,用实心菱形表示
- 当在 aggregation 和 association 之间难以抉择时,选 association
概括/泛化
- generalization
- 反义词:specialization 专业化
- 按照对象的某种相同属性(discriminator 有侧重的、片面的、非全面的),分组
- Van、Car、Truck 可以根据 vehicle-type 泛化成 Vehicle。
- 前者是 subclass,后者是 superclass,根据 discriminator
- 具有 sub/super 的关系
继承
- 通常对一些相似的属性或操作进行继承,可以减少不必要的描述,提升描述的使用率,但要注意:
- 只在一个地方对属性和行为下定义(理解:子类多次定义,不如父类一次解决)
- 允许子类对象替代父类对象
继承以外
- 子类可以增加新的属性、覆盖父类方法
- 继承时(比如多重继承)如果出现冲突(比如两栖车同时继承了陆车的size和水车的size,但含义分别是载重量和排水量,此时就是 name conflict),可以采用多种办法解决:
- 用户自定义命令;
- 预定义命令;
- 重定义名称(only 属性)
抽象类
- abstract class
- 没有自身的实例
- 在 UML 中用斜体表示
覆盖
- coverage
- 有以下几种情况:
- 部分重叠 overlapping:比如父类:运动员,子类:网球运动员、足球运动员。父类实例可以属于多个子类。
- 互斥 disjoint:比如父类:人,子类:男人、女人。父类实例最多只能属于一个子类。
- 完全 complete:任一父类都能在子类中找到归属。
- 不完全 incomplete:存在某些父类,在子类中无法找到归属。
- 重叠且不完全,比如上面运动员的例子。
- 重叠且完全,比如父类:课程,子类:毕业生课程、在校生课程。
- 互斥且完全,比如父类:大学生,子类:毕业生和在校生。
- 互斥且不完全,比如父类:树,子类:橡树、椰子树等。
上文是抽象,下文是实现
对象
- object
- 是一种概念/抽象/事物,具有鲜明的边界和行为(来自别处的 request,要做出的某些操作)。
- 例如:张三的银行账户
接口
- interface
- 描述对象能表现出的操作
特性
- properties
- 对象具有 identity、state、behavior 三种特性
对象的抽象
- encapsulation
- 在外部接口和内部实现之间,划分了一个明显的界线
- 隐藏不必要的实现、确保模块化;
- 具有可见的 public 接口和隐藏的 private 实现
- public 接口对外提供服务
类
- class
- 定义:一系列具有共同点的对象的描述
- 共同点:state、behavior、relationships、semantics(语义)
- 提供了一个创建对象的 template。
- class 是一个工厂,object 是一个实例。
- class 可以理解为一种松耦合、高内聚的模块
属性
- attribute
- 数据的一种描述
- 基础属性和衍生属性:出生日期和年龄(后者可以通过前者计算得到)
操作
- operation
- 对象在 class 中可能会用到的操作
- 副作用:方法的执行可能会改变某个类的状态(read 操作不会产生副作用)
方法
- method
- 是 operation 的实现
- 一个 operation 可以有多种 method
作用范围
- scope
- 一般的属性或操作是单对象实例作用范围的
- 有一些属性或操作可以被类的所有对象所共享,称为类属性,在 UML 中带下划线
连接
- link
- 对象实例们之间的物理或理论上的联系
- link 允许彼此间的通信
- 例如:Person worksFor one Organization,Person teaches one Course
联结
- association
- 具有相同语义的一系列 links 集合的描述
- 类图中用直线或带箭头的直线表示
- 能显示连通性
- 能显示清晰、可读性
- class 之间或者 class 与自身,都有多种不同的联结方式
- 度:存在一元(一元联结时建议赋予不同角色)、二元(应用最多)、多元联结
- 具有多重性
qualifier
- qualifier
- 将 N-M 关系浓缩成 1-N 的关系
约束
- constraints
- 有:ordering、subset、general 三类
- ordering:顺序的,如has
- subset:自己的,比如:Chair-of 是 1-N 关系,但 Member-of 是 M-N 关系,Chair-of 是 Member-of 的子集。