【问题标题】:Most optimized way to create multiple objects with several operations使用多个操作创建多个对象的最优化方式
【发布时间】:2020-09-29 17:59:26
【问题描述】:

所以我一直在研究工厂函数和类,寻找创建具有多个函数/操作的多个对象的最优化方法。

假设我正在做一个 TODO 列表,我创建的每个任务都有 7 个参数,甚至更多的操作,但主要是 getter 和 setter。

如果我使用工厂函数创建这些任务中的每一个,那么每个创建的对象都会在内存中为每个创建的任务提供近十几个函数,对吗?

既然我们有Object.create() 来创建一个对象作为另一个对象的原型,那么最好将taskOperations 分离为一个独立对象并使用Object.create(taskOperations) 就像我在下面所做的那样,以避免用相同的方法阻塞内存创建的所有对象的函数?

这是最优化的方式还是使用类更有效?

const taskOperations = {
    getTitle() {
        return this.title;
    },
    setTitle(title) {
        this.title = title;
    },
    getDateCreated() {
        return this.dateCreated;
    },
    setDateDue(dateDue) {
        this.dateDue = dateDue;
    },
    getDateDue() {
        return this.dateDue;
    },
    setPriority(priority) {
        this.priority = priority;
    },
    getPriority() {
        return this.priority;
    },
};

// Task factory
const createTask = (title) => {
    let task = Object.create(taskOperations);
    task.title= title;
    task.dateCreated= new Date();
    task.dateDue= "";
    task.priority= false;
    task.note= "";
    task.done= false;
    task.projectID= 0;
    return task
};

【问题讨论】:

  • 这是假设在您的实际代码中,您的任务操作不仅仅是 getter/setter,而是执行服务/业务逻辑的函数?
  • @ggordon 目前只有 getter 和 setter,但会有更复杂的操作。但是有兴趣知道这种情况是否会在这种情况下产生影响。
  • 谢谢,我分享了一些关于减少内存使用的想法以及您可以考虑进一步优化的其他模式。

标签: javascript class javascript-objects factory object-create


【解决方案1】:

提案

您目前担心在不同的对象上复制多个相似的函数,因为这会增加内存使用量。

我们可以利用所使用的语言类型,即解释性和“真实”data encapsulation 的空间很小。

在 Javascript 中,所有内容都是“公共的”或可访问的,即没有数据封装,因此对象属性足以访问/更改对象的状态(即对于您有 setter/getter 的地方,例如 setTitlegetTitle )。

对于更复杂的操作并试图减少多个类似函数的内存开销,您可以创建一个"singleton" 服务(我在这里再次使用引号,这或多或少是您应用它的方式,而不是希望限制它由于您使用的语言类型)具有方法或预期操作的类。然后,每个方法将接受task 对象和执行操作所需的任何其他详细信息,并在必要时更新任务的相应状态。这意味着对于内存中的 15,000 个tasks,您将不再需要15000 * [num of task operations]

这可能看起来像(同样,这个实现实际上是基于语法糖和决策的):

const TaskService = {
    getTitle(task) {
        return task.title;
    },
    setTitle(task,title) {
        task.title = title;
      
    },
    getDateCreated(task) {
        return task.dateCreated;
    },
    setDateDue(task,dateDue) {
        task.dateDue = dateDue;
    },
    getDateDue(task) {
        return task.dateDue;
    },
    setPriority(task,priority) {
        task.priority = priority;
    },
    getPriority(task) {
        return task.priority;
    },
};

无论是否使用类,我们的想法是尽可能分离关注点,即保持类简单,我们可以拥有仅用于存储状态的类(例如,您在工厂中创建对象的位置)和允许我们执行不同操作的类.

我希望这有助于决策过程。有很多软件设计和反设计模式。

进一步阅读

很多关于设计模式的文献通常参考类型化语言(例如,Java、C# 等),但我希望这也能有所帮助

文章 - https://www.toptal.com/javascript/comprehensive-guide-javascript-design-patterns 创建 Javascript 对象的其他方法 - Which way is best for creating an object in JavaScript? Is `var` necessary before an object property?

【讨论】:

  • 好的,我明白了。需要一些时间来理解其中的一些,因为 JS 语法有时是如此令人困惑。感谢您的帖子和参考
猜你喜欢
  • 2012-01-31
  • 1970-01-01
  • 2011-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多