系统架构设计高级技能 · 软件架构概念、架构风格、ABSD、架构复用、DSSA(一)【系统架构设计师】

系列文章目录

系统架构设计高级技能 · 软件架构概念、架构风格、ABSD、架构复用、DSSA(一)【系统架构设计师】
系统架构设计高级技能 · 系统质量属性与架构评估(二)【系统架构设计师】
系统架构设计高级技能 · 软件可靠性分析与设计(三)【系统架构设计师】

现在的一切都是为将来的梦想编织翅膀,让梦想在现实中展翅高飞。
Now everything is for the future of dream weaving wings, let the dream fly in reality.

系统架构设计 · 基础(一)【系统架构设计师】

  • 系列文章目录
  • 一、软件架构的概念★★★
    • 1.1 软件架构的定义
    • 1.2 软件架构设计4 + 1视图
    • 1.3 软件架构设计与生命周期
    • 1.4 软件架构的重要性
  • 二、软件架构的风格★★★★★
    • 2.1 软件架构经典五大风格
      • 2.1.1 数据流体系结构风格
        • 2.1.1.1 批处理风格
        • 2.1.1.2 管道/过滤器风格
      • 2.1.2 调用/返回系结构风格
        • 2.1.2.1 主程序/子程序风格
        • 2.1.2.2 面向对象风格
        • 2.1.2.3 层次结构风格
      • 2.1.3 以数据为中心系结构风格
        • 2.1.3.1 仓库结构风格
        • 2.1.3.2 黑板结构风格
        • 2.1.3.3 超文本系统风格
      • 2.1.4 虚拟机体系结构风格
        • 2.1.4.1 解释器风格
        • 2.1.4.2 规则系统风格
      • 2.1.5 独立构件体系结构风格
        • 2.1.5.1 进程间通信风格
        • 2.1.5.2 事件驱动系统风格(隐式调用)
    • 2.2 C2风格
    • 2.3 闭环风格
  • 三、基于架构的软件开发方法(ABSD)★★★★
    • 3.1 体系机构设计的方法概述
    • 3.2 基于架构的开发模型(ABSD)
  • 四、特定领域的软件架构(DSSA)★★★
    • 4.1 特定领域的软件架构 - 基本活动
    • 4.2 特定领域的软件架构 - 领域分析机制
    • 4.3 特定领域的软件架构 - 建立过程
  • 五、软件架构的复用★★★

一、软件架构的概念★★★

1.1 软件架构的定义

软件架构概念

软件架构(Software Architecture) = 软件体系结构
指系统的一个或者多个结构,结构包括:
(1)结构 - 软件的构件(可能是程序的模块、类、或者中间件)
(2)属性 - 构件的外部可见属性
(3)交互作用 - 构件之间的相互关系

软件架构的本质

软件架构为软件系统提供了一个 结构、行为和属性的高级抽象
软件架构风格是特定应用领域的 惯用模式,架构定义 一个词汇表和一组约束

软件架构的作用

软件架构是 项目干系人进行交流的手段
软件架构是 可传递和可复用的模型,通过研究软件架构可能预测软件的质量。
软件架构使推理和控制的更改更加简单, 有助于循序渐进的原型设计,可以作为培训的基础。

需求分析 → 架构(弥补需求到设计的鸿沟)→ 软件设计
架构设计就是需求分配,既 将满足的需求的职责分配到组件上

软件架构设计通过多种视图全面描述 - 4 + 1 视图

1.2 软件架构设计4 + 1视图

视角与视图:
从不同的视角来检查,所以会有不同的视图。
在这里插入图片描述

图1_1 软件架构4+ 1视图

Kruchten在1995年提出了一个“4+1”的视图模型。“4+1”视图模型从5个不同的视角包括逻辑视图、进程视图、物理视图、开发视图和场景视图来描述软件架构。每一个视图只关心系统的一个侧面,5个视图结合在一起才能反映系统的软件架构的全部内容。

逻辑视图:主要支持系统的功能需求,即系统提供给最终用户的服务。逻辑视图设计中要注意的主要问题是要保持一个单一的、内聚的对象模型贯穿整个系统,且描述对象模型和对象之间的关系。

