面向对象系统分析与设计(6)
1. 系统设计
- 定义:将分析模型的逻辑结构加以实现前的准备过程。
哪些工作内容:
- 考虑非功能性需求的弊端;
- 考虑全局设计问题;
- 考虑实现的环境 —— implement environment;
- 补充 classes 的所有属性和操作;
- 将 implementation 的工作分成可执行的小块;
- 为 subsystems 间建立接口。
当可以从“分析模式”平滑过渡到“设计模式”时(即无需大改时),就是开始系统设计的最佳时刻。
1.1 设计的意义和标准
上文列出的 6 项工作必须要在 implementation 前完成,所以不能跳过设计这一步骤。
- 研究非功能性需求提高质量;
- 看重设计目标和扩展功能,而不是管理目标。
- 遵循的标准:外观标准、依赖标准、维护标准、开销标准等等。
- 考虑的范畴:
- 数据的管理;
- 访问权限管理;
- 流程控制;
- 边界条件;
1.2 设计 Tips:
- 指定 admin 的用例,作为 start-up 和 shutdown。
- 指定 errors 的异常处理机制。
1.3 implement environment
- 要考虑在构建一个 system 时,技术和管理上所受到的限制。
- 比如:系统运行环境问题、硬件/软件问题、编程语言选择问题、参与人员问题等。
- 策略:定位对 implement environment 的依赖,然后可以创建代理的方式(类似 JVM 的跨平台)来解决。
2. UP 设计过程
- 设计 use-cases(PPT P21)
- 设计 classes(PPT P57)
- 设计 subsystems(PPT P75)
2.1 use-case 设计
- 确定要设计哪些类
- 保持可追溯性:use-case 设计的实现 -> use-case 分析的实现 -> use-case
- 增加说明:使用类图、非功能性的需求。
其中 OO Design 的迭代过程:
- 设计初步类图模型;
- 为每个用例设计一个 sequence diagram。
- 开发初步的 sequence diagrams;
- 开发多层的 sequence diagrams。
- 修改类图;
- 修改方法名;
- 修改属性等;
- 用 package 打包(或者分 subsystem、分层)等方式,按功能将类图设计分区。
2.1.1 设计初步类图模型
- 扩展 domain model class diagram。
- 注:domain model 是指缩略版的类图,只有类名、属性名两种信息。不含 method、没有
+、-、#
等符号。 - 1)增加属性的 type 和初值。
- 2)增加可见性标识。
- 注:domain model 是指缩略版的类图,只有类名、属性名两种信息。不含 method、没有
- 详细设计。
- 1)交互图实现指向性。
- 2)补足箭头,让其连贯起来。
- 3)每个类增加 method。
2.1.2 设计初步 sequence diagram
初步 sequence diagram 的假设:
1. perfect technology assumption。比如不考虑登录注销功能。
2. perfect memory assumption。比如不考虑存储问题。
3. perfect solution assumption。比如不考虑 Exception 分支。
2.1.3 设计 multilayer sequence
- 修改 domain layer,其中加入 use-case controller 和 classes;
- 增加 data access layer。
- 增加额外的数据访问类,作为外界数据库交互用途;
- 取消掉 perfect memory 假设。
- 职责分离。(以前是 controller 要实例化一个实体类,这个 instance 要求 DA 类去操作 instance 的属性去读数据库;增加 data access layer后:controller 可以直接要求 DA 类去实例化那个实体类,而且由 DA 类来完成读库,传初始值给 instance 等操作)
- 增加 view layer。
- 增加额外的 user-interface 类。比如增加 windows 类用来实现 actor 和 controller 之间的交互。
- 为每个用例增加 GUI 表格或者 Web 网页。
2.1.4 修改类图
- 做到每层一个类图:
- view 层和 data access 层增加新类;
- domain 层的 use-case controller 增加新类。
- 时序图的 messages 增加 methods:
- 构造方法;
- getter 和 setter 方法;
- 用例特有的方法。
2.1.5 打包分区
- 高级的 UML 图会将相关的类联系起来;
- 确认一个 system 的主要组成和依赖。
- 为每层确定最终的分区情况。
- 划分子系统、在 packages 中体现出层次性。
2.2 classes 设计
- 前提:要设计的类,必须是能够被实现的类才行。
- 这些类出自两个地方:
- the problem domain:改进之前对类的分析;如果必要,可以将类划分为多个设计类。
- the solution domain:一般的公用类库、框架等;实现一个系统的技术工具等。
2.2.1 solution domain
- 如果是 boundary classes,要考虑指定的 user interface technologies。
- 如果是 entity classes,要考虑指定的 data management technologies。
- 如果是 control classes,要考虑:
- distribution issues:看需不需要分布式吧。
- performance issues:考虑跟 boundary class 和 entity class 的兼容问题。
- transaction issues:考虑是否需要事务管理技术。
2.2.2 activities
- 完善 activities 的规格:
- 补足属性、联结、操作等;
- 补足可见性等;
- 对操作增加约束,比如先决条件、后发动作等。
- 异常等。
- 选出可重用的组件:
- 类库;
- 对非功能性需求的一般设计机制(generic design mechanisms):持久性、分布式、安全性、事务管理等。
- 重建设计模式:
- realize associations:[理解]大概指可变性、适应性。
- 利用继承、代理等实现重用。
- 优化设计模式:
- 修改访问路径;
- 拆分 classes;
- 缓存;
- 延迟计算。
2.2.3 优秀的类的设计
- 完整、充足:无论什么 users 想做的都能满足;
- primitiveness:operations 采用最简单最省力的方式;
- 高内聚
- 低耦合
2.2.4 generic design mechanisms
针对常见的需求,一些好的实践。
- 设计模型,同义词:example。
- 针对 object 和 RDBMS 对应的情况,优秀的做法是:
- 一个 class 对应一张表;
- 一个 属性对应表中一个字段;
- 主键对应 objectId;
- 每个 object 对应表中一行;
- classes 间的 association 与表中关系对应;
- 继承关系,也在表中对应。
- 针对 object 和 RDBMS 对应的情况,优秀的做法是:
- 框架,不解释。
2.3 subsystems 设计
将系统拆分成子系统,便于更好的管理。
子系统中可以包括:
- 设计类;
- 用例的实现;
- 其他子系统;
- 接口。
Tips:用例可以设计成子系统;子系统可以被当做交互图。
2.3.1 子系统的分区/分层
- 可以递归的划分子系统;
- 每层为高层提供服务,以及使用下层的服务;
- 层次结构:
- closed layered architecture: 一般指上下层的调用,不可以跨层。较常见。
- open layered architecture: 可跨层调用。耦合度高,较少见。
- 子系统分区:
- 一层可分多个子系统;
- 层间存在 peer to peer 的服务。
2.3.2 子系统接口
- 通常叫做 API
- 包括:操作名、参数及参数类型、返回值;
- Tips:
- 如果有一个依赖指向这个子系统,那么这个子系统有必要提供一个接口。
- 使用接口的 client,与这个子系统的实现是 independent 的。
2.4 deployment model
- 定义:描述一个 system 是如果在物理上部署/安排的。
- deployment diagram 要展示的有:
- nodes:一般指计算资源(处理器等);
- relationships:一般指 nodes 的连接方式。
- 一般的分布式部署采用三层结构。
- 1)clients:用户接口。
- 2)database functionality:数据库的功能。
- 3)business/application logic:业务逻辑。
- [理解]其实是一种 server/client 结构,可以当做 view 层、业务层、DAO 层来看待,每层都可独立替代。
2.5 检查设计
一个大型 project 的开发会涉及很多人员甚至团队,所以要在设计的最后统一命名风格、统一 OO 的规矩、消除冗余类等等。检查工作要持续到 project 的始末。