系统架构师---软件重用、基于架构的软件设计、软件模型

目录

软件重用

构件技术

基于架构的软件设计

ABSD方法与生命周期

抽象功能需求

用例

抽象的质量和业务需求

架构选项

质量场景

约束

基于架构的软件开发模型

架构需求

需求获取

标识构件

需求评审

架构设计

架构文档

架构复审

架构实现

架构演化


前言:

软件重用技术是一种重要的软件开发方法,虽然至今软件重用技术还不够成熟,距离理想中的软件工厂还有一些距离,但是现有的一些重用技术(例如,中间件、应用服务器等)已经改变了开发过程。

软件重用

软件产品与其他的产品不同,是抽象的,一旦产生就可以不限制地复制,因此重复利用软件产品的意义重大,可以节约大量的人力物力。软件重用指的是利用已经存在的软件元素建立新的软件系统,这其中的软件元素既可以是软件产品、源代码、也可以是文档、设计思想甚至是领域知识。软件重用可以直接提高软件的开发效率、降低软件的开发成本、缩短软件的开发周期、提高软件质量。

常见的软件重用形式包括:

  1. 源代码复用。这是最简单的也是最常见的重用形式,但由于软件系统的复杂性,很难大规模地重用已有源代码。
  2. 架构重用。架构重用也很常见,随着软件架构风格和设计模式的推广和应用,架构重用已经对软件开发产生了重大的影响。
  3. 应用框架的重用。随着软件技术的发展,应用框架的重用变得越来越普遍,很多成熟的软件公司都建立了自己的开发框架。在开源社区中,世界各地的技术爱好者也在不断地推出应用了各种新技术的开发框架,例如,应用AOP技术的Spring等
  4. 业务建模的重用。虽然不同的软件的业务领域各自不同,但人们还是总结出了一些常见领域的建模方法,重用这些领域模型可以降低因领域知识不足而造成的需求风险。
  5. 文档以及过程重用。软件文档和软件过程也是软件开发中不可缺少的元素,有效地重用这些文档和过程也有助于提高开发效率和软件质量、降低开发成本。
  6. 软件构件的重用。
  7. 软件服务的重用。随着Web服务的提出,人们越来越关注服务的重用。SOA面向服务框架提出了面向服务的软件架构,并且定义了相应的标准。但是SOA还不够成熟,相信这一领域在未来的几年中还将取得更大的进展。
构件技术

构件又称为组件,是一个包容、可复用的程序集。首先,构件是一个程序集,或者说是一组程序的集合。这个集合可能会以各种方式体现出来,如源程序或二进制的代码。这个集合整体向外提供统一的访问接口,构件外部只能通过接口来访问构件,而不能直接操作构件的内部。

构件的两个最重要的特征是自包容与可重用。自包容指的是构件的本身是一个功能完整的独立体,构件内部与外部的功能界限清晰明确,可以独立配置与使用。而可重用既是构件的特点,也是构件 出现的目的。使用构件技术实现软件复用,采用搭积木的方式生产软件,就成为软件人员的梦想。

构件的开发者和使用者往往不是相同的人或组织,所以必须定义构件的标准才能够消除其中的障碍。随着构件技术的发展,目前应用比较广泛的构件标准有Java Bean。

基于架构的软件设计

基于架构的软件设计是一种架构驱动方法。

  1. 功能的分解。在功能分解中,ABSD方法使用已有的基于模块的内聚和耦合技术。
  2. 通过选择架构风格来实现质量和业务需求。
  3. 软件模板的使用。软件模板利用了一些软件系统的结构。

软件模板是一个特殊类型的软件元素,包括描述所有这种类型的元素在共享服务和底层构造的基础上如何进行交互。软件模板还包括属于这种类型的所有元素的功能,这些功能的例子有,每个元素必须记录某些重大事件,每个元素必须为运行期间的外部诊断提供测试点等。在软件产品线系统 中,软件模板 显得格外重要,因为新元素的引入是一个通用的技术。这个技术用来使产品线架构适应一个特定的产品。

