Skip to main content

Рефакторинг для реализации шаблона конструктора

Код, который не соответствует установленным шаблонам проектирования (например, Singleton, Factory или Observer), может привести к таким проблемам, как жесткое связывание, отсутствие гибкости или дублированный код.

помогает использовать соответствующие шаблоны проектирования, чтобы сделать код более гибким и поддерживаемым. Например, рекомендуется преобразовать повторяющиеся экземпляры в шаблон фабрики или использовать шаблон наблюдателя для тесного соединения классов.

Примечание.

Ответы, описанные в этой статье, являются примерами. Ответы являются недетерминированными, поэтому вы можете получить различные ответы, показанные здесь.

Этот код JavaScript создает три Person объекта, каждый из которых содержит name и age свойства. Затем он использует имя человека для получения и печати своего возраста.

class Person {
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }
}

var people = {};

function addPerson(name, age) {
  people[name] = new Person(name, age);
}

function getAge(name) {
  if (people[name]) {
    console.log(name + " is " + people[name].age + " years old.");
  } else {
    console.log("Person not found.");
  }
}

addPerson("Ana", 30);
addPerson("Mario", 25);
addPerson("Louise", 40);

getAge("Mario");

What design patterns could improve this code? Don't show me code examples.

Copilot предлагает следующие шаблоны:

  • Шаблон singleton: чтобы обеспечить наличие только одного экземпляра people объекта.
  • Шаблон фабрики: создание фабрики для создания Person объектов.
  • Шаблон модуля: чтобы инкапсулировать people объект и связанные функции в модуле, чтобы избежать загрязнения глобального пространства имен.

Теперь можно попросить Copilot реализовать шаблон, который вы считаете наиболее подходящим.

Refactor this code using the module pattern

const PersonModule = (function() {
  class Person {
    constructor(name, age) {
      this.name = name;
      this.age = age;
    }
  }

  const people = {};

  function addPerson(name, age) {
    people[name] = new Person(name, age);
  }

  function getAge(name) {
    if (people[name]) {
      console.log(name + " is " + people[name].age + " years old.");
    } else {
      console.log("Person not found.");
    }
  }

  return {
    addPerson,
    getAge
  };
})();

PersonModule.addPerson("Ana", 30);
PersonModule.addPerson("Mario", 25);
PersonModule.addPerson("Louise", 40);

PersonModule.getAge("Mario");

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