《软件架构设计》温昱电子工业出版社第16章细化架构设计王建民mcswjm@mail.sysu.edu.cn2010年1月20日《软件架构设计》温昱电子工业出版社目录216.1架构细化在软件过程中所处的位置16.2设计逻辑架构16.3设计开发架构16.4设计数据架构16.5设计运行架构16.6设计物理架构16.7注意满足所有约束性软件需求16.8PMTool实战:细化架构设计16.9总结与强调《软件架构设计》温昱电子工业出版社解决的现实问题3 由于角色和分工不同,整个软件团队以及客户等众多各自需要掌握的技术或技能存在很大差异,需要了解整套架构决策的不同子集。 软件架构必须围绕“如何构建软件”指定多方面的设计决策,可能设计的概念有很多:逻辑层(Layer)、物理层(Tier)、子系统、模块、接口、进程、线程、消息、协议,等等。 越是复杂的系统,越是需要从多个方面进行架构设计,这样才能把问题研究和表达清楚。16.1架构细化在软件过程中所处的位置4 在概念性架构的基础上,运用更多具体的设计技术,设计出能够为实际开发提供更多指导和限制的实际架构。 实际架构重视通过子系统和模块来分割整个系统,并为每个子系统定义明确的接口。 软件架构中包含了软件系统如何组织等关键决策,模块的技术细节被局部化到了小组内部,这样就理顺了不同小组的沟通层次。《软件架构设计》温昱电子工业出版社16.1架构细化在软件过程中所处的位置5图16-1概念性架构、实际架构、开发实现的关系:上下承接,不断细化16.1.2运用基于5视图方法进行架构细化61.关键需求——对软件架构设计器关键作用的需求子集,包含功能需求、质量(属性)需求、商业需求三类;2.领域模型——以面向对象方式对问题领域的模拟和抽象,决定了软件系统的功能范围;3.概念性架构——选择了对未来软件系统的质量和功能描述;4.约束——具有强制性,规定了业务和技术上的标准和限制;5.经验——运用架构师的经验和业界的经验。《软件架构设计》温昱电子工业出版社16.1.2运用基于5视图方法进行架构细化细化顺序 5个架构设计图的设计顺序有很高的灵活性。 不断转换架构设计的角度更能反映实际情况。7基于5视图方法进行架构细化领域模型关键需求概念架构架构方案经验约束图16-2架构细化的“输入”和“输出”16.2设计逻辑架构8《软件架构设计》温昱电子工业出版社16.2.1概述9 逻辑架构的设计着重考虑功能需求——系统应当向用户提供什么样的服务。 关注点是行为或职责的划分,包括功能和辅助功能模块。 分配给逻辑层、功能模块、类等不同粒度的逻辑单元。 UML图:静态描述:包图、类图、对象图动态描述:序列图、协作图、状态图和活动图16.2.1概述10 逻辑架构的设计目标细化功能单元发现通用机制细化领域模型确定子系统接口和交互机制《软件架构设计》温昱电子工业出版社16.2.2识别通用机制11 软件架构关心的是如何将系统分为不同的部分以及各部分之间如何交互。两种做法:只识别并列举协作识别协作,并将有共性的协作抽象成通用机制«»«»«»«»«»«»«»«»图16-3只识别协作,不提取通用机制16.2.2识别通用机制12 机制(Mechanism)“软件应用系统中重复出现的解决方案”模式的实例。需要进一步细化成为特定模型中的协作。《软件架构设计》温昱电子工业出版社16.2.2识别通用机制13 优点提高系统的概念完整性。有利于建立起所有涉众对软件架构的共同认识。 实现考虑某几组对象如何协作以便使用通用机制处理公共行为。图16-4通用机制的提取16.2.2识别通用机制14图16-5采用对象图表达的“服务请求队列机制”《软件架构设计》温昱电子工业出版社16.3设计开发架构1516.3.1概述16 开发架构的设计着重考虑开发期质量属性。例如可扩展性、可重用性、可移植性、易理解性、易测试性等。 开发架构的关注点式软件开发环境中软件模块的实际组织方式。源程序文件、配置文件、源程序包、编译后的目标文件、第三方库文件等。 开发架构和逻辑架构存在一定的映射关系。当系统规模比较小时,联系会非常密切。《软件架构设计》温昱电子工业出版社16.3.1概述17 开发架构的设计应完成下列工作:确定要开发或直接利用的程序包之间的依赖关系确定采用的技术确定采用的框架等16.3.2分层与分区18 好的架构设计必须把变化点错落有致地封装起来。 分层架构的最大优点是将整体问题属性,吧可能的变化分别封装在不同的层中。 把架构划分为层,不同的层形成了开发小组的自然分界——每层的开发人员所需要的技巧是不同的。《软件架构设计》温昱电子工业出版社16.3.2分层与分区 应用层将借助MFC实现,但图中没有反应清楚; 通讯层的实现基于某串口通讯SDK,图中也没有反应清楚; 基础架构层放入设备控制层下产生歧义; 层次划分依据不一致。稳定性?高内聚?19图16-7令框架位于“基础框架层”16.3.2分层与分区 在分层的基础上,进一步分区(Partition)形成横切竖割的“二维架构”。20图16-8通过分区来说明框架在架构中的位置《软件架构设计》温昱电子工业出版社16.3分层与分区 进一步,把类库和框架的具体用法反应出来。 框架封装了设计元素之间的交互机制和协作流程,是架构的一部分。 分区适合表达应用使用框架的方式:通过类继承或接口实现等手段对扩展点进行扩展。21图16-9开发架构设计:运用分区反映框架的用法16.3.2分层与分区22 框架能否切中肯棨地阐明开发和架构的关系,不仅关系到你的设计思路是否清晰、是否合理,还关系到后续的程序开发工作能够顺畅展开的问题。 软件架构为了达到易修改、易测试、易扩展性等质量属性奥球,必须分离关注点,而在通过展现层、业务层、数据层等进行关注点分离的同时,可以辅以分区方法。框架是分区方法最常用的例子。《软件架构设计》温昱电子工业出版社16.4设计数据架构2316.4.1概述24 系统=程序+数据+软件 数据架构的设计着重考虑“数据需求” 数据架构的关注点是持久化的数据的组织 描述数据架构E-R图数据流图UML类图《软件架构设计》温昱电子工业出版社16.4.1概述25 数据架构的设计应完成下列工作:持久化数据存储方案数据传递、数据复制、数据同步等策略(可选)16.4.2如何将OO模型映射为数据模型 数据架构的设计从OO模型开始从经典的逻辑数据模型开始 本书推荐先基于OO模型进行物理数据模型的设计,之后进行设计优化。26图16-10设计数据架构的步骤《软件架构设计》温昱电子工业出版社16.4.2如何将OO模型映射为数据模型27图16-11二级分类的商品之例商品分类的类图和相应物理数据模型,任何商品必须位于严格的二级分类体系之中。16.4.2如何将OO模型映射为数据模型28分类体系改为灵活的多级分类,则类图将被调整,物理数据模型也应相应被更改。图16-12多级自由分类的商品之例《软件架构设计》温昱电子工业出版社16.4.2如何将OO模型映射为数据模型29调整“每种商品智能被归在一种分类之中”规定,允许一个商品归在多个分类。图16-13商品可属于多种类别之例16.4.2如何将OO模型映射为数据模型30 OO模型和数据模型之间关系密切,从OO模型导出数据模型的做法可以更好地保持设计的一致性。《软件架构设计》温昱电子工业出版社16.5设计运行架构3116.5.1概述32 运行架构的设计着重考虑运行期质量属性,例如性能、可伸缩性、持续可用性等。 运行架构关注进程、线程、对象等运行时概念,以及相关的并发、同步、通信等问题。 运行架构与开发架构开发架构偏重程序包在编译时期的静态依赖关系,表现为对象,线程、进程。运行架构关注运行时这些单元的交互问题。《软件架构设计》温昱电子工业出版社16.5.1概述33 运行架构是在开发架构的基础上,从宏观上规划多条控制流的并发和同步。 描述运行架构静态:包图、类图、对象图动态:序列图、协作图16.5.1概述34 运行架构的设计应完成以下工作:确定引入哪些进程与线程确定主动对象、被动对象、以及控制流关系处理相关问题:进程线程的创建、销毁、通信机制、资源争用等协议设计(可选,例如基于TCP/IP协议定义本系统的“应用协议”)《软件架构设计》温昱电子工业出版社16.5.2运用主动类规划并发35 为什么要进行并发性的设计?一方面,软件系统要支持的业务本身可能就是并发的;另一方面,并发利于提高性能和可伸缩性;还有,某些情况下,采用并发性设计师最直观、最自然地解决方案。16.5.2运用主动类规划并发36 控制流作为在处理机上顺序执行的动作系统,目前主要的实现技术有两种:进程或线层。 进程,“重量级控制流”。既是处理机资源的分配单位,又是其他计算机资源的分配单位。 线程,“轻量级控制流”,仅仅是处理机资源的分配单位。《软件架构设计》温昱电子工业出版社16.5.2运用主动类规划并发37 主动对象(ActiveObject)一组属性和服务的封装体,至少有一个服务是主动服务,主动服务不需要接收“消息”就能主动执行。 被动服务(PassiveObject)所有服务都是被动服务,需要被调用才能执行。 主动类(ActiveClass)描述主动对象的类。16.5.2运用主动类规划并发38 主动对象对于并发性设计之所以重要,是因为它是控制流的驱动着。 主动对象的主动服务时控制流的源头,该主动服务被创建成进程或线程。 从主动对象的主动服务开始,层层调用其他对象的服务,就形成了一个控制流。《软件架构设计》温昱电子工业出版社16.5.2运用主动类规划并发 以Java语言为例,一个线程必须是由一个主动类定义的,并通过“专门机构”完成线程的启动。 实现方法一:实现为Thread类的子类Thread类的背后“藏着”真正的线程机构,最终将调用本地操作系统的能力来实现线程的创建与控制。3916.5.2运用主动类规划并发 以Java语言为例,一个线程必须是由一个主动类定义的,并通过“专门机构”完成线程的启动。 实现方法二:实现Runnable接口;通过Thread最终将之创建成线程。40《软件架构设计》温昱电子工业出版社16.5.2运用主动类规划并发41 总之,进行并发性设计的关键是识别系统中所有并发执行的控制流,然后用主动对象来启动这些控制流。 把系统中所有的主动对象表示清楚,就抓住了系统中每个控制流的源头,就可以把并发执行的所有控制流梳理清楚。16.5.3应用协议的设计 应用协议,是指处于通信协议栈最高层的协议。 定义了网络应用程序之间是如何交谈的,它的语义是和应用相关的,而和具体通信无关。 协议的设计属于运行架构设计应关注的范围。42图16-17TCP/IP协议栈中应用协议的位置《软件架构设计》温昱电子工业出版社16.6设计物理架构4316.6.1概述44 物理架构的设计着重考虑“安装和部署需求”。 物理视图描述运行软件的计算机、网络、硬件设施等情况,还包括如何将软件包部署(如果是嵌入式系统则是烧写)到这些硬件资源上,以及它们运行时的配置情况。 物理架构还要考虑软件系统和包括硬件在内的整个IT系统之间是如何相互影响的,关注如何配置硬件和网络来配合软件系统的可靠性、可伸缩性、持续可用性、性能、安全性等方面要求。《软件架构设计》温昱电子工业出版社16.6.1概述45 物理架构必须考虑“功能的分布”和“数据的分布”。 描述软件架构部署图组件图16.6.1概述46 物理架构的设计应完成下列工作确定物理配置方案(可能是网络方案,也可能是单片机等的分布,或者两者兼有)确定如何将目标程序映射到物理结点《软件架构设计》温昱电子工业出版社16.7注意满足所有约束性软件需求4716.7注意满足所有约束性软件需求48 约束性需求规定了开发软件系统时必须遵守的限制条件,忽视它们可能导致架构设计的失败。 和功能性需求相比,约束并不强调行为,它既可能是开发时必须遵循的标准,也可能是硬件的限制,还可能是法律法规等社会