体系结构设计

  1. 分析关键需求和项目约束;
  2. 通过选择体系结构风格;
  3. 进行软件体系结构逻辑(抽象)设计;
    1. 依据概要功能需求与体系结构风格建立初始设计
    2. 使用非功能性需求与项目约束评价和改进初始设计
  4. 依赖逻辑设计进行软件体系结构(实现)设计;
    1. 开发包(构件)设计
    2. 运行时的进程
    3. 物理部署
  5. 完善体系结构设计;
  6. 添加构件接口;
  7. 迭代过程3-7

前三个是逻辑设计

后四个是物理设计

分析关键需求和项目约束

image-20250421173019979

案例:

image-20250421173123175

通过选择体系结构风格

案例:

分层风格

  • 协议不变的情况下易于修改
  • 能够促进并行开发

image-20250421173742433

进行软件体系结构逻辑(抽象)设计

依据概要功能需求与体系结构风格建立初始设计

将需求分配到子系统和模块

  • 考虑功能的相同性
    • 不同任务,但是相同功能
  • 考虑可复用性
    • 结构、数据、行为的可复用性

案例:

image-20250421174328378

image-20250421174358005

image-20250421174521416

需要考虑这个销售是否用到Sale的数据 所以我们加入了红色字体的逻辑包

根据这个我们可以把下面的初步设计方案一:

image-20250421174733719

改成下面的初步设计方案二:

image-20250421174803777

使用非功能性需求与项目约束评价和改进初始设计

初步设计的分析

image-20250421185851040

根据这个修改出最终方案

image-20250421193541384

(RMI:远程方法调用)

物理包设计原则

image-20250421193945448

  • CCP:共同封闭原则;需要一起改的类放一起
  • CRP:共同重用原则;类应该可以被重用
  • REP:共同发布原则;单元的重用与单元的释放
  • ADP:无环依赖原则;包之间不要有循环依赖
  • SDP:稳定依赖原则;不稳定性 = 输出耦合度 / (输入耦合度 + 输出耦合度)
  • SAP:稳定抽象原则;稳定的包尽量是抽象包

包的稳定度度量

  • 一种方法是计算进、出该包的依赖关系的数目。可以使用这些数值来计算该包的位置稳定性(positional stabilty)。
    • (Ca)输入耦合度(Afferent Coupling):指处于该包的外部并依赖于该包内的类的类的数目。
    • (Ce)输出耦合度(Efferent Coupling):指处于该包的内部并依赖于该包外的类的类的数目。
    • (不稳定性I)
      • I=Ce/(Ca+Ce)

抽象性度量

  • 包的抽象性用抽象类的数目和包中所有类的数目进行计算。
  • 假如说包中类的总数是Nc,抽象类的数目是Na,那么抽象度A=Na/Nc

包设计的过程

  • 先CCP原则对把可能一同变化的类组织成包进行发布,
  • 随着系统的不断增长,我们开始关注创建可重用的元素,于是开始使用CRP和REP来指导包的组合。
  • 最后使用ADP、SDP、SAP对包图进行度量,去掉不好的依赖。

依赖逻辑设计进行软件体系结构设计

(JDBC(Java Database Connectivity)类库包是 Java 用于连接和操作数据库的一套 API(应用程序接口))