ABSD方式是递归的,且迭代的每一个步骤都是清晰定义的。因此,不管设计是否完成,架构总是清晰的,这有助于降低架构设计的随意性。

ABSD方法与生命周期

ABSD方法在生命周期中的位置。尽管我们没有描述一个需求获取、组织或跟踪的特定方法,但还是假设一个需求阶段至少部分完成,从需求获取(包括功能需求、质量和业务需求、约束)。ABSD方法的输出是三个视图的概念构件的集合,包括能够产生每个概念构件的假设、软件模板的集合和那些已经做出具体实现的决策,我们把具体实现决策当作附加约束来维护。

在ABSD方法中,必须记录所有做出的决策及这些决策的原理,这有利于决策的可跟踪性和决策评审。

ABSD方法的输入由下列部分组成

  1. 抽象功能需求,包括变化的需求和通用的需求
  2. 用例(实际功能需求)
  3. 抽象的质量和业务需求
  4. 质量因素(实际质量和业务需求)
  5. 架构选项
  6. 约束
抽象功能需求

ABSD方法假定需求阶段的输出之一是功能需求的抽象描述,包括这些需求的粗略变化描述。当获取需求时,考虑所有最终用户是重要的。

对一个特定系统来说,通常有不同类型的最终用户。不同的系统管理员(数据库管理员、系统管理员、网络管理员等)都是可以是最终用户。维护工程师也可以是系统的最终用户。总之,一个最终用户就是当系统运行时使用系统的任何人员。

与抽象功能需求相联系的是对公共需求和与这些需求相关的粗略变化的描述,在设计阶段,理解这些需求之间的依赖关系是至关重要的。

我们必须在某些抽象级别上获取功能需求,产品的详细需求往往要等具体产品开发完成后才能知道。当详细需求明确时,抽象功能的获取为详细需求提供了分类。

用例

用例是一个或多个最终用户系统之间的交互的具体表述,在这里,最终用户既可以是操作人员,也可以是与系统进行交互操作的其他软件系统。虽然用例很容易找到和创新,甚至可能有成百上千个,但是,因为我们需求分析用例,所以必须限制用例的数量。在架构设计阶段,只有重要的用例才有用。我们必须对所创建的用例进行分组,设置优先级,以便筛选出最重要的用例,剩下的用例可以在设计阶段的任何时候创建。

抽象的质量和业务需求

必须对待构建系统的质量和业务需求进行编号,每个质量属性都包含一个特定的行为,以及希望得到的结果,质量需求要尽量具体化。

架构选项

对每个质量和业务需求,我们都要列举能够满足该需求的所有可能的架构。例如,如果需求是支持一系列 不同的用户界面,则可能的架构选择就是把不同的用户界面分解成不同的构件。如果需求是保持操作系统的独立性,则可能的架构选择就是构建虚拟的操作系统层,接受所有的操作系统调用,并解释之为当前操作系统所能的支持。

只需要列举所有可能的选项,而不需要对这些架构选项进行决策,这种列举取决于设计师的经验,即可来自某些书籍介绍,也可直接来自设计师本身的实践。

质量场景

用例功能需求具体化一样,质量场景使质量需求具体化。质量场景使质量需求的特定扩充。

和用例一样,质量场景也很容易找到和创建,可以创建很多个。我们必须对质量场景进行分组,设置优先级,只需要验证最重要的质量场景。

约束

约束是一个前置的设计决策,设计过程本身包含决策。某些决策可以直接由业务目标导出而无须考虑对设计的影响。例如,如果一个公司在某个中间件产品上投入大量资金,那么在产品的选择上就可以不必考虑其他决策。在需求获取阶段,约束主要来自系统的业务目标。

