软件体系结构刘兴计算机学院软件工程系软件体系结构内容•1概述•2软件体系结构风格•3案例研究•4软件体系结构的分析与评估(略)•5流行的软件体系结构•6设计模式与软件架构•7企业架构师和设计师、企业软件架构简介1概述•我们要学的这个是什么玩意?•我们为什么要学这个玩意?•我们将来会怎么干?•其他人是怎么玩的?1概述•它是一种简单的、清楚的、完善的方式形成的•软件工程师需要一种更好的视角来理解软件,并试图找到一种新的方法来构建更复杂的大型软件系统•SA(softwarearchitecture)•一个简单程序到复杂系统软件的距离是十年1概述-需求开发的主要困难1概述-软件危机的原因•软件规模越来越大•随着软件应用范围的增广,软件规模愈来愈大。大型软件项目需要组织一定的人力共同完成,而多数管理人员缺乏开发大型软件系统的经验,而多数软件开发人员又缺乏管理方面的经验。各类人员的信息交流不及时、不准确、有时还会产生误解。•软件项目开发人员不能有效地、独立自主地处理大型软件的全部关系和各个分支,因此容易产生疏漏和错误。1概述-软件危机的原因•软件复杂度越来越高•软件不仅仅是在规模上快速地发展扩大,而且其复杂性也急剧地增加。软件产品的特殊性和人类智力的局限性,导致人们无力处理“复杂问题”。•所谓“复杂问题”的概念是相对的,一旦人们采用先进的组织形式、开发方法和工具提高了软件开发效率和能力,新的、更大的、更复杂的问题又摆在人们的面前。1.1whatisSA?•这种全局结构的设计和规划问题包括全局组织结构;全局控制结构;通信和同步以及数据存取协议;规定设计元素的功能;设计元素的组合;物理分布;规模和性能;演化的维度;设计方案的选择等。•1随着软件系统的规模和复杂性不断增加,系统的全局结构的设计和规划变得比算法的选择以及数据结构的设计更加重要。•2人们普遍认为,为系统设计一个合适的体系结构是系统取得长远的成功的关键因素。•3非形式化的。1.1whatisSA?•形式化还是非形式化:•首先,软件工程师在长期的实践中已经拥有了一套共享的,语义丰富的词典,它由软件系统的习惯用语,模式,软件系统组织结构风格组成。•通过识别一个管道过滤器体系结构风格的实例,一个软件工程师传达了这样的事实:这个系统的主要功能就是进行数据流的转换,系统的主要功能由各种独立实体的过滤器分别来实现,系统的响应时间和吞吐量能用一种直接的方式计算出来。1.1whatisSA?e.g.每个Filter都有输入端和输出端,例如一个MPEG-1解码Filter它的输入是MPEG编码的流数据,它的输出端是一解码过的流数据。DirectShow正是通过将不同的Filter连接在一起完成特定的功能的,我们将这些Filter的连接叫做FilterGraph,如下图A给出是播放AVI的FilterGraph:图A播放AVI文件的GraphFilter图上图中每个模块分别代表了不同的Filter,媒体文件Filter从硬盘读取AVI文件,AVI分离Filter将文件分离为音频流和视频流,AVI解码Filter对视频流进行解码并送往Video表现Filter,由后者将各帧在显示器上显示,默认的DirectSound设备用DirectSound将音频流输出。。1.1whatisSA?•其次,体系结构的描述的作用好像一个框架,系统属性在这个框架下进行扩充,并且,它在考察一个系统实现其整体需求的能力中扮演了非常重要的作用。•(软件体系结构是非常抽象的,可以理解更大范围的,系统级的关注点,比如吞吐量,通信模式,执行控制结构,可伸缩性,以及系统演化的扩展方式,提供一个自然的框架。)1.1whatisSA?•软件系统的体系结构定义系统由计算构件和构件之间的相互作用组成。构件可以是客户机和服务器、数据库、过滤器或者是在一个分层系统中的层。构件之间的相互作用在这个设计层次上可以是简单和相似的,比如过程调用,共享变量的访问。但是它们也可以是复杂和语义丰富的。比如客户机-服务器协议(client-serverprotocols)数据库存取协议(database-accessingprotocols),异步事件多点传送(asynchronouseventmulticast)和管道数据流(pipedstreams)1.1whatisSA?•软件设计层次•体系结构级:系统性能与构件之间的整体联系。这个级别的构成元素是模块,模块通过各种方式互连,通过操作算子将子系统组装成一个系统。•代码级:这个级别的设计问题包括算法和数据结构;其构成元素是编程语言原语。•执行级:这个级别的设计问题包含存储器的映射、数据格式配置、堆栈和寄存器的分配。软件各级抽象高级程序设计语言数据结构与算法软件结构研究的开始抽象数据类型程序族软件体系结构汇编语言、宏替换、高级语言编译器、数据类型程序=数据结构+算法软件划分与构造、方便系统的开发与维护数据类型抽象、封装、信息隐藏、多态性程序族在信息隐藏和软件结构设计上具有相同的模式(设计模式抽象)软件体系结构使系统在体系结构级达到重用1.1定义•DewaynePerry和A1exanderWo1f•软件体系结构是具有一定形式的结构化元素,即构件的集合,包括处理构件、数据构件和连接构件。••处理构件负责对数据进行加工,数据构件是被加工的信息,连接构件把体系结构的不同部分组合连接起来。••这一定义注重区分处理构件、数据构件和连接构件,这一方法在其他的定义和方法中基本上得到保持。1.1定义•MaryShaw和DavidGarlan•软件体系结构是软件设计过程中的一个层次,这一层次超越计算过程中的算法设计和数据结构设计。•体系结构问题包括总体组织和全局控制、通讯协议、同步、数据存取,给设计元素分配特定功能,设计元素的组织,规模和性能,在各设计方案间进行选择等。•软件体系结构处理算法与数据结构之上关于整体系统结构设计和描述方面的一些问题,如全局组织和全局控制结构、关于通讯、同步与数据存取的协议,设计构件功能定义,物理分布与合成,设计方案的选择、评估与实现等。•Kruchten•软件体系结构有四个角度,它们从不同方面对系统进行描述:概念角度描述系统的主要构件及它们之间的关系;模块角度包含功能分解与层次结构;运行角度描述了一个系统的动态结构;代码角度描述了各种代码和库函数在开发环境中的组织。•HayesRoth•软件体系结构是一个抽象的系统规范,主要包括用其行为来描述的功能构件和构件之间的相互连接、接口和关系。•DavidGarlan和DewnePerry•软件体系结构是一个程序/系统各构件的结构、它们之间的相互关系以及进行设计的原则和随时间演化的指导方针。•BarryBoehm•软件体系结构包括一个软件和系统构件,互联及约束的集合;一个系统需求说明的集合;一个基本原理用以说明这一构件,互联和约束能够满足系统需求。•Bass,Ctements和Kazman•软件体系结构包括一个或一组软件构件、软件构件的外部的可见特性及其相互关系。其中,“软件外部的可见特性”是指软件构件提供的服务、性能、特性、错误处理、共享资源使用等。1.2软件体系结构研究的内容和范畴•被解决的:模块接口语言,特定领域的软件体系结构,软件的重用,软件组织结构模式的规范化编纂,体系结构描述语言,体系结构设计形式化的支持和体系机构设计环境。•四个研究领域:•1.新的体系机构描述语言来解决体系机构描述问题。•2.体系结构领域知识的总结性研究。这个领域关心的是工程师通过软件实践总结而来的各种体系机构原则和模式的分类和阐释。•3.针对特定的领域的框架的研究。•4.软件体系结构形式化支持的研究。1.2软件体系结构研究的内容和范畴•风格、设计模式、框架•1.体系结构风格(architecturestyles)•体系结构风格独立于实际问题,强调了软件系统中通用的组织结构。比如管道线,分层系统,客户机-服务器等等。1.2软件体系结构研究的内容和范畴•风格、设计模式、框架•2.设计模式•设计模式是软件问题高效和成熟的设计模板,模板包含了固有问题的解决方案。设计模式可以看成规范了的小粒度的结构成分,并且独立于编程语言或编程范例。设计模式的应用对软件系统的基础结构没有什么影响,但可能对子系统的组织结构有较大影响。每个模式处理系统设计或实现一种特殊的重复出现的问题。它为解决抽象部分和实现部分独立变化的问题提供了一种通用结构。因此,设计模式更强调直接复用的程序结构。1.2软件体系结构研究的内容和范畴•风格、设计模式、框架•3.应用框架(applicationframework)•应用框架是整个或部分系统的可重用设计,表现为一组抽象构件的集合以及构件实例间交互的方法。可以说,一个框架是一个可复用的设计构件,它规定了应用的体系结构,阐明了整个设计、协作构件之间的依赖关系、责任分配和控制流程。1.2软件体系结构研究的内容和范畴•体系结构风格、设计模式和应用框架的概念是从不同的目的和出发点讨论软件体系结构,它们之间的概念经常互相借鉴和引用。1.3体系结构设计原则•抽象•分而治之•封装和信息隐藏•模块化•高内聚和低耦合•关注点分离•策略和实现的分离•接口和实现的分离1.3体系结构设计原则体系结构是指软件系统的基本和主体的形态,也就是软件系统中“最本质”的东西。一个软件系统的体系结构设计得好不好,可以用“合适性、结构稳定性、可扩展性、可复用性”这些特征量来评估。1.3体系结构设计原则合适性:即体系结构是否适合于软件的“功能性需求”和“非功能性需求”。设计师可以充分发挥主观能动性,根据需求的特征,通过推理和归纳的方法设计出合适的体系结构。经验不丰富的设计师往往把注意力集中在“功能性需求”而疏忽了“非功能性需求”,殊不知后者恰恰是最能体现设计水平的地方。高水平的设计师高就高在“设计出恰好满足客户需求的软件,并且使开发方和客户方获取最大的利益,而不是不惜代价设计出最先进的软件。(以设计住宅为例)…对于软件系统而言,能够满足需求的设计方案可能有很多种,究竟该选哪一种?此时商业目标是决策依据,即选择能够为开发方和客户方带来最大利益的那个设计方案。大部分软件开发人员天生有使用新技术的倾向,而这种倾向对开发商业产品而言可能是不利的,切记切记结构稳定性当前中国有几句流行的至理名言:“稳定压倒一切”、“发展是硬道理”。发展的前提条件是稳定,社会如此,开发软件产品也是如此。•体系结构一旦设计完成,应当在一定的时间内保持稳定不变,只有这样才能使后续工作顺利开展。如果体系结构经常变动,那么建筑在体系结构之上的用户界面、数据库、模块、数据结构等等也跟着经常变动,用“树倒猢狲散”来比喻很恰当,这将导致项目发生混乱。•高水平的设计师应当能够分析需求文档,判断出哪些需求是稳定不变的,哪些需求是可能变动的。于是根据那些稳定不变的需求设计体系结构,而根据那些可变的需求设计软件的“可扩展性”。可扩展性是指软件扩展新功能的容易程度。可扩展性越好,表示软件适应“变化”的能力越强。可扩展性越来越重要,这是由现代软件的商业模式决定的:••社会的商业越发达,需求变化就越快。••现代软件产品通常采用“增量开发模式”,开发商不断地推出软件产品的新版本,从而不断地获取增值利润。••稳定性和可扩展性之间存在辨证的关系:如果系统不可扩展的话,那么就没有发展前途,所以不能只关心稳定性而忽视可扩展性;而软件系统“可扩展”的前提条件是“保持结构稳定”,否则软件难以按计划开发出来,稳定性是使系统能够持续发展的基础。所以稳定性和可扩展性都是体系结构设计的要素。••如果每次变化都导致体系结构发生大的变动,那简直就是“伤筋动骨”,这样的体系结构无疑是败笔之作。(例如房屋装修)•复用就是指“重复利用已经存在的东西”。被复用的对象可以是有形的物体,也可以是无形的知识财富。复用不是人类懒惰的表现而是智慧的表现。因为人类总是在继承了前人的成果,不断加以利用、改进或创新后才会进步。•复用的有利于提高产品的质量、提高生产率和降低成本。由经验可知,通常在一