如何记录对象的合同

时间:2014-02-21 10:12:55

标签: javascript oop interface contract

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

假设我正在尝试用JavaScript设计UI控件库。我想以多态方式处理一组控件,例如无论是文本字段还是下拉列表,都可以调用control.loadDataFromServer()。但是某些行为可能不会出现在所有类型的控件中,例如对于可编辑的控件,我会调用control.validate()control.getValue()这对于静态文本标签等不会发生。

我的主要目标是尝试实现新控件或修改现有控件的新开发人员可以立即了解可以实现的内容,而无需筛选所有调用代码。

在像C#或Java这样的静态类型语言中,我会使用IControlIEditableControl之类的接口。现在,我知道JavaScript是鸭子类型,但我确实想给进一步的开发人员提供一些提示。我可以在控件的原型中提供虚拟实现,但这个解决方案对我来说似乎很脏。我有什么选择?

1 个答案:

答案 0 :(得分:0)

最后,我决定使用类似于quacksLike解决方案http://fitzgeraldnick.com/weblog/39/的内容。

对于每个逻辑"接口"我创建了一个对象,它使用JS原型(String,Number,Function等)列出成员以及非常基本的类型指示。使用JSDoc很容易记录这个接口对象(也可以添加有关方法参数的缺失信息)。

使用目标对象时,我会检查对象是否支持"接口"如果是这样,我继续调用方法。它不像静态打字那么安全,但对我来说还不错。

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

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