Systems Analysis and Design,主要针对面向对象分析(Object-Oriented Analysis,OOA),之前的系统建模可以理解为是分析和设计过程的一种重要手段
首先介绍一个相关术语
责任
Responsibilities,一个对象或类所承担的任务,它定义了对象应该具备的功能和行为,以及对象与其他对象之间的交互方式。
- 对象或类与其他对象进行交互所承共同的任务或行为,则形成了协作关系 (collaborations)
分析方法
Identifying the classes & Creating object models
文本分析
Perform textual analysis by reviewing the case diagrams and analyze use case to identify potential objects, attributes, operations, and relationships.
- The primary purpose of textual / UseCase analysis is to create an initial set of classes.
名词 ➡️ 对象类别
形容词 ➡️ 对象属性
及物 / doing 动词 ➡️ 对象操作
不及物动词 ➡️ exception
hava 动词 ➡️ 关联 / 聚合关系
be 动词 ➡️ 分类关系
某组常见特定动词 ➡️ 依赖关系
经典分析
- 着重于问题领域中的有形事物
- 主要从经典分类原理推导出类和对象
行为分析
Behavior Analysis
- 将具有相似行为的对象组成类。
- 将具有共同责任的事物进行分组。
CRC 卡片分析
Class-Responsibility-Collaboration (CRC) card,一种用于记录类的责任和协作的卡片
一个标准索引卡集合,包括三个部分:
类名、类的职责、类的协作关系,
每一张卡片表示一个类。
结构化分析
Structured Analysis,通过使用不同图表对系统需求进行建模
数据流图
DFDs - Data Flow Diagrams
实体关系图
ERDs - Entity-Relationship Diagrams,实体建模
设计原则
Designing Objects
GRASP 原则
General Responsibility Assignment Software Principle
创建者
Creator
一个对象在创建另一个对象时,它负责初始化或拥有对新对象的引用。
信息专家
Information Expert
具有最相关信息的对象应该负责执行相关操作
低耦
Low Coupling
对象之间的依赖应该尽可能地减少,以降低系统的耦合度。
对象之间的通信应该基于抽象而不是具体的实现。
控制器
Controller
使用控制器对象来协调和控制用户界面和系统之间的交互,它充当用户输入的处理中心。
高内聚
High Cohesion
即对象内部的各个元素应该紧密相关,围绕实现一项特定的功能。
多态
Polymorphism
将操作应用于多个对象类型,而无需依赖于特定的对象类型。
纯粹信息 / 间接 / 受保护变化
- Pure Fabrication - 创建辅助类来减轻对象的责任
- Indirection - 引入间接层来降低对象之间的直接依赖
- Protected Variations - 通过稳定的接口保护系统内部的变化
SOLID 原则
GRASP 和 SOLID 原则在很大程度上是重叠的,但它们强调的焦点和方法略有不同。
单一职责
Single Responsibility Principle,SRP
一个类应该只有一个职责或功能。这样可以提高类的内聚性,使得类更加可理解、可维护和可测试。
开放封闭
Open-Closed Principle,OCP
软件实体(类、模块、函数等)应该对扩展是开放的,但对修改是封闭的。
即在添加新功能时,不应修改现有的代码,而是通过扩展 (extension) 现有代码来实现。
里氏替换
Liskov Substitution Principle,LSP
子类对象可以在不破坏程序正常运行的前提下替换其父类对象。
接口隔离
Interface Segregation Principle,ISP
应该为客户端提供它们需要的特定接口,不强迫客户端依赖于它们不需要的接口。
即接口应该精确地定义客户端所需的行为,避免定义臃肿庞大的接口。
依赖倒置
Dependency Inversion Principle,DIP
高层模块不应该依赖于低层模块,两者都应该依赖于抽象。
抽象不应该依赖于具体实现细节,而具体实现细节应该依赖于抽象。
这样可以减少模块之间的耦合性,提高代码的可维护性和可测试性。