在我对较新的Web平台/应用程序(如Drupal,Wordpress和Salesforce)的分析中,他们中的许多人基于模块化的概念创建了他们的软件:开发人员可以创建新的扩展和应用程序而无需更改代码由核心开发人员维护的“核心”系统。特别是,我知道Drupal使用了一个“钩子”系统,但我对实现它的引擎或设计知之甚少。
如果您要沿着创建应用程序的道路前进,并且您想要一个允许模块化的系统,那么您从哪里开始?这是一个人人都知道的特殊设计模式吗?这个范例是否倾向于订阅手册?他们的任何网站是否从头开始讨论这种类型的开发?
我知道有些人直接指向OOP,但这似乎完全不同。
我计划的这个特殊系统更倾向于像Salesforce这样的东西,但它不是CRM系统。
为了这个问题,请忽略购买与构建论点,因为该考虑因素已经在进行中。现在,我正在研究构建方面。
答案 0 :(得分:6)
这里有两种方法,一种方法取决于软件的行为方式。
一种方法是plugin route,人们可以安装新代码到修改相关方面的应用程序中。这条路线要求您的应用程序可以安装,而不仅仅是作为服务提供(或者您安装和审查第三方发送的代码,这是一场噩梦)。
另一种方法是提供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
这也与Hollywood principle有关,这是一个很好的应用,但有时它是不实际的。
答案 1 :(得分:1)
来自Plugin pattern的P of EAA可能就是你所追求的。为您的服务创建一个公共接口,插件(模块)可以在运行时将其集成到ad-hoc。
答案 2 :(得分:1)
这称为组件架构。这是一个非常大的领域,但这里的一些关键重要事项是:
还有更多!
答案 3 :(得分:0)
如果您正在托管应用程序,请发布(和dogfood)RESTful API。
如果您要分发软件,请查看OSGi。
答案 4 :(得分:0)
这是一个小视频,至少会给你一些提示; the Lego Process [不到2分钟]
还有一个关于如何基于模块化创建自己的框架的完整方法......
制作模块化软件最重要的关键因素是要记住,纯粹[主要]是你可以创建系统的松散耦合问题。耦合越松散,模块化就越容易......