购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.6 软件体系结构

当系统的规模和复杂度不断增加的时候,构造整个系统的关键是对整个系统的结构和行为进行抽象,一方面寻求更好的方法使系统的整体设计更容易理解,另一方面寻求构造大型复杂系统的复用。

编写小规模的程序(如词频统计)主要考虑算法的选择、数据结构的设计、数据库的构造,而编写复杂的大规模程序(如Web信息检索系统)更加侧重于对系统的全局结构设计和规划。

体系结构一词起源于建筑学,属于工程领域,是从宏观层面描述整个建筑的结构,把一个复杂的建筑体拆分成多个基本的建筑单元,再进行有机结合。建筑设计的原则是坚固、适用、赏心悦目。软件体系结构(Software Architecture)包括构成系统的设计元素的描述、设计元素之间的交互、设计元素的组合模式以及在这些模式中的约束。软件体系结构有五大组成部分:一是构件,是一组基本的构成要素;二是连接件,是这些要素之间的连接关系;三是约束,是作用于这些要素或连接关系上的限制条件;四是质量,是系统的质量属性,如性能、可扩展性、可修改性、可重用性、安全性等;五是物理分布,是这些要素连接之后形成的拓扑结构,描述了从软件到硬件的映射。

简单来说,软件体系结构=构件+连接件+约束,提供了在更宏观的结构层次上来理解系统层面的骨架,重点关注如何将复杂的软件系统划分成模块、如何规范模块的构成、如何将这些模块组织为完整的系统以及如何保证系统的质量要求。

构件是具有某种功能的可复用的软件结构单元,表示系统中主要的计算元素和数据存储。任何在软件系统运行中承担一定功能、发挥一定作用的功能体都可以称为构件,如程序函数、模块、对象、类、文件、相关功能的集合等。构件作为一个封装的实体,只能通过接口与外界环境进行交互,其内部结构是被隐藏的。构件功能以服务的形式体现出来,通过接口对外发布,进而产生与其他构件的关联,如目前广泛使用的Web服务。

连接是构件间建立和维护行为关联与信息传递的途径。有两种实现方式,即机制和协议。机制包括过程调用、中断、I/O、事件、进程、线程、共享、同步、并发、消息、远程调用、动态连接、API等;协议是连接的规约,对过程调用来说是参数的个数、类型和参数排列次序,对消息传送来说是消息的格式。同步和异步是影响实现连接的复杂机制。

连接件表示构件之间的交互并实现构件之间的连接,如管道(pipe)、过程调用(procedure call)、事件广播(event broadcast)、客户机-服务器(client-server)、数据库连接(SQL)等都是连接件。构件是软件功能设计和实现的承载体,而连接件是负责完成构件之间信息交换和行为联系的专用构件。

好的开始是成功的一半。初期的总体设计是决定软件产品成败的重要因素,错误的设计决策往往会带来灾难性的后果。因此,软件体系结构的设计目标有:可重用性、可扩展性/可改变性、简单性和有效性。可重用性是指复用已经实现证明的体系结构或提供可重用资产。在软件设计的过程中,可以对经过实践证明的体系结构实现复用,从而提高设计效率和可靠性,降低设计复杂度。另外,也可以将公共部分抽象、提取出来,形成公共类、工具类,为大规模开发提供基础和规范。体系结构的设计要具备灵活性,方便增加功能,以便更好地适应用户的需求,因而要具备可扩展性(易于增加新的功能)和可改变性(易于适应需求变更)。体系结构构建了一个相对小的、简单的模型,这样就将复杂问题简单化,使系统更加易于理解和实现,是简单性的体现。软件体系结构还突出体现了早期设计决策,展现了系统满足需求的能力,是有效性的体现。

软件体系结构是逐步发展起来的:1968年,软件体系结构的概念开始出现,由NATO首次提出;经历了由20世纪60年代的高级语言到20世纪70~80年代的面向过程开发(系统被划分成不同的子程序,相互之间的调用关系就构成了系统的结构)、20世纪90年代的面向对象开发(系统被划分成不同的对象,采用统一建模语言UML来描述系统的结构)、基于构件的软件开发(体系结构成为软件工程领域研究的热点,出现了体系结构风格、框架、设计模式等概念)以及21世纪初的面向服务开发(具备分布式、跨平台、互操作、松散耦合等特点,致力于解决企业信息化过程中不断变化的需求和异构环境集成等难题)、21世纪10年代的云与服务开发,直至现在的智能化软件开发。其中,1999年IEEE 1471—2000标准的发布为软件架构的普及应用制定了标准化规范。这是一个从无体系结构到概念与理论体系的形成,再到理论完善及普及应用的过程。

图2.6展现了软件体系结构的发展历程,从上到下是一个由细粒度到粗粒度的转变,从左到右则体现了从IT技术向商务过程发展以及从封闭到开放的过程。

对于图中的风格、模式和框架,这里稍做说明和比较。体系结构风格用于描述某一特定应用领域中系统组织的惯用模式,反映了领域中众多系统所共有的结构和语义特性,比如MVC(Model View Control);设计模式描述了软件系统设计过程中常见问题的一些解决方案,通常是从大量的成功实践中总结出来的且被广泛公认的实践和知识,比如观察者模式;软件框架是由开发人员定制的应用系统的骨架,是整个或部分系统的可重用设计,通常由一组抽象构件和构件实例间的交互方式组成,比如Python Django框架是一个开放源代码的Web应用框架。因此,框架和体系结构的关系是:体系结构的呈现形式是一个设计规约,而框架是半成品软件;体系结构的目的是指导软件系统的开放,而框架的目的是设计复用。

比如MVC体系结构在Web应用中有不同的对应框架,前端有AngularJS和BackBoneJS,而后端有Django。框架和设计模式的关系是:框架给出的是整个应用的体系结构;而设计模式则给出了单一设计问题的解决方案,且可以在不同的应用程序或框架中进行应用。又如一个网络游戏可以基于网易的Pomelo框架开发,这是一个基于Node.js的高性能、分布式游戏服务器框架;而在实现某个动画功能时,可能会使用观察者模式实现自动化的通知更新。因此,设计模式的目标是改善代码结构,提高程序的结构质量;而框架强调的是设计的重用性和系统的可扩展性,目的是缩短开发周期、提高开发质量。

图2.6 软件体系结构的发展历程

目前常见的体系结构风格有以下几种。一是独立构件,包括进程通信和事件系统,事件系统又分为隐式调用和显式调用;二是数量流,包括批处理和管道-过滤器;三是以数据为中心,包括仓库和黑板;四是虚拟机,包括解释器和基于规则的系统;五是调用/返回,包括主程序-子程序、面向对象和层次结构。

主程序-子程序风格是结构化程序设计的一种典型风格,从功能的观点设计系统,通过逐步分解和细化,形成整个系统的体系结构。其构件是主程序和子程序,连接器是调用-返回机制,拓扑结构是层次化结构。

面向对象风格是建立在数据抽象和面向对象的基础上的,系统被看作对象的集合,每个对象都有自己的功能集合。这种风格的构件是类和对象,对象之间通过函数调用和消息传递实现交互。其特点是具有信息隐藏性:数据及作用在数据上的操作被封装成抽象数据类型;只通过接口与外界交互,内部的设计决策被封装起来。 qeJtAsdsmG2W5jvJ71syaWHe7z4hxUwqO1NFvoFvS5wuPJOV68vo6msP+qCLkeO+

点击中间区域
呼出菜单
上一章
目录
下一章
×