配置驱动的开发(上)
 

2009-11-13 作者:Steve McDuff 来源:IBM

 

代码重复随时会产生麻烦,有些人可能对代码做了修改,但是忘了将修改应用于重复的源代码。产生的混乱可大可小,但是无论程度如何,重复都是麻烦的来源。在本文中,IBM 开发人员 Steve McDuff 建议使用配置驱动的开发来解决这个问题。

配置驱动的开发和模型驱动的开发之间的差异是,前者并不限制于代码的模型,比如类、字段和关系。配置驱动的开发(Configuration-driven development,CCD)包含应用程序中可以配置的所有内容。例如,如果体系结构指出某些业务规则必须一致地应用于整个应用程序,那么可以使用配置文件来配置和应用这些规则。

在本文中,我将介绍配置驱动的开发,并解释它如何解决代码重复和修改问题。

代码重复和修改

假设您正在开发的应用程序由以下组件组成:

1.一个数据库

2.带 Web 服务 API 的中间件服务器

3.带基于 Web 的用户界面的中间件服务器

4.使用中间件 API 的胖客户机

图 1. 一个简单的参数

在 图 1 中可以看到,一个简单的参数(比如字符串的长度)将会影响所有四个组件。它还会影响下面的用户文档和单元测试领域:

用户文档:

  • 胖客户机
  • 基于 Web 的用户界面
  • Web 服务 API

单元测试领域:

  • 数据库
  • Web 服务 API
  • 基于 Web 的用户界面
  • 胖客户机

图 2 说明了 图 1 所示的简单参数的总体影响。

图 2. 依赖性过多

真是让人吃惊,像字符串长度这么简单的东西竟然不只在四个位置上重复,而是在十个不同的位置出现。字符串长度参数只是一个例子;许多类型的业务规则对于典型的应用程序都有类似的影响。一些规则是几乎任何应用程序中都有的,比如字符串长度和数字的最小/最大值。其他规则专门用来满足特定应用程序的需要。应用程序是否使用签出/签入机制保持一致性?关于信息的这些规则是否从客户机和服务器获得?所有这些因素合在一起,即使是最简单的代码修改也很容易导致大混乱。

传统的解决方案

信息重复不是一个新问题,而且已经有许多工具和技术用来防止这个问题。在本节中,我将讨论对信息重复最常用的一些解决方案。

开发过程

一些开发团队将冗余信息修改纳入严格的开发过程中,以此解决信息重复问题。这个解决方案很繁琐,因为它需要监督和复查,但它是有效的。

设计良好的代码

设计良好的代码再加上对常量的重用,可以减轻代码重复问题。当应用程序的所有部分都用同一种语言编写时,代码驱动解决方案的效果最好。

模型驱动的工具

模型驱动的开发的概念是以配置的形式读取应用程序模型。模型驱动的最大优点是,它们使与对象及其关系相关的繁琐任务自动化。下面是一些流行的模型驱动开发工具:

  • Eclipse Modeling Framework(EMF):它存储类的布局和字段。它为应用程序生成 Java 类、网络接口,甚至还包括数据库映射。通过生成对象,EMF 使编写常用方法的繁琐部分自动化,比如获得器、设置器、相等、复制、克隆、串行化等等。EMF 使用可以存储许多对象定义的配置文件。在多用户环境中,合并这些文件可能导致一些问题。EMF 只能处理应用程序的对象、它们的关系和方法。对于处理定制的业务规则,它没有提供任何帮助。
  • UML2:它通过类关系、字段和逻辑的图表描述和说明应用程序。UML 的优点是它与语言无关。在完成逻辑设计之后,从理论上说,可以用任何语言生成对象。
  • Ruby on Rails:它从数据库模式中提取模型的配置。然后生成处理业务逻辑、基于 Web 的用户界面和单元测试所需的构架。生产效率的提高主要是由于数据库模式的修改会在代码中传播。

CDD 是如何工作的

我已经描述了配置驱动开发的基础。为了更好地理解它是如何工作的,我们来考虑一个来自真实世界的示例。在本节中,我将描述我的团队在开发 Rational Portfolio Manager 中采用的配置驱动开发解决方案。

在 XML 文件中存储配置

在配置驱动的开发中,开发人员主要在 XML 文件中进行所有修改。与应用程序相关的所有其他文件都从这些文件中读取它们的配置,要么是在运行时读取配置,要么是在构建时生成选择的组件。在 Rational Portfolio Manager 项目中,我们在配置文件中存储以下组件和信息:

应用程序对象

  • 它们的关系
  • 它们的文档
  • 它们的验证规则
  • 它们在签入/签出机制中的行为
  • 它们在应用程序安全框架中的限制
  • 它们的数据库映射
  • 它们在可视布局中的位置

错误代码

  • 它们的惟一标识符
  • 它们的文档
  • 它们在运行时生成的消息
  • 它们使用的参数

Web 服务接口定义

  • 暴露的方法
  • 文档
  • 它们使用验证规则时用到的参数
  • 它们在应用程序安全框架中的限制

图 3 显示典型的配置驱动构建过程。

图 3. 配置驱动构建过程示例

所需的工具

下面的工具对于配置驱动的开发很重要:

编辑工具

在大多数情况下,简单的文本编辑器对于编辑 XML 文件已经足够了。优秀的 XML 编辑器会在修改文件时检验语法的有效性,并简化 XML 标记的编辑。

读取工具

为了从 XML 文件中获得信息,需要利用某种工具将 XML 文件直接装载到应用程序中。例如,可以使用 Java 库 Betwixt 将 XML 配置的上下文填充到 Java 文件。

用来生成工件的工具

在读取配置文件之后,下一个逻辑步骤是让产品的其他部分利用这些配置信息。这时有几种方法。第一种是将配置文件嵌入软件本身,这样就可以在运行时读取它们。另一个方式是使用工具(比如 Apache Commons 的 Java Velocity 引擎)生成代码和文档。

规则

大多数应用程序开发人员熟悉以下规则,但是与 Java 开发或极限编程中的做法相比,在配置驱动的开发中它们的应用方式有所不同。

1. 保持简单

配置文件必须容易理解和改进。尽管这似乎是理所当然的,但是有经验的 XML 用户常常使用不利于 CDD 方式的高级特性,比如那些使 XML 难以读取和理解的语法。

2. 根据需要进行改进

预定义的 XML 布局不会满足每个开发人员的需要。对这个问题的解决方案是,让 XML 布局能够适应需求。根据领域或软件体系结构的不同,类或字段定义中使用的 XML 属性有很大的差异。请记住,改进应该避免用户破坏 “保持简单” 规则。在上面的示例中,很容易发现许多配置参数在几乎所有其他产品中都没有用。市场上还没有工具能够简化它们的实现。

3. 尽早且经常进行验证

常识指出,在开发过程中越早发现错误,就越容易解决。根据这条原则,尽可能早些对配置进行详尽验证是有意义的。例如,可以使用 XSD 或 DTD 文件验证配置文件的 XML 结构。如果需要应用定制的验证规则,那么要毫不犹豫地实现自己的验证工具。尽管编写这些工具花费的时间并不是花费在最终产品的时间,但是这种投资是值得的。


火龙果软件/UML软件工程组织致力于提高您的软件工程实践能力,我们不断地吸取业界的宝贵经验,向您提供经过数百家企业验证的有效的工程技术实践经验,同时关注最新的理论进展,帮助您“领跑您所在行业的软件世界”。
资源网站: UML软件工程组织