1.4 软件体系结构的理想与现实

1.4.1 软件体系结构的理想效果

软件体系结构的理想效果是可完整、高效地重用整个软件体系结构,将现有软件体系结构应用于新的项目中。

用户只需将需求明确、选择适合的软件体系结构,就可完成整个项目的功能、非功能的需求分析,并且确定好相关软件模块的划分、采用的相关技术,以及技术对应的相关软件战术,这些战术可以提升用户开发的软件模块质量,同时结合软件的非功能需求,快速满足非功能属性的要求。简单地说,如果一个体系结构得以理想化的复用,那么软件的需求、设计乃至相关关键技术均可快速被确定及复用。下面举一个例子说明软件体系结构的理想复用。

某一用户公司完成了多个软件项目,这些软件项目均属一个软件序列。公司即将开发一个新的应用newAPP。新应用基于软件体系结构复用的开发过程,与传统过程的对比如表1-2所示。

表1-2 体系结构复用与传统开发过程对比

表格左列为以体系结构复用的相关开发过程,右侧为传统的开发模式。左列由于可利用现有的体系结构,在体系结构分析上只需对与原有体系结构有区别的需求进行分析,即可尽快地完成体系结构的选择,以及新需求的分解,同时责任划分也相对容易,可快速地利用原有体系结构进行填充、定制。与体系结构所对应的原有代码结构可保持不变,只需在修改部分的结构上进行代码重构即可完成新的应用开发。

例如笔者所在实验室具有一套电信业务开发平台,基于该平台可快速地开发各种功能的通信业务。基于平台的开发正是对基于体系结构复用的开发过程,用户可借鉴该通信平台的已有架构,在开发时,将重点转变为如何利用和定制框架以完成新的通信业务需求,从而大大减少了开发的工作量。架构也是类似的,也有利于小组模式的开发和维护。同时,同样的架构大大提高了代码的复用率,减少了额外的代码测试,提高了代码的成熟度。对程序员新手而言,在一个框架中进行开发,更像是在一个半成品的积木模型上进行再创造。

1.4.2 现存软件复用的层次

软件互用层次按照复用的内涵可以分为如下几种。

① API级别的复用,软件库的复用。API的复用是最基础的复用形态,用户通过调用某个或几个API而形成对遗留代码的复用。

② 软件构件的复用。它是将多个API有机地组成一套具备通用功能,可在相关中间件上使用的组件。软件构件的复用比纯粹API级别的复用多了一些环境的限制,相关上下文信息较为明确。

③ 服务的复用。将某些软件的功能开放出来以服务的形式对外提供,一般采用SOAP等标准协议进行开放。服务的复用在某种层次上比软件构件复用多了一些通用性,同时一般可支持远程调用,有利于系统的解耦合。

④ 框架的复用。框架的复用比上述复用更进一步,框架一般规定了框架自身提供的功能,也规范了框架中应用的行为准则。框架一般还提供相关通用服务,便于用户快速地开发相关应用。

⑤ 体系结构的复用。对体系结构的复用包括体系结构的静态与动态结构,可完整刻画软件系统的功能与非功能属性,便于快速地搭建软件结构。

目前的软件复用层次,仍停留在前四个阶段,很多开发人员甚至还停留在第1阶段左右。例如一个本科生在学习编程语言的过程中,一般先学习语言自身的关键词、各种语句,之后学习的库函数就属于第1阶段的复用。在第1层次的复用中,开发人员可基于标准库或者已知第三方库函数从最底层开发相关应用。显然,这种开发过程相当烦琐。若开发一个大型系统,需要做很多工作才能完成。

为此针对第1阶段的复用,大多数软件开发企业会过渡到第2、3阶段的复用层次。通过选择合理的软件构件或者服务,简化系统某些部分的开发难度及工作量。例如,一个软件中需要使用一个天气预报的功能,若软件开发人员还自己去编写天气预报的功能,不仅费时费力而且也不见得准确。在这种情况下,调用一个第三方的天气预报构件或者服务,可快速地完成该功能的搭建。

在进行第2、3阶段的复用之后,框架的复用也就顺理成章了。若一个系统的若干个基本功能可由一套软件框架统一提供,选择相应的软件框架可为软件的快速开发、定制提供良好的支持。例如,开发一个基于JAVA的Web应用,采用Spring+Structs+Hibernate的框架可为用户的数据存储、前后端分离等提供良好的支持,也便于用户快速地扩展相关功能。

现存的这几个复用方式,虽然可以在一定程度上加快软件开发的效率,提升软件质量,但是仍存在着诸多不足之处。例如,基于API的复用层次较低,用户使用API开发应用,着眼点过于细节化,很难对整体软件的架构提出建设性意见。如表1-3所示,举例说明了不同的复用层次。

表1-3 不同复用层次的说明

基于构件或者服务的软件复用,虽然层次相对API有了一定的提升,但是仍对软件架构有直接的帮助。同时,由于构件、服务很难直接与新应用的需求相匹配,复用的场景受到限制,具体体现为构件、服务功能粒度大的难以满足应用细节要求,功能粒度小的则复用层次较低。

基于框架的复用,虽然可提供相应的通用服务,然而应用自身对通用服务的个性化需求,使得通用服务仍需定制。同时,由于基于框架开发,应用的相关特殊流程、交互方式受到框架的约束,应用开发变得束手束脚。

综上所述,现存的软件复用层次与软件体系结构的理想仍有较大的差距,如何缩小差距是当前软件体系结构的重要研究问题及目标,也是读者学习软件体系结构的目标之一。