在某些特殊情况下,约束由遗留系统决定。今天,几乎没有软件系统不参考已有系统的,常见的情况下,新老系统同时并存,或者新系统替代老系统,但是必须尽可能重用老系统的功能。在设计阶段,虽然这些遗留系统处于被设计系统的外部,但是设计师必须考虑遗留系统的特征。也就是说,在某种程度上,遗留系统影响着当前的设计,因此,理解遗留系统的结构和解决 问题的技术都很重要。出于商业的目的,可能要求重用遗留系统的构件,这种需求就变成了约束。

基于架构的软件开发模型

基于架构的软件开发模型(ABSDM)把整个基于架构的软件过程划分为架构需求、设计、文档化、复审、实现、演化等6个子过程。

架构需求

需求是指用户对目标软件系统在功能、行为、性能、设计约束等方面的期望。架构需求受技术环境和架构设计师的经验影响。需求过程主要是获取用户需求,标识系统种所要用到的构件。如果以前有类似的系统架构的需求,我们可以从需求库中取出,加以利用和修改,以节省需求获取的时间,减少重复劳动,提高开发效率。

需求获取

架构需求一般来自三个方面,分别是系统的质量目标,系统的业务目标和系统开发人员的业务目标。软件架构需求获取过程主要是定义开发人员必须实现的软件功能,使得用户能完成他们的任务,从而满足业务上的功能需求。

与此同时,还要获得软件质量属性,满足一些非功能需求。

标识构件

上图所示虚框部分属于标识构件过程,该过程为系统生产初始逻辑结构,包含大致的构件。这一过程又可以分为三步来实现。

第一步:生产类图。生产类图的CASE工具有很多,例如Rational Rose就能生成类图。

第二步:对类进行分组。在生成的类图基础上,使用一些标准对类进行分组可以大大简化类图结构,使之更清晰。一般地,与其他类隔离的类形成一个组,由泛化关联的类组成一个附加组,由聚合或组合关联的类也形成一个附件组。

第三步:把类打包成构件。把在第二步得到的类打包成构件,这些构件可以分组合并成更大的构件。

需求评审

组织一个由不同代表(如分析人员、客户、设计人员、测试人员)组成的小组,对架构需求及相关构件进行仔细的审查。审查的主要内容包括所获取的需求是否真实反映了用户的需求,类的分组是否合理,构件合并是否合理等。

必要时,可以在“需求-标识构件-需求评审”之间进行迭代。

架构设计

架构需求用来激发和调整设计决策,不同的视图被用来表达与质量目标有关的信息。架构设计是一个迭代的过程,如果要开发的系统能够 从已拥有的系统中导出大部分,则可以使用已有系统的设计过程。软件架构设计过程如图:

  1. 提出软件架构模型
    1. 在建立架构的初期,选择一个合适的架构风格是首要的。在 这个风格基础上,开发人员通过架构模型,可以获得关于架构属性的理解。此时,虽然这个模型是理想化的(其中的某些部分可能错误地表示了应用的特征),但是,该模型为将来的实现和演化过程建立了目标。
    2. 把已标识的构件映射到软件架构中,把在架构需求阶段已标识的构件映射到架构中,将产生一个中间结构,这个中间结构只包含哪些能明确适合架构模型的构件。
    3. 分析构件之间的相互作用,为了把所有已标识的构件集成到架构中,必须认真分析这些构件的相互作用和关系。
    4. 产生软件架构,一旦决定了关键构件之间的关系和相互作用,就可以在第二阶段得到的中间架构的基础上进行细化。
    5. 设计评审,一旦设计了软件架构,我们必须邀请独立于系统开发的外部人员对架构进行评审。
架构文档

绝大多数的架构都是抽象的,由一些概念上的构件组成。例如,层的概念在任何程序设计语言中都不存在。因此,要让系统分析师和程序员去实现架构,还必须把架构进行文档化。文档是在系统演化的每一个阶段,系统设计与开发人员的通信媒介,是为验证架构设计和提炼或修改这些设计所执行预先分析的基础。

