基于动态链接库的复杂信息系统分层框架设计[摘]

摘  要  使用动态链接库集来设计开发复杂信息系统,大大缓解了信息系统开发的难度,实现了代码复用,提高了系统开发的效率和准确性,充分发挥了动态链接库的优势。将信息系统按照一定方式,层次划分、构造分层框架,然后将每层的各个模块封装入库,使整个系统低耦合、可插拔、层次结构清晰,而且可以大大降低开发复杂度。

1 引言

    通常,信息系统结构庞大,功能模块较多,消息处理复杂,多使用数据库、共享内存等手段共享数据。开发大型复杂的信息系统周期长,人力资源需求较大,而且还有一个最大的特点是系统升级频繁。因为这样的系统涵盖范围广,牵扯的功能比较多,需求更新比较快,所以改动和更新难免发生在开发过程的每个阶段。对于一个庞大的系统,哪怕一个小小的改动也需消耗大量的资源,比如必须重新进行文档的更新和各阶段测试等等。
    在动态链接库技术出现之前,这个问题更加突出,仅是简单修改一个模块的程序也会涉及与之相关的所有模块的测试,消耗大量的人力物力资源,使开发效率非常低下。动态链接库技术的出现大大缓解了这个问题。
    一般情况下,人们应用动态链接库实现工程底层接口的共享和一致性,而很少将动态链接库技术应用在软件上层模块,比如界面或中间层模块。本文尝试用动态链接库技术设计实现结构庞大的复杂信息系统整体框架。

2 动态链接库的特点

    动态链接库(Dynamic Link Library,DLL )是一种建立在客户/服务器通信概念之上、包含单个或多个输出函数、用于完成某种功能的可执行的二进制代码库文件。该文件可以在使用它的客户程序运行时被动态装入和链接。DLL可以被一个或多个客户程序调用,这些客户程序可以是应用程序或者是其它的DLL[1]
    动态链接库的优点[2]
    (1) 封装实现。DLL可以用不同的编程语言进行开发,并由不同的编程语言进行调用,只要DLL的接口确定,内部实现可以独立设计完成。
    (2) 动态加载。相对动态链接库来说,静态链接库需要在应用程序编译链接时,将链接库的代码编入应用程序的执行代码中,随应用程序初始化加载代码时一同加载。而对于动态链接库,应用程序可以在运行时确定需要执行什么操作,然后装入相应的函数即可,而不需要将全部函数加入。
    (3) 节省内存。如果两个或多个应用程序需要使用同一个DLL,那么该DLL只要被放入内存一次,所有的应用程序都可以共享它。DLL可以同时被多个进程调用,不过各调用进程只拥有独立的DLL数据块(包括静态变量和全局变量),而共享着物理内存中独一无二的执行代码块。
    (4) 资源共享。DLL可以包含对话框模板、字符串、图标和位图等资源,多个应用程序能够使用DLL来共享这些资源。
    (5) 便于升级。如果动态链接库程序需要升级,只要不改动接口,可以随意改动,其调用程序不需要做任何改用,大大降低工程的复杂度,促进分工合作,提高开发效率。
    (6) 便于维护。动态链接库功能独立,即使数据众多也能很方便的进行管理。

3 信息系统的特点

    信息系统通常以解决一种或几种特定的任务为目标。根据不同任务需要,开发特定的信息系统,比如信息分发系统,信息融合系统,任务解算系统等。这些系统具有如下特点:
    1)功能模块多
    一个大型的信息系统通常包括多个分系统或子系统,功能模块较多。每个模块完成一项子任务或者一次任务解算。模块之间存在数据共享、调用、协调等关系。
    2)数据复杂
    信息系统中包含大量数据,包括模块内部数据,模块间传输的数据,分系统之间共同关心的数据等。这些数据的存储、共享、传递给系统设计增加了难度。如何节省内存、共享资源、简化交互是相当关键的设计需求。
    3)内部关系复杂
    信息系统中,各模块相互配合,共同完成任务目标,不可避免相互通信,交换数据,形成复杂的数据流和调用关系网。
    4)开发维护费用高
    信息系统需要综合处理大量数据业务,用户多,工作量大,因此结构庞大,开发起来需要投入大量资源和时间,系统维护成本也相当大。
    5)系统升级比较频繁
    由于信息系统涵盖范围广,各个模块的变化和更新都可能带来系统的整体更新,随着性能和功能需求的增长,系统需要不断更新。系统升级是开发设计中必须要考虑的问题。
    6)系统运行效率要求较高
    信息系统往往解决实时问题,要求反应速度快,计算准确,所以对于存储效率、传输效率、计算效率都有相当高的要求。
    7)界面操作较多
    信息系统的操作用户需要使用界面发送控制命令,通过表单窗口等查看执行结果和系统数据。
所以界面开发量比较大,而且对于使用方便性有很高要求。
结合动态链接库和信息系统的特点,可以发现,动态链接库的各种优点恰恰能解决复杂信息系统开发所面临的问题。如图1所示。
图1 动态链接库与信息系统特点对应关系图

