Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/478.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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_Oop_Interface_Contract - Fatal编程技术网

Javascript 如何记录对象的合同

Javascript 如何记录对象的合同,javascript,oop,interface,contract,Javascript,Oop,Interface,Contract,我正试图找到一种很好的方法来记录JavaScript中对象的预期接口或契约,例如,将调用哪些方法,哪些属性将出现等等。我希望它尽可能接近代码,例如不在外部文档文件中 假设我正在尝试用JavaScript设计UI控件库。我希望以多态方式处理一组控件,例如call control.loadDataFromServer,而不管它是文本字段还是下拉列表或其他什么。但某些行为可能并不存在于所有类型的控件中,例如,对于可编辑控件,我将调用control.validate或control.getValue,这

我正试图找到一种很好的方法来记录JavaScript中对象的预期接口或契约,例如,将调用哪些方法,哪些属性将出现等等。我希望它尽可能接近代码,例如不在外部文档文件中

假设我正在尝试用JavaScript设计UI控件库。我希望以多态方式处理一组控件,例如call control.loadDataFromServer,而不管它是文本字段还是下拉列表或其他什么。但某些行为可能并不存在于所有类型的控件中,例如,对于可编辑控件,我将调用control.validate或control.getValue,这对于静态文本标签等不会发生

我的主要目标是让一个新的开发人员尝试实现新的控件或修改现有控件时,可以立即理解可以实现什么,而不必筛选所有调用代码


在C或Java等静态类型语言中,我会使用IControl和IEditableControl等接口。现在,我知道JavaScript是duck类型的,但我确实想给进一步的开发人员一些提示。我可以在控件的原型中提供虚拟实现,但那个解决方案对我来说太脏了。我的选择是什么?

最后,我决定使用类似于这种古怪解决方案的东西

对于每个逻辑接口,我创建了一个对象,其中列出了使用JS原型字符串、数字、函数等的成员以及非常基本的类型指示。。这个接口对象很容易用JSDoc记录,还可以添加缺少的方法参数信息

当使用目标对象时,我检查对象是否打算支持接口,如果是,我继续调用方法。它不像静态打字那样安全,但对我来说已经足够好了

var interfaces = {
     ...
     validatable: {
         validate: Function,
         isValid: Boolean,
         getValidationMessages: Function
     }
     ....
}

...
if (typing.checkSupport(control, interfaces.validatable)) {
    control.validate();  
    if (!control.isValid) {
      ....
    }
}

您是否正在寻找一种格式来注释您的代码,并可能从中生成文档,比如JsDoc?或者您正在寻找一种方法来编写代码,使其更具自我记录能力?也许可以看看传单:。他们使用了很多接口,至少在文档中是这样。不管是哪种方式,都可能值得一看他们的源代码。@Tibos,我更喜欢自文档化代码,但我不喜欢为了这个目的而用虚拟方法污染我的原型。至于JSDoc,我不知道如何记录对象的不同可选方面。顺便说一句,我根本不需要生成外部文档文件。