4+1视图
编写架构文档之前要先确定是给谁看的,不同的人关注点不同,就需要有不同的视图。
相关者 | 视角 | 主要元素 | 用途 | |
---|---|---|---|---|
逻辑视图 | 客户、用户,开发组织管理者 | 系统的功能元素,以及它们的接口、职责,交互 | 系统,子系统,功能模块,接口 | 开发组织划分,成本、进度的评估 |
过程视图 | 开发人员、性能优化 | 系统运行时现成,进程的情况 | 系统进程、线程及处理队列 | |
物理视图 | 系统集成商,系统运维人员 | 系统逻辑组件到物理节点的物理部署和节点之间的物理网络配置 | 物理节点及节点间的通信 | |
开发视图 | 开发人员、测试人员 | 系统如何开发实现 | 系统的分层,分区,包,框架,系统服务,业务服务,类,接口,系统平台和相关基础框架 | 指导开发组织设计和开发实现 |
场景视图 | 用户、设计人员、开发人员 | 重要场景及其非功能性需求 |
通过建模表达架构
什么是模型
对一个系统的完整的抽象,包括对某个领域特定问题的理解和认识,以及求解及解决方案。 计算机系统是为了解决某个领域的特定问题,问题的求解过程,就是从领域问题到计算机系统的映射。
对架构师而言,最首要的是抽象能力,将客观世界中的问题映射到计算机系统中,架构文档就是架构师的输出。
软件为什么需要建模
- 沟通
- 表达软件设计的最终成果
UML
定义
UML:统一建模语言,以图形的方式描述软件的概念。
UML可以用来描述:
- 某个问题领域
- 作为设计工具,构思设计软件
- 描述已经完成的软件实现
UML图
UML图的分类,常见的要掌握的有7种:
- 静态图,用来描述各个元素之间的不变的关系。
- 用例图
- 包括角色,功能,边界等元素
- 每张图不要放过多信息,如果需要详细描述,可以按照自顶向下的逻辑分多张图展示
- 对象图
- 类图
- 组件图
- 六种关系
- 可以描述开发工作的分工及开发计划
- 包图
- 部署图
- 架构师应该画的第一张图
- 用例图
- 动态图:用来描述执行流程或软件实体在执行过程中的变化。
- 简单消息,反映在类之间就是方法调用
- 同步消息,类之间的调用一定是同步的,虽然方法的实现有可能是异步的
- 异步消息
六种关系的表达
各种关系的强弱顺序:
泛化 = 实现 > 组合 > 聚合 > 关联 > 依赖
从图例顺序也能看出强弱顺序:
泛化:
实现:
组合:
聚合:
关联:
依赖:
泛化(Generalization)
- 实现关系:是一种继承关系,表示一般与特殊的关系,它指定了子类如何特化父类的所有特征和行为
- 例如:老虎和动物
- 箭头指向:带三角箭头的实线,箭头指向父类
实现(Realization)
- 实现关系:是一种实现类与接口的关系,表示实现类是接口所有特征和行为的实现。
组合(Composition)
- 实现关系:
- 是一种整体和部分的关系,但部分不能离开整体独立存在
- 整体和部分有相同的生命周期,整体对象负责部分的生命周期
- 组合是关联关系的一种,比聚合更强的关系
- 在代码中是以成员变量的形式出现,所以关联和组合在语法上无法区分,要视具体逻辑才能区分。
- 例如:公司和部门的关系
聚合(Aggregation)
- 实现关系:
- 是一种整体和部分的关系,且部分可以离开整体而单独存在;
- 聚合是关联关系的一种,是强的关联关系;
- 在代码中是以成员变量的形式出现,所以关联和聚合在语法上无法区分,要视具体逻辑才能区分。
- 箭头指向:带空心菱形的实心线,菱形指向整体。
- 例如:汽车和轮胎的关系
关联(Association)
- 实现关系:是一种拥有的关系,它使一个类知道另一个类的属性和方法;在代码中体现为类和成员变量的关系
- 箭头指向:单向关联使用带普通箭头的实线,箭头指向被拥有者。双向的关联没有箭头或两个箭头。
- 例如:
依赖(Dependency)
- 实现关系:
- 是一种使用的关系,即一个类的实现需要另一个类的协助,所以尽量不要使用双向的依赖。
- 代码中体现为,局部变量、方法的参数或对静态方法的调用
- 箭头指向:带箭头的虚线,指向被使用者。