7.1软件架构概念
7.1.1软件架构的定义
7.1.2软件架构设计与生命周期
1.需求分析阶段

SA定义:Architecture=Components+Connectors+Topology+Constraints+Performance
(软件体系结构=构件+连接件+拓扑结构+约束+质量)
2.设计阶段
SA关注最早最多阶段,这一阶段研究主要包括SA模型描述、SA模型的设计与分析方法、对SA设计经验的总结与复用。
SA模型描述3个层次:
1).SA的基本概念
有哪些元素组成以及何种原则组织,传统的只有构件和胶水代码,现在的是胶水代码这部分升级为连接子同构件地位,构件和连接子的建模。
2).体系结构描述语言ADL
支持构件、连接子及其配置的描述语言就是如今所说的体系结构描述语言。如ADL,它对连接子的重视区分于其他描述语言。
3).SA模型的多视图表示:关注点分离思想
从不同的角度描述系统的体系结构从而得到多视图,把ADL和多视图结合起来更好理解,如典型的4+1视图(b编辑视图、进程视图、开发视图、物理视图, 加上统一的场景),Hofmesiter的4视图模型(概念视图、模块视图、执行视图和代码视图)、CMU-SEI的Views and Beyond模型(模块视图、构件和连接子视图、分配视图)等。
3.实现阶段
这一阶段除了关注高层次的系统设计、描述和验证,还关注基于SA的开发过程的支持,如组织结构、配置管理等,从SA向实现过度的途径,如将程序设计语言引入SA阶段、模型映射、构件组装、复用中间件平台等,基于SA的测试技术。
基于SA的开发过程的支持,如组织结构、配置管理等。
SA提供的蓝图较好的实现开发组织结构和管理过程,对于大型系统,参与人员多,需要提供配置管理手段。
从SA向实现过度的途径,如将程序设计语言引入SA阶段、模型映射、构件组装、复用中间件平台等。
为了填补SA模型和底层实现间鸿沟,通过封装实现细节、模型转换、精华等手段缩小概念间差距,典型方法如下:
SA模型中引入实现阶段的概念,比如引入程序设计语言。---便于理解。
通过模型转换技术,将高层SA模型逐步精化成能够支持实现的模型。
封装底层的实现细节,使之成为较大粒度构件,这样SA作用就是知道组装构件和连接子来完成系统。
4.构件组装阶段
SA模型指导下,可复用构件可在较高层次上实现系统,比如在架构阶段,提高实现效率。研究的内容2方面:
如何支持可复用构件的互联,即对SA设计模型中规约的连接子的实现支持。
①设计阶段对连接子的支持:很多ADL支持在实现阶段将连接子直接转为具体的代码。
②中间件的使用,中间件有特定标准,为构件互联提供支持,还提供了其他的服务,比如安全服务、明明服务等等
组装过程中,如何消除体系结构适配问题。
失配有三方面:构件引起的(如系统对构件基础设施、控制模型、数据模型的假设存在冲突)、连接子引起的(交互协议、连接子模型假设冲突)、系统成分引起的(整体和全局的冲突)。
5.部署阶段
随着网络与分布式软件的发展,软件部署从软件开发中独立出来,成为软件生命周期中独立阶段。(比如git上的自动化部署(提交代码后自动部署)。但是分布式软件要满足一定的质量属性要求的,比如性能、可靠性,因此部署需要考虑多方面信息,如软件构件的互联性、硬件拖布结构、硬件资源占用等等。
SA对部署的作用
提供高层体系结构视图来描述部署阶段的软硬件模型。
基于SA的模型可分析部署方案,择优。
6.后开发阶段
部署安装完成后,这一阶段主要围绕维护、演化、复用等方面进行。典型的方向:动态软件体系结构、体系结构恢复与冲击等。
1.动态软件体系结构
SA在运行时发生变化的两类:
1).软件内部执行导致的SA改变,比如服务器端软件根据客户请求到达时创建新的构件来响应用户请求;自适应软件根据不同的配置采用不同的连接子来传输数据。
2).软件系统外部的请求对软件的重新配置。比如安全性的软件系统,这些系统修改或升级时候不停机。
基于以上情况,就产生了如何在设计阶段捕获SA的这种动态性,并进一步指导,从塞肉实现在线演化或自适应甚至是自主计算,这就是研究的内容,两部分:
1).体系结构设计阶段的支持
2).运行时刻基础设施的支持
2.体系结构恢复与重建
当前系统的开发很少是从头开发的,都是参照既有系统的,升级、增强或移植,但是这些既有的系统开发较早没考虑SA,也少有文档资料,从这些系统中恢复或重构体系结构是有意义和必要的。
SA重建指从既有系统中获取体系结构的过程,输出物为一组SA视图,方法4种:
1).手工SA重建
2).工具支持手工重建。
3).通过查询语言来自动建立聚集:思路是通过逆向工程工具支持下分析代码,得到结构
4).其他技术,如数据挖掘等。
7.1.3软件架构的重要性
降低成本、改进质量、按时按需交付产品的关键因素。
7.2基于架构的软件开发方法
7.2.1体系结构的设计方法概述
7.2.2概念与术语
1.设计元素
ABSD是一个自顶向下,递归细化的方法,软件系统的体系结构通过该方法得到细化,直到能产生软件的构件和类。
2.视角与视图
考虑体系结构时,要从不同的视角(Perspective)来观察对架构的描述,这需要软件设计师考虑体系结构的不同属性。如,展示功能组织的静态视角能判断质量特性,展示并发行为的动态视角能判断系统行为特性,因此,选择的特定视角或视图(如逻辑视图、进程视图、实现视图和配置视图)可以全方位的考虑体系结构设计。使用逻辑视图来记录设计元素的功能和概念接口,设计元素的功能定义了它本身在系统中的角色,这些角色包括功能、性能等。
3.用例和质量场景
7.2.3基于体系结构的开发模型
传统的软件开发过程可从概念到实现若干阶段,按照传统的开发模型,软件体系结构的建立应在需求分析之后,概要设计之前。但它的缺点是效率不高,不能很好的支持软件重用等缺点。
7.2.4体系结构需求
1.需求获取
2.标识构件