开发视图:也称为模块视图,主要侧重于软件模块的组织和管理。开发视图通过系统输入输出关系的模型图和子系统图来描述。可以在确定了软件包含的所有元素之后描述完整的开发角度,也可以在确定每个元素之前,列出开发视图原则。

进程视图:也称为过程视图。侧重于系统的运行特性,主要关注一些非功能性的需求,例如系统的性能和可用性。进程视图强调并发性、分布性、系统集成性和容错能力,以及逻辑视图中的主要抽象的进程结构。进程视图可以描述成多层抽象,每个级别分别关注不同的方面。

物理视图:主要考虑如何把软件映射到硬件上,它通常要考虑到解决系统拓扑结构、系统安装、通信等问题。

场景:可以看作是那些重要系统活动的抽象,它使四个视图有机地联系起来,从某种意义上说,场景是最重要的需求抽象。在开发架构时,它可以帮助设计者找到架构的构件和它们之间的作用关系。同时,也可以用场景来分析一个特定的视图,或描述不同视图构件间是如何相互作用的。场景可以用文本表示,也可以用图形表示。

逻辑视图和开发视图描述系统的静态结构,而进程视图和物理视图描述系统的动态结构。对于不同的软件系统来说,侧重的角度也有所不同。例如,对于管理信息系统来说,比较侧重于从逻辑视图和开发视图来描述系统,而对于实时控制系统来说,则比较注重于从进程视图和物理视图来描述系统。

1.3 软件架构设计与生命周期

软件架构是贯穿整个生命周期的,不同阶段的作用和意义不同,各阶段架构工作表现表:

阶段作用和意义
需求分析阶段有利于各阶段参与者的交流,也易于维护各阶段的可追踪性。
软件需求模型向软件架构模型转换关注两个问题:
1)如何根据需求模型构建软件架构模型
2)如何保证模型转换的可追踪性
设计阶段关注最早和最多的阶段。
这一阶段的研究主要包括:
1)软件架构模型的描述
2)软件架构模型的设计与分析方法
3)软件架构设计经验的总结与复用
架构模型的描述研究包括:
①组成SA(软件架构)模型 - 构件和连接的建模
②架构描述语言(Architecture Describe Language,ADL)
③多视图 - 4 + 1视图
ADL三个基本元素:
1)构件:计算或数据存储单元,包括构件和相应的构件接口
2)连接件:用于构件之间交互建模的体系结构构造块及其支配这些交互的规则
3)架构配置:描述体系结构的构件和连接件的连接图
ADL是建模用的,是一些伪代码
实现阶段有效实现从软件架构设计向实现的转换。
这一阶段架构研究包括:
1)基于架构开发过程的支持
2)寻求从架构向实现过渡的途径
3)研究基于架构的测试技术
构件组装阶段可复用构件组装的设计能够提高系统实现的效率。
这一阶段的研究内容包括:
1)如何支持可复用构件的互联,即对架构设计模型中规约的连接子的实现提供支持
2)组装过程中,如何检测并消除架构失配问题
适配问题主要包括:
①构件本身适配
②连接子(互联机制)的失配
③部分和整体的失配
部署阶段组织和展示部署阶段的软硬件架构、评估分析部署方案。
部署阶段的软件架构对软件部署的作用:
1)提供高层的体系结构视图描述部署阶段的软硬件模型
2)基于软件架构模型可以分析部署方案的质量属性从而选择合理的部署方案
后开发阶段 主要围绕维护、演化、复用进行。
部署安装后(后开发阶段)的系统架构研究方向包括:
1)动态软件体系结构
2)体系结构恢复与重建

1.4 软件架构的重要性

软件架构设计是降低成本、改进质量、按时和按需交付产品的关键因素。

二、软件架构的风格★★★★★

  • 架构风格定义了用于描述系统的术语表和一组指导构建系统的规则。
  • 架构风格反映了领域中众多系统所共有的结构和语义特性,并指导如何将各个构件有效地组织成一个完整的系统。
  • 软件架构风格是特定应用领域的惯用模式,架构定义一个词汇表和一组约束。

