Наиболее оптимизированный способ создания нескольких объектов с несколькими операциями

Поэтому я изучал фабричные функции и классы в поисках наиболее оптимизированного способа создания нескольких объектов с несколькими функциями/операциями каждый.

Допустим, я делаю список TODO, каждая задача, которую я создаю, имеет 7 параметров и даже больше операций, но в основном геттеры и сеттеры.

Если я создам каждую из этих задач, используя фабричную функцию, каждый созданный объект будет иметь почти дюжину функций в памяти для каждой из созданных задач, верно?

Поскольку у нас есть 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
};

person spacing    schedule 29.09.2020    source источник
comment
это предполагает, что в вашем реальном коде ваши операции с задачами - это не просто геттеры/сеттеры, а функции, выполняющие сервисы/бизнес-логику?   -  person ggordon    schedule 02.10.2020
comment
@ggordon на данный момент только геттеры и сеттеры, но будут более сложные операции. Но было бы интересно узнать, как это повлияет на ситуацию.   -  person spacing    schedule 02.10.2020
comment
Спасибо, я поделился некоторыми идеями по сокращению использования памяти и дополнительными шаблонами, которые вы могли бы рассмотреть для дальнейшей оптимизации.   -  person ggordon    schedule 02.10.2020


Ответы (1)


Предложение

Ваша текущая проблема заключается в репликации нескольких похожих функций на разных объектах, поскольку это увеличивает использование памяти.

Мы могли бы воспользоваться типом используемого языка, то есть интерпретируемым, и небольшим пространством для реальной инкапсуляции данных< /а>.

В Javascript все является общедоступным или доступным, т.е. нет инкапсуляции данных, поэтому свойств объекта достаточно для доступа/изменения состояния объекта (т.е. там, где у вас есть установщики/геттеры, например setTitle и getTitle).

Для более сложных операций и в попытке уменьшить накладные расходы памяти для нескольких похожих функций вы можете создать singleton service (здесь я использовал цитаты, так как это более или менее то, как вы его применяете, и не надеетесь ограничить его из-за типа используемого вами языка), который имеет методы или предполагаемые операции. Затем каждый метод будет принимать объект 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 — Какой способ лучше всего подходит для создания объекта в JavaScript? Требуется ли `var` перед свойством объекта?

person ggordon    schedule 01.10.2020
comment
Хорошо, я вижу. Нужно некоторое время, чтобы разобраться с некоторыми из них, потому что синтаксис JS иногда очень запутан. Спасибо за пост и ссылки - person spacing; 05.10.2020