2

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

假设我正在做一个 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
};
4

1 回答 1

1

提议

您当前关注的是在不同对象上复制多个类似功能,因为这会增加内存使用量。

我们可以利用所使用的语言类型,即解释型和“真实”数据封装的空间很小。

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

对于更复杂的操作并试图减少多个类似函数的内存开销,您可以创建一个“单例”服务(我在这里再次使用了引号,这或多或少是您应用它的方式,而不是希望限制它,因为您正在使用的语言类型)具有方法或预期操作的类。然后,每个方法将接受一个task对象和执行操作所需的任何其他详细信息,并在必要时更新任务的相应状态。这意味着对于 15,000task秒的内存,您将不再需要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 对象的其他方法 -哪种方法最适合在 JavaScript 中创建对象?在对象属性之前是否需要`var`?

于 2020-10-01T22:40:03.353 回答