架构-架构设计1-架构概述
概述
从需求分析到软件设计之间的过渡过程称为软件架构。只要软件架构设计好了,整个软件就不会出现坍塌性的错误,即不会崩溃。
【架构设计就是需求分配,即将满足需求的职责分配到组件上】。
软件架构=软件体系架构
【软件架构为软件系统提供了一个结构、行为和属性的高级抽象】,由构件的描述、构件的相互作用(连接件)、指导构件集成的模式以及这些模式的约束组成。
软件架构不仅指定了系统的组织结构和拓扑结构,并且显示了系统需求和构件之间的对应关系,提供了一些设计决策的基本原理。
解决好【软件的复用、质量和维护问题】,是研究软件架构的根本目的。
软件架构设计包括提出架构模型,产生架构设计和进行设计评审等活动,是个迭代的过程。架构设计主要关注软件组件的结构、属性和交互作用,并通过多种视图全面描述特定系统的架构。
软件架构能够在设计变更相对容易的阶段,考虑系统结构的可选方案,便于技术人员与非技术人员就软件设计进行交互。能够展现软件的结构、属性与内部交互关系。
架构的作用
- 软件架构是项目干系人进行交流的手段,明确了对系统实现的约束条件,决定了开发和维护组织的组织结构,制约着系统的质量属性。
- 软件架构使推理和控制的更改更加简单,有助于循序渐进的原型设计,可以作为培训的基础。
- 软件架构是可传递和可复用的模型,通过研究软件架构可能预测软件的质量。
架构的本质
- 软件架构为软件系统提供了一个结构、行为和属性的高级抽象
- 软件体系结构风格是描述某一特定应用领域中系统组织方式的惯用模式
架构设计与生命周期
- 需求分析阶段。需求分析和SA设计面临的是不同的对象:一个是问题空间;另一个是解空间。从软件需求模型向SA模型的转换主要关注两个问题:【如何根据需求模型构建SA 模型。如何保证模型转换的可追踪性】。
- 设计阶段。是SA研究关注的最早和最多的阶段,这一阶段的SA研究主要包括:SA 模型的描述、SA 模型的设计与分析方法,以及对SA设计经验的总结与复用等。有关SA 模型描述的研究分为3个层次:
- SA的基本概念(构件和连接子)、
- 体系结构描述语言ADL
- ADL(Architecture Description Language)是这样一种形式化语言,它在底层语义模型的支持下,为软件系统的概念体系结构建模提供了具体语法和概念框架。
- 如:Aesop、MetaH、C2、Rapide、SADL、Unicon等。
- 三个基本要素:
- 构件:计算或数据存储单元。
- 连接件:用于构件之间交互建模的体系结构构造块及其支配这些交互的规则。
- 架构配置:描述体系结构的构件与连接件的连接图。
- SA模型的多视图表示。
- 实现阶段。最初SA研究往往只关注较高层次的系统设计、描述和验证。为了有效实现SA设计向实现的转换,实现阶段的体系结构研究表现在以下几个方面。
- 研究基于SA 的开发过程支持,如项目组织结构、配置管理等,
- 寻求从SA 向实现过渡的途径,如将程序设计语言元素引入SA 阶段、模型映射、构件组装、复用中间件平台等。
- 研究基于SA 的测试技术。
- 构件组装阶段。在SA设计模型的指导下,可复用构件的组装可以在较高层次上实现系统,并能够提高系统实现的效率。在构件组装的过程中,SA 设计模型起到了系统蓝图的作用。研究内容包括如下两个方面。
- 如何支持可复用构件的互联,即对SA 设计模型中规约的连接子的实现提供支持。
- 在组装过程中,如何检测并消除体系结构失配问题。
在构件组装阶段的失配问题主要包括:由构件引起的失配、由连接子引起的失配、由于系统成分对全局体系结构的假设存在冲突引起的失配等。
- 部署阶段。SA 对软件部署作用如下。
- 提供高层的体系结构视图来描述部署阶段的软硬件模型。
- 基于SA 模型可以分析部署方案的质量属性,从而选择合理的部署方案,
- 后开发阶段。是指软件部署安装之后的阶段。这一阶段的SA 研究主要围绕维护、演化、复用等方面来进行。典型的研究方向包括动态软件体系结构、体系结构恢复与重建等。
- 动态软件体系结构。现实中的软件具有动态性,体系结构会在运行时发生改变。
运行时变化包括两类:软件内部执行所导致的体系结构改变;软件系统外部的请求对软件进行的重配置
包括两个部分的研究:体系结构设计阶段的支持、运行时刻基础设施的支持。 - 体系结构恢复与重建。对于现有系统在开发时候没有考虑SA的情况,从这些系统中恢复或重购体系结构。从已有的系统中获取体系结构的重建方法分为4类:手工体系结构重建、工具支持的手工重建、通过查询语言来自动建立聚集、使用其他技术(如数据挖掘等)
- 动态软件体系结构。现实中的软件具有动态性,体系结构会在运行时发生改变。
构件
【对象】–【模块】–【构件】–【服务】
概念
定义1:软件构件是一种组装单元,它具有规范的接口规约和显式的语境依赖。软件构件可以被独立地部署并由第三方任意地组装。
定义2:构件是某系统中有价值的、几乎独立的并可替换的一个部分,它在良好定义的体系结构语境内满足某清晰的功能。
定义3:构件是一个独立发布的功能部分,可以通过其接口访问它的服务。
构件由一组通常需要同时部署的原子构件组成。一组原子构件是一个模块和一组资源。原子构件是部署、版本控制和替换的基本单位。原子构件通常成组地部署,但是它也能够被单独部署。
构件和原子构件之间的区别在于,大多数原子构件永远都不会被单独部署,尽管它们可以被单独部署。相反,大多数原子构件都属于一个构件家族,一次部署往往涉及整个家族。
- 一个模块是不带单独资源的原子构件
- 一个单独的包被编译成多个单独的类文件–每个公共类都有一个。
- 模块是一组类和可能的非面向对象的结构体,比如过程或者函数
构件的特性是:
- 独立部署单元
- 作为第三方的组装单元
- 没有(外部的)可见状态
一个构件可以包含多个类元素,但是一个类元素只能属于一个构件。
将一个类拆分进行部署通常没什么意义。
对象的特性是:
- 一个实例单元,具有唯一的标志
- 可能具有状态,此状态外部可见
- 封装了自己的状态和行为
【对象,不带资源的原子构件】
构件的复用
检索与提取构件
基于关键字的检索
特点:
树形或有向无回路图结构刻面检索法
特点:
利用Facet描述构件执行的功能、被操作的数据、构件应用的语境或任意其他特征
例如:分多个刻面:
1、应用领域
2、使用环境
3、功能超文本检索法
特点:按照人类的联想思维方式任意跳转到包含相关概念或构件的文档
【基于构件的软件开发中,已有的构建分类方法可以归纳为三大类,以上三大类】
理解与评价构件
- 要复用构件,准确地理解构件至关重要。特别是对构件修改使用时。
- 为达到目的,必须要求构件的开发过程遵循公共标准。
- 一般构件库的文档中全面而准确地说明以下内容
构件的功能与行为、相关的领域知识、可适应性约束条件与例外情形、可以预见的修改部分及修改方法。
修改构件
1、理想状态是直接复用构件库中现成的构件,但大多数情况下,必须对构件进行或多或少的修改,以应对新需求。
2、为了减少构件修改的工作量,要求开发人员尽量使构件的功能、行为和接口设计更为抽象化、通用化和参数化。这样,复用者即可通过对实参的选取来调整构件的功能或行为。如果这种调整仍不足以使构件适用于新系统,复用者就必须借助设计信息和文档来修改构件。
3、构件库中若无可修改使用的构件,则按新需求开发构件,并存入构件库。
组装构件
组装的三种方式
1、基于功能的组装:采用子程序调用和参数传递的方式将构件组装起来。
2、基于数据的组装:仍然是传统的子程序调用与参数传递。但它所依赖的软件设计方法不再是功能分解,而是面向数据的设计方法,例如,Jackson系统开发方法。
3、面向对象的组装:如果从类库中检索出来的基类能够完全满足新系统的需求,则可以直接应用。否则,必须以基类为父类,生成相应的子类,以满足新系统的需求。
构件组装失配问题
1、由构件引起的失配,包括由于系统对构件基础设施、构件控制模型和构件数据模型的假设存在冲突引起的失配;
2、由连接子引起的失配,包括由于系统对构件交互协议、连接子数据模型的假设存在冲突引起的失配;
3、由于系统成分对全局体系结构的假设存在冲突引起的失配等。要解决失配问题,首先需要检测出失配问题,并在此基础上通过适当的手段消除检测出的失配问题。
构件的分类
从构件的外部形态来看,构件可分为5类:
- 独立而成熟的构件。已在实际运行环境多次检验,该类构件隐藏了所有接口,用户只需用规定好的命令进行使用。例如,数据库管理系统和操作系统等。
- 有限制的构件。有限制的构件提供了接口,指出了使用的条件和前提,这种构件在装配时,会产生资源冲突、覆盖等影响,在使用时需要加以测试。例如,各种面向对象程序设计语言中的基础类库等。
- 适应性构件。适应性构件进行了包装或使用了接口技术,把不兼容性、资源冲突等进行了处理,可以直接使用。这种构件可以不加修改地使用在各种环境中。例如ActiveX等。
- 装配的构件。装配(assemble)的构件在安装时,已经装配在操作系统、数据库管理系统或信息系统不同层次上,使用胶水代码(gluecode)就可以进行连接使用。目前一些软件商提供的大多数软件产品都属这一类。
- 可修改的构件。对原构件修改错误、增加新功能,可以利用重新“包装”或写接口来实现构件的版本替换。这种构件在应用系统开发中使用得比较多。
中间件
中间件是一类构件
中间件是一类系统软件
简化结构、屏蔽差异、利于复用
优点
- 面向需求。即设计师集中精力于业务逻辑本身。
- 业务的分隔和包容性。应用开发人员可以按照不同的业务进行功能的划分,体现为不同的接口或交互模式。
- 设计与实现隔离。构件对外发生作用或构件间的交互,都是通过接口进行的,构件使用者只需要知道构件的接口,而不必关心其内部实现,这是设计与实现分离的关键。
- 隔离复杂的系统资源。架构很重要的一个功能就是将系统资源与应用构件隔离,这是保证构件可复用甚至“即插即用”的基础,与中间件的意图也是一致的。
- 符合标准的交互模型。中间件则实现了架构的模型,实现了标准的协议。
- 软件复用。中间件提供了构件封装、交互规则、与环境的隔离等机制,这些都为软件复用提供了方便的解决方案。
- 提供对应用构件的管理。基于中间件的软件可以方便地进行管理,因为构件总可以通过标识机制进行划分。