Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/438.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript-无实现契约的依赖项注入(接口)_Javascript - Fatal编程技术网

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

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的方法,它接受一个参数)

出现了几个问题:

  • 在构造函数中,我是否应该手动检查
    dependency
    参数,以确保它具有
    Dependent
    所需的所有内容
  • 我应该不用担心吗
  • 其他图书馆如何处理这种情况?例如,我知道有几个DI项目……或者MVC项目,例如需要它们的视图对象来实现某些众所周知的方法

  • 我意识到我可以将一个函数传递给构造函数。换句话说,如果依赖关系是一个函数,那么我们就调用它。这是最安全的方法吗?我不认为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