第四章软件体系结构描述主讲人何欣2006年5月26日4.1软件体系结构描述方法项目管理静态分析器时间分析器测试结果库缓冲复杂度计算测试结果库最优/最劣时间计算程序复杂度函数调用关系图带时间特性的流程图测试配置测试结果打印图4-1某软件辅助理解和测试工具部分体系结构描述4.1软件体系结构描述方法♦1.图形表达工具♦2.模块内连接语言♦3.基于软构件的系统描述语言♦4.软件体系结构描述语言4.1软件体系结构描述方法♦描述软件体系结构是研究软件体系结构的前提。♦为了支持体系结构的开发,形式化的建模符号系统和可应用于体系结构规格说明的开发与分析工具是必需的。体系结构描述语言以及与之相对应的工具集正好解决了这一问题。♦ADL是软件体系结构研究的核心问题之一。它不但是形式化描述软件体系结构的基本工具,而且也是对软件体系结构进行求精、验证、演化和分析的前提和基础。4.1软件体系结构描述方法♦ADL的一个宽松的定义是这样的——用于软件应用程序的体系结构描述语言关注整个应用程序的高层结构,而不是其中某一个源代码模块的实现细节。♦ADL吸取了传统程序设计中语义严格、精确的特点,并针对软件体系结构的整体性和抽象性,定义和确定了适合于软件体系结构表达与描述的有关抽象元素,从而能精确、无歧义地描述软件体系结构,更好地支持对软件体系结构求精、验证、演化和分析。4.1软件体系结构描述方法♦表4-1当前常见的一些体系结构描述语言ADLACMEWrightC2UniconDarwinAESOPRapideControl&MetaHWeavesSADLUMLGestaltDemeterFR研发组织CarnegieMellon大学CarnegieMellon大学CarnegieMellon大学SouthernCalifornia大学CarnegieMellon大学英国ImperialCollegeStanford大学Honeywell公司技术中心美国Aerospace公司SRIRational软件公司Siemens公司研究院Northeastern大学Ohio州立大学负责人DavidGarlanDavidGarlanMedvidovicMaryShawJeffKramer&JeffMageeDavidGarlanDavidLuckhamSteveVestalGorlickMarkMoriconiBobSchwankeKarlLieberherrB.Chandrasekaran4.2软件体系结构描述框架标准♦Rational提出的可重用的体系结构描述框架建议,基于RUP(RationalUnitedProcess)、采用UML模型描述软件的体系结构。♦认为体系结构描述的关键是定义视点、试图以及建模元素之间的映射关系。♦可以从四个视点出发描述体系结构,即需求视点、设计视点、实现视点和测试视点。♦在此基础上,提出了七种体系结构视图,即用例视图、域视图、非功能需求视图、逻辑视图、实现视图、过程视图和部署视图。♦然后,从系统建模的角度考虑多个视图之间的映射关系,并建议了这些视图的表示和视图之间的映射关系的表示。4.3ACME♦ACME是一种体系结构互换语言,支持体系结构的规格说明在不同ADL之间的转换。♦可以把它作为体系结构设计工具的通用交换格式,也可以作为开发新的体系结构设计和分析工具的基础。♦ACME项目开始于1995年,当时的目标是在不同的体系结构开发工具之间提供一种能够相互交互体系结构描述的公共语言。♦目前的ACME语言和ACME工具开发库(AcmeToolDeveloper’sLibrary,AcmeLib)为软件体系结构的描述、表示、生成和分析,提供了一种通用的、可扩展的基础设施。♦尽管按照Medivodevic的观点,从严格意义上讲,ACME并不是一种体系结构描述语言,但是它包含大量ADL的特点,实用性也很高。4.3ACME♦ACME语言和开发工具包提供3种基本功能:♦(1)体系结构的相互交互。通过提供一种体系结构设计的交换格式,ACME允许各种开发工具与其它补充工具协同工作。这样,使用ACME的设计师与使用其它ADL设计师相比,就多了很多可供选择的开发工具。♦(2)为新的体系结构设计和分析工具提供了可扩展的基础。许多体系结构设计和分析工具需要一个用于描述、存储、操纵体系结构设计的表示法。但开发好的表示法往往需要很高的时间和经济成本。使用ACME可以有效减少这方面的成本,因为可以用它提供的语言和用于工具开发的函数库作为基础。使用ACME还使得所开发的工具能够有更好的通用性,因为它可以与其它使用ACME格式的工具交流设计,协作开发。♦(3)体系结构描述。ACME本身是一个很好的开发语言。尽管不是适合于所有的应用系统,ACME体系结构描述语言能够让开发者很好地认识体系结构建模,提供了一个相对容易的对简单软件系统的描述方法。4.3ACME♦ACME有如下主要特点:♦用7种基本的设计元素来表示软件体系结构。♦提供了一种灵活的注释机制,支持把体系结构和用子语言表示的非结构化信息结合起来,这些子语言是外部定义的。♦提供了一种类型机制,用于抽象出共同的、可重用的体系结构惯用法和风格。♦提供了一个开放的语义框架,用于体系结构描述的推理。4.3AcmeStudio环境4.3ACME♦4.2.1ACME体系结构设计元素类型♦ACME的核心概念以7种类型的实体为基础:构件、连接件、系统、端口、角色、表述和表述图(rep-maps,representationmap的缩写)。在这7个类型里,最基本的体系结构描述元素是构件、连接件和系统。构件连接件角色端口系统图4-2一个ACME描述的元素4.3ACME♦4.2.1ACME体系结构设计元素类型♦构件——代表系统中基本的计算元素和数据存储。直观上看,在用方框和连线表示的体系结构图中,它们对应的就是方框。典型的构件有客户、服务器、过滤器、对象、黑板、数据库等。♦连接件——代表构件之间的交互。它是构件之间通信和交互活动的媒介,像“胶水”一样把构件联系成为一个体系结构。直观上看,它们对应方框—连线图中的连线。连接件的例子包括简单的交互形式,如管道、过程调用、事件广播等。但连接件也可以表示更复杂的交互,如客户/服务器协议或数据库和应用程序之间的SQL连接。♦系统——代表构件和连接件的配置。4.3ACME♦4.2.1ACME体系结构设计元素类型♦构件的接口定义为端口(Port)的集合。每个端口表示构件与它外部环境的一个交互点。通过使用不同类型的端口,一个构件能提供多个接口。一个端口可以表示很简单的接口,也可以表示复杂接口,如必须按某种指定顺序被调用的过程集合,或一个事件广播交互点。♦连接件的接口可以用角色(Role)来定义。连接件的每一个角色定义了连接件所代表的交互中的一个参与方。二重连接件有两个角色,如RPC连接件的Caller和Callee,或管道连接件的reading和writing,或消息发送连接件的sender和receiver角色。其他类型的连接件的角色可能多于两个。例如,事件广播连接件,可能有一个事件播报角色和任意数目的事件接收角色。4.3ACME♦4.2.2ACME的属性♦以上7种元素足以用来定义体系结构的层次结构。但是,体系结构还包含有许多其它附加信息,而且不同的ADL里增加的描述信息不尽相同。作为一种用于交流的ADL,ACME为了解决这一问题,使用属性列表来表示对于结构的说明信息。♦每一个属性由名字,可选类型和值构成。对7种设计实体里的任何一种都可以添加注释。4.3ACME♦4.2.2ACME的属性♦下面的代码显示了增加几个属性的一个客户/服务器系统。♦Systemsimple_CS={♦ComponentClient={♦Portsend_request;♦Properties{♦Aesop-style:style-id=client-server;//属性,指明元素怎样联系到其他ADL,Ascop风格♦Unicon-style:style-id=cs;//属性,Unicon风格♦Source-code:external=“CODE-LIB/client.c”♦}♦}4.3ACME♦4.2.2ACME的属性♦ComponentServer={♦Portreceive_request;♦Properties{♦idempotence:boolean=true;♦Max-concurrent-client:integer=1;♦Source-code:external=“CODE-LIB/client.c”♦}♦}4.3ACME♦4.2.2ACME的属性♦ConnectorRPC={♦Roles{Caller,Callee}♦Properties{//指明RPC只能被能够处理Wright语言的工具所处理♦synchoronous:boolean=true;♦Max-roles:integer=2;♦protocol:Wright=“…”♦}♦}4.3ACME♦4.2.2ACME的属性♦Attachments={♦Client.send-requesttorpc.caller;♦Server.receive-requesttorpc.callee♦}♦}4.3ACME♦4.2.2ACME的属性♦当然,为了使不同的ADL都能够使用属性所表达的信息,这些ADL对于属性应该有共同的理解。♦ACME并不明确地定义属性的含义,但是它支持对属性含义的共享使用。♦当前已经有一些属性子语言被开发出来。其中之一是用来规定在使用图形化的体系结构描述编辑工具时的可视化属性,还有一个子语言用于描述体系结构上的临时约束。4.3ACME♦4.2.3ACME的模板和风格定义♦ACME语言引入模板机制。♦它是一种类型化、参数化的宏,用于对反复出现的模式做规格说明。♦在应用或初始化这些模式时,只要给它们提供适当类型的参数就可以了。♦模板定义了句法结构,可以被扩展到需要生成新的声明的位置。♦它们非常灵活,可以像在构件和连接件中一样定义它们的联结。4.3ACME♦4.2.3ACME的模板和风格定义♦下面的代码显示了client-server风格的使用。♦Styleclient-server={♦ComponentTemplateClient(rpc_call_ports:Ports)={♦Portsrpc_call_ports;♦Properties{♦Aesop-style:style-id=client-server;//属性,Aesop风格♦Unicon-style:style-id=cs;//属性,Unicon风格♦Source-code:external=“CODE-LIB/client.c”♦}♦}4.3ACME♦4.2.3ACME的模板和风格定义♦ComponentTemplateServer(rpc_receive_ports:Ports)={♦Portrpc_receive_ports;♦Properties{♦Aesop-style:style-id=client-server;♦Unicon-style:style-id=cs;♦idempotence:boolean=true;♦Max-concurrent-client:integer=1;♦Source-code:external=“CODE-LIB/client.c”♦}♦}4.3ACME♦4.2.3ACME的模板和风格定义♦TemplateRPC(caller_port,callee_port:Port)defining(conn:Connector)={♦conn=Connector♦{♦Roles{Caller,Callee}♦Properties{♦synchoronous:boolean=true;♦Max-roles:integer=2;♦protocol:Wright=“…”♦}♦Attachments{♦Conn.callertocallee_port;♦C