Javascript -没有实现契约(接口)的依赖注入

Javascript - Dependency Injection without implementation-contract (interface)

本文关键字:接口 依赖 注入 契约 实现 Javascript      更新时间:2023-09-26

javascript新手。假设我有一个这样的构造函数:

function Dependent(dependency) {
    this.doSomething = function(x) {
       dependency.doSomethingReal(x);
    }
}
var impl = new SomeImplementation();
var dependent = new Dependent(impl);
console.log(dependent.doSomething(3));

我的理解是,语言中没有任何东西可以帮助确保impl实际上可以履行其职责(实际上有一个名为doSomethingReal的方法接受一个参数)。

出现了几个问题:

  1. 在构造函数中,我应该手动检查dependency参数以确保它具有Dependent所需的所有东西吗?
  2. 我不应该担心它吗?
  3. 其他库如何处理这种情况?例如,我知道有几个DI项目……或MVC项目,例如,要求他们的视图对象实现某些众所周知的方法。

我意识到我可以把一个函数传递给构造函数。换句话说,如果dependency是一个函数,我们就调用它。这是最安全的方法吗?我不认为这是MVC项目做的…有时传入一个对象也是有意义的。

您可以使用instanceof来检查一个对象是否是另一个对象的实例。

例如,在代码中:

function Dependent(dependency) {
    // here we could check that dependency is an instance of SomeImplementation
    if (!(dependency instanceof SomeImplementation))
        throw "dependency must be an instance of SomeImplementation";
    this.doSomething = function(x) {
        dependency.doSomethingReal(x);
    }
}
var impl = new SomeImplementation();
var dependent = new Dependent(impl);
console.log(dependent.doSomething(3));

在javascript中,使用'duck typing'方法来验证对象也是很常见的。例如:

console.log (
    'isABird' in duck &&
    'walks' in duck &&
    'swims' in duck &&
    'quacks' in duck ?
    "juhm... I'm pretty sure we're dealing with a duck" :
    "meh... since I a expect a duck to be a bird, walks, swims and quacks, then this buddy is definitely not a duck"
);

嗯,据我所知,Duck Typing将是处理JavaScript中这个问题的自然方法,因为JavaScript不是严格类型的语言。

因此,这将意味着您确实只是接受,JavaScript是松散类型的,并且当您试图访问没有此方法的对象上的方法时,您将不得不处理运行时错误。(你的选项2)

除此之外,你还可以使用一个模式来模拟JavaScript中的接口或抽象类,就像你在选项1中建议的那样,这里有详细描述:

http://www.addyosmani.com/resources/essentialjsdesignpatterns/book/decoratorpatternjavascript(章节"伪古典装饰师")

但是这也会导致运行时错误。异常可能会更早一点出现,但不会在"编译时"出现。因此,在这两种设计中,您都需要测试应用程序,以查找与类型相关的错误。

所以我愿意接受Duck Typing