Skip to main content

Refatorando para implementar um padrão de design

O Copilot Chat pode sugerir padrões de design que você pode usar para aprimorar 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.

O Copilot Chat pode ajudar você a usar padrões de design apropriados para tornar seu código mais flexível e fácil de manter. 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. Respostas do Copilot Chat 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 recuperar e imprimir a idade dela.

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

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

Exemplo de resposta 1

O Copilot sugere os seguintes padrões:

  • Padrão Singleton: para garantir que haja apenas uma instância do objeto people.
  • Padrão Factory: para criar uma fábrica para criar 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 que o Copilot implemente o padrão que você acha mais apropriado.

Refactor this code using the module pattern

Exemplo de resposta 2

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