插件式开发体会:

自开始写【大话QT】系列就开始接触渲染客户端的开发,说是开发不如更多的说是维护以及重构,在接手这块的东西之前自己还有点犹豫,因为之前我一直认为客户端嘛,没什么技术含量,总是想做比较有挑战性的,为了这周总还专门找我谈了谈,算是“安抚”民心吧。正式谈话过后,我才决定接手渲染客户端的开发。

渲染客户端的所有构成均是采用开源框架拼凑起来的整体,细分它的组成大致包含以下开源模块,简单描述:

1> CTKPlugin插件系统框架。负责整个项目的架构,决定了项目采用插件形式开发维护。

2> Google protocol buffer。负责定义项目的通信协议,它是google内部使用的协议架构,最大的优点是:实现高效,向下兼容的通信协议。

3> Zeromq框架:负责项目中的网络通信,用于高性能网络编程。

4> 日志系统。负责项目中所有日志的输出。

其中,最为关键的就是CTKPlugin插件系统,它决定了项目的整体架构——采用插件式开发。经过这么多天的维护开发也深深的感受到这种插件式开发的方式带来的好处。以前,总是从课本上读到所谓的理想的“热插拔”式的插件开发,而我总是不以为然,我的意识里一个项目的开发多多少少都是臃肿的,在使用了这种插件式的开发方式后,突然感觉软件的开发、维护、升级变得很容易,下面说一下我体会到的几点好处:

1. 开发工作由之前的人等人变为并行开发。项目中插件系统分为两大部分:基础插件与应用插件,基础插件即通用插件,在其它插件系统中都要使用到的,比如:日志插件在每个其它插件中都会被使用;而应用插件之间则是相互独立的,比如:登录插件、文件管理插件等。基础插件一般是一些开源库,只需要我们编译出来使用即可,基本不需要我们自行开发;而应用插件功能的独立性决定了它们之间不会相互调用(业务整合插件除外),这样多个人员就可以独立开发,每个人负责一个独立的插件,项目进度会大大加快、周期缩短。

2. 测试案例容易编写,插件功能很方便得到验证。在一个插件的初始版本完成后,可以很方便的编写测试用例,来验证插件提供的功能性。由于插件系统最终提供的是动态链接库dll(windows下),而测试用例则可以建立为应用工程或界面工程,提供程序入口,加载调用插件中提供的方法。而且,测试用例可以保存在项目中(不会最终发布,最终发布的是插件的dll),如果将来插件使用出现问题,或者需要添加其它功能,或者升级均可以利用测试案例重新快速测试验证。

3. 系统业务逻辑变得异常清晰。如果项目不采用插件方式开发,每个功能均会杂糅在一起,无论是开发人员或者将来加入到项目开发的人都无法很快的了解业务流程,在分析这个功能的时候又涉及到那个功能。而采用插件式开发方式则每个业务逻辑很清晰明了,如果将来要调试3dmax的渲染模块,那么只需要阅读3dmax渲染插件就可以了,而且结合测试案例,很容易就可以上手。

上面就是这段时间以来针对项目采用插件系统开发的几点体会。

CTKPlugin插件系统介绍:

在CTKPlugin插件系统中要清晰地理解一个概念:插件是以服务的方式提供功能。每一个插件都有它的生命周期,在插件初始化的时候它会将自己的唯一实例注册到插件系统中作为服务提供,即上图中的register阶段。而当另一个插件需要使用到该插件提供的服务的时候就需要通过getService的方式获取。下面通过代码简单说明一下一个插件是如何想CTKPlugin系统中注册服务以及其它插件是如何使用该服务的:

1.  插件服务注册

每一个插件的实现都必须实现一个插件的声明周期类,它继承自CTKPlugin中的ctkPluginActivator,在ctkPluginActivator中定义了start与stop虚函数,插件的声明周期类必须要实现start与stop,实现服务的注册。

[cpp] view plain copy  
  1. class LHAuthPlugin : public QObject, public ctkPluginActivator
  2. {
  3. Q_OBJECT
  4. Q_INTERFACES(ctkPluginActivator)
  5. public:
  6. void start(ctkPluginContext *Context);
  7. void stop(ctkPluginContext *Context);
  8. private:
  9. LHAuth *m_Auth;
  10. };

