Javascript-无实现契约的依赖项注入(接口)
javascript的新特性。假设我有一个这样的构造函数:Javascript-无实现契约的依赖项注入(接口),javascript,Javascript,javascript的新特性。假设我有一个这样的构造函数: function Dependent(dependency) { this.doSomething = function(x) { dependency.doSomethingReal(x); } } var impl = new SomeImplementation(); var dependent = new Dependent(impl); console.log(dependent.doSomet
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的方法,它接受一个参数)
出现了几个问题:
dependency
参数,以确保它具有Dependent
所需的所有内容我意识到我可以将一个函数传递给构造函数。换句话说,如果依赖关系是一个函数,那么我们就调用它。这是最安全的方法吗?我不认为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中,使用“”方法验证对象也是很常见的。例如:
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类型将是在JavaScript中处理这个问题的自然方法,因为JavaScript不是一种严格的类型化语言 因此,这意味着您实际上只接受JavaScript是松散类型的,并且当您试图访问一个对象上没有此方法的方法时,您必须处理运行时错误。(你的选择2) 除此之外,您还可以使用一种模式,尝试在JavaScript中模拟接口或抽象类,其工作原理与您在选项1中建议的类似,下面对此进行了详细描述: (第章“伪古典装饰师”) 但这也会导致运行时错误。异常可能只是在稍早的时候出现,但不会在“编译时”出现。因此,在这两种设计中,您都需要测试应用程序,以便找到与类型相关的错误
因此,我很乐意接受Duck类型。您可以将函数转换为字符串,并将形式参数正则表达式转换为数组,然后您可以使用该数组执行任何需要的操作,但要获得任意名称(不使用eval),这很难,但如果您提前有一个特定集合,则可以很容易地将成员命名为形式属性。然后,您必须重新编译函数或使用包装器在调用时更改参数。我会使用一个包装器,它的开头是Dependent(),它实际上取决于依赖项不实现需求的副作用。通常主要的库只是默默地失败,但同样,这取决于结果如何。如果副作用是什么也没有发生,那么就默默地失败。如果副作用是你的玩家突然获得了0个生命值,那么也许应该通过某种解决方法或抛出错误来处理,以便在其他地方捕获。但是,很少有理由使用
instanceof
,就像C#/Java中的相应版本没有真正的理由一样。使用duck类型代替OP