关于渐进式构建可复用构件库的一些想法
前言:软件设计是一个反复的迭代过程,在当前还看不到“银弹”希望的条件下,如何面对复杂可变的现实环境?如何构建可维护、可扩展、可复用的软件系统?如何降低开发成本、缩短开发周期?就这一问题,本文初步地提出自己的一些想法,与大家一起讨论。
一、公司当前软件开发现状分析:
(1). 软件的可维护性不强。频繁的软件升级,要追踪软件的演化变得十分困难,使得软件难以修改;没有维护文档说明,通常需要在一大堆乱如麻的程序中修改某一段代码;深刻理解原开发人员的编程思想相当困难,致使修改产生的Bug有可能延迟发现。
(2). 以往的软件开发过程,每个项目都是从头做起,不同项目之间的共享部分甚微,复用方面至多是每个开发者复用自己的积蓄,表现形式体现在源代码的复制与粘贴。
(3). 以往的技术与方法不能很好地满足复用的需要,其表现在:
1. 当前的体系结构设计不能满足软件扩展与可复用的要求。伸缩性较差,模块与模块之间耦合性太强,不能很好地在其基础上进行扩展;
2. 缺乏界定“复用”的机制。即没有明确地界定出潜在复用的部分,我们不知道哪些部分可以被复用,或可被可复用构件所替代。
3. 缺乏制作可复用构件的方法。这反映在许多方面,例如,缺乏有效方法进行构件库系统的设计和实现;不能有效地挑选出可复用构件并对之进行强化。
二、为什么要实施软件复用?
“软件危机”的提出使得人们开始对软件及其特性进行更深一步研究,概括地来讲就是解决这两个方面的内容:如何开发软件,怎样满足对软件日益增长的需求;如何维护数量不断膨胀的已有软件。
成功的IT公司资料表明,在应对软件日益增长的需求及维护数量不断膨胀的已有软件这两个方面,实施软件复用可以使得企业在及时满足市场,提高软件质量,降低开发费用和维护费用等方面,取得显著改进。
实施软件复用(Software reuse)的目的,是使软件开发工作进行得更快、更好、更省。“更快”是指及时提供软件产品而市场竞争中赛过竞争对手;“更好”是指软件产品具有更可靠的质量;“更省”是指软件开发和维护成本更低。
换句话说,实施复用的目的是快速、可靠、低成本地完成客户合同。具体说,实施复用是将冗余工作减到极小;并提高工作结果的可靠性;从而大幅度缩短软件开发周期(从数年减到数月,从数月送到数周)。
三、实施软件复用的技术
利用可复用的软件成分来开发软件的技术称为软件复用技术。软件复用技术主要有3种:
(1) 软件构件技术
按照一定的规则将可再用的软件成分组合在一起,构成软件系统或新的可再用的软件成分。这种技术的特点是使可再用的软件成分在整个组合过程中保持不变。
(2) 软件生成技术
根据形式化的软件功能描述,在已有的可再用的软件成分基础上,生成功能相似的软件成分或软件系统。使用这种技术需要可再用软件库和知识库的支持,其中知识库用来存储软件生成机理和规则。
(3) 面向对象的程序设计技术
传统的面向数据和面向过程的软件设计方法,把数据和过程作为相互独立的实体,数据用于表达实际问题中的信息,程序用于处理这些数据。程序员在编写程序时必须时刻考虑所要处理的数据格式,对于不同的数据格式要做同样的处理或者对于相同的数据格式要做不同的处理都必须编写不同的程序。由于,传统的软件设计方法忽略了数据和程序之间的内在联系,因此,可再用的软件成分比较少。
四、构建“构件库”的两种体系架构模型
(1)分层式体系结构
粗略地说,所谓分层式体系结构(Layered architecture),是按层组织软件的一种软件体系结构,其中每层的软件建立在低一层的软件层上。位于同一层上的诸多软件系统或子系统,具有同等的通用度,低层的软件比高层的软件更具通用性。
比较典型的4层次分层体系结构,如下图:
(2)插件式框架体系架构
应用程序由应用程序框架、插件接口、插件和公共函数库四部分组成。基本上可以用下图表示:
应用程序框架负责应用程序的整体运作,它清楚程序整个流程,但并不知道每个过程具体要做什么。它在适当的时候调用一些插件,来完成真正的功能。
插件接口是一个协议,可能用IDL描述,可能是头文件,也可能一段文字说明。插件按照这个协议实现出来,就可以加入到应用程序中来。当然,对于复杂的系统,插件接口可能有多个,各自具有独立的功能。
插件是完成实际功能的实体,实现了要求的插件接口。尽管实现什么以及怎么实现,完全是插件自己的自由。在实际情况来,一般还是有些限制,因为插件接口本身可能就是一个限制。如,实现编译功能的插件,自然不能实现成一个聊天功能的插件。
公共函数库是一组函数或者类,应用程序框架和插件都可以调用。它通常是一个独立的动态库(DLL)。应用程序框架本身是公用的,是代码复用的一种方式。但并不是所有可复用代码都可以放在框架中,特别是插件会用到的公共代码,那会造成插件对框架的依赖。把这些公共代码提取到一个独立的库中,是一种好的方法。
基于插件式框架设计的好处:其把扩展功能从框架中剥离了出来,降低了框架的复杂度,让框架更容易实现。扩展功能与框架以一种很松的方式耦合,两者在保持接口不变的情况下,可以独立变化和发布。公开插件接口,让第三方有机会扩展应用程序的功能。
五、渐进式构建“构建库”
渐进复用的实践经验告诉我们,构建可重用“构建库”不是一蹴而就的事情,不是在原有系统进行一次或是几次重构就能一劳永逸的事情。主要有两方面的原因:第一、体系结构应当是稳步变革,一般需要2~3轮迭代;其次,组织结构的变革不能靠一次大跳跃就完成,而应该逐步地边学习边变革。
构建计划:
A、初步构建目标:
1. 初步理解应用目标,重点关注体系结构。
2. 初步的市场分析,了解当前市场主流开发技术及竞争对象正在研发的项目;
3. 目标业务模型,其重点在于理解应当开发出什么样的应用系统和什么样的构件系统,作为第一批产品推出。
4. 复用业务的高层设想(即概要式设想);
5. 建立构建团队,物色合适的构建人员,参与构建工作。最好先从一支核心团队开始(2-3人),然后逐步扩大队伍和范围。
B、第二步构建目标:
1. 建立体系结构,重点在于设计好接口界面和门面;
2. 复用业务的进一步建模;
3. 进一步的市场需求分析;
4. 建立合适的团队,开始实施构建工作;
结尾
本文从公司当前软件开发现状出发,阐述了为什么要实施软件复用,以及实施软件复用的技术及常用的两种体系结构,再到第五部分如何渐进式构建构建可复用构件库,初步地提出了自己的想法,当然很多地方还有待进一步商榷与讨论,不当之处,请指正。谢谢!
参考资料:
1、《软件工程》
2、《系统分析师教程》
3、网上的相关资料