Delphi 开发中几种代码复用方式及其比较
我们在软件开发中,经常会碰到多处代码相同或相似的地方,如何处理这种情况,不仅对个人,而且 对于一个团队,是一个重要的问题。代码复用的作用也不仅是使得代码编写简单、减少
工作量。本文只讨 论在一个只使用 delphi 作为开发工具的团队如何有效的进行代码复用,如何在开发进度、软件维护之间取 得平衡。这里以作者领导的一次开发作为例子。 最原始的办法,复制、粘贴,不同的地方稍作修改。恐怕每个人都曾经使用过这种方法。这无疑在写 程序时是最快的方法。不过,其缺点也是明显的,别的不说,这种方式阻碍了人的思考,功能确实完成了, 但是错过了自己提升自己的机会。表面看是节约了时间,实际是浪费了自己。我当年使用这种方法时,总 觉得自己更象一个泥瓦匠。 谁都会对这种方式说"不"吗?问题在于我在实践中发现,更多的程序员倾向于这样编程。我不得不强 制执行一些看起来是微不足道甚至是不完全正确的的细节标准,例如:所有的 SQL 语句必须在 DataModal 中。大多数程序员反对这一条,反对的理由有很多种,有些不乏道理。不过更多的是程序员感觉这样编程 变得繁琐,感到受到了约束。他们反问在 Form 中直接写 sql 语句多好,又容易看懂,不需要看程序时跳来 跳去的。我只好打开他们曾经完成的系统,使用 Find in File 功能,
搜索结果表明同样的
sql 语句出现了若 干次。如果不有效的解决这个问题,我实在难以想象如何向程序员灌输如同业务逻辑和界面逻辑分开的概 念。好在有些程序员开始考虑这个
问题,他向我提出这样的
方案:把所有的 sql 语句写在单独 unit 中,供 所有的 unit 调用。虽然我知道,这样做只是为了复用而复用,但是我仍然鼓励这种做法,因为能复用总比 不能复用强,半块面包总强于没有面包。 使用函数。我发现这是大多数程序员喜欢使用的方法。从面向过程的程序来说,函数调用几乎是唯一 的代码复用方法了。在开发组讨论的过程中,
程序员们也最喜欢使用这种方式作为系统之间的接口。这次 开发中终于把权限、流程和打印系统单独分裂出来,由单独的程序员开发,提供给其他系统调用。如何调 用?程序员首先想到的就是函数调用。确实函数调用也解决了不少的问题。 随着程序不断的开发,系统的复杂度也在不断增加,这时候以函数作为接口的方式也显得越来越复杂。 以一个简单的例子而言,权限系统处理操作员管理、系统登陆验证等功能,所以系统都需要当前登陆操作 员的信息。开始是想的比较简单,只要知道登陆操作员的 id,那
么其他相关信息都可以通过权限系统不同 的引出函数来
查询,但考虑到操作员信息的通用性,而且为其提供若干个引出函数就显得过于繁琐。我们 设计了一个操作员类,每个系统都有其接口声明,而具体实现在权限系统中。在系统中增加一个全局操作 员对象,这个对象在
系统登陆时创建,记录了
登陆操作员的所有信息。其他系统只要访问这个全局对象就 能得到登陆操作员的信息,包括其所属部门,登陆时间等等。这样做的好处有: (1)隐藏了实现的细节,不仅隐藏了数据库
设计,也隐藏了代码实现的细节。例如后来由于种种原因, 操作员的表结构发生了变化,而其他系统对此可以一无所知。后来权限系统也重写了读取权限部分,同样, 其他系统也一无所知,只是感觉速度变快了。 (2)模块之间是松耦合。 (3)提高程序员的水平。
最后一点恐怕有人怀疑,我要更多的解释。在讨论如何得到当前登陆操作员信息时,开始甚至有程序 员提出这样的方法:设置全局变量操作员编号变量,让其他系统利用这个 id 直接读数据库中得到信息的。 代码复用还有应该重要的方面是界面的复用。一次开发中必然会有部门界面使