# Refatorando para implementar um padrão de design

Copilot Chat pode sugerir padrões de design que você pode usar para melhorar seu código.

Código que não segue os padrões de design estabelecidos (como Singleton, Factory ou Observer) pode levar a problemas como acoplamento estrito, falta de flexibilidade ou código duplicado.

Copilot Chat pode ajudá-lo a usar padrões de design apropriados para tornar seu código mais flexível e mantenedível. Por exemplo, é recomendável converter instanciações repetitivas em um padrão Factory ou usar o padrão Observer para desacoplar classes estritamente conectadas.

> \[!NOTE] As respostas descritas neste artigo são exemplos.
> Copilot Chat as respostas são não determinísticas, portanto, você pode obter respostas diferentes das mostradas aqui.

## Cenário de exemplo

Este código JavaScript cria três objetos `Person`, cada um com propriedades `name` e `age`. Depois, ele usa o nome de uma pessoa para obter e imprimir a idade dela.

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

## Exemplo de prompt 1

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

## Exemplo de resposta 1

Copilot sugere os seguintes padrões:

* **Padrão Singleton**: para garantir que haja apenas uma instância do objeto `people`.
* **Padrão Factory**: para desenvolver uma fábrica que cria objetos `Person`.
* **Padrão Module**: para encapsular o objeto `people` e as funções relacionadas em um módulo para evitar a poluição do namespace global.

## Exemplo de prompt 2

Agora você pode pedir Copilot para implementar o padrão que você acha mais apropriado.

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

## Exemplo de resposta 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");
```

O padrão de módulo aprimora a organização do código, aumenta a privacidade de dados e reduz o risco de conflitos de nomenclatura, tornando o código mais fácil de manter e escalar.

## Leitura adicional

* [Engenharia de prompts para o GitHub Copilot Chat](/pt/copilot/concepts/prompting/prompt-engineering)
* [Práticas recomendadas para usar GitHub Copilot](/pt/copilot/get-started/best-practices)