2.1 软件架构经典五大风格

五大架构风格子风格
数据流风格批处理、管道-过滤器
调用/返回风格程序/子程序、面向对象、层次结构
以数据为中心风格数据库系统、黑板系统、超文本系统
虚拟机风格解释器、规则系统
独立构件风格进程通信、事件驱动系统(隐式调用)

2.1.1 数据流体系结构风格

在这里插入图片描述

图2_1 数据流风格

优点缺点典型实例
1、松耦合【高内聚-低耦合】
2、良好的重用性/可维护性
3、可扩展性【标准接口适配】
4、良好的隐蔽性
5、支持并行
1、交互性较差
2、复杂性高
3、性能较差(每个过滤器都需要解析与合成数据)
传统编译器
网络报文处理

2.1.1.1 批处理风格

批处理风格的每一步处理都是独立的,并且每一步是顺序执行的。数据必须是完整的,以整体的方式传递。

2.1.1.2 管道/过滤器风格

在管道/过滤器风格的软件架构中,每个构件都有一组输入和输出,构件读输入的数据流,经过内部处理,然后产生输出数据流。

2.1.2 调用/返回系结构风格

在这里插入图片描述

图2_2 调用/返回风格

2.1.2.1 主程序/子程序风格

主程序/子程序风格是结构化开发时期的经典架构风格。这种风格一般采用单线程控制,把问题划分为若干处理步骤,构件即为主程序和子程序。子程序通常可合成为模块。过程调用作为交互机制,即充当连接件。

2.1.2.2 面向对象风格

这种风格的构件是对象,或者说是抽象数据类型的实例。对象是一种被称作管理者的构件,它负责保持资源的完整性。对象是通过函数和过程的调用来交互的。

2.1.2.3 层次结构风格

层次系统组织成一个层次结构,每一层为上层服务,并作为下层客户。在一些层次系统中,除了一些精心挑选的输出函数外,内部的层只对相邻的层可见

2.1.3 以数据为中心系结构风格

在这里插入图片描述

图2_3 以数据为中心系结构风格

2.1.3.1 仓库结构风格

数据库系统是仓库风格最常见的形式。在数据库系统中,构件主要有两大类,一类是中央共享数据源,保存当前系统的数据状态;另一类是多个独立处理单元,处理单元对数据元素进行操作。

2.1.3.2 黑板结构风格

黑板系统包括知识源、黑板和控制三个部分。知识源包括若干独立计算的不同单元,提供解决问题的知识。知识源响应黑板的变化,也只修改黑板;黑板是一个全局数据库,包含问题域解空间的全部状态,是知识源相互作用的唯一媒介;知识源响应是通过黑板状态的变化来控制的。黑板系统通常应用在对于解决问题没有确定性算法的软件中,例如,信号处理、问题规划和编译器优化等。语音识别、知识推理。

2.1.3.3 超文本系统风格

超文本系统中出现的构件以网状链接方式相互连接,用户可以在构件之间进行按照人类的联想思维方式任意跳转到相关构件。超文本是一种非线性的网状信息组织方法,它以结点为基本单位,链作为结点之间的联想式关联。超文本系统通常应用在互联网领域。

2.1.4 虚拟机体系结构风格

在这里插入图片描述

图2_4 虚拟机体系结构风格

2.1.4.1 解释器风格

解释器通常包括一个完成解释工作的解释引擎、一个包含将被解释的代码的存储区、一个记录解释引擎当前工作状态的数据结构,以及一个记录源代码被解释执行的进度的数据结构。具有解释器风格的软件中含有一个虚拟机,可以仿真硬件的执行过程和一些关键应用,其缺点是执行效率比较低。

2.1.4.2 规则系统风格

基于规则的系统包括规则集、规则解释器、规则/数据选择器和工作内存,一般用在人工智能领域和DSS中。

2.1.5 独立构件体系结构风格

在这里插入图片描述

图2_5 独立构件体系结构风格

2.1.5.1 进程间通信风格

