【问题标题】:JavaScript: How to compensate the lack of interfaces in delegate pattern?JavaScript:如何弥补委托模式中接口的不足?
【发布时间】:2015-07-12 09:49:04
【问题描述】:

使用 RequireJS,我构建了一个小脚本。根据传递给函数的内容,需要另一个文件——所以它可能类似于一个真正的简单工厂。想象一下:

function MyThing(a) {
    if (a > 2) {
        this.script = require['lib1'];
    } else {
        this.script = require['lib2'];
    }
}

我是其他语言(我来自 PHP),我可以在两个类中实现相同的接口,并确保 lib1lib2 都共享接口中定义的函数。

如果它在 JavaScript 中像这样工作,那么我可以调用 this.script.getId() 或类似的东西,它会正常工作,无论是使用 lib1 还是 lib2

不幸的是,JavaScript 中没有接口(@98​​7654321@ 很好地解释了为什么它没有意义),所以我有点纠结于应该如何处理它。

当然,我可以创建一个映射到两个库的接口之类的东西,但我觉得这是处理它的错误方法。

解决我遇到的问题的正确方法是什么?

【问题讨论】:

  • 到底是什么问题?你需要“处理”什么?在 JavaScript 中,对象就是对象。只要确保您的对象有一些共同的属性集就可以了。
  • @Pointy 这正是问题所在——在其他语言中,我可以确保使用接口有一些通用属性。一致性将通过语言的特性强制执行。在 JavaScript 中,这只是开发人员的善意;-)
  • 是的,这就是 JavaScript 的本质。
  • @Sven:然后使用 typescript 或其他可以让您进行类型检查和接口一致性的东西,并编译为 js

标签: javascript oop interface


【解决方案1】:

你可以只使用鸭子类型,它利用了 JS 可以将任何东西转换为布尔值的事实。如果一个函数存在,它的强制布尔值是true,所以:

var lib = doMagicLoading();

// does the lib support the function we need?
if (lib.functionINeed) {
  // it does, so we can simply move on along our intended code path.
  lib.functionINeed();
} else {
  // if it does not, that might be a problem, or it might not be. Warn us:
  console.warn("library does not implement the function I Need...");
}

这也是 JavaScript 代码如何确保它在支持不同版本 JS 的不同浏览器上执行“正确的事情”的方式。第一步:测试函数是否存在。第 2 步:如果有则调用它,如果没有则执行其他操作。

当然,在您的情况下,作为负责编写工作代码的程序员,您实际上可以保证行为良好的代码,因为您当然为脚本编写了测试,以确保两个代码路径都正确的事情,您在部署之前使用r.js 捆绑了您的代码。如果没有:是时候开始编写测试了。不要只相信开发人员编写工作代码——包括你自己 =)

【讨论】:

  • 嘎嘎。嘎嘎。嘎嘎。这个词每次都让我咯咯笑。
  • @Mike'Pomax'Kamermans 我了解,测试将确保一切正确。你觉得做这样的事情合理吗?
  • 如果你想要你可以信任的代码,那么在运行时对非确定性代码进行测试是非常必要的。您无法保证将采用哪条路径,因此您编写的代码确保对两者都进行测试。然后,如果您想要真正的完整性,您还可以设置版本控制,以便您甚至无法合并未通过测试的代码(如果您将 Github 之类的东西与 TravisCI 一起使用,这听起来更容易)
猜你喜欢
  • 2023-03-17
  • 1970-01-01
  • 2012-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-07
  • 2012-01-31
  • 2012-02-11
相关资源
最近更新 更多