{"meta":{"title":"Refatorando para implementar um padrão de design","intro":"Copilot Chat pode sugerir padrões de design que você pode usar para melhorar seu código.","product":"GitHub Copilot","breadcrumbs":[{"href":"/pt/copilot","title":"GitHub Copilot"},{"href":"/pt/copilot/tutorials","title":"Tutoriais"},{"href":"/pt/copilot/tutorials/copilot-cookbook","title":"Livro de receitas do GitHub Copilot"},{"href":"/pt/copilot/tutorials/copilot-cookbook/refactor-code","title":"Refatorar o código"},{"href":"/pt/copilot/tutorials/copilot-cookbook/refactor-code/refactor-design-patterns","title":"Refatorar padrões de design"}],"documentType":"article"},"body":"# Refatorando para implementar um padrão de design\n\nCopilot Chat pode sugerir padrões de design que você pode usar para melhorar seu código.\n\nCó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.\n\nCopilot 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.\n\n> \\[!NOTE] As respostas descritas neste artigo são exemplos.\n> Copilot Chat as respostas são não determinísticas, portanto, você pode obter respostas diferentes das mostradas aqui.\n\n## Cenário de exemplo\n\nEste 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.\n\n```javascript id=person-module\nclass Person {\n  constructor(name, age) {\n    this.name = name;\n    this.age = age;\n  }\n}\n\nvar people = {};\n\nfunction addPerson(name, age) {\n  people[name] = new Person(name, age);\n}\n\nfunction getAge(name) {\n  if (people[name]) {\n    console.log(name + \" is \" + people[name].age + \" years old.\");\n  } else {\n    console.log(\"Person not found.\");\n  }\n}\n\naddPerson(\"Ana\", 30);\naddPerson(\"Mario\", 25);\naddPerson(\"Louise\", 40);\n\ngetAge(\"Mario\");\n```\n\n## Exemplo de prompt 1\n\n```copilot copy prompt ref=person-module\nWhat design patterns could improve this code? Don't show me code examples.\n```\n\n## Exemplo de resposta 1\n\nCopilot sugere os seguintes padrões:\n\n* **Padrão Singleton**: para garantir que haja apenas uma instância do objeto `people`.\n* **Padrão Factory**: para desenvolver uma fábrica que cria objetos `Person`.\n* **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.\n\n## Exemplo de prompt 2\n\nAgora você pode pedir Copilot para implementar o padrão que você acha mais apropriado.\n\n```copilot copy prompt ref=person-module\nRefactor this code using the module pattern\n```\n\n## Exemplo de resposta 2\n\n```javascript\nconst PersonModule = (function() {\n  class Person {\n    constructor(name, age) {\n      this.name = name;\n      this.age = age;\n    }\n  }\n\n  const people = {};\n\n  function addPerson(name, age) {\n    people[name] = new Person(name, age);\n  }\n\n  function getAge(name) {\n    if (people[name]) {\n      console.log(name + \" is \" + people[name].age + \" years old.\");\n    } else {\n      console.log(\"Person not found.\");\n    }\n  }\n\n  return {\n    addPerson,\n    getAge\n  };\n})();\n\nPersonModule.addPerson(\"Ana\", 30);\nPersonModule.addPerson(\"Mario\", 25);\nPersonModule.addPerson(\"Louise\", 40);\n\nPersonModule.getAge(\"Mario\");\n```\n\nO 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.\n\n## Leitura adicional\n\n* [Engenharia de prompts para o GitHub Copilot Chat](/pt/copilot/concepts/prompting/prompt-engineering)\n* [Práticas recomendadas para usar GitHub Copilot](/pt/copilot/get-started/best-practices)"}