4+1视图

编写架构文档之前要先确定是给谁看的,不同的人关注点不同,就需要有不同的视图。

image.png

相关者 视角 主要元素 用途
逻辑视图 客户、用户,开发组织管理者 系统的功能元素,以及它们的接口、职责,交互 系统,子系统,功能模块,接口 开发组织划分,成本、进度的评估
过程视图 开发人员、性能优化 系统运行时现成,进程的情况 系统进程、线程及处理队列
物理视图 系统集成商,系统运维人员 系统逻辑组件到物理节点的物理部署和节点之间的物理网络配置 物理节点及节点间的通信
开发视图 开发人员、测试人员 系统如何开发实现 系统的分层,分区,包,框架,系统服务,业务服务,类,接口,系统平台和相关基础框架 指导开发组织设计和开发实现
场景视图 用户、设计人员、开发人员 重要场景及其非功能性需求

通过建模表达架构

什么是模型

对一个系统的完整的抽象,包括对某个领域特定问题的理解和认识,以及求解及解决方案。 计算机系统是为了解决某个领域的特定问题,问题的求解过程,就是从领域问题到计算机系统的映射。

1-架构方法:架构师如何做架构 - 图2

对架构师而言,最首要的是抽象能力,将客观世界中的问题映射到计算机系统中,架构文档就是架构师的输出。

软件为什么需要建模

  • 沟通
  • 表达软件设计的最终成果

UML

定义

UML:统一建模语言,以图形的方式描述软件的概念。

UML可以用来描述:

  • 某个问题领域
  • 作为设计工具,构思设计软件
  • 描述已经完成的软件实现

UML图

1-架构方法:架构师如何做架构 - 图3

UML图的分类,常见的要掌握的有7种:

  1. 静态图,用来描述各个元素之间的不变的关系。
    1. 用例图
      1. 包括角色,功能,边界等元素
      2. 每张图不要放过多信息,如果需要详细描述,可以按照自顶向下的逻辑分多张图展示
    2. 对象图
    3. 类图
    4. 组件图
      1. 六种关系
      2. 可以描述开发工作的分工及开发计划
    5. 包图
    6. 部署图
      1. 架构师应该画的第一张图
  2. 动态图:用来描述执行流程或软件实体在执行过程中的变化。
    1. 协作图
      1. 也叫合作图
      2. 可以由用例图自动生成
    2. 序列图
    3. 活动图
      1. 泳道
    4. 状态图
      1. 描述状态的变迁

        UML中的消息

  • 简单消息,反映在类之间就是方法调用
  • 同步消息,类之间的调用一定是同步的,虽然方法的实现有可能是异步的
  • 异步消息

六种关系的表达

各种关系的强弱顺序:
泛化 = 实现 > 组合 > 聚合 > 关联 > 依赖

从图例顺序也能看出强弱顺序:

泛化:1-架构方法:架构师如何做架构 - 图4

实现:1-架构方法:架构师如何做架构 - 图5

组合:1-架构方法:架构师如何做架构 - 图6

聚合:1-架构方法:架构师如何做架构 - 图7

关联:1-架构方法:架构师如何做架构 - 图8

依赖:1-架构方法:架构师如何做架构 - 图9

泛化(Generalization)

  • 实现关系:是一种继承关系,表示一般与特殊的关系,它指定了子类如何特化父类的所有特征和行为
  • 例如:老虎和动物
  • 箭头指向:带三角箭头的实线,箭头指向父类1-架构方法:架构师如何做架构 - 图10

实现(Realization)

  • 实现关系:是一种实现类与接口的关系,表示实现类是接口所有特征和行为的实现。

组合(Composition)

  • 实现关系:
    • 是一种整体和部分的关系,但部分不能离开整体独立存在
    • 整体和部分有相同的生命周期,整体对象负责部分的生命周期
    • 组合是关联关系的一种,比聚合更强的关系
    • 在代码中是以成员变量的形式出现,所以关联和组合在语法上无法区分,要视具体逻辑才能区分。
  • 例如:公司和部门的关系1-架构方法:架构师如何做架构 - 图11

聚合(Aggregation)

  • 实现关系:
    • 是一种整体和部分的关系,且部分可以离开整体而单独存在;
    • 聚合是关联关系的一种,是强的关联关系;
    • 在代码中是以成员变量的形式出现,所以关联和聚合在语法上无法区分,要视具体逻辑才能区分。
  • 箭头指向:带空心菱形的实心线,菱形指向整体。
  • 例如:汽车和轮胎的关系1-架构方法:架构师如何做架构 - 图12

关联(Association)

  • 实现关系:是一种拥有的关系,它使一个类知道另一个类的属性和方法;在代码中体现为类和成员变量的关系
  • 箭头指向:单向关联使用带普通箭头的实线,箭头指向被拥有者。双向的关联没有箭头或两个箭头。
  • 例如:1-架构方法:架构师如何做架构 - 图13

依赖(Dependency)

  • 实现关系:
    • 是一种使用的关系,即一个类的实现需要另一个类的协助,所以尽量不要使用双向的依赖。
    • 代码中体现为,局部变量、方法的参数或对静态方法的调用
  • 箭头指向:带箭头的虚线,指向被使用者。1-架构方法:架构师如何做架构 - 图14

各个阶段需要的模型图

需求分析(产品提供)

  • 用例图:功能场景
  • 活动图:关键的业务流程
  • 状态图:关键的业务对象的状态变迁
  • 时序图:当前系统和外部系统的依赖和交互

    概要设计

  • 部署图:顶层架构

  • 时序图:服务器或者子系统的时序图
  • 活动图:子系统级的活动图
  • 组件图:
  • 组件时序图:
  • 组件级的活动图:

    详细设计

  • 类图:

  • 类的时序图
  • 状态图:状态的枚举值、变迁的bool值变化
  • 方法级的活动图