面向对象系统分析与设计(4)
引子
- 为了让具有不同背景的角色(比如 user、customer 等)能够准确地获取需求,引入了类图、用例图、时序图、状态机图等等手段
UP建模
UP建模的四大阶段:
- 初始阶段:主要从此阶段拿到需求。搞定最关键部分的元素。占比10%。
- 详述阶段:填充细节,占比约80%。
- construction 阶段:补充剩下的。(不理会)
- transition 阶段:需求变更时进入此阶段。(不理会)
专有名词
- domain model:针对一些全局的类和类之间的关系建模。静态的。关键词:数据。
- use-case model:针对角色、用例和他们之间的关系建模。动态的。关键词:功能性。
- domain specification:对 domain model 的描述。
- use case specification:对 use-case model 的描述。
- user-interface specification & prototyping:对 actors 和 system 之间的接口标准的描述。
- actors:指的是 users,代表外部的主体。
- glossary 术语表:分析员、开发者用的专业术语。
- architecture description:对 use-cases 中的主干(核心,仅占 5~10%)的描述
身份
- system analyst:负责整个需求、精简系统、确定类、类间的联系、确定 actors 和用例。(任务最重,几乎什么都做)
- domain analyst:分析全局的特性。
- architect:以整体视角对用例模型进行描述。
- use-case 举例者:对用例进行详细阐述。
- user-interface 设计者:设计接口。
获取需求的正确步骤
- 拿到 user 的 needs:目标 + 约束(哪些能做、哪些不能做)
- 确定可行性:从经济、技术、可操作性、合法性等方面考虑
- 记录需求。
- 实现需求。
什么是有效的需求?
正确、完整、一致、无二义、真实。
Domain 建模
【important】拿到系统中最核心的 classes 和它们的 associations
要求:这种建模要尽可能的准确,保证后期不再修改、系统可以重用。
- classes 有哪些?
- 业务对象(比如订单、账户这种);
- 真实世界的对象(比如消费者、供应商);
- 事件(买卖)
- classes 用名词表示,associations 用动词表示。
- 阿辉注:如果题目列出一大段文字,那么我们要做的是:
- 首先将名词圈出来,这些名词都可能是 classes;
- 然后剔除多余、不相关的名词。
- 同时存在一些名词,很明显是附属于其他名词的(比如 name、age 等名词,明显归属于 Person 的名下),可以当做属性看待,不能作为独立的 classes。
- 剔除这些名词后,幸存下来的差不多就是合格的 classes 了。
- 之后将动词圈出来,这些动词很可能就是 associations;
- 按照前两步骤幸存下来的名词连线,将不合格的动词剔除。
- 剩下的动词大概就是合格的 associations 了。
- 以上步骤主要靠练习,没有特别有效的技巧。
- 对于属性的命名,注重简短、有内涵等等。
- generalization(泛化、父类/子类的关系)的层次选择 2~3 层最合适。
use-case 建模
【important】看重功能性 functionality。
- 开始使用 use-case:
- 使用事件表;
- 确定 actors;
- 确定 functions;
- 为不同的场景创建 Activities flow。
- 一些内部用例可以重用。
actors
- 定义:system 外界的一些直接接触者(实体),对系统输入,获得输出。
- 举例:学生、教师、注册员、以及非人的事物(如第三方系统:账单系统)
- 理解:actor 是一个 object,user 则是这个 object 的 instance。
use case
- 定义:运用 system 的一种方式。代表一系列 events。
- 理解:use case 是一个类的容器,scenario 是一个 instance。
- use case 的命名应当是动宾短语,语态是现在时。
- 举例:一个注册员 registrar,对应的用例有:维护学生信息、维护教师信息、维护课程信息、提供课程清单。
Scenario
- 理解:以 actor 的视角,对 system 的描述。这种描述仅建立在部分功能的基础上,所以一定是不全面、带有偏见的。
- 用处:多用在 error 和非主要流程的描述上。
- scenario 的分类:
- 既有场景:描述当下。
- 预想的场景:描述将来。
- evaluation:比如:acceptance tests(对功能进行检测)。
- training:给新人培训。
- use-case 建模的两种观点:
- top-down:从 use-case 开始,到 scenario 结束。
- bottom-up:从 scenario 开始,到 use-case 结束。
怎么算是一个好的用例
- 主要体现功能性;
- 传递一些有价值的东西交给 actor;
- 范围要大,够清晰,最好列出细节。
- 不仅显示正常的流程,还要考虑异常的流程。
- 规格:
- name;
- actors;
- 一些先决条件:preconditions;
- 事件流:flow of events;
- 一些后决条件:postconditions;
- 其他需求(按需,可选)
- 分支、异常流程(按需,可选)
flow of events
- 定义:一系列的事件序列。要求有序、有条理、事件明确。
- 要求:尽可能简单、避免循环。
include
- 将若干个 use-cases 中的相同功能剥离开,作为独立的 use-case,然后让这些 use-cases 都包含(include)它。
- 在 use case 图中,通常是虚线箭头指向独立 use-case,而且附上
<<include>>
的记号。
extend
- 新的 use-case 继承旧的 use-case。
- 在 use case 图中,通常是子类用虚线箭头指向父类,而且附上
<<extend>>
的记号。
十种 use-case 建模的 errors
- 不写 usage scenario text。
- 只描述属性和方法不解释用法(usage)。(阿辉注:理解不能吧,我也看不懂,记住好了)
- use case 太简短。
- 遗漏 user interface。
- 给 use-case 取名太晦涩。
- 没有从 user 视角看待用例。
- 忽略 system 的响应。
- 忽略分支流程。
- 忽略前置、后置条件。
- 对采用 include 或 extends 难以抉择。
user-interface
逻辑上:需要确定哪些数据是 user 可以操作的,以及这些数据是用什么方式呈现给 user 的。
实际上:sketch -> prototype -> verify。
- [理解]先写个草稿、然后写个模板,最后套用并适当修改。
acceptance tests
- 定义:通过测试的方式,告知消费者,system 的功能、限制等等有效可用。
- 目标:确保功能性、接口可用、消息正确、以及界面正常。
- 步骤:
- 检查之前的需求,剔除冗余;
- 收集 users 新增的需求;
- 为每个需求,构建一个独立的评价场景。