构件是独立的过程,连接件是消息传递,构件通常是命名过程,消息传递的方式可以是点对点,异步或者同步的方式,以及远程过程方法调用等。

2.1.5.2 事件驱动系统风格(隐式调用)

构件不直接调用一个过程,而是触发或广播一个或多个事件。这种风格中的构件是匿名的过程,它们之间交互的连接件往往是以过程之间的隐式调用(implicit invocation)来实现的。基于事件的隐式调用风格的主要优点是为软件复用提供了强大的支持,为构件的维护和演化带来了方便,其缺点是构件放弃了对系统计算的控制。

2.2 C2风格

C2风格通过连接件连接构件或某个构件组,构件与构件之间无连接。

软件体系结构设计的一个核心问题就是能否使用重复的体系结构模式,即能否达到体系结构级的软件重用。

C2 = EBI(基于事件的集成)+ LCS(分层客户端服务器)

C2是一种基于构件和消息的架构风格,可用于创建灵活的,可伸缩的软件系统。可以将架构看作是按照一定规则由连接件如消息路由设备连接的许多构件组成的层次网络系统中的构件和连接件都有一个“顶部”和“底部”;一个构件的“顶部”或“底部”可以连接到一个连接件的“底部”或“顶部”;对于一个连接件,和其相连的构件或连接件的数量没有限制,但是构件和构件之间不能直接相连。
在这里插入图片描述

图2_6 C2体系结构风格

C2架构的基本规则:

  • 构件和连接件都有一个顶部和一个底部。
  • 构件的顶部要连接到连接件的底部,构件的底部要连接到连接件的顶部,构件之间不允许直连。
  • 一个连接件可以和任意数目的其他构件和连接件连接。
  • 当两个连接件进行直接连接时,必须由其中一个的底部到另一个的顶部。

2.3 闭环风格

在这里插入图片描述

图2_7 闭环控制体系结构风格

  • 适用于嵌入式系统,用于解决简单闭环控制问题。
  • 经典应用:空调温控,定速巡航。

三、基于架构的软件开发方法(ABSD)★★★★

3.1 体系机构设计的方法概述

基于架构的软件设计(ABSD,Architecture-Based Software Design)是一种架构驱动方法,架构驱动也就是说架构先行,需求获取和分析还没有完成就开始架构设计,需求获取和分析与架构设计并行,例如产品线系统和长期运行的系统,我们不可能开始就能决定所有的需求。

ABSD强调由业务、质量和功能需求的组合驱动架构设计 ,强调采用 视角和视图描述软件架构 ,采用 用例(功能需求)和质量场景(质量需求) 描述需求

ABSD方法有三个基础:

  • 第一个基础是功能的分解。在功能分解中,ABSD方法使用已有的基于模块的内聚和耦合技术。
  • 第二个基础是通过选择架构风格来实现质量和业务需求。
  • 第三个基础是软件模板的使用。

3.2 基于架构的开发模型(ABSD)

传统的软件开发过程是问题定义,需求分析,软件设计,实现,测试。ABSD把整个软件过程分成六个部分,架构需求,设计,文档化,复审,实现,演化六个步骤。
在这里插入图片描述

图3_1 基于架构软件的开发过程

在这里插入图片描述

图3_2 基于架构软件的需求、设计、实现、演化过程

四、特定领域的软件架构(DSSA)★★★

DSSA(Domain Specific Software Architecture)特定领域软件架构,可以看做开发产品线的一个方法或理论,目标就是支持一个特定领域中多应用的生成。

4.1 特定领域的软件架构 - 基本活动

在这里插入图片描述

图4_1 基本活动

(1)建立领域模型,一个严格定义的问题域或解决域。其中,垂直域是在相同领域中深入;水平域是在不同领域中平移。
(2)具有普遍性,使其可以用于领域中某个特定应用的开发。
(3)对整个领域的合适程序的抽象。
(4)具备该领域固定的、典型的在开发过程中的。可复用元素。

4.2 特定领域的软件架构 - 领域分析机制

在这里插入图片描述

图4_2 领域分析机制