架构文档化过程的主要输出结果是架构需求规格说明和测试架构需求的质量设计说明书这两个文档。生成需求模型构件的精确 的 形式化的描述,作为用户和开发者之间的一个约定。

软件架构的文档要求与软件开发项目中的其他文档是类似的。文档的完整性和质量是软件架构成功的关键因素。文档要从使用者的角度进行编写,必须分发给所有与系统有关的开发人员,并且保证开发者手上的文档是最新的。

架构复审

上图中可以看出,架构设计、文档化和复审是一个迭代的过程。从这方面来说,在一个主版本的软件架构分析之后,要安排一次由外部人员(用户代表和领域专家)参加的复审。

复审的目的是标识潜在的风险,以及早发现架构设计中的缺陷和错误,包括架构能否满足需求、质量需求是否在设计中得到体现、层次是否清晰、构件的划分是否合理、文档表达是否明确、构件的设计是否满足功能与性能的要求,等等

由外部人员进行复审的目的是保证架构的设计能够公正的进行检验,使组织的管理者能够决定正式实现架构。

架构实现

所谓的实现,就是用实体来显示出一个软件架构,即要符合架构所描述的架构性设计决策,分割成规定的构件,按规定方式互相交互。架构的实现过程如图

上图中的虚框部分是架构实现过程。整个实现过程是以复审后的文档化的架构说明书为基础的,每个构件必须满足软件架构中说明的对其他 构件的责任。这些决定即实现的约束是在系统级或项目范围内做出的,每个构件上工作的实现者是看不见的。

在架构说明书中,已经定义了系统中的构件与构件之间的关系。因为在架构层次上,构件接口约束对外唯一地 代表了构件,所以可以从构件库中查找符合接口约束的构件,必要时开发新的满足要求的构件。

然后,按照设计提供的结构,通过组装支持工具把这些 构件的实现体组装起来,完成整个软件系统的连接与合成。

最后一步是测试,包括单个构件的功能性测试和被组装应用的整个功能和性能测试。

架构演化

在构件开发过程中,最终用户 的需求可能还有变动。在软件开发完毕,正常运行后,由一个单位移植到另一个单位,需求也会发生变化。在这种情况下,就必须相应地修改软件架构,以适应新的软件需求。架构演化过程如下图所示。脚骨演化是使用系统演化步骤去修改应用,以满足新的需求。主要包括以下七个步骤。

  1. 需求变动归类首先必须对用户需求的变化进行分类,使变化的需求与已有构件对应。对找不到对应构件的变动,也要做好标记,在后续的工作中,将创建新的构件,以对应这部分变化的需求。
  2. 制定架构演化计划在改变原有结构之前,开发组织必须制定一个周密的架构演化计划,作为后续演化开发工作的指南。
  3. 修改、增加或删除构件在演化计划的基础上,开发人员可根据在第一步得到的需求变动的归类情况,决定是否修改或删除存在的构件、增加新的构件。最后,对修改和增加的构件进行功能性测试。
  4. 更新构件的相互作用随着构件的增加、删除和修改,构件之间的控制流必须得到更新。
  5. 构件组装与测试通过组装支持工具把这些构件的实现组装起来,完成整个软件系统的连接与合成,形成新的架构。然后对组装后的系统的整体功能和性能进行测试。
  6. 技术评审对以上步骤进行确认,进行技术评审。评审组装后的架构是否反映需求变动,符合用户需求。如果不符合,则需要进行2到6步之间进行迭代。
  7. 产生演化后的架构在原来的系统上所作修改必须集成到原来的架构中,完成一次演化过程。

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

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

相关文章

