Chinaunix首页 | 论坛 | 博客
  • 博客访问: 959386
  • 博文数量: 134
  • 博客积分: 7443
  • 博客等级: 少将
  • 技术积分: 1411
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-10 20:18
文章分类

全部博文(134)

文章存档

2012年(7)

2011年(29)

2010年(16)

2009年(6)

2008年(18)

2007年(58)

分类:

2007-02-10 20:37:37

mini-language方法,在UNIX领域流传很久。但没有进入软件设计方法的课程。 在这个“面向对象”的时代,有许多这种传统的好的设计方法被忽视了。

在《The Art of Unix Programming》中,整个的第8章和《The Pragmatic Programmer》的第12节都对这个方法进行了介绍。

DB2DB 是我开发的一个程序。完成数据库之间数据的传输。用户在配置文件中指定源数据库和目标数据库;指定读取数据的SQL语句和插入数据的SQL语句。 DB2DB在源数据库中读取数据,并对返回的每一条数据,在目标数据库中执行插入数据的SQL。因为DB2DB通用性好,被广泛的应用的公司的项目中。这个程序的设计,正是使用了mini-language的方法。

要设计通用的程序,关键之一是程序的可配置性,就把选择权交给用户,用户通过配置程序决定程序的行为。考虑一个极端的情况,一个很复杂的应用,用户可能使用一种语言来配置程序的逻辑,程序通过对配置文件解释执行,完成用户希望的功能。使用这种极端的方式思考,甚至可以把编程也看成写配置文件,比如:把SHELL脚本看成配置文件,SHELL解释程序通过对配置文件的解析和执行,完成开发人员设计的动作。

当然,大多情况下,没有必要设计一种完整意义的编程语言。这种起配置作用的不完整语言,称为“mini- language”。像/etc/passwd这样的文件使用的格式,就可以看成简单的“mini-language”设计;而像awk脚本这样的语言,可以看成一个复杂的“mini-language”,复杂到几乎和一个编程语言相当。在实际中使用mini-language方法,会设计一种针对特定问题领域的,简单的专用的语言。使用这种语言表达程序需要的信息,把最容易变动的逻辑使用这种语言描述,保证了程序通用性。

首先要确定使用 mini-language要描述什么信息?描述这些信息需要使用到哪些概念?选择的概念应该尽量接近问题领域,语言尽量保持简单,也要考虑容易实现。比如DB2DB的变量定义文件,要表达的信息:把源数据库哪些表的数据导入到目标数据库的哪些表。我使用了普遍熟悉的SQL的概念,来设计它的语言,方便配置也方便实现(把SQL的解析和执行工作都交给数据库)。

可以考虑下面的思路:程序代码要实现的是一个引擎,这个引擎实现几个基本的原操作。使用“mini-language”定义一个原操作的序列。程序通过解释mini-language的代码,完成操作序列,完成程序功能。比如在 DB2DB中的几个原操作,获取当前时间;通过指定SQL计算需要信息;通过指定SQL读数据;通过指定SQL把读取的数据插入等等。

如果把mini-language的配置看成是元数据。这种设计方法实际上是,抽象一个合理的模型,在代码中实现,而把具体的细节放到元数据中。其思想是:把知识放到要处理的数据或配置中,程序的逻辑保持简单,简单逻辑的程序更容易实现,也更可靠。

要设计好的mini-language, 要懂一些编译原理的基本知识。还可以使用Lex,Yacc,javaCC等工具自动生成解析的代码,当然如果语言很简单,就没有必要使用这些工具,只需要懂得一些编译原理中介绍得算法,自己实现解析代码很容易。

2007-6-14 update :

最近在公司一个大项目中, 我经过努力说服他人,全面使用了这种方法. 实现了数据处理的高度可配置性. 比较成功.开发语言是JAVA, 使用了JAVACC生成的代码解析配置的转换表达式.和以前使用方式有所不同的是: 表达式解析,配置加载后,即生成用来转换数据的对象结构(相当与编译生成了执行代码),可反复使用这个对象结构进行计算.实现了一次解析,多次计算(和传统的边解析边计算的方式不同).执行效率有很大的提高.


 

阅读(2107) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~