3.架构需求评审
7.2.5体系结构设计
体系结构开发模型第二阶段:体系结构设计。

1.提出软件体系结构模型
在建立体系结构初期,选择一个合适的体系结构风格是首要的,在这个风格基础上,开发人员通过体系结构模型,可以获得关于体系结构属性的理解。此时,虽然这个模型是理想化的,但是,该模型为将来的实现和演化过程建立了目标。
补充:什么是架构风格呢?
根据应用架构指南所说,架构风格指:一组原则。
你可以把它看成是一组为系统家族提供抽象框架的粗粒度模式。架构风格能改进分块,还能为频繁出现的问题提供解决方案,以此促进设计重用。
2.把已标识的构件映射到软件体系结构中
3.分析构件之间的相互作用
为了把所有已标识的构件集成到体系结构中,必须认真分析这些构件的相互作用和关系。
4.产生软件体系结构
一旦决定了关键构件之间的关系和相互作用,就可以在第2阶段得到的中间结构的基础上进行精化。
5.设计评审
一旦设计了软件体系结构,必须邀请独立于系统开发的外部人员对体系结构进行评审。
7.2.6体系结构文档化
体系结构开发模型第三阶段:体系结构文档化。
7.2.7体系结构复审
体系结构开发模型第四阶段:体系结构复审。
7.2.8体系结构实现
体系结构开发模型第五阶段:体系结构实现。

7.2.9体系结构的演化
体系结构开发模型第六阶段:体系结构演化。
构件开发中,用户需求变动,以及系统移植到别的平台等等都会引起需求变动,这就要修改体系结构适应变化。
体系结构演化六步:
7.3软件架构风格
7.3.1软件架构风格概述
- 软件体系结构风格是描述某一特定应用领域中系统组织方式的惯用模式。
- 体系结构风格定义一个系统家族,即一个体系结构定义一个词汇表和一组约束。词汇表中包含一些构件和连接件类型,而这组约束指出系统是如何将这些构件和连接件组合起来的。
- 体系结构风格反映了领域中众多系统所共有的结构和语义特性,并指导如何将各个模块和子系统有效地组织成一个完整的系统。
- 对软件体系结构风格的研究和实践促进对设计的重用,一些经过实践证实的解决方案也可以可靠地用于解决新的问题。例如,如果某人把系统描述为“客户/服务器”模式,则不必给出设计细节,人们立刻就会明白系统是如何组织和工作的。
7.3.2数据流体系结构风格
面向数据流,按照一定的顺序从前向后执行程序。
1.批处理
特征:每个步骤都是独立的程序,每一步必须在前一步结束后才能开始,并且数据必须是完整的,以整体的方式传输。它的基本构件是独立的程序,连接件是某种类型的媒介,连接件定义了数据流图,表达了拓扑结构。
2.管道-过滤器
◆早期编译器就是采用的这种架构,要一步一步处理的,均可考虑此架构风格。
◆二者区别在于批处理前后构件不一定有关联,并且数据是作为整体传递,即必须前一个执行完才能执行下一个。管道-过滤器是前一个输出作为后一个输入,前面执行到部分可以开始下一个的执行,数据不需要整体传输。
7.3.3调用/返回体系结构风格
构件之间存在互相调用的关系,一般是显式的调用,代表的风格有主程序/子程序、面向对象、层次结构。
1.主程序/子程序风格
单线程控制,把问题划分为若干个处理步骤,构件即为主程序和子程序,子程序通常可合成为模块。过程调用作为交互机制,充当连接件的角色。调用关系具有层次性,其语义逻辑表现为子程序的正确性取决于它调用的子程序的正确性。
2.面向对象体系结构风格