实现类:

[cpp] view plain copy  
  1. void LHAuthPlugin::start(ctkPluginContext *Context)
  2. {
  3. m_Auth = new LHAuth();
  4. Context->registerService(QStringList("LHAuthInterface"), m_Auth);
  5. }
  6. void LHAuthPlugin::stop(ctkPluginContext *Context)
  7. {
  8. Q_UNUSED(Context)
  9. if (m_Auth)
  10. {
  11. delete m_Auth;
  12. m_Auth = 0;
  13. }
  14. }

其中:registerService即向CTKPlugin插件系统中注册该插件的唯一实例,而stop则是插件声明周期的终止。

2. 使用其它插件提供的服务

在其它模块中如果想使用登录认证插件,则在其它模块的Init阶段完成登录认证模块的加载,并完成初始化的功能:

[cpp] view plain copy  
  1. //! 初始化登录模块
  2. ctkServiceReference refAuth= d->m_PluginContext->getServiceReference("LHAuthInterface");
  3. d->m_AuthInterface = (qobject_cast<LHAuthInterface *>(d->m_PluginContext->getService(refAuth)));
  4. if (!d->m_AuthInterface ||
  5. (d->m_AuthInterface->Init(d->m_Parameters) != LH_SUCCESS) ||
  6. (d->m_AuthInterface->CreateInstance(varInstance, d->m_Parameters) != LH_SUCCESS))
  7. {
  8. qDebug()<<QObject::tr("Module %1 is invalid").arg("com.lht.auth");
  9. return LH_FAILURE;
  10. }
  11. else
  12. d->m_nAuthInstance = varInstance.toInt();

getServiceReference()即在CTKPlugin插件系统中获取LHAuthInterface服务。在初始化完成之后,就可以利用m_AuthInterface->Login()来使用登录认证插件提供的功能了。

项目如何使用插件式开发:

如上图所示,只是我这个项目本身实现插件系统功能的一个基本架构,相信不同的人使用会探索出更加有效,更加方便的使用方式。

每个项目都会有它的入口,我们不妨称之为portal,在portal中实现的功能很简单,最主要的就是完成CTKPlugin系统的初始化工作,待ctkplugin初始化完成之后首先加载lht_controller插件,lht_controller插件是很重要的一个插件,它主要负责完成其它所有应用插件的加载工作,如上图所示,它加载了lht_login登录插件、lht_mayaMaya渲染插件、lht_log日志插件、lht_goldenfarm渲染客户端插件(业务逻辑插件),然后执行业务逻辑插件,即lht_goldenfarm,而在lht_goldenfarm中根据业务逻辑实现不同的功能,调用不同的插件。

看上面的架构,很清晰明了,对于系统的维护很方便、容易。

本章总结:

好了,以上就是我这段时间开发收获到的东西,很多东西都是我以前开发中不注意的,现在慢慢当成规则严格要求自己,争取让自己的开发更加规范。

只有不断总结才能不断进步,还是验证了周总的那句话:“还是太年轻啊!!”。

FROM:  http://blog.csdn.net/houqd2012/article/details/23875279?utm_source=tuicool&utm_medium=referral

