系统架构师学习笔记_第六章(下)_连载

6.3 基于 UML 的软件开发过程


6.3.1  开发过程概述

UML 是独立于软件开发过程的,能够在几乎任何一种软件开发过程中使用。迭代的渐进式软件开发过程包含四个阶段:初启、细化、构件、部署。

1、初启

项目的发起人 确定项目的 主要目标 和 范围,初步的可行性分析 和 经济效益分析。

2、细化

细化阶段的开始 标志着 项目的正式确立。

1.初步的需求分析,比较重要、比较有风险的用例。

2.初步的高层设计,用例、用例图、类、类图 将 依据 包 的划分方法 分属于 不同包。

3.部分的详细设计,根据软件元素 的重要性和风险程度 确立优先细化原则,不能将风险的识别和解决延迟到细化阶段后。

4.部分的原型构造。


3、构建

构造阶段,每次迭代中实现一部分用例,用户可以及早参与对已实现用例的实际评价。

原则:

1.用户认为业务价值较大的用例 应 优先安排。

2.开发人员评估后 认为 开发风险较高的用例 优先 安排。

迭代计划中,要确定迭代次数、每次迭代所需时间 以及 每次迭代中应完成的用例。


6.3.2  基于 UML 的需求分析

1、生成用例

如果多个用户扮演同一角色,这些用户将由单一执行者表示。如果一个用户扮演多种角色,则需要多个执行者来表示同一用户。

用例主要来源于分析人员对 场景的 分类和抽象,即将相似的场景进行归类,使一个用例可以通过实例化和参数调节而涵盖多个场景。

2、用活动图表示用例

3、生成用例图

执行者与用例之间的关系有两种:触发执行、信息交换。

执行者指向用例 表示 触发执行 和/或 信息交换,用例指向执行者 表示用例将生成的信息传递给执行者。

4、建立顶层架构

顶层架构便于开发人员 聚焦于系统的不同部分。


模型——视图——控制器(Model、View、Controller,MVC)模式。

模型 维护并保存数据,视图 呈现数据,控制器将动作映射为处理功能并实际调用。

MVC 模式特别适合于分布式应用软件,尤其是web应用系统。

分层模式 降低软件系统的 耦合度。

确立顶层架构的过程中需综合考虑以下因素:

包的数量,架构过早地陷入细节,返工的可能性很大,也不合理地限制了后续分析和设计活动的自由空间。

包之间的耦合度。

将不稳引起的软件元素分类聚集于少数几个包中,以提高软件系统的可维护性。

可选功能 和 必须实现的功能 置于 不同的包。

根据开发人员 专长 划分,使每个包都能分配给最合适的开发人员,有利于并行开发。


6.3.3  面向对象的设计方法

1、设计用例实现方案

1.提取边界类,实现类和控制类。

边界类用于描述 系统与外部环境之间的交互。
a.界面控制。
b.外部接口。
c.环境隔离。使目标软件系统的 其余部分 尽可能地 独立于环境软件。

边界类,<<boundary>>。

实体类“内向收敛”特征,仅提供 读/写 信息的必要操作 作接口,并不涉及业务逻辑处理,<<entity>>。

控制类,<<control>>。

边界类的作用范围可以超越单个用例。

2.构造交互图

交互图作为用力的精确实现方案。

事件流中的事件 直接对应交互图中的消息,事件间的先后关系体现为 交互图中的时序,对消息的响应 则构成消息接收者的职责,这种职责被确立为 类的方法。

不应该出现 穿越控制类 生命线 的消息。

为 易于理解,应该用分离的 UML 交互图 分别表示 事件流和每个备选事件流。

原则上,每个类都应该有一个操作来响应交互图中指向其对象的那条消息。

2、设计技术支撑方案

当用户需求发生变化时,技术支撑方案应具有良好的稳定性。

技术支撑方案应该位于层次结构中的较低层次。

一方面取决于 需求,另一方面取决于 对软件技术手段把我和选取。

3、设计用户界面

1.熟悉用户 并对 用户分类,以便尽量照顾到所有用户的合理要求,并优先满足某些特权用户。

2.按用户类别 分析用户的 工作流与习惯,从每类中选取一个用户代表,建立调查表,判断用户对操作界面的需求和喜好。