3.层次型体系结构风格
构件组成一个层次结构,连接件通过决定层间如何交互的协议来定义。每层为上一层提供服务,使用下一层的服务,只能见到与自己邻接的层。修改某一层,最多影响其相邻的两层(通常只能影响上层)。
◆层次结构优点:
1、支持基于可增加抽象层的设计,允许将一个复杂问题分解成一个增量步骤序列的实现。
2、不同的层次处于不同的抽象级别,越靠近底层,抽象级别越高。
3、由于每一层最多只影响两层,同时只要给相邻层提供相同的接口,允许每层用不同的方法实现,同样为软件复用提供了强大的支持。
◆缺点:
1、并不是每个系统都可以很容易的划分为分层的模式。
2、很难找到一个合适的、正确的层次抽象方法。
4.客户端/服务器体系结构风格
两层C/S--->三层C/S
两层C/S:数据库服务器、客户应用程序和网络。胖客户机,瘦服务器”。
三层C/S结构:功能层是应用的主体,实现具体的业务处理逻辑;数据层是数据库管理系统。瘦客户机。
7.3.4以数据为中心的体系结构风格
以前这个叫仓库风格/(数据共享风格),以数据为中心,所有的操作都是围绕建立的数据中心进行的,代表的风格有数据库系统、超文本系统、黑板系统。
1.仓库体系结构风格

2.黑板体系结构风格
黑板系统是一种问题求解模型,是组织推理步骤、控制状态数据和问题求解之领域知识的概念框架。适合解决非结构化的问题,能在求解过程中运用多种不同知识源,使得问题的表达、组织和求解变得比较容易。
求解过程:
将问题的解空间组织成一个或多个应用相关的分级结构。分级结构的每一层信息由一个唯一的词汇来描述,它代表了问题的部分解。

3.数据库系统
7.3.5虚拟机体系结构风格
1.解释器体系结构风格

2.规则系统体系结构风格
基于规则的系统(见图7-16)包括规则集、规则解释器、规则/数据选择器及工作内存。
—般用在人工智能领域和DSS中。
7.3.6独立构件体系结构风格
构件之间是互相独立的,不存在显式的调用关系,而是通过某个事件触发、异步的方式来执行,代表的风格有进程通信、事件驱动系统(隐式调用)。
主要优点是为软件复用提供了强大的支持,为构件的维护和演化带来了方便;缺点是构件放弃了对系统计算的控制。
1.进程通信体系结构风格
2.事件系统体系结构风格
7.4软件架构复用
7.4.1软件架构复用的定义及分类
软件产品线:一组软件密集型系统,它们共享一个公共的、可管理的特性集,满足某个特定市场或任务的具体需要,是以规定的方式用公共的核心资产基础开发出来的。即围绕核心资产库进行管理、复用、集成新的系统。
核心资产库:包括软件架构即其可裁剪的元素,更广泛地,它还包括设计方案及其文档、手册、项目管理的记录、测试计划和用例
复用核心资产(特别是软件架构):更进一步采用产品线将会惊人地提高生产效率、降低成本和缩短上市时间。
软件复用:指系统化的软件开发过程,开发一组基本的软件构造模块,以覆盖不同的需求/体系结构之间的相似性,从而提高系统开发的效率、质量和性能。是一种系统化的软件开发过程,通过识别、开发、分类、获取和修改软件实体,以便在不同的软件开发过程中重复的使用它们。
软件复用分类:
7.4.2软件架构复用的原因
降本增效、提高生产力、提高质量和互操作性,维护也简单。
7.4.3软件架构复用的对象及形式
软件产品线的本质:在生产产品家族时,以一种规范的、策略性的方法复用资产。
可复用资产范围广,主要几个方面:
7.4.4软件架构复用的基本过程

