软件架构之构件复用技术

简介

软件架构复用

在应用软件系统的开发过程中,通常包含以下几个关键阶段:需求分析、设计、编码、测试和维护。在这些阶段中,复用技术均可以得到有效应用。特别是,软件架构复用作为一种大粒度、高抽象级别的复用方式,为后续的编码、测试等工作中的复用技术应用奠定了坚实的基础。

软件架构复用不仅关注系统的整体组织和结构,还涉及系统中各部分的接口选择、特定行为的定义、较大子系统的构成以及架构风格的确定。通过在架构设计阶段引入复用技术,可以显著提升系统的可维护性和可扩展性,同时降低开发成本和缩短开发周期。架构复用的核心在于通过预先定义和验证的架构模式和组件,确保在后续开发阶段中能够高效、可靠地复用这些经过验证的架构元素,从而提高整个软件开发过程的效率和质量。

软件复用的维度

  • 水平复用 强调的是在不同应用程序或系统之间的复用,通常涉及通用的、独立的组件。
  • 垂直复用 强调的是在同一应用程序的不同层次之间的复用,通常涉及特定的、业务相关的组件。

软件复用的方式

1. “原封不动”复用

“原封不动”复用是指寻找可以直接使用的现存类,以提供所需的特性。这种情况是所需要的类已经存在。现在建立它的一个实例,用以提供所需的特性。这个实例可以直接为应用软件利用,或者它可以用来做另一个类的实现部分。通过复用一个现存类,可以获得不加修改就能工作的已测试代码。

2. 进化性复用

进化性复用是指在找不到完全符合要求特性的类时,如果存在具有类似功能的类,可以通过继承来实现系统的功能需求。如果新类将要成为一个现存类的子类,它应当继承这个现存类的所有特性。然后,新类可以对需要追加的数据及必需的功能进行补充定义,还可以将几个现存类的特性混合起来开发出新的类。每个现存类是某些概念的模型,混合起来则产生了一个为特定待开发软件所用的具有多重概念的类。有时一个现存的类可能会提供某些新类中需要的特性和某些新类中不需要的特性。因此,可以先建立一个新的更抽象的类,使之成为要设计的类的父类,然后修改现存类以继承新的父类。

3. “废弃性”开发

“废弃性”开发是指在不使用任何复用的情况下开发一个新类。任何一个类,只要其开发不涉及现存类,就可以被视为一个新类的开始。因此,将建立两种类:一种是抽象类,它概括了将要表达的概念;另一种是具体类,它实现这个概念。虽然在开发新类时不需要使用现存类来演变成新类,但仍存在复用的可能性。在新类的实现过程中,可以通过引用一些现存类的实例来加快开发速度。例如,表格、硬件接口等都可以作为新类的局部组件使用。

模块、对象和构件

从关注点上来讲,模块关注于代码的组织和复用对象关注于数据和行为的封装构件关注于系统的构建和部署。相对来说,构件最显著的特征是其具有较高的独立性,可以独立开发、测试和部署。在其操作上具有可配置的特性,通常可以通过配置来适应不同的环境或需求,而不怎么需要修改其内部代码。

构件复用的四个阶段

基于构件的软件设计方法(CBSD)主要是指从已有的构件库中利用可复用的构件,尽快让系统模块化,从而让系统能够快速开发出来的开发方法。具体可以细分为检索和提取构件、理解和评价构件、对构件进行修改、组装构件模型四个阶段。

检索和提取构件

从构件库中提取寻找构件一般有三种方法,分别是关键字分类法刻面分类法 和 超文本组织法

1、关键字分类法

假设我们有一个巨大的图书馆,里面有很多书。为了找到一本特定的书,你可以使用书的标题、作者名或者关键词来搜索。在软件构件库中,关键字分类法就是通过给每个构件打上标签(关键字),比如“数据库连接”、“用户认证”等,然后通过这些关键字来搜索构件。这种方法简单直接,适用于构件有明确标签的情况。

2、刻面分类法

