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

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

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

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

> \[!NOTE] Ответы, описанные в этой статье, являются примерами.
> Copilot Chat Ответы не детерминированы, поэтому вы можете получить другие ответы, чем показаны здесь.

## Пример сценария

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

```javascript id=person-module
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");
```

## Пример запроса 1

```copilot copy prompt ref=person-module
What design patterns could improve this code? Don't show me code examples.
```

## Пример ответа 1

Copilot предлагает следующие закономерности:

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

## Пример запроса 2

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

```copilot copy prompt ref=person-module
Refactor this code using the module pattern
```

## Пример ответа 2

```javascript
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");
```

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

## Дополнительные материалы

* [Инженерия подсказок для GitHub Copilot Chat](/ru/copilot/concepts/prompting/prompt-engineering)
* [Лучшие практики использования GitHub Copilot](/ru/copilot/get-started/best-practices)