javascript - 类不变量:一个对象需要不为空的,反之亦然。提供什么优雅的方式?
问题描述
假设我们应该实现一个双向链表。这个数据结构假设有一个 ' 链,Link
它们中的每一个都与前一个和下一个都有连接。由于我不喜欢处理讨厌if (previousLink !== null)
的空检查(所以它可能看起来像这样:
class Link {
data;
previousLink;
nextLink;
constructor(data, previousLink, nextLink) {
this.data = data;
this.previousLink = previousLink;
this.nextLink = nextLink;
this.checkClassInvariants();
}
checkClassInvariants() {
assert(this.previousLink !== null);
assert(this.nextLink !== null);
}
insertPreviousLink(link) { ... checkClassInvariants(); }
removePreviousLink() { ... checkClassInvariants(); }
/* etc. */
}
所有插入/删除例程都不会进行空检查,而只是修补对象连接。我们的牺牲是我们必须实现一些BeginningLink
and EndLink
。前者知道它的previousLink
isnull
和后者是相同的,但与nextLink
. 但是,除了这些之外,断言的其他部分应该仍然有效。似乎这个目标可以通过 的多态性来实现checkClassInvariants()
:
class BeginningLink extends Link {
constructor(nextLink) {
super(new DummyData(), null, nextLink);
}
checkClassInvariants() {
assert(this.nextLink !== null);
}
}
class EndLink extends Link {
constructor(previousLink) {
super(new DummyData(), previousLink, null);
}
checkClassInvariants() {
assert(this.previousLink !== null);
}
}
当我们LinkedList
尝试用BeginningLink
and初始化自身时EndLink
,它们的不变量将失败,因为此时BeginningLink
正在创建 no EndLink
exists(反之亦然)。
绕过这个混乱的优雅方法是什么?我应该checkClassInvariants()
(Link
至少在构造函数中)忽略并LinkedList
负责非空检查吗?但是如果一个类本身明确声明它的不变量会更好,不是吗?
解决方案
推荐阅读
- regex - 路径的 ElasticSearch 正则表达式查询
- java - 输入正确数据时,会产生授权错误
- php - 为什么字符修剪适用于 get_the_excerpt 而不适用于 the_excerpt?
- frama-c - 手册中的 Frama-C acsl max 示例不起作用
- javascript - 有条件地将多个键分配给对象
- javascript - 输入事件和角度的反应形式
- python - Matplotlib - 将图形导出到内存缓冲区中的 png
- python-3.x - 如何解决“没有名为 _bz2 的模块”错误?
- angular - Angular Karma 测试对象:无法读取未定义的属性“未定义”
- git - 有没有办法删除我的(远程)git repo中曾经跟踪的文件,这些文件在我的本地版本中不存在?