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