2014-02-21 22 views
1

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

比方说,我试图在JavaScript中设计UI控件库。我想以多态的方式处理一组控件,例如无论是文本字段还是下拉菜单或其他任何内容,请致电control.loadDataFromServer()。但是某些行为可能不会出现在所有类型的控件中,例如对于可编辑控件,我将调用control.validate()control.getValue(),这对于静态文本标签等不会发生。

我的主要目标是如此一个新的开发人员试图实现新的控制或修改现有的人可以立即明白什么是可能的实现,而无需筛选所有的调用代码。在像C#或Java这样的静态类型语言中,我会使用像IControlIEditableControl这样的接口。现在,我知道JavaScript是鸭子类型的,但我想给进一步的开发者一些提示。我可以在控件的原型中提供虚拟实现,但该解决方案对我来说似乎很脏。我有什么选择?

+0

您是否正在寻找一种格式来注释掉您的代码(并可能从中生成文档),如JsDoc?或者您是否正在寻找一种编写代码的方式来更自我记录? – Tibos

+0

也许看看小册子:http://leafletjs.com/reference.html。他们使用大量的接口,至少在文档中。无论哪种方式,可能值得看看他们的源代码。 –

+0

@Tibos,我希望更多的自我记录代码,但我不喜欢用虚拟方法来污染我的原型,仅仅是为了这个目的。至于JSDoc,我没有看到我可以如何记录对象的不同可选“方面”。顺便说一句,我根本不需要生成外部文档文件。 – ovolko

回答

0

最后我决定沿用这个quacksLike解决方案http://fitzgeraldnick.com/weblog/39/

对于每个逻辑“接口”,我使用JS原型(字符串,数字,函数等)创建一个列出成员以及非常基本类型指示的对象。这个接口对象非常容易用JSDoc进行文档记录(也可以添加关于方法参数的缺失信息)。

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

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

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