3.首先应考虑命令的顺序,一般常用命令居先,与用户工作习惯保持一致;其次,根据外部服务之间的聚合关系组织相应的命令;然后充分考虑人类记忆的局限性,最好组织为一颗两层多叉树;提供操作的快捷方式。

5.利用快速原型演示,改进界面设计。并评判系统是否 齐全、方便、好用。

4、精化设计模型

对模型进行改进的活动可以分为 精化 和 合并 两种。一般先从精化开始。设计优秀的粗粒度组件应该只是完成一项功能,这一点是它与子系统的主要区分。

粗粒度组件的范围过于广泛,难以发挥重用价值,粗粒度组件拥有持久化的行为,拥有业务逻辑,需要表示层的支持。

将需求分成几个功能组,基本上就可以得到相应的粗粒度组件了。

过小的范围,将会造成粗粒度组件不容易使用,用户需要理解不同的粗粒度组件之间的复杂关系。

如果可能,在粗粒度组件之间定义单项关联可以有效的减少组件之间的耦合。

尽可能简化组件之间的关系。

我们需要从软件的目标领域中 识别出关键性的实体,或者说领域中的名词。然后决定它们应该归属于那些粗粒度组件。

两个组件之间存在重复的要素,可以从中抽取共性的部分,形成新的组件。


6.4  系统架构文档化

6.4.1  模型概述

以精心选择的形式 将若干结构元素进行装配。

软件架构 = { 元素,形式,关系/约束 }

逻辑视图(logical view)对象模型。
过程视图(process view)并发和同步特征。
物理视图(physical view)分布式。
开发视图(development view)静态组织结构。
场景。
Rational 4.1 视图模型。

每个视图上均独立地应用 Perry&Wolf 软件架构公式。

对每种视图选用特定的 架构风格(architectural style)。


6.4.2  逻辑结构

逻辑架构主要支持功能性需求,系统分解为一系列的关键抽象,(大多数)来自于问题域,表现为对象或对象类的形式。

抽象、封装、继承。

对于数据驱动程度高的应用程序,可以使用其他形式的逻辑视图,如 E-R图 代替面向对象的方法。

1、逻辑视图的风格

采用面向对象的风格,试图在整个系统中 保持 单一的、一致的 对象模型。


6.4.3  进程架构

进程架构考虑一些非功能性的需求,并发性、分布性、系统完整性、容错性,以及逻辑视图的主要抽象如何与进程结构相配合在一起。

进程是 构成可执行单元任务的分组。

区分主要次要任务:主要任务是 可以唯一处理的架构元素;次要任务是 由于实施原因而引入的局部附加任务。


6.4.4  开发架构

开发架构关注软件开发环境下实际模块的组织。

开发架构用模块和子系统图来表达,显示了“输出”和“输入”关系。

考虑因素:开发难度、软件管理、重用性、通用性、由工具集、语言 所带来的限制。

开发视图 是建立产品线的 基础。

推荐使用分层(layered)的风格,每层具有良好定义的职责。某层子系统依赖同一层或低一层的子系统,最大程度地减少了具有复杂模块依赖关系的 网络的开发量。


6.4.5  物理架构

物理架构主要关注系统非功能性的需求,可用性、可靠性(容错性),性能(吞吐量)、可伸缩性。

软件至节点的映射需要高度的灵活性 及 对源代码产生最小的影响。


6.4.6  场景

4种视图的元素通过数量比较少的一组重要场景(更常见的是用例)进行无缝协同工作,我们为场景描述相应的脚本(对象之间和过程之间的交互序列)。

在某种意义上 场景是最重要的 需求抽象。

4+1 的 +1 起到了两个作用:

作为一项驱动因素 来发现架构设计过程中的 架构元素。

作为架构原型测试的出发点。

场景表示法与组件逻辑视图非常相似,但它使用过程视图的连接符来表示对象之间的交互。


6.4.7  迭代过程

在进行文档化时,提倡一种更具有迭代性质的方法——架构先被原型化、测试、估量、分析,然后在一系列的迭代过程中被细化。

除了减少 风险之外,还有其他优点:团队合作、培训、加深对架构的理解、深入程序和工具 等。使 需求被细化、成熟化。

系统大多数关键的功能以场景的形式被捕获,关键意味着:最重要的功能、系统存在的理由、使用频率最高的功能、必须减轻的一些重要技术风险。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值