我有一个 getter 方法,可以从反序列化数据实例化类。我怀疑这是一种非常低效的做事方式
class Container {
get content() {
let contentList = []
for (let c of this._content) { // this._content is an array of objects
contentList.push(new ContentTypes[c.type](c)) //ContentTypes is a mapping between type names and classes
}
return contentList
}
}
OOP 领域合适的设计模式是什么?
最佳答案
无论代码是在 getter 还是方法中,效率都不会改变。但改变的是使用您的类编写代码的人的期望。
我不认为访问对象的属性会产生太多开销。因此,当使用 Container
实例时,如果我看到 contents
属性,我不会期望它做很多工作。你的(有一点)。
我会:
保留返回内容的副本(使返回内容不可变),并且仅在其依赖的内容发生变化时才丢弃它,或者
使其成为一个方法(显式)。
(或者我可能两者都做。)
我预计方法调用会比属性访问产生更多的开销。我不知道是否有一个具体的 OOP 原则可以引用,但这是我的经验观点(无论它是否值得)。
但是,请注意,存在反例。一个著名且可直接应用的属性是 DOM 元素的 innerHTML
属性,它是一个访问器属性,在使用时可以完成相当多的工作。
这是一个返回您保留并重新返回的不可变事物的示例,但当其基础数据发生更改时该事物会失效:
class Container {
constructor() {
this._content = [];
this._exposedContent = null;
}
addContent(content) {
this._content.push(content);
this._exposedContent = null; // Invalidating the cached copy if any
}
get content() {
// Do we have a cached copy?
if (!this._exposedContent) {
// No, create it
this._exposedContent = this._content.map(
c => Object.freeze(new ContentTypes[c.type](c))
);
}
return this._exposedContent;
}
}
(您也可能在一段时间后使副本过期。)
但是,与您的 content
访问器中的代码实际内容相比,是否值得内存开销和复杂性需要判断。我的默认立场是使用方法(getContent
或类似方法)而不是缓存,但这是一个判断调用。
关于javascript - 在 getter 方法中实例化类是否内存效率低下?什么 OOP 设计可以防止这种情况发生?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59611344/