2

我们开发了一种移动应用程序套件,最初设计为无需任何用户代码即可运行。它是移动应用工作室的一部分,现在我们想通过 Javascript 启用“用户覆盖”。

现在我们正在尝试 3 个想法:

  1. 事件模式
  2. 钩子图案
  3. “猴子补丁”(现有功能的原型覆盖)

任何方式都有其优点和缺点。例如,

当前使用 dojo 的订阅和发布实现的事件模式

优点很好:核心代码中的附加代码干净且最少。问题:代码执行已经发生,用户只收到核心发生的通知。为了应用他的定制,他需要反转更改并推出自己的代码。这有点混乱且不可靠,因为核心可能依赖于以后不再存在的东西。

钩子图案。可以说它的实现类似于“代表”

即,默认情况下,核心代码确实确定内容的和平是否可共享:

xapp.utils.getModuleViewCreationParameters = function (content, viewManager, selected,type,heading)
{
    var isShareable = false;

    if(type!=null)
    {
       isShareable=xapp.utils.isSharable(type);
    }

为了使用户能够覆盖此行为但保持默认不变,我需要像这样扩展它:

xapp.utils.getModuleViewCreationParameters = function (content, viewManager, selected,type,heading)
{
    var isShareable = false;

    if(type!=null)
    {
       isShareable=xapp.utils.isSharable(type);
    }

    if(ctx && ctx.getShareDelegate && ctx.getShareDelegate() && ctx.getShareDelegate().isSharable){
        isShareable=ctx.getShareDelegate().isSharable(type);
    }

现在,“ctx.getShareDelegate()”返回用户的实际类,可以用来覆盖默认行为。

优点:它仍然干净并且更直接地修改了核心的流程。缺点:它可能会导致某种意大利面条代码,但我不确定这一点。

我的最后一个想法:原型修改又名猴子补丁

优点:它当然允许任何核心覆盖,但是:缺点:用户代码依赖于太多假设,例如核心代码的函数签名保持不变。

好吧,毕竟我最喜欢的仍然是“钩子或委托模式”。

你能推荐任何替代方案或建议来解决这个问题吗?或者设计一个用户可定制的 JS API ?

4

0 回答 0