4.3 特定领域的软件架构 - 建立过程

在这里插入图片描述

图4_3 建立过程

五、软件架构的复用★★★

  • 软件架构复用的定义及分类
    软件架构复用是系统化的软件开发过程:开发一组基本的软件构件模块,以覆盖不同的需求/体系结构之间的相似性,提高系统开发的效率、质量和性能。

  • 软件架构复用的原因
    减少开发工作、减少开发时间、降低开发成本、提高生产力、提高产品质量,更好的互操作性。

  • 软件架构复用的对象及形式
    可复用的资产包括:需求、架构设计、元素、建模分析、测试、项目规划、过程+方法+工具、人员、样本系统、缺陷消除。
    一般形式的复用包括:函数的复用、库的复用、面向对象开发中的类、接口和包的复用。

  • 软件架构复用的基本过程
    (1) 首先构建/获取可复用的软件资产(复用前提);
    (2) 管理可复用资产;
    (3) 使用可复用资产。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/63339.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

小黑子—JavaWeb:第六章 - Filter、Listener、AJAX与JSON

JavaWeb入门6.0 1. Filter1.1 Filter快速入门1.2 Filter执行流程1.3 Filter拦截路径配置1.4 Filter过滤器链1.5 案例登录验证 2. Listener2.1 ServletContextListener使用 3. AJAX3.1 AJAX 快速入门3.2 案例 验证用户名是否存在3.3 Axios 异步框架3.3.1 Axios 快速入门3.3.2 Ax…

涂鸦智能获Matter Non-VID Scoped PAA资质 助力开发者拥抱Matter生态

今年5月,全球化IoT开发者平台涂鸦智能(NYSE: TUYA,HKEX: 2391)正式生成Tuya Matter PAA密钥根,并于7月,成功通过了连接标准联盟和第三方MA机构审查而上线。自此,涂鸦正式成为全球同时提供支持Ma…

Docker 发布一个springboot项目

文章目录 1、新建SpringBootDemo项目并打包2、使用Dockerfile打包(基础用法)进一步maven源码打包法 3、更进一步(maven插件打包)docker-maven-pluginspring-boot-maven-plugin前提条件本地环境配置项目环境配置maven插件打包运行校…

pycharm出现python test运行报错(pytest模式)

pycharm出现python test运行报错 一、python test 执行代码报错二、删除运行配置三、修改pycharm默认配置为 unittests四、成功! 一、python test 执行代码报错 二、删除运行配置 三、修改pycharm默认配置为 unittests 四、成功!

多语言一键铺货跨境电商平台快速开发(java开源)

要搭建一个多语言一键铺货跨境电商平台,可以参考以下步骤: 1. 确定需求:首先,明确平台的功能需求,包括多语言支持、一键铺货功能、跨境支付等。 2. 选择适合的开源项目:选择一个适合的Java开源电商平台项…

C语言系列之原码、反码和补码

一.欢迎来到我的酒馆 讨论c语言中,原码、反码、补码。 目录 一.欢迎来到我的酒馆二.原码 二.原码 2.1在计算机中,所有数据都是以二进制存储的,但不是直接存储二进制数,而是存储二进制的补码。原码很好理解,就是对应的…

SpringBoot + Docker 实现一次构建到处运行~

一、容器化部署的好处 图片 Docker 作为一种新兴的虚拟化方式,它可以更高效的利用系统资源,不需要进行硬件虚拟以及运行完整操作系统等额外开销。 传统的虚拟机技术启动应用服务往往需要数分钟,而 Docker 容器应用,由于直接运行…

vue项目实战-脑图编辑管理系统kitymind百度脑图

前言 项目为前端vue项目,把kitymind百度脑图整合到前端vue项目中,显示了脑图的绘制,编辑,到处为json,png,text等格式的功能 文章末尾有相关的代码链接,代码只包含前端项目,在原始的…

Stephen Wolfram:ChatGPT 的训练

The Training of ChatGPT ChatGPT 的训练 OK, so we’ve now given an outline of how ChatGPT works once it’s set up. But how did it get set up? How were all those 175 billion weights in its neural net determined? Basically they’re the result of very large…