【大话QT之四】ctkPlugin插件系统实现项目插件式开发相关推荐

  1. ctkPlugin插件系统实现项目插件式开发

    插件式开发体会: 自开始写[大话QT]系列就开始接触渲染客户端的开发,说是开发不如更多的说是维护以及重构,在接手这块的东西之前自己还有点犹豫,因为之前我一直认为客户端嘛,没什么技术含量,总是想做比较有 ...

  2. Android项目驱动式开发教程 第2版,《Android项目驱动式开发教程》第一章开发入门.ppt...

    <Android项目驱动式开发教程>第一章开发入门 1.4 项目框架分析 4 android:versionName="1.0" > 5 8 第9行代码andro ...

  3. 基于Qt的智能车载系统嵌入式项目(正点原子IMX6ULL开发板)

    基于正点原子的IMX6ULL开发板的智能车载系统(Qt) 提示:该项目借鉴了不少大佬的代码,我没有自己造轮子(代码在文章末尾,同时附上参考链接 ) 本人其他项目链接基于linux的智能仓储项目 基于Q ...

  4. java 插件原理_javaweb项目插件实现机制

    如题,java开发web程序想实现插件机制有什么办法? 就比如:一个论坛,里面有签到,积分,第三方登录,编辑器选择等等的功能,现在我想把他们都抽出来,当成插件,论坛核心只保留用户的登录,注册,发帖,回 ...

  5. 构建自己的 Qt 插件系统

    简述 Qt 本身提供了插件相关的技术,但并没有提供一个通用的插件框架!倘若要开发一个较大的 GUI 应用程序,并希望使其可扩展,那么拥有这样一个插件框架无疑会带来很大的好处. 根据 深入理解插件系统  ...

  6. 做一个计算器_如何设计一个JavaScript插件系统,编程思维比死磕API更重要

    WordPress有插件. jQuery有插件.Gatsby.Eleventy和Vue也是如此. 插件是库和框架的常见功能,并且有一个很好的理由:它们允许开发人员以安全,可扩展的方式添加功能.这使核心 ...

  7. delphi bpl插件系统开发

    一个插件系统需要什么? 一个最小的插件系统当然需要插件本身,调用插件的容器,最后需要契约. 契约是什么呢?契约就是两个对象相互沟通的一个标准,这个标准应该统一,这样容器才能和不同的插件通讯.我们可以使 ...

  8. 独孤九剑与乾坤大挪移—uikiller插件系统

    上篇<雷神之锤>介绍了uikiller的基本用法,有人说长按功能可以取名为蓄力攻击.重击,我觉得还真是可以的,但就是感觉招数名字不够大气.在这里还要给大家道个歉,上篇中我说了这一样句话: ...

  9. 使用Python打造基本WEB漏洞扫描器(二) 爬虫插件系统的开发—E-Mail收集插件实列

    一.实验介绍 1.1 实验内容 基于上节的爬虫,在爬虫的基础上增加一个插件系统,通过爬虫爬取网页链接后调用这个插件系统中的插件进行各种操作,本节也会写个简单的email收集插件作为列子,后面也会讲到如 ...

最新文章

  1. C++ 向量(vector) 的使用
  2. golang垃圾回收概述
  3. r230/r250/m200
  4. 微信小程序引入Vant组件库
  5. 哪个版本python适用于windows-何种版本的Python适合您
  6. TS和JS相对比的优势
  7. 卡顿严重_王者峡谷:S20出现bug?卡顿十分严重
  8. .NET Core Blazor 1-Blazor项目文件分析
  9. WampServer服务器离线问题的解决方法
  10. docker集群部署:第3部分:服务
  11. EasyUI:导出datagrid数据到桌面
  12. 十八、vim进入编辑模式、vim命令模式、vim实践
  13. java获取世界各国地址,获取世界各国、全国省份、城市、县
  14. html如何改成花体英文字体,花体英文转换器可复制字体(附花体字发文技巧)...
  15. 风险回避、减轻、转移、接受,汇率风险
  16. 电视hdr测试软件,短路三分钟 | 你家电视、显示器真的支持HDR么?
  17. WPF自学手册-读书笔记(一)
  18. AWS使用(一)——申请付费版亚马逊云服务器的流程
  19. Matlab底层算法实现图像反色变换
  20. 高校计算机科研项目,jsp204高校科研项目申报系统

热门文章

  1. 计算机系统结构张晨曦版课后答案
  2. 【招聘】苏映视硬件、软件、嵌入式、算法多岗位open!
  3. JSP 校园二手物品租赁交易网站myeclipse开发mysql数据库java编程网页设计
  4. vue使用百度富文本编辑器(ueditor)
  5. CSS——响应式布局案例以及点击出现下拉框实现过程
  6. android7.0版本更新出现解析包错误问题,求帮助
  7. 关于936A 936B 936C发热芯 A1321 A1322 A1323的区别
  8. java乱鬼三国,三国十大倒霉鬼TOP10排名
  9. 为啥站长广告位这么难卖?
  10. win7怎么设置计算机的性能,win7怎么提升电脑性能