4

在我对较新的 Web 平台/应用程序(例如 Drupal、Wordpress 和 Salesforce)的分析中,他们中的许多人基于模块化的概念来创建他们的软件:开发人员可以创建新的扩展和应用程序,而无需更改“核心”中的代码。 " 由主要开发人员维护的系统。特别是,我知道 Drupal 使用“钩子”系统,但我对实现它的引擎或设计知之甚少。

如果您要走上创建应用程序的道路,并且想要一个允许模块化的系统,您从哪里开始?这是每个人都知道的特定设计模式吗?有没有这种范式倾向于订阅的手册?他们是否有任何网站从头开始讨论这种类型的开发?

我知道有些人直接指向 OOP,但这似乎完全不是一回事。

我计划的这个特定系统更倾向于 Salesforce,但它不是 CRM 系统。

为了这个问题,请忽略 Buy vs. Build 论点,因为这种考虑已经在进行中。现在,我正在研究构建方面。

4

5 回答 5

6

有两种方法可以绕过这里,选择哪一种取决于您的软件的行为方式。

一种方法是插件 路径,人们可以在其中将新代码安装到应用程序中,修改相关方面。这条路线要求您的应用程序是可安装的,而不仅仅是作为服务提供(或者您安装和审查第三方发送的代码,这是一场噩梦)。

另一种方法是提供一个API,它可以由相关方调用,并使应用程序将控制权转移到位于其他地方的代码(例如 Facebook 应用程序),或者使应用程序按照 API 命令使开发人员能够执行的操作(例如 Google地图)。

即使机制不同并且如何实际实现它们也不同,无论如何,您必须定义

  • 我会让用户有什么自由?
  • 我将为程序员提供哪些服务来定制应用程序?

最重要的是:

  • 如何在我的代码中启用此功能,同时保持安全和健壮。这通常是通过对代码进行沙箱处理、验证输入并可能为用户提供有限的功能来完成的。

在这种情况下,钩子是代码中调用所有已注册插件的钩子函数的预定义位置,如果已定义,则会修改应用程序的标准行为。例如,如果你有一个渲染背景的函数,你可以拥有

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

这也都与好莱坞原则有关,适用是好事,但有时就是不切实际。

于 2009-01-05T14:48:21.443 回答
1

EAA P插件模式可能就是您所追求的。为您的服务创建一个公共接口,插件(模块)可以在运行时将其集成到 ad-hoc 中。

于 2009-01-05T14:41:37.383 回答
1

这称为组件架构。这确实是一个很大的领域,但这里的一些关键的重要事情是:

  • 组件的组成(容器组件可以包含任何其他组件)
    • 例如,网格应该能够包含其他网格或任何其他组件
  • 通过接口编程(组件通过已知接口进行交互)
    • 例如一个视图系统,它可能要求一个组件呈现自己(比如在 HTML 中,或者它可能被传递一个呈现区域并要求视图直接在其中绘制
  • 广泛使用动态注册表(加载插件时,它会在适当的注册表中注册自己)
  • 将事件传递给组件的系统(例如鼠标点击、光标输入等)
  • 通知
  • 用户管理

还有更多!

于 2009-01-05T14:47:31.273 回答
0

如果您要托管应用程序,请发布(和 dogfood)一个 RESTful API。

如果您正在分发软件,请查看OSGi

于 2009-01-05T14:28:03.247 回答
0

这是一个小视频,至少会给你一些提示;乐高过程[少于 2 分钟]

还有一个完整的秘诀,介绍如何广泛基于模块化创建自己的框架......

制作模块化软件最重要的关键要素是要记住,这纯粹是 [主要] 一个问题,即您可以创建系统的松散耦合程度。耦合越松散,模块化就越容易......

于 2009-08-10T17:03:03.057 回答