gpt4 book ai didi

javascript - 如何记录对象的契约(Contract)

转载 作者:行者123 更新时间:2023-11-28 08:30:27 26 4
gpt4 key购买 nike

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

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

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

在 C# 或 Java 等静态类型语言中,我会使用 IControl 和 IEditableControl 等接口(interface)。现在,我知道 JavaScript 是鸭子类型的,但我确实想为进一步的开发人员提供一些提示。我可以在控件的原型(prototype)中提供虚拟实现,但该解决方案对我来说似乎很脏。我有什么选择?

最佳答案

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

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

在使用目标对象时,我会检查对象是否打算支持“接口(interface)”,如果是,我会继续调用方法。它不像静态类型那么安全,但对我来说已经足够了。

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

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

关于javascript - 如何记录对象的契约(Contract),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21931324/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com