什么是响应式设计(Responsive Design)?如何实现一个响应式网页?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 响应式设计(Responsive Design)⭐ 如何实现一个响应式网页?1. 弹性网格布局2. 媒体查询3. 弹性图像和媒体4. 流式布局5. 优化导航6. 测试和调整7. 图片优化8. 字体优化9. 渐进增强10. 面向移动优先11. …

一、Kafka概述

目录 1.1 定义1.2 消息队列1、传统消息队列的应用场景2、消息队列的两种模式 1.3 Kafka的基础架构 1.1 定义 Kafka传 统定义:Kafka是一个分布式的基于发布/订阅模式的消息队列(Message Queue),主要应用于大数据实时处理领域。 K…

6、Spring_Junit与JdbcTemplate整合

Spring 整合 1.Spring 整合 Junit 1.1新建项目结构 1.2导入依赖 导入 junit 与 Spring 依赖 <!-- 添加 spring 依赖--> <dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version…

数据结构数组栈的实现

Hello&#xff0c;今天我们来实现一下数组栈&#xff0c;学完这个我们又更进一步了。 一、栈 栈的概念 栈是一种特殊的线性表&#xff0c;它只允许在固定的一端进行插入和删除元素的操作。 进行数据的插入和删除只在栈顶实现&#xff0c;另一端就是栈底。 栈的元素是后进先出。…

前端高频面试题 js中堆和栈的区别和浏览器的垃圾回收机制

一、 栈(stack)和 堆(heap) 栈(stack)&#xff1a;是栈内存的简称&#xff0c;栈是自动分配相对固定大小的内存空间&#xff0c;并由系统自动释放&#xff0c;栈数据结构遵循FILO&#xff08;first in last out&#xff09;先进后出的原则&#xff0c;较为经典的就是乒乓球盒结…

验证码服务(使用提供好的项目)

1、先生成一个指定位数的验证码&#xff0c;根据需要可能是数字、数字字母组合或文字。 2、根据生成的验证码生成一个图片并返回给页面 3、给生成的验证码分配一个key&#xff0c;将key和验证码一同存入缓存。这个key和图片一同返回给页面。 4、用户输入验证码&#xff0c;连…

iPhone 15 Pro与谷歌Pixel 7 Pro:哪款相机手机更好?

考虑到苹果最近将更多高级功能转移到iPhone Pro设备上的趋势,今年秋天iPhone 15 Pro与谷歌Pixel 7 Pro的对决将是一场特别有趣的对决。去年发布的iPhone 14 Pro确实发生了这种情况,有传言称iPhone 15 Pro再次受到了苹果的大部分关注。 预计iPhone 15系列会有一些变化,例如切…

新版Jadx 加载dex报错 jadx.plugins.input.dex.DexException:Bad checksum 解决方法

本文所有教程及源码、软件仅为技术研究。不涉及计算机信息系统功能的删除、修改、增加、干扰,更不会影响计算机信息系统的正常运行。不得将代码用于非法用途,如侵立删!新版Jadx(1.6+) 加载dex报错 jadx.plugins.input.dex.DexException:Bad checksum 解决方法 环境 win10J…

QT5.12.12通过ODBC连接到GBase 8s数据库(CentOS)

本示例使用的环境如下&#xff1a; 硬件平台&#xff1a;x86_64&#xff08;amd64&#xff09;操作系统&#xff1a;CentOS 7.8 2003数据库版本&#xff08;含CSDK&#xff09;&#xff1a;GBase 8s V8.8 3.0.0_1 为什么使用QT 5.12.10&#xff1f;该版本包含QODBC。 1&#…

二进制数间按位逻辑运算按位逻辑与、逻辑或运算bitwise_and()bitwise_or()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 二进制数间按位逻辑运算 按位逻辑与、逻辑或运算 bitwise_and() bitwise_or() [太阳]选择题 下列代码最后一次输出的结果是&#xff1f; import numpy as np a, b 3, 8 print("…

Diffusion Models for Image Restoration and Enhancement – A Comprehensive Survey

