所遇不良设计(三)

  我看到好多独立的事情被外包或者众包出去,在完成速度和效率上,都很是出色。好多开源的组织也是这样,接纳全世界软件开发着的贡献,而后对这些贡献进行整理,这是众包的过程。项目经理在分派任务的过程当中,将系统分割成不一样的部分,而这不一样的部分又关联的不那么紧密; 让他们齐头并进,这样让项目效率提升很多。vim

1 高度集中的集权模式

  在以前的一家公司,在开发的过程当中,当你写完代码,你根本就不能去测试你的代码。首先你的代码没有测试模块,由于电信的业务错综复杂,要调试须要牵扯到不少系统。我发现这些系统是互相关联,少了哪同样都不能正常运行(彻底造成不了所谓的插件模式)。还有就是你们在本地写好代码,都会上传到同一个服务器上,编译; 有时候恰好碰到某我的也在上传本身的模块,你要等一下,而后等他编译完成以后,你才能接着你的工做。这就是我要说的中心模式,因为拥有一个中心,你必须排着队去处理任务,当你的模块出现问题,还会影响到其余人工做。windows

  如今不一样了,在一家游戏公司,每一个人都拥有本身的数据,本身的服务端,本身的客户端; 我开发好本身的服务端。在本身的虚拟机里面运行,彻底不会影响其余的人工做。同时,客户端开发人员,也拥有和我同样的部署。当客户端和服务端都开发完以后,只须要将客户端链接上服务端就能够进行联调。联调完成以后,将模块代码归总到工程的svn主干,通常一个模块都会指定一个客户端和一个服务端来作。若是人员比较多,两两配对,能够同时作多个模块,而相互不想干扰。这就是分布式开发模式。服务器

  分布式开发模式是基于插件模式的基础之上,模块被分割出来以后,它们是互不相关联的。高度集权模式,就像独木桥同样堵得紧。分布式开发模式则拥有更多车道,八面玲珑。咱们很快可以看清分布式开发的好处。框架

  在测试上,分布式也体现其优越性。程序猿分别开发本身的模块,每一个人为本身的模块写入测试模块,确保本身的模块运行良好以后; 而后将不一样的模块汇总,由测试人员查处各个模块之间的衔接bug。假使每一个开发人员不确保本身的模块工做正常,全部的bug聚集到测试人员那里,将是不可开交的。eclipse

2 千篇一概的固定框架

  每一个公司都有一个框架,一个开发人员进入这家公司就必须得按照固定的模式去写这个模块。那种千篇一概的工做会让那些想追求新鲜事物的程序猿们厌烦不已; 因而乎不停的跳槽,不停的换工做,最后仍是没有跳出这个尴尬的局面; 这恰是一个码农的真实写照。写重复性代码是必须,咱们每一个人都是生产线上的工人,作重复性的事情,能够减小工做的难度,提升工做效率。可是软件开发毕竟不是富士康里面的生产线。编辑器

  插件模式,最后要打造的就是这种方式,减小开发的难度,造成固定的插件开发套路。有没有什么方法来解决这样的问题了?分布式

  减小重复性工做的方法,就是让这部分重复性的劳做成果自动产生–作一个代码生成工具。如今一些主流的IDE(eclipse、vim、emacs)都支持插件,大部分公司能够根据本身的框架结构,来开发IDE插件,定制本身的IDE。我之前使用VC开发过MFC程序,咱们发现使用它可以很方便的添加消息、类、事件等,这些只须要启动classwizard。咱们能够设计插件,与IDE相融合,来建立框架里面的一些组建,以及在刚开始的时候,建立本身的模块模板。VC也是这样作的,它会建立Dialog等模板。插件会在各个组建模板须要添加代码的地方,去添加TODO标志,这样子提醒开发人员去补全代码。ide

  按照这样的方式,能够减小大量的复制粘贴的工做,同时也减小了复制粘贴过程的大量错误。要记住,当你产生了大量的复制粘贴,说明好多东西是能够自动生成的。这样子,程序猿能够专一于本身关心的事情,也就不会以为很枯燥了。svn

3 左右逢源的插件模式

  上面以及包括前几篇文章里面屡次提到插件模式,插件模式其实也是一种弱中心化的过程。它有一个中心,起到统筹的做用,各个插件互不关联,表现出不一样的特性。当一个插件工做失常,不会影响其余插件的工做。我所见到大部分编辑器,都拥有不少插件。编辑器是一个中心,它拥有最基本的要素; 插件来丰富其特性。函数

  在windows下面拥有一款编辑工具,notepad++; 我特喜欢,其有丰富的插件,其由C++开发而成的。插件开发全部的特性是:1.插件与插件之间互不依赖; 2.在开发插件的时候不须要去更改主体的代码; 3.主体自动去加载插件。想一想,当咱们下了notepad++的一个插件,咱们并无去更新或者更改notepad++或者其某个插件; 当咱们将notepad++的插件放置到其plugin目录下时,从新启动notepad++,notepad++就可以使用这个插件的特性了。

  这种不断的更新模块,并不会致使整个工程的从新的编译生成的特性; 只有动态库才能很好完成这样的工做。notepad++的插件就是一系列的dll文件。

  不一样的操做系统动态加载dll的API不同,Poco库,一个跨平台的C++库,为咱们解决了不一样平台的差别,提供了统一的加载dll的API。在开发咱们的插件的时候,咱们必需要约定插件的一个入口函数,主体应用经过调用相应dll的入口函数,而后在针对插件的不一样特性,来作一系列的操做。  

  下面是一个例子:

  

 1   //主题程序经过配置文件加载dll,而dll_config.txt配置文件里面包含了全部插件dll的路径
 2   bool LoadPlugin() {
 3       file.open("dll_config.txt");
 4       while (!iseof(file)) {
 5           dll_path = file.readline();//从配置文件读取dll路径
 6       HAND hDll = LoadLibrary(dll_path); //加载dll
 7       Proc proc = GetProcAddress(hDll, "Init"); //获取函数地址
 8       proc();//调用函数
 9       }
10   }
11 
12 
13   //配置文件dll_config.txt
14   xxx/a.dll
15   ...
16   xxx/n.dll
17 
18   //插件模式dll,必需要实现Init入口函数,并且使用C,防止产生联编,由于咱们要根据函数名称获取dll中的Init函数地址,能够在入口函数里面调用插件的C++接口
19   __declspec(dllexport) void Init() {
20       xxx
21   }
View Code

 

  这是主体程序加载插件的模式,还有不少事情要作,主题程序必须提供清晰的程序结构来供插件调用。好比编辑器会有工具条,菜单,编辑框,状态栏等,插件要在这些上产生特性,要对这些组建作操做的。

  插件模式让事情变得更加简单化,同时让开发变得没有挑战性; 同时也可让程序猿关注更重要的事情,抽出更多的时间来作本身喜欢的事情。

相关文章
相关标签/搜索