opencv基础-38 形态学操作-闭运算(先膨胀,后腐蚀)cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)

闭运算是先膨胀、后腐蚀的运算,它有助于关闭前景物体内部的小孔,或去除物体上的小黑点,还可以将不同的前景图像进行连接。 例如,在图 8-17 中,通过先膨胀后腐蚀的闭运算去除了原始图像内部的小孔(内部闭合的…

在Raspberry Pi 4上安装Ubuntu 20.04 + ROS noetic(不带显示器)

在Raspberry Pi 4上安装Ubuntu 20.04 ROS noetic(不带显示器) 1. 所需设备 所需设备: 树莓派 4 B 型 wifi microSD 卡:最小 32GB MicroSD 转 SD 适配器 (可选)显示器,鼠标等 2. 树莓派…

【山河送书第五期】:《码上行动:利用Python与ChatGPT高效搞定Excel数据分析》参与活动,送书三本!!

《码上行动:利用Python与ChatGPT高效搞定Excel数据分析》 前言内容提要本书亮点购买链接参与方式往期赠书回顾: 前言 在过去的 5 年里,Python 已经 3 次获得 TIOBE 指数年度大奖,这得益于数据科学和人工智能领域的发展&#xff0…

【转】金融行业JR/T0197-2020《金融数据安全 数据安全分级指南》解读

原文链接:金融行业JR/T0197-2020《金融数据安全 数据安全分级指南》解读 《金融数据安全 数据安全分级指南》 解 读 随着IT技术的发展,银行的基础业务、核心流程等众多事务和活动都运营在信息化基础之上,金融机构运行过程中产生了大量的数字…

GNSS基本原理

大家都知道,GNSS卫星之所以能够对地球上的终端(例如手机、汽车、轮船、飞机等)进行定位,依靠的是三维坐标系。 找至少4颗卫星,分别计算各个卫星与终端之间的距离△L(这个距离也被称为“伪距”)&…

RISC-V基础之函数调用(五)函数递归调用及函数参数数量溢出(超出现有寄存器个数)约定(包含实例)

首先先解释一下栈在函数调用中的作用,更详细的部分请参照考研复习之数据结构笔记(五)栈和队列(上)(包含栈的相关内容)_管二狗赶快去工作!的博客-CSDN博客 函数嵌套调用栈的作用是用…

深度学习常用的激活函数

深度学习的核心思想是通过多层次的神经网络结构,逐步抽取和表示数据中的高级特征,从而实现对复杂数据模式的学习和识别。 神经网络结构: 深度学习使用多层次的神经网络,包括输入层、隐藏层和输出层。这些网络结构允许模型自动学习…

手机上的照片怎么压缩?推荐这几种压缩方法

手机上的照片怎么压缩?如果你需要通过电子邮件或短信发送照片,则可能需要将其压缩为较小的文件大小以便于发送。另外,如果您你的手机存储空间有限,可以通过压缩照片来节省空间。下面就给大家介绍几种压缩手机照片的方法。 1、使用…

Leetcode-每日一题【剑指 Offer 21. 调整数组顺序使奇数位于偶数前面】

题目 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数在数组的前半部分,所有偶数在数组的后半部分。 示例: 输入:nums [1,2,3,4]输出:[1,3,2,4] 注:[3,1,2,4] 也是正确的…

07 Ubuntu中使用poetry工具管理python环境——巨详细!!!

由于conda和ros2的环境实在太容易冲突了。我真的不敢再使用conda,着实是有些搞不明白这解释器之间的关系。 conda的卸载和ros2的安装暂不赘述,下面着重来说如何在Ubuntu中使用poetry进行包管理及遇到的问题。 1 安装poetry 由于在有写入权限的限制&am…

【Linux初阶】基础IO - 动静态库 | 初识、生成、链接、加载

🌟hello,各位读者大大们你们好呀🌟 🍭🍭系列专栏:【Linux初阶】 ✒️✒️本篇内容:动静态库初识,库的含义,静态库的生成与链接,gcc/g默认链接方式&#xff0c…