架构要分阶段,而后分视图:
- 把握需求特点,确定架构驱动力(预备架构)
- 采用 二维需求观 来定出需求特定和非功能性需求优先级、取舍
- 根据重大需求,确定概念架构(概念架构)
- 细化架构设计,关注不同视图(4+1视图)
- 逻辑视图
- 开发视图
- 运行视图
- 数据视图
- 物理视图
- *贯穿如上3过程的有*对非功能目标的考虑
关注约束,要乘早。
架构设计,除了关注架构本身外,还关注到人,比如,划分子系统原则中,有如下:
- 职责分离原则
- 通用专用分离原则
- 技能分离原则(关注到了人)
- 工作量均衡原则(关注到了人)
************预备架构***********
预备架构关注质量因素和相互冲突关系,需要谨慎做出权衡。
质量点:
- 持续可用性
- 性能
- 可扩展性
- 安全性
- 可互操作性
- 可维护性
- 可移植性
- 可靠性
- 可重用性
- 鲁棒性
- 可测试性
- 易用性
共同决定架构的因素有:
- 功能需求
- 质量属性
- 约束(4大类约束)
- 业务环境
- 使用环境
- 构建环境
- 技术环境
预备架构,需要:
- 建立需求理解的大局观
- 关键需求决定架构
- 其余需求验证架构
还需要:
- 分析业务需求和约束背后的衍生需求
- 发现遗漏需求
- 确定关键功能
- 确定关键质量
- 权衡质量属性之间的矛盾关系
通过如下分析工具来进行(需求二维视图):
功能需求(广义) |
质量需求 |
约束 |
|
组织级 |
|||
用户级 |
|||
开发级 |
Tip:
- 关键功能子集(减法)
- 重点支持哪些质量属性(减法)
- 充分考虑约束(加法)
预备架构的分析步骤:
- 需求结构化
- 采用二维需求视图
- 分析约束影响
- 采用二维需求视图
- 确定关键质量(各质量间的关系、优先级、取舍)
- 分类合适+必要扩充
- 考虑多方涉众
- 检查性思维
- 识别矛盾+划定优先级
- 严格程度要符合领域和规模特定(比如医疗、航空领域,可靠性极高)
- 确定关键功能
- 核心功能
- 必做功能
- 高风险功能
- 独特功能
产出
· 关键质量、优先级
· 关键功能
**************概念架构***********
概念架构针对重大需求、特色需求、高风险需求的要求,给出高层次的解决方案(大方针,非细节)
分3个步骤:初步设计、高层分割、考虑非功能需求
初步设计:
- 发现关键职责(基于关键功能)
- 使用鲁棒图
高层分割(复杂性是根本问题,虽无法降低,但可以控制):
- 切系统为系统
- 当系统覆盖的功能范围比较广泛时
- Or
- 当系统需要部署在复杂的硬件环境中时
- 切系统为子系统
- 分层方式(以下技术可以同时应用于系统中)
i. Layer(逻辑层)
ii. Tier(物理层)
iii. 按通用型分层
iv. 技术堆叠
- 考虑非功能需求
- 采用 目标-场景-决策表 来分析
-
目标
场景 决策 可重用性 持续可用 安全性 - 上面的目标列具体内容,是从预备架构中得出的
产出
· 系统分层图及外部系统的表示
· 其他表示法,尚不清楚,比如黑板,微内核等
****************细化架构***********
细化架构分5种视图:
· 逻辑架构视图
· 开发架构视图
· 数据架构视图
· 运行架构视图
· 物理架构视图
逻辑架构视图
- 3管齐下,综合应用
- 分层的细化是划分子系统的必用策略之一
- 分区的引入
i. 对大多数团队而言,应先做一个高级的广度设计,然后马上转到深度优先的底层设计和实现上去
- 机制的提取
i. 机制是一种特殊的子系统,比如Event Framework
- 4 原则
- 职责不同的单元划归到不同子系统
- 通用型不同的单元划归不同子系统
- 需要不同开发技能的单元划归不同子系统
- 兼顾工作量的相对平衡,进一步切分太大的子系统
- “分”是手段,“合”是目的。不能“合”在一起支持更高层次功能的模块,又有何用呢?
- 协作决定接口 – 序列图
- 质疑驱动
- 功能方面,特殊的功能支持吗?
- 质量方面,耦合性、重用性、性能等怎么样?
- 用循环思维
i. 找遗漏对象事物
ii. 通过序列图分析
- 10条经验
- 划分子系统:分层的细化
- 划分子系统:分区的引入
- 划分子系统:机制的提取
- 接口的定义:协作决定接口
- 选用序列图,杜绝协作图
- 包 - 接口图:从结构到行为的桥
- 灰盒包图:描述关键子系统
- 循序渐进的螺旋思维
- 设计模式:包内结构
- 设计模式:包间协作
产出
· 分层UML图
· 关键子系统联系图(包间结构图、灰盒包图)
· 关键功能协作图
物理架构视图
思维框架
经济性,技术可行性,易维护性,性能,持续可用性,可伸缩性 |
目标层 |
通信开销(网络争用),计算开销(内存争用,硬盘争用,CPU争用,数据争用) |
思维层 |
软件单元,数据单元,网络,物理节点 |
结果层 |
产出:
· 部署图
运行架构视图
- 控制流图,主动对象<<active>>版型,UML
- 如果存在多个控制流,看情况,是否需要
- 控制流的create,destroy
- 共享内存
- 共享消息
产出
· 分层中主动对象标识出
· 关系到主动对象的活动流
开发架构视图
重用的目标:时刻关注节省成本
重用价值:重用次数*单次价值
维护是最昂贵的环节,要重用测试
重用技术方向:Framework, Service, Server,平台,中间件
产出
· 要编写的源程序清单
· 可重用的框架、库
· 项目划分、依赖关系
· 项目目录结构
· 技术选型
数据视图
数据分布策略:
- 把握系统特点,确定分布策略(合适原则)
- 不同分布策略,可以综合运用(综合原则)
- 从“对吗”,“好吗”两方面进行评估优化(优化原则)
数据分布分类:
- 独立、集中
- 分区(水平、垂直)
- 复制、子集
- 重组(统计性重组、结构性重组)
**************各个架构阶段的比较**********
架构设计应进行到何种程度
- 应为开发人员提供足够的指导和限制(可支持并行的详细设计)
- 因项目、开发团队情况的不同而变化(项目熟悉程度、风险高低、团队技能水平)
- 业务层、通用机制应更深入的设计
- 核心模型影响可扩展性,应当深入设计
- 通用机制影响易理解性和bug率,应当更深入设计
概念架构和5视图法的区别和联系
- 概念架构从少数视角重点视角进行概念设计
- 细化架构从多个视角、全面视角进行充分设计
- 经过细化架构设计后,就能进入详细设计了
工具:场景 – 设计决策
场景 |
设计决策 |