1.复用的前提:获取可复用的软件资产
2.管理可复用资产
3.使用可复用资产
7.5.1特定领域软件体系结构
7.5.1DSSA的定义
- 一个严格定义的问题域和问题解域。
- 具有普遍性,使其可以用于领域中某个特定应用的开发。
- 对整个领域的构件组织模型的恰当抽象。
- 具备该领域固定的、典型的在开发过程中可重用元素。
补充:
DSSA(Domain Specific Software Architecture)与软件体系结构风格的比较
- DSSA与软件体系结构风格是从不同角度出发研究问题的两种结果,前者从问题域出发,后者从解决域出发。
- DSSA只对某个领域进行专家知识的提取、存储、组织,但可以同时使用多种软件体系结构风格;而在某个软件体系结构风格中进行专家知识组织时,可以将提取的公共结构和设计方法扩展到多个应用领域。
- DSSA通常选用一个或多个适合所研究的领域的体系结构风格,并设计一个该领域专用的体系结构分析设计工具。但该方法提取的专家知识只能应用于一个较小的范围--所在领域。一个领域的
- DSSA及其工具在另一个领域中是不适应的,或不可以重用的。
- 体系结构风格避免设计到特定的应用领域或背景,所提取的知识比DSSA提取的知识应用范围要广。但在一个特定领域中,正是由于体系结构风格对领域知识、领域背景的忽略,使其在一个具体领域的开发中的作用并不比DSSA要大。
- DSSA与体系结构风格是互为补充的两种技术。
7.5.2DSSA的基本活动
领域分析:
这个阶段的主要目标是获得领域模型(领域需求)。识别信息源,即整个领域工程过程中信息的来源,可能的信息源包括现存系统、技术文献、问题域和系统开发的专家、用户调查和市场分析、领域演化的历史记录等,在此基础上就可以分析领域中系统的需求,确定哪些需求是领域中的系统广泛共享的,从而建立领域模型。
领域设计:
这个阶段的目标是获得DSSA。DSSA描述在领域模型中表示的需求的解决方案,它不是单个系统的表示,而是能够适应领域中多个系统的需求的一个高层次的设计。建立了领域模型之后,就可以派生出满足这些被建模的领域需求DSSA。
领域实现:
这个阶段的主要目标是依据领域模型和DSSA开发和组织可重用信息。这些可重用信息可能是从现有系统中提取得到,也可能需要通过新的开发得到。
7.5.3参与DSSA的人员
参与DSSA的四种角色人员
领域专家:
包括该领域中系统的有经验的用户、从事该领域中系统的需求分析、设计、实现以及项目管理的有经验的软件工程师等。提供关于领域中系统的需求规约和实现的知识,帮助组织规范的、一致的领域字典,帮助选择样本系统作为领域工程的依据,复审领域模型、DSSA等领域工程产品,等等。
领域分析人员:
由具有知识工程背景的有经验的系统分析员来担任。控制整个领域分析过程,进行知识获取,将获取的知识组织到领域模型中。
领域设计人员:
由有经验的软件设计人员来担任。根据领域模型和现有系统开发出DSSA,并对DSSA的准确性和一致性进行验证。
领域实现人员:
由有经验的程序设计人员来担任。根据领域模型和DSSA,开发构件。
7.5.4DSSA的建立过程
定义领域范围:
领域中的应用要满足用户一系列的需求。
定义领域特定的元素:
建立领域的字典,归纳领域中的术语,识别出领域中相同和不相同的元素。
定义领域特定的设计和实现需求的约束:
识别领域中的所有约束,这些约束对领域的设计和实现会造成什么后果。
定义领域模型和架构:
产生一般的架构,并描述其构件说明。产生、搜集可复用的产品单元:为DSSA增加复用构件,使可用于新的系统。
以上过程是并发的、递归的、反复的、螺旋型的。
三层次模型
领域开发环境:领域架构师决定核心架构,产出参考结构、参考需求、架构、领域模型、开发工具。
领域特定的应用开发环境:应用工程师根据具体环境来将核心架构实例化。
应用执行环境:操作员实现实例化后的架构。