一个具体项目的重构(三)完结篇

通讯插件系统


通讯系统的设计要求是什么呢?就是可以支持所有的现有机型(实际上做的时候,一些早已退出市场机型并没有做。),也支持将来的新机型。

这里就涉及到两个比较复杂的问题,就是不同的机型有着不同的底层通讯协议,还有着不同的操作流程(比如上传文件和数据的时候,是PC机选择还是在电子词典上面选择等等。)。

底层通讯协议就是说串口还是USB,怎么握手,怎么传输。

操作流程,简单地说我们分为两种模式:

模式1:连接的时候,PC机可以要求电子词典提供文件列表,在PC机上面指定需要上传什么文件。一次握手可以传输多个文件。

模式2:PC机不能得到电子词典的文件列表,所以上传的时候必须在电子词典上选择要传输什么文件。一次握手只能传输一个文件。

这两种模式带来的实际问题是他们在传输中需要的界面也完全不同,所以问题变得很麻烦。

最后我的解决方案是三层的结构。


  1. 插件管理系统,它给主EXE提供抽象的传输接口,服务性的接口包括枚举机型列表,设定通讯参数等,功能性的接口包括上传文件/数据库,下载文件/数据库,升级。这些接口的具体实现是它调用不同的传输插件和界面插件实现的。

  2. 界面插件,它实现了和插件管理系统的功能性接口同名的所有接口,或者说在功能方面它直接给插件管理系统服务。而它的接口的实现是通过调用某个特定的传输插件完成的。

  3. 传输插件,它提供了比较底层也是比较实质的传输接口(这些接口直接为界面插件服务),另外还包括了一些注册自己所需要的接口(直接为插件管理系统服务)。


这三层结构大致如图所示:

通讯插件系统示意图

这张图不能完全表示出来这个结构的思路。

我们这里通过实际工作中的两种不同的流程来介绍。


  1. 动态注册流程,每次通讯插件管理系统启动动态的提取所有通讯插件的信息注册在一个内存结构体内。具体实现方式是,每次通讯插件管理系统启动分配一个足够大的内存区域,然后在传输插件目录枚举所有的DLL,并对每个DLL调用我们定义的标准接口GetInfo,得到DLL支持的机型,以及它所需的UI类型。如果DLL没有这个标准接口,则认为它不是我们的标准通讯插件。注意,这里我们并没有枚举界面插件。原因在于,不同的通讯插件可能对应同一个界面插件,也就是说他们是多对一的关系。而且,如果存在一个流程类型(一个流程类型对应一个界面插件,一个界面插件实际上就是实现一种传输流程。),但是没有对应的机型和它对应,那么它实际是不会被使用的。或者说,我们只给用户选择机型的界面,没有选择界面插件的界面,因为机型确定了,所需要的界面类型也就确定了。或者说界面类型是用户完全不需要关心。这个流程在图中用蓝色线表示。

  2. 传输流程。每次用户点击上传功能,或者下载功能。插件管理系统首先查看当前机型是什么。如果没有设定当前机型,就提醒用户来设定。得到了当前设定的机型后,就在注册信息表(我们的内存结构)里面,寻找这个机型需要的界面插件信息,找到后调用这个界面插件,并把当前机型的传输界面的名字作为一个参数。这个过程用红色线表示。


在动态注册流程,三层的关系是插件管理系统->传输插件->界面插件(没有实际调用界面插件)。在传输流程中,三层关系是插件管理系统->界面插件->传输插件。

我负责编写的是,插件管理系统(dll),模式1的界面插件(dll),模式2的界面插件(dll),还有一个用来调试的工具。限于篇幅和公司利益问题,这里我不可能把具体的接口公布出来。我要说的是界面插件真难写,麻烦死了。幸好在后面的维护工作中我发现,虽然我们的插件系统设计为可以支持任意多种的界面模式,实际上,我们所有的自主产品和外包产品都可以在这两个模式其中一直之下很好的工作。

新的工作方式


这个项目已经完成了快半年了,这半年来我们工作方式因为这个项目的成功也发生了改变。现在一旦出新产品,我们就负责培训产品项目组的工程师如果按照我们的接口方式来编写传输插件。这对我们对他们都并不困难,因为实际上我们的传输插件接口模式,就是对一般的很普遍的上传下载进行封装。多个产品在这个期间推出,可以负责任的说,因为这样的新模式,我们花在联机软件上面时间和精力都变得很少,而且系统也很少出现Bug。特别是对于外包产品,外包公司不需要自己写一个联机软件,只需要把他们的底层传输协议用我们的DLL接口来封装一下。我们也很方便,节省了很多沟通需要的时间和成本。而且也避免了其它部分重要代码的外流(在这个模式下,外包公司甚至不需要知道我们上层的软件是怎么样的。当然为了调试方便,当然会告诉他们我们的系统的运作方式)。

这个项目中还有很多值得总结的东西,但是可能和我主要想谈的系统结构,系统的模块划分粒度问题,用层次来解决统一接口和特定实现的问题,关系不是很大,所以这里不提了。项目中也有些遗憾,我在内存分配,版本控制(插件的),等方面还有很多设计不合理的地方。这是经验和能力的问题,也是对系统理解能力的问题。

::...
免责声明:
当前网页内容, 由 大妈 ZoomQuiet 使用工具: ScrapBook :: Firefox Extension 人工从互联网中收集并分享;
内容版权归原作者所有;
本人对内容的有效性/合法性不承担任何强制性责任.
若有不妥, 欢迎评注提醒:

或是邮件反馈可也:
askdama[AT]googlegroups.com


点击注册~> 获得 100$ 体验券: DigitalOcean Referral Badge

订阅 substack 体验古早写作:


关注公众号, 持续获得相关各种嗯哼:
zoomquiet


自怼圈/年度番新

DU22.4
关于 ~ DebugUself with DAMA ;-)
粤ICP备18025058号-1
公安备案号: 44049002000656 ...::