刻面分类法类似于宝石的切面,每个切面代表构件的一个属性或特征。想象一下,我们在挑选宝石,宝石的每个切面都代表它的一个特性,比如颜色、透明度、重量等。在软件构件库中,刻面分类法会根据构件的不同属性(如功能、性能、可靠性等)来组织构件。这样,你可以根据需要的特定属性来选择构件,比如你想要一个“高性能”且“易于维护”的数据库连接构件,就可以通过这两个属性来筛选。

3、超文本组织法

在软件构件库中,超文本组织法就是通过链接(超链接)将相关的构件组织在一起。例如,一个“用户认证”构件可能会链接到“权限控制”和“会话管理”构件,因为这些构件在功能上是相互关联的。这种方法有助于用户在构件之间建立联系,理解它们之间的关系,从而更好地选择和组合构件。

除了以上从构件库中获取构件以外,其他的获取方法还有:通过遗留工程(legacy engineering)进行解构,将具有潜在重用价值的构件提取出来,得到可重用的构件。也可以从市场上购买现成的商业构件,即COTS(Commercial Off-The-Shell)构件。

理解和评价构件

准确地理解构件至关重要。特别是对构件修改使用时,必须要求构件的开发过程遵循公共标准

逆向工程是理解构件的另一种重要手段。它试图通过对构件的分析,结合领域知识,半自动地,生成相应的设计信息,然后借助设计信息完成
对构件的理解和修改。

对构件进行修改

理想状态是直接复用构件库中现成的构件,但大多数情况下,必须对构件进行或多或少的修改,以应对新需求。

为了减少构件修改的工作量,要求开发人员尽量使构件的功能、行为和接口设计更为抽象化、通用化和参数化。这样,复用者即可通过对实参的选取来调整构件的功能或行为。如果这种调整仍不足以使构件适用于新系统,复用者就必须借助设计信息和文档来修改构件。

修改后的构件存入构件库。

组装构件模型

组装构件通常有三种可供选择的方式。

1、基于功能的组装:

采用子程序调用和参数传递的方式将构件组装起来。开发人员首先应对目标软件系统进行功能分解,将系统分解为强内聚、松耦合的功能模块。然后根据各 模块的功能需求提取构件,对它进行适应性修改后再挂接在上述功能分解框架(framework)中。

2、基于数据的组装

仍然是传统的子程序调用与参数传递。但它所依赖的软件设计方法不再是功能分解,而是面向数据的设计方法,例如,Jackson系统开发方法。这种方法从目标系统的输入、输出数据结构入手,导出程序框架结构,再补充其他细节,最终得到完整的程序结构图。它特别适用于输入、输出数据结构明确的中小型系统,例如商业应用中的文件表格处理。

3、面向对象的组装

如果从类库中检索出来的基类能够完全满足新系统的需求,则可以直接应用。否则,必须以基类为父类,生成相应的子类,以满足新系统的需求。

构件系统体系结构

构件系统体系结构由一组平台决策、一组构件框架和构件框架之间的互操作设计组成。系统体系结构是构建和设计系统的蓝图,而构件是这个蓝图中的构建块,它们共同定义了系统的结构和行为。

简单来说,构件系统的体系结构类似于搭积木,具有可配置、模块化、可替换、动态性的特性。构件系统架构(Component-Based Software Engineering, CBSE)是基于此。

原子构件 通常指的是最小的、不可再分的构件单元,它封装了特定的功能和所需的资源。从这个角度来看,原子构件确实可以被视为一个“小的服务”

构件复用的案例分析

制作可复用的页面在一个软件系统中,如果页面的样式大体一致,整个系统就形成一个统一的风格,便于程序员的开发与维护,也便于用户的使用记忆并给予用户一个整体的美感。

我们代入到一个 “ERP业务系统的设计与实现” 中,一种符合构件复用的设计是,实现一个页面模板,并将模板中的前台和后台代码都分为不变部分和可变部分。在制作一个应用页面时,程序员只要修改其中的可变部分代码即可完成页面的制作。这样,在制作模板页面时,尽可能地将代码写成通用的不变部分,以减少程序员的代码编写量。

页面可以用到3种可复用的构件,分别为数据库访问构件,页面用户控件和自定义控件。

在这个例子中,我们可供分析的信息有:

1)上述案例中的菜单可以作为一种构件(而不只是代码模块或对象),具有标准的表现形式和结构,同时具有独立部署、便于组装的特性。

