几种常用软件架构设计指南.docx
- 文档编号:12098088
- 上传时间:2023-04-17
- 格式:DOCX
- 页数:13
- 大小:199.34KB
几种常用软件架构设计指南.docx
《几种常用软件架构设计指南.docx》由会员分享,可在线阅读,更多相关《几种常用软件架构设计指南.docx(13页珍藏版)》请在冰豆网上搜索。
几种常用软件架构设计指南
几种常用软件架构设计指南
软件架构(softwarearchitecture)是一系列相关的抽象模式,用于指导大型软件系统各个方面的设计。
软件架构是一个系统的草图。
软件架构描述的对象是直接构成系统的抽象组件。
各个组件之间的连接则明确和相对细致地描述组件之间的通讯。
在实现阶段,这些抽象组件被细化为实际的组件,比如具体某个类或者对象。
在面向对象领域中,组件之间的连接通常用接口来实现。
软件体系结构的定义
虽然软件体系结构已经在软件工程领域中有着广泛的应用,但迄今为止还没有一个被大家所公认的定义。
许多专家学者从不同角度和不同侧面对软件体系结构进行了刻画,较为典型的定义有:
DewaynePerry和A1exWo1f曾这样定义:
软件体系结构是具有一定形式的结构化元素,即构件的集合,包括处理构件、数据构件和连接构件。
处理构件负责对数据进行加工,数据构件是被加工的信息,连接构件把体系结构的不同部分组组合连接起来。
这一定义注重区分处理构件、数据构件和连接构件,这一方法在其他的定义和方法中基本上得到保持。
MaryShaw和DavidGarlan认为软件体系结构是软件设计过程中的一个层次,这一层次超越计算过程中的算法设计和数据结构设计。
体系结构问题包括总体组织和全局控制、通讯协议、同步、数据存取,给设计元素分配特定功能,设计元素的组织,规模和性能,在各设计方案间进行选择等。
软件体系结构处理算法与数据结构之上关于整体系统结构设计和描述方面的一些问题,如全局组织和全局控制结构、关于通讯、同步与数据存取的协议,设计构件功能定义,物理分布与合成,设计方案的选择、评估与实现等
Kruchten指出,软件体系结构有四个角度,它们从不同方面对系统进行描述:
概念角度描述系统的主要构件及它们之间的关系;模块角度包含功能分解与层次结构;运行角度描述了一个系统的动态结构;代码角度描述了各种代码和库函数在开发环境中的组织。
HayesRoth则认为软件体系结构是一个抽象的系统规范,主要包括用其行为来描述的功能构件和构件之间的相互连接、接口和关系。
DavidGarlan和DewnePerry于1995年在IEEE软件工程学报上又采用如下的定义:
软件体系结构是一个程序/系统各构件的结构、它们之间的相互关系以及进行设计的原则和随时间进化的指导方针。
BarryBoehm和他的学生提出,一个软件体系结构包括一个软件和系统构件,互联及约束的集合;一个系统需求说明的集合;一个基本原理用以说明这一构件,互联和约束能够满足系统需求。
1997年,Bass,Ctements和Kazman在《使用软件体系结构》一书中给出如下的定义:
一个程序或计算机系统的软件体系结构包括一个或一组软件构件、软件构件的外部的可见特性及其相互关系。
其中,"软件外部的可见特性"是指软件构件提供的服务、性能、特性、错误处理、共享资源使用等。
软件体系结构建模
研究软件体系结构的首要问题是如何表示软件体系结构,即如何对软件体系结构建模。
根据建模的侧重点的不同,可以将软件体系结构的模型分为5种:
结构模型、框架模型、动态模型、过程模型和功能模型。
在这5个模型中,最常用的是结构模型和动态模型。
结构模型
这是一个最直观、最普遍的建模方法。
这种方法以体系结构的构件、连接件和其他概念来刻画结构,并力图通过结构来反映系统的重要语义内容,包括系统的配置、约束、隐含的假设条件、风格、性质。
研究结构模型的核心是体系结构描述语言。
框架模型
框架模型与结构模型类似,但它不太侧重描述结构的细节而更侧重于整体的结构。
框架模型主要以一些特殊的问题为目标建立只针对和适应该问题的结构。
动态模型
动态模型是对结构或框架模型的补充,研究系统的"大颗粒"的行为性质。
例如,描述系统的重新配置或演化。
动态可能指系统总体结构的配置、建立或拆除通信通道或计算的过程。
这类系统常是激励型的。
过程模型
过程模型研究构造系统的步骤和过程。
因而结构是遵循某些过程脚本的结果。
功能模型
该模型认为体系结构是由一组功能构件按层次组成,下层向上层提供服务。
它可以看作是一种特殊的框架模型。
这5种模型各有所长,也许将5种模型有机地统一在一起,形成一个完整的模型来刻画软件体系结构更合适。
例如,Kruchten在1995年提出了一个"4+1"的视角模型。
"4+1"模型从5个不同的视角包括逻辑视角、过程视角、物理视角、开发视角和场景视角来描述软件体系结构。
每一个视角只关心系统的一个侧面,5个视角结合在一起才能够反映系统的软件体系结构的全部内容。
图1“4+1”视图模型
逻辑架构
逻辑架构主要支持功能性需求――即在为用户提供服务方面系统所应该提供的功能。
系统分解为一系列的关键抽象,(大多数)来自于问题域,表现为对象或对象类的形式。
它们采用抽象、封装和继承的原理。
分解并不仅仅是为了功能分析,而且用来识别遍布系统各个部分的通用机制和设计元素。
我们使用Rational/Booch方法来表示逻辑架构,借助于类图和类模板的手段。
类图用来显示一个类的集合和它们的逻辑关系:
关联、使用、组合、继承等等。
相似的类可以划分成类集合。
类模板关注于单个类,它们强调主要的类操作,并且识别关键的对象特征。
如果需要定义对象的内部行为,则使用状态转换图或状态图来完成。
公共机制或服务可以在类功能(classutilities)中定义。
对于数据驱动程度高的应用程序,可以使用其他形式的逻辑视图,例如E-R图,来代替面向对象的方法(OOapproach)。
图2逻辑视图表示符号
开发架构
开发架构关注软件开发环境下实际模块的组织。
软件打包成小的程序块(程序库或子系统),它们可以由一位或几位开发人员来开发。
子系统可以组织成分层结构,每个层为上一层提供良好定义的接口。
系统的开发架构用模块和子系统图来表达,显示了"输出"和"输入"关系。
完整的开发架构只有当所有软件元素被识别后才能加以描述。
但是,可以列出控制开发架构的规则:
分块、分组和可见性。
图3开发视图的标识符号
进程架构
进程架构考虑一些非功能性的需求,如性能和可用性。
它解决并发性、分布性、系统完整性、容错性的问题,以及逻辑视图的主要抽象如何与进程结构相配合在一起-即在哪个控制线程上,对象的操作被实际执行。
进程架构可以在几种层次的抽象上进行描述,每个层次针对不同的问题。
在最高的层次上,进程架构可以视为一组独立执行的通信程序(叫作"processes")的逻辑网络,它们分布在整个一组硬件资源上,这些资源通过LAN或者WAN连接起来。
多个逻辑网络可能同时并存,共享相同的物理资源。
例如,独立的逻辑网络可能用于支持离线系统与在线系统的分离,或者支持软件的模拟版本和测试版本的共存。
图4进程视图的标识符号
物理架构
物理架构主要关注系统非功能性的需求,如可用性、可靠性(容错性),性能(吞吐量)和可伸缩性。
软件在计算机网络或处理节点上运行,被识别的各种元素(网络、过程、任务和对象),需要被映射至不同的节点;我们希望使用不同的物理配置:
一些用于开发和测试,另外一些则用于不同地点和不同客户的部署。
因此软件至节点的映射需要高度的灵活性及对源代码产生最小的影响。
图5物理视图的标识符号
场景架构
四种视图的元素通过数量比较少的一组重要场景(更常见的是用例)进行无缝协同工作,我们为场景描述相应的脚本(对象之间和过程之间的交互序列)。
在某种意义上场景是最重要的需求抽象,它们的设计使用对象场景图和对象交互图来表示。
该视图是其他视图的冗余(因此"+1"),但它起到了两个作用:
●作为一项驱动因素来发现架构设计过程中的架构元素。
●作为架构设计结束后的一项验证和说明功能,既以视图的角度来说明又作为架构原型测试的出发点。
场景表示法与组件逻辑视图非常相似(请对照图2),但它使用过程视图的连接符来表示对象之间的交互(请对照图4),注意对象实例使用实线来表达。
管道过滤器风格软件架构
在管道/过滤器风格的软件体系结构中,每个构件都有一组输入和输出,构件读输入的数据流,经过内部处理,然后产生输出数据流。
这个过程通常通过对输入流的变换及增量计算来完成,所以在输入被完全消费之前,输出便产生了。
因此,这里的构件被称为过滤器,这种风格的连接件就象是数据流传输的管道,将一个过滤器的输出传到另一过滤器的输入。
此风格特别重要的过滤器必须是独立的实体,它不能与其它的过滤器共享数据,而且一个过滤器不知道它上游和下游的标识。
一个管道/过滤器网络输出的正确性并不依赖于过滤器进行增量计算过程的顺序。
图6管道过滤器体系结构
图7数字通信系统粗略模型
管道/过滤器风格的软件体系结构具有许多很好的特点:
Ø使得软构件具有良好的隐蔽性和高内聚、低耦合的特点;
Ø允许设计者将整个系统的输入/输出行为看成是多个过滤器的行为的简单合成;
Ø支持软件重用。
重要提供适合在两个过滤器之间传送的数据,任何两个过滤器都可被连接起来;
Ø系统维护和增强系统性能简单。
新的过滤器可以添加到现有系统中来;旧的可以被改进的过滤器替换掉;
Ø允许对一些如吞吐量、死锁等属性的分析;
Ø支持并行执行。
每个过滤器是作为一个单独的任务完成,因此可与其它任务并行执行。
但是,这样的系统也存在着若干不利因素。
Ø通常导致进程成为批处理的结构。
这是因为虽然过滤器可增量式地处理数据,但它们是独立的,所以设计者必须将每个过滤器看成一个完整的从输入到输出的转换。
Ø不适合处理交互的应用。
当需要增量地显示改变时,这个问题尤为严重。
Ø因为在数据传输上没有通用的标准,每个过滤器都增加了解析和合成数据的工作,这样就导致了系统性能下降,并增加了编写过滤器的复杂性。
层次风格软件架构
层次系统组织成一个层次结构,每一层为上层服务,并作为下层客户。
在一些层次系统中,除了一些精心挑选的输出函数外,内部的层只对相邻的层可见。
这样的系统中构件在一些层实现了虚拟机(在另一些层次系统中层是部分不透明的)。
连接件通过决定层间如何交互的协议来定义,拓扑约束包括对相邻层间交互的约束。
这种风格支持基于可增加抽象层的设计。
这样,允许将一个复杂问题分解成一个增量步骤序列的实现。
由于每一层最多只影响两层,同时只要给相邻层提供相同的接口,允许每层用不同的方法实现,同样为软件重用提供了强大的支持。
图8是层次系统风格的示意图。
层次系统最广泛的应用是分层通信协议。
在这一应用领域中,每一层提供一个抽象的功能,作为上层通信的基础。
较低的层次定义低层的交互,最低层通常只定义硬件物理连接。
图8层次系统体系结构
层次系统有许多可取的属性:
Ø支持基于抽象程度递增的系统设计,使设计者可以把一个复杂系统按递增的步骤进行分解;
Ø支持功能增强,因为每一层至多和相邻的上下层交互,因此功能的改变最多影响相邻的上下层;
Ø支持重用。
只要提供的服务接口定义不变,同?
?
一组标准的接口,而允许各种不同的实现方法。
但是,层次系统也有其不足之处:
Ø并不是每个系统都可以很容易地划分为分层的模式,甚至即使一个系统的逻辑结构是层次化的,出于对系统性能的考虑,系统设计师不得不把一些低级或高级的功能综合起来;
Ø很难找到一个合适的、正确的层次抽象方法。
三层应用程序模式是我们最常用的模式之一。
当我们在准备使用层来组织应用程序的方式构件一个业务解决方法,如何组织应用程序以便重用业务逻辑、提供部署灵活性并保留重要的资源连接,这就可以用三层应用程序模式。
图9三层软件架构
表现层:
这一层负责与用户的交互。
提供服务,显示信息(例如在windows或HTML页面中,处理用户请求(鼠标点击,键盘敲击等),HTTP请求,命令行调用。
)
业务层:
逻辑,系统中真正的核心。
业务层实现应用程序的业务功能。
数据访问层:
与数据库、消息系统、事务管理器及其其他软件包通信。
图10四层软件架构
MVC模式
MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:
模型(Model)、视图(View)和控制器(Controller)。
MVC模式最早由TrygveReenskaug在1974年[1]提出,是施乐帕罗奥多研究中心(XeroxPARC)在20世纪80年代为程序语言Smalltalk发明的一种软件设计模式。
MVC模式的目的是实现一种动态的程式设计,使后续对程序的修改和扩展简化,并且使程序某一部分的重复利用成为可能。
除此之外,此模式通过对复杂度的简化,使程序结构更加直观。
软件系统通过对自身基本部份分离的同时也赋予了各个基本部分应有的功能。
图11MVC架构
模型(Model)“数据模型”(Model)用于封装与应用程序的业务逻辑相关的数据以及对数据的处理方法。
“模型”有对数据直接访问的权力,例如对数据库的访问。
“模型”不依赖“视图”和“控制器”,也就是说,模型不关心它会被如何显示或是如何被操作。
但是模型中数据的变化一般会通过一种刷新机制被公布。
为了实现这种机制,那些用于监视此模型的视图必须事先在此模型上注册,从而,视图可以了解在数据模型上发生的改变。
视图(View)视图层能够实现数据有目的的显示(理论上,这不是必需的)。
在视图中一般没有程序上的逻辑。
为了实现视图上的刷新功能,视图需要访问它监视的数据模型(Model),因此应该事先在被它监视的数据那里注册。
控制器(Controller)控制器起到不同层面间的组织作用,用于控制应用程序的流程。
它处理事件并作出响应。
“事件”包括用户的行为和数据模型上的改变。
MVC模式的优点
在最初的JSP网页中,像数据库查询语句这样的数据层代码和像HTML这样的表示层代码混在一起。
经验比较丰富的开发者会将数据从表示层分离开来,但这通常不是很容易做到的,它需要精心地计划和不断的尝试。
MVC从根本上强制性地将它们分开。
尽管构造MVC应用程序需要一些额外的工作,但是它带给我们的好处是毋庸置疑的。
首先,多个视图能共享一个模型。
如今,同一个Web应用程序会提供多种用户界面,例如用户希望既能够通过浏览器来收发电子邮件,还希望通过手机来访问电子邮箱,这就要求Web网站同时能提供Internet界面和WAP界面。
在MVC设计模式中,模型响应用户请求并返回响应数据,视图负责格式化数据并把它们呈现给用户,业务逻辑和表示层分离,同一个模型可以被不同的视图重用,所以大大提高了代码的可重用性。
其次,控制器是自包含(self-contained)指高独立内聚的物件,与模型和视图保持相对独立,所以可以方便的改变应用程序的数据层和业务规则。
例如,把数据库从MySQL移植到Oracle,或者把RDBMS数据源改变成LDAP数据源,只需改变控制器即可。
一旦正确地实现了控制器,不管数据来自数据库还是LDAP服务器,视图都会正确地显示它们。
由于MVC模式的三个模块相互独立,改变其中一个不会影响其他两个,所以依据这种设计思想能构造良好的少互扰性的构件。
此外,控制器提高了应用程序的灵活性和可配置性。
控制器可以用来连接不同的模型和视图去完成用户的需求,也可以构造应用程序提供强有力的手段。
给定一些可重用的模型和视图,控制器可以根据用户的需求选择适当的模型机型处理,然后选择适当的的视图将处理结果显示给用户。
架构视图
软件架构一般来说组织成视图,视图由以下统一建模语言图组成:
逻辑视图:
类图、状态机和对象图。
进程视图:
类图与对象图(包括任务-进程与线程)。
实施视图:
构件图。
部署视图:
配置图。
用例视图:
用例图描述用例、主角和普通设计类;顺序图描述设计对象及其协作关系。
架构的文档化
架构设计中产生的文档可以归结为两种:
⏹软件架构文档,其结构遵循"4+1"视图(请对照图13,一个典型的提纲)
⏹软件设计准则,捕获了最重要的设计决策。
这些决策必须被遵守,以保持系统架构的完整性。
图12软件架构文档提纲
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 常用软件 架构 设计 指南
![提示](https://static.bdocx.com/images/bang_tan.gif)