4 分层构建复杂信息系统

    对于结构复杂、功能较多的信息系统,根据功能划分,可以将系统划分为多个模块,每个模块完成特定的子任务,然后再由各个模块得到的结果来计算完成整个信息系统的任务目标。这样做可以使每个模块相互独立,分解了信息系统的复杂度。但是,仅仅这样做是不够的。
    在开发实践中可以发现,有些模块使用相同的数据来完成各自的程序计算,如果每个模块都开辟内存来保存几乎相似的数据,不仅造成系统资源的大大浪费,还使系统存在数据不一致的风险。再者,对于相似的操作,开发多组功能相似的函数显然浪费了宝贵的资源,维护起来也相当困难。
    分层构建信息系统可以有效解决上述遇到的问题。首先,分析需求,根据业务种类,将整个信息系统分解为几个较大的功能模块,使每个模块完成独立的子任务;其次,分析每个模块,按照具体的处理顺序将模块由上到下划分为界面处理、业务处理、数据库操作等性质不同的层次;再次,分析各个模块各个层次的相同点和不同点,比如是否有相同的数据对象,是否调用相同的函数功能,重新优化分割;最后,归纳总结出信息系统应该由哪几层构成,每层应该有哪些功能模块,上下层之间的调用关系。按照这个顺序设计出分层结构的信息系统框架。如图2所示。
图2  信息系统分层结构图
    根据需要,每层还可以划分为多个功能实现层。比如界面层可以分为主显示层和显示模块层。如图3所示。
图3  界面分层结构图
    同样,将某一业务处理划分为多个独立的子处理过程。如图4所示。
图4  业务处理分层结构图

5 动态链接库解决各层程序的封装问题

    对于数据处理层和一般业务处理层的程序,很容易实现代码封装,将各个独立的功能模块封装入动态链接库,为上层程序提供一组特定的接口函数,当需要调用该模块功能时,加载该动态链接库或者在调用进程启动时就将动态链接库加载入内存。
    如果将界面程序也封装入动态链接库中,则更能提高系统的模块化水平,使模块之间的耦合度降低,从而提高软件的可读性和复用性。
    每个业务模块可分为界面部分、业务处理部分、数据处理部分,将三部分的程序分别封装入动态链接库中,使界面、业务处理、数据处理相分离。一般情况下,一个界面库对应一个业务处理库,一个业务处理库对应一个数据处理库,根据特殊情况一个界面库也可以对应两个以上的处理库,一个业务处理库也可以对应两个以上数据处理库。上层的动态链接库可以交叉调用下层的动态链接库,这种方式是动态链接库提供数据共享和代码共享的最突出体现。
    信息系统中,最关键的部分是业务处理部分。业务处理有多种方式,大致分为以下几种情况:
    1)数据库访问
    功能复杂的信息系统中必然需要存放大量的任务数据,建立合理的数据库可以高效的存取这些数据。上层程序通过数据库接口调用数据库,进行添加、读取、修改、删除操作,将这些数据库操作封装入动态链接库可以保证数据库操作的独立性,减少系统的复杂性。另外,信息系统中的数据具有非常重要的共享性需求,所以创建数据处理动态链接库时,应特别考虑数据共享问题,通常采用映射共享内存的方法,使每个访问数据的程序得到共享内存的地址。
    2)网络通信
    复杂信息系统往往包含多个分系统,这些分系统之间靠以太网进行连接。一方面每个分系统需要开发大量的通信代码;另一方面,各个分系统之间要保持时间的一致性。所以将通信和对时部分的代码封装入动态链接库中,不仅有助于代码共享和复用,而且能够保证各个分系统之间消息的时间一致性。
    3)一般应用处理
    信息系统根据用途不同分多种多样,有综合信息系统,也有专业信息系统。为了解决特定复杂问题,开发人员会专门开发一些专用的代码,比如解决坐标转换的函数集,或者图形专用函数集等。如果将这些函数集分别封装入相应的动态链接库,则可以使开发和调用都比较方便。第一,可以促使开发人员成立专门的专题研究以保证函数功能的正确性;第二,可以使整个开发过程更加清晰可控。
    4)以上几种情况的组合
    有些业务处理需要调用各种功能,比如接收消息后进行数据处理,这时该业务处理模块就需要既调用通信功能又调用数据处理功能。这种情况更加体现动态链接库的灵活性,不用重新编写代码,只需调用通信库和数据处理库中的函数即可。
    综上所述,设计整个信息系统框架,如图5所示。

图5 基于动态链接库的信息系统框架图

 

6 动态链接库的维护

使用动态链接库设计复杂信息系统,可以促进开发公司和人员的分工合作,提高开发效率。但是有个问题需要注意,就是大量动态链接库的维护问题。如何保证可读性、互斥性、版本的可控性等是至关重要的。这些维护开销都需要考虑到系统开发过程中。

    1) 可读性
    制定统一的命名规则,使每一个动态链接库都有唯一的标识,命名时尽量选用能说明该动态链接库主要用途的词汇。
    2) 互斥性
    应该尽量保证各个动态链接库的功能没有交叉,即库功能的原子性,这样可以避免上层程序使用时不够明确,带来维护上的困难。另外如果功能交叉,会存在相同功能代码的不一致性问题。比如,两个库函数有相似功能的函数,一方面很难确定哪一个库函数功能更完备,另一方面很难确定升级时应该使用哪个库作为升级对象。
    3) 版本可控性
    严格管理各个动态链接库的版本。按照设计,动态链接库的数量将非常庞大,明确每个动态链接库的版本是非常困难的,尤其是在升级不受限制的情况下。所以应该配置相应的数据库,以精确管理动态链接库的各种版本状态,以保证信息系统中各个模块功能的正确性。

7 总结

    将复杂信息系统分层设计有利于分解任务,降低整个系统的复杂度,提高资源的利用率。使用动态链接库封装信息系统各层各模块功能,有助于数据共享,代码共享,提高了系统的运行效率,增强了系统性能。而且,各个动态链接库可独立开发,有效促进了分工合作,大大提高了信息系统开发的效率和准确性。总之,基于动态链接设计开发复杂信息系统,充分发挥了动态链接库的优势。即便如此,对于大型的复杂信息系统的开发,应用这种方式还需做更多的实践尝试,以求更好的完成任务目标。
You Might Also Like
发表评论