在我对较新的Web平台/应用程序(如Drupal,Wordpress和Salesforce)的分析中,他们中的许多人基于模块化的概念创建了他们的软件:开发人员可以创建新的扩展和应用程序而无需更改"核心"中的代码"由主要开发者维护的系统.特别是,我知道Drupal使用了一个"钩子"系统,但我对实现它的引擎或设计知之甚少.
如果您要沿着创建应用程序的道路前进,并且您想要一个允许模块化的系统,那么您从哪里开始?这是每个人都知道的特定设计模式吗?是否有这个范例倾向于订阅的手册?他们的网站是否从头开始讨论这种类型的开发?
我知道有些人直接指向OOP,但这似乎并不完全相同.
我正在计划的这个特定系统更倾向于像Salesforce这样的东西,但它不是CRM系统.
为了解决这个问题,请忽略Buy vs. Build参数,因为该考虑已经在进行中.现在,我正在研究构建方面.
这里有两种方法,一种方法取决于软件的行为方式.
一种方法是插件 路由,人们可以在应用程序中安装新代码来修改相关方面.此路线要求您的应用程序可以安装,而不仅仅作为服务提供(或者您安装和审查第三方发送的代码,这是一场噩梦).
另一种方法是提供一个API,可以由相关方调用,并使应用程序转移控制到位于其他地方的代码(一个Facebook应用程序)或使应用程序执行,因为API命令使开发人员(谷歌和谷歌)地图).
即使机制各不相同以及如何实际实现它们也有所不同,但无论如何都要定义
我会让用户有什么自由?
我将为程序员提供哪些服务来定制应用程序?
而最重要的是:
如何在我的代码中启用此功能,同时保持安全性和健壮性.这通常通过沙箱化代码,验证输入并可能为用户提供有限的功能来完成.
在此上下文中,钩子是代码中的预定义位置,用于调用所有已注册插件的钩子函数(如果已定义),从而修改应用程序的标准行为.例如,如果您有一个可以渲染背景的函数
function renderBackground() { foreach (Plugin p in getRegisteredPlugins()) { if (p.rendersBackground) p.renderBackground(); } //Standard background code if nothing got executed (or it still runs, //according to needs) }
在这种情况下,你有一个插件可以实现的'renderBackground'钩子来改变背景.
在API方式中,用户应用程序将调用您的服务以获取渲染的背景
//other code Background b = Salesforce2.AjaxRequest('getBackground',RGB(255,10,0)); //the app now has the result of calling you
这也与好莱坞原则有关,这是一个很好的应用,但有时它只是不实用.