图像恢复与增强的扩散模型综述 论文链接&#xff1a;https://arxiv.org/abs/2308.09388 项目地址&#xff1a;https://github.com/lixinustc/Awesome-diffusion-model-for-image-processing/ Abstract 图像恢复(IR)一直是低水平视觉领域不可或缺的一项具有挑战性的任务&…

【golang】for语句和switch语句

使用携带range子句的for语句时需要注意哪些细节&#xff1f; numbers1 : []int{1, 2, 3, 4, 5, 6} for i : range numbers1 {if i 3 {numbers1[i] | i} } fmt.Println(numbers1)这段代码执行后会打印出什么内容&#xff1f; 答案&#xff1a;[1 2 3 7 5 6] 当for语句被执行…

C++避坑——most vexing parse问题

1."坑"的问题是什么&#xff1f; 先看一段代码&#xff1a; class Functor { public:void operator()(){std::cout << "我是线程的初始函数" << std::endl;} };int main() {std::thread t(Functor());// 强制高速编译器这是一个构造函数!t.j…

智慧课堂学生行为检测评估算法

智慧课堂学生行为检测评估算法通过yolov5系列图像识别和行为分析&#xff0c;智慧课堂学生行为检测评估算法评估学生的表情、是否交头接耳行为、课堂参与度以及互动质量&#xff0c;并提供相应的反馈和建议。智慧课堂学生行为检测评估算法能够实时监测学生的上课行为&#xff0…

小程序中的全局配置以及常用的配置项(window,tabBar)

全局配置文件和常用的配置项 app.json: pages:是一个数组&#xff0c;用于记录当前小程序所有页面的存放路径&#xff0c;可以通过它来创建页面 window:全局设置小程序窗口的外观(导航栏&#xff0c;背景&#xff0c;页面的主体) tabBar:设置小程序底部的 tabBar效果 style:是否…

java.8 - java -overrideoverload 重写和重载

重写(Override) 重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变&#xff0c;核心重写&#xff01; 重写的好处在于子类可以根据需要&#xff0c;定义特定于自己的行为。 也就是说子类能够根据需要实现父类的方法。 重写方法不…

浏览器跨域

生活中的事跟跨域有什么关系&#xff0c;那必须有。 跨域的产生是浏览器的安全机制引起的&#xff0c;只有在使用Ajax时才会发生。简单来说就是你可以通过ajax发送请求&#xff0c;但要看远程服务器脸色&#xff0c;他没授权&#xff0c;浏览器这个老六就给拦截了&#xff0c;不…

【C++】4、Preprocessor 预处理:条件编译、源文件包含、宏替换、重定义行号、错误信息、编译器预留指令

文章目录 一、概述二、格式2.1 条件编译2.2 源文件包含2.3 宏替换2.3.1 语法2.3.2 C标准内置的预定义宏 2.4 重定义行号和文件名2.5 错误信息2.6 编译器预留指令 三、应用场景 C的 Build 可分为4个步骤&#xff1a;预处理、编译、汇编、链接。 预处理就是本文要详细说的宏替换…

服务注册中心 Eureka

服务注册中心 Eureka Spring Cloud Eureka 是 Netflix 公司开发的注册发现组件&#xff0c;本身是一个基于 REST 的服务。提供注册与发现&#xff0c;同时还提供了负载均衡、故障转移等能力。 Eureka 有 3 个角色 服务中心&#xff08;Eureka Server&#xff09;&#xff1a;…

Java学数据结构(3)——树Tree B树 红黑树 Java标准库中的集合Set与映射Map 使用多个映射Map的案例

目录 引出B树插入insert删除remove 红黑树(red black tree)自底向上的插入自顶向下红黑树自顶向下的删除 标准库中的集合Set与映射Map关于Set接口关于Map接口TreeSet类和TreeMap类的实现使用多个映射Map&#xff1a;一个词典的案例方案一&#xff1a;使用一个Map对象方案二&…