2)上述案例的复用是对ERP系统领域不同层次的复用,属于垂直复用

3)我们可以将菜单的抽象实现当成是一个原子构件,由一个菜单项类和一些触发形式、名称、子菜单项组成。其组装的方式倾向于面向对象的组装方式。

4)ERP系统中的菜单具有可配置、模块化、可替换、动态性的特性。在软件开发早起通常由程序员手动实现,目前该类需求已经被替换由主流操作系统的框架(如.NET)实现,通过组合现成的、可互操作的构件来构建实现。

5)以上基于构件的软件工程称之为CBSE

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

55 | 享元模式(下):剖析享元模式在Java Integer、String中的应用

上篇文章,我们通过棋牌游戏和文本编辑器这样两个实际的例子,学习了享元模式的原理、实现以及应用场景。用一句话总结一下,享元模式中的“享元”指被共享的单元。享元模式通过复用对象,以达到节省内存的目的。 今天,我…

[PHP]重复的Notice错误信息

<?php $a []; var_dump($a[name]);执行结果&#xff1a; 原因&#xff1a; display_errors和error_reporting都打开了Notice错误信息

线性回归实现

1.从数据流水线、模型、损失函数、小批量随机梯度下降优化器 %matplotlib inline import random import torch from d2l import torch as d2l 2.根据带有噪声的线性模型构造人造数据集。使用线性模型参数w [2,-3.4]T、b 4.2和噪声项ε生成数据集及标签 y Xw b ε def …

windows 上验证请求接口是否有延迟

文件名&#xff1a;api_request_script.bat &#xff0c;直接右键点击执行即可。 echo off setlocal:: 配置:: 替换为实际接口URL set "logFilelog.txt" set "errorLogFileerror_log.txt" set "interval3" :: 请求间隔&#xff08;秒&#xff…

React之组件渲染性能优化

关键词&#xff1a; shouldComponentUpdate、PureComnent、React.memo、useMemo、useCallback shouldComponentUpdate 与 PureComnent shouldComponentUpdate 与 PureComnent 用于类组件。虽然官方推荐使用函数组件&#xff0c;但我们依然需要对类组件的渲染优化策略有所了解…

面经汇总——第一篇

1. int数据类型做了什么优化 Java在处理整数类型时&#xff0c;进行了多种优化&#xff0c;主要体现在编译器层面和JVM层面&#xff0c;目的是提高性能、减少内存开销。 常量池优化 Java中的Integer类有一个缓存机制&#xff0c;对于值在-128到127之间的int数字&#xff0c;Int…

springBoot集成nacos注册中心以及配置中心

一、安装启动nacos 访问&#xff1a;http://127.0.0.1:8848/nacos/index.html#/login 二、工程集成nacos 1、引入依赖 我这里搭建的父子工程哈&#xff0c;在子工程引入 <dependencies><!-- SpringBoot Web --><dependency><groupId>org.sp…

代码审计-Python Flask

1.Jinjia2模版注入 Flask是一个使用 Python 编写的轻量级 Web 应用框架。其 WSGI 工具箱采用 Werkzeug &#xff0c;模板引擎则使用 Jinja2。jinja2是Flask作者开发的一个模板系统&#xff0c;起初是仿django模板的一个模板引擎&#xff0c;为Flask提供模板支持&#xff0c;由于…

MySQL-30.索引-介绍

一.索引 为什么需要索引&#xff1f;当我们没有建立索引时&#xff0c;要在一张数据量极其庞大的表中查询表里的某一个值&#xff0c;会非常的消耗时间。以一个6000000数据量的表为例&#xff0c;查询一条记录的时间耗时约为13s&#xff0c;这是因为要查询符合某个值的数据&am…

RabbitMQ系列学习笔记(八)--发布订阅模式

文章目录 一、发布订阅模式原理二、发布订阅模式实战1、消费者代码2、生产者代码3、查看运行结果 本文参考&#xff1a; 尚硅谷RabbitMQ教程丨快速掌握MQ消息中间件rabbitmq RabbitMQ 详解 Centos7环境安装Erlang、RabbitMQ详细过程(配图) 一、发布订阅模式原理 在开发过程中&…

SpringBoot+MyBatis+MySQL项目基础搭建

