软件架构设计的一个核心问题是如何有效地使用重复的体系结构模式,即达到软件体系结构级的软件重用。软件架构风格(Software Architecture Style)是描述软件系统组织方式的常用模式,在实践中已经被多次应用。按照Shaw和Garlan的说法,“一种体系结构风格定义了构件类型和连接件类型的词汇表,以及它们如何组合的约束条件”。软件架构风格通常分为数据流(Data Flow)风格、调用/返回(Call/Return)风格、独立构件(Independent Components)风格、虚拟机(Virtual Machines)风格和仓库(Repositories)风格5大类。在实际应用中,随着软件系统规模的扩大和复杂,一个系统往往会同时使用多类体系结构风格,这些风格可以交叉组合,彼此重叠。
请围绕“软件架构风格及其应用”论题,依次从以下3个方面进行论述。
1.概要叙述你参与管理和开发的软件工程项目及你在其中所担任的主要工作。
2.请说明以上软件架构风格分类中每一类有哪些经典的软件体系结构设计风格,并就其中至少两类论述其具体的软件架构风格的构件、连接件类型和组合约束要求等结构特征及其应用特点。
3.具体阐述你参与管理和开发的项目中在体系结构设计时选择使用软件架构风格的情况,包括选择的依据、多个风格组合使用的情况和最终实际效果等,还有哪些需要进一步改进之处及如何进行改进。
参考答案:1.简要介绍你参与规划、设计和实施的大中型软件工程项目的基本情况,尤其有针对性地介绍与软件架构风格或软件重用方面的需求和应用环境,简要说明自己在该项目中的角色、所承担的主要任务及开展的主要工作。论文叙述自己参与设计和实施的软件工程项目应有一定的规模,自己在该项目中担任的主要工作应有一定的分量。
2.结合你的项目实践经验,介绍以下软件架构风格方面的知识点。
1)Garlan和Shaw将软件架构风格分为5大类
(1)数据流风格:包括批处理序列架构风格(Batch Sequential)和管道/过滤器架构风格(Pipes/Filters)。
(2)调用/返回风格:包括主程序/子程序架构风格(Main Program and Subroutine)、数据抽象和面向对象架构风格(Data Abstraction and Object-Oriented)及层次结构架构风格(Hierarchical Layers)。
(3)独立构件风格:包括进程通信架构风格(Communicating Processes)和事件驱动架构风格(EventSystems)。
(4)虚拟机风格:包括解释器架构风格(Interpreters)和基于规则的系统(Rule-based Systems)架构风格。
(5)仓库风格:包括数据库架构风格(Databases)和黑板架构风格(Blackboards)。
其他:特定领域软件体系结构(Domain-specific Software Architectures)、状态转移(State TransitionSystem)、分布式处理(Distributed Processes)架构风格和:REST(REpresentational State Transfer)混合架构风格等。其中分布式架构风格中有客户机/服务器(C/S)架构风格、浏览器/服务器(B/S)架构风格、CORBA、DCOM和EJB架构风格等。
论文中5类软件架构风格,每一类给出两个具体的体系结构风格即可,给出的体系结构风格属于“其他”一类者也可。
2)每一种具体的架构风格的模型
(1)数据流风格包括批处理序列架构风格和管道/过滤器架构风格。
①批处理序列架构风格。组件为一系列固定顺序的计算单元,组件间只通过数据传递交互。每个处理步骤是一个独立的程序,每一步必须在前一步结束后才能开始,数据必须是完整的,以整体的方式传递。
②管道/过滤器架构风格。每个构件都有一组输入和输出,构件读取输入的数据流,经过内部处理,然后产生输出数据流。这个过程通常通过对输入流的变换及增量计算来完成,包括通过计算和增加信息丰富数据,通过浓缩和删除精炼数据,通过改变记录方式转化数据,递增地转化数据等。在输入被完全消费之前,输出便产生了。这里构件被称为过滤器,连接件就是数据流传输的管道,将一个过滤器的输出传到另一个过滤器的输入。
(2)调用/返回风格包括主程序/子程序架构风格、数据抽象和面向对象架构风格及层次结构架构风格。
①主程序/子程序架构风格。单线程控制,把问题划分为若干处理步骤,构件即为主程序和子程序。子程序通常可合成为模块。过程调用作为交互机制,即充当连接件。调用关系具有层次性,其语义逻辑表现为子程序的正确性,取决于它调用的子程序的正确性。
②数据抽象和面向对象架构风格。这种风格的构件是对象。对象是抽象数据类型的实例。在抽象数据类型中,数据的表示和它们的相应操作被封装起来。对象的行为体现在其接受和请求的动作。连接件即是对象间交互的方式,对象是通过函数和过程的调用来交互的。对象具有封装性,一个对象的改变不会影响其他对象。对象拥有状态和操作,也有责任维护状态。这种结构风格中包含有封装、交互、多态、集成和重用等特征。
③层次结构架构风格。层次系统组织成一个层次结构。构件在一些层实现了虚拟机。连接件通过决定层间如何交互的协议来定义,拓扑约束包括对相邻层间交互的约束。这个风格的特点是每层为上一层提供服务,使用下一层的服务,只能见到与自己邻接的层。大的问题分解为若干个渐进的小问题,逐步解决,隐藏了很多复杂度。修改一层,最多影响两层,而通常只能影响上层。上层必须知道下层的身份,不能调整层次之间的顺序。
(3)独立构件风格包括进程通信架构风格和事件驱动架构风格。
①进程通信架构风格。构件是独立的过程,连接件是消息传递。这种风格的特点是构件通常是命名过程,消息传递的方式可以是点对点、异步和同步方式及远过程调用等。
②事件驱动架构风格。构件不直接调用一个过程,而是触发或广播一个或多个事件。系统中其他构件中的过程在一个或多个事件中注册,当一个事件被触发,系统自动调用在这个事件中注册的所有过程。一个事件的触发就导致了另一个模块中过程的调用。
这种风格中的构件是非命名的过程,它们之间交互的连接件往往是以过程之间的隐式调用(ImplicitInvocation)来实现的。基于事件的隐式调用风格的主要优点是为软件重用提供了强大的支持,为构件的维护和演化带来了方便;其缺点是构件放弃了对系统计算的控制。
(4)虚拟机风格包括解释器架构风格和基于规则的系统。
①解释器架构风格。一个解释器通常包括完成解释工作的解释引擎,一个包含将被解释的代码的存储区,一个记录解释引擎当前工作状态的数据结构,以及一个记录源代码被解释执行的进度的数据结构。具有解释器风格的软件中含有一个虚拟机,可以仿真硬件的执行过程和一些关键应用;其缺点是执行效率较低。
②基于规则的系统。基于规则的系统包括规则集、规则解释器、规则/数据选择器及工作内存。
(5)仓库风格包括数据库架构风格和黑板架构风格。
①数据库架构风格。数据库架构是库风格最常见的形式。构件主要有两大类,一个是中央共享数据源,保存当前系统的数据状态;另一个是多个独立处理元素,处理元素对数据元素进行操作。
②黑板架构风格。黑板架构包括知识源、黑板和控制3部分。知识源包括若干独立计算的不同单元,提供解决问题的知识,知识源响应黑板上的变化,也只修改黑板。黑板是一个全局数据库,包含解域的全部状态,是知识源互相作用的唯一媒介。知识源响应是通过黑板状态的变化来控制。黑板通常应用在对于解决问题没有确定性算法的系统中,例如信号处理、问题规划及编译器优化等软件系统的设计中。
论文中给出每一类软件架构风格中一个具体的体系结构风格即可。
3.结合项目的实际状况,指出在体系结构设计时选择使用软件架构风格的情况,包括选择的依据及多个风格组合使用的情况等,要给出实际的效果及分析。论文最后可以进一步讨论你在该工程项目中获得的,与软件架构风格应用方面相关的体会,以及在今后的工作过程中,如果碰到类似的开发项目你将如何应用这些经验或教训。对需要进一步改进的地方,应有具体的着眼点,不能泛泛而谈。