一、新建项目 1.1 新建springboot项目 新建项目 选择SpringBoot&#xff0c;填写基本信息&#xff0c;主要是JDK版本和项目构建方式&#xff0c;此处以JDK17和Maven举例。 1.2 引入依赖 选择SpringBoot版本&#xff0c;勾选Lombok&#xff0c;Spring Web&#xff0c;MyBa…

UI自动化测试 —— web端元素获取元素等待实践!

前言 Web UI自动化测试是一种软件测试方法&#xff0c;通过模拟用户行为&#xff0c;自动执行Web界面的各种操作&#xff0c;并验证操作结果是否符合预期&#xff0c;从而提高测试效率和准确性。 目的&#xff1a; 确保Web应用程序的界面在不同环境(如不同浏览器、操作系统)下…

设计模式和软件框架的关系

设计模式和软件框架在软件开发中都有助于解决复杂问题和提高代码质量&#xff0c;但它们在概念和使用上存在一些区别。它们的关系可以通过以下几点理解&#xff1a; 层次与抽象程度 设计模式&#xff08;Design Patterns&#xff09;是一组通用的、可复用的解决方案&#xff0c…

完爆YOLOv10!Transformer+目标检测新算法性能无敌,狠狠拿捏CV顶会!

百度最近又搞了波大的&#xff0c;推出了一种全新的实时端到端目标检测算法RT-DETRv3&#xff0c;性能&耗时完爆YOLOv10。 RT-DETRv3基于Transformer设计&#xff0c;属于代表模型DETR的魔改进化版。这类目标检测模型都有着强大的扩展性与通用性&#xff0c;因为Transform…

MySQL—CRUD—进阶—(二) (ಥ_ಥ)

文本目录&#xff1a; ❄️一、新增&#xff1a; ❄️二、查询&#xff1a; 1、聚合查询&#xff1a; 1&#xff09;、聚合函数&#xff1a; 2&#xff09;、GROUP BY子句&#xff1a; 3&#xff09;、HAVING 子句&#xff1a; 2、联合查询&#xff1a; 1&#xff09;、内连接…

基于FPGA的以太网设计(五)

之前简单介绍并实现了ARP协议&#xff0c;今天简单介绍一下IP协议和ICMP协议。 1.IP协议 IP协议即Internet Protocol&#xff0c;是网络层的协议。 IP协议是TCP/IP协议族的核心协议&#xff0c;其主要包含两个方面&#xff1a; IP头部信息。IP头部信息出现在每个IP数据报中…

第13篇:无线与移动网络安全

目录 引言 13.1 无线网络的安全威胁 13.2 无线局域网的安全协议 13.3 移动通信中的安全机制 13.4 蓝牙和其他无线技术的安全问题 13.5 无线网络安全的最佳实践 13.6 总结 第13篇&#xff1a;无线与移动网络安全 引言 无线和移动网络的发展为我们的生活带来了极大的便利…

边缘计算与联邦学习:探索隐私保护和高效数据处理的结合

个人主页&#xff1a;chian-ocean 文章专栏 边缘计算与联邦学习&#xff1a;探索隐私保护和高效数据处理的结合 1. 引言 随着物联网(IoT)设备的普及&#xff0c;网络边缘产生了大量数据。将这些数据上传至云端进行集中式计算和处理&#xff0c;既有隐私泄露的风险&#xff…

15分钟学Go 实战项目一:命令行工具

实战项目一&#xff1a;命令行工具 1. 引言 命令行工具是开发者常用的工具之一&#xff0c;它可以帮助用户通过命令行界面对程序进行控制和交互。在这节中&#xff0c;我们将创建一个简单的命令行工具&#xff0c;以帮助你理解Go语言的基本语法和如何处理命令行输入。在这个过…

详解安卓和IOS的唤起APP的机制,包括第三方平台的唤起方法比如微信

网页唤起APP是一种常见的跨平台交互方式&#xff0c;它允许用户从网页直接跳转到移动应用程序。 这种技术广泛应用于各种场景&#xff0c;比如让用户在浏览器中点击链接后直接打开某个应用&#xff0c;或者从网页引导用户下载安装应用。实现这一功能主要依赖于URL Scheme、Univ…