1
resposta

[Sugestão] Melhoria na Implementação do Método criaNovo usando Polimorfismo

Na implementação original da classe Controller, o método criaNovo recebe os dados para criação diretamente do corpo da requisição (req.body). No entanto, para a rota de matrícula (/pessoas/:estudanteId/matriculas), o estudante_id deveria ser extraído dos parâmetros da URL (req.params.estudanteId).

Implementação original na classe Controller:

async criaNovo(req, res) {
  const dadosParaCriacao = req.body;
  try {
    const novoRegistroCriado = await this.entidadeService.criaRegistro(
      dadosParaCriacao
    );
    return res.status(200).json(novoRegistroCriado);
  } catch (erro) {
    // erro
  }
}

Problema

Essa implementação funciona para a maioria dos casos, mas, no contexto das matrículas, o estudante_id precisa ser extraído do req.params.estudanteId e incluído nos dados de criação do registro. O método da superclasse Controller não prevê esse cenário.

Solução: Aplicação de Polimorfismo

Para resolver essa limitação, sobrescrevemos o método criaNovo na MatriculaController, garantindo que o estudante_id seja corretamente atribuído.

Implementação na MatriculaController:

async criaNovo(req, res) {
  const estudanteId = req.params.estudanteId;
  const dadosParaCriacao = req.body;

  try {
    const estudanteEncontrado = await matriculaServices.pegaUmRegistroPorId(
      estudanteId
    );

    if (!estudanteEncontrado) {
      return res.status(404).json({ message: "Estudante informado inválido" });
    }
    const novoRegistroCriado = await this.entidadeService.criaRegistro({
      ...dadosParaCriacao,
      estudante_id: estudanteId,
    });
    return res.status(200).json(novoRegistroCriado);
  } catch (erro) {
    // erro
  }
}

Vantagens

  • Mantém a estrutura base da superclasse Controller, evitando duplicação de código desnecessária.
  • Garante que o estudante_id seja extraído corretamente dos parâmetros da rota.
  • Mantém a coesão e reaproveitamento de código utilizando herança e polimorfismo.

Essa abordagem melhora a flexibilidade do código, permitindo a reutilização do método criaNovo para diferentes entidades sem comprometer a necessidade específica da rota de matrícula.

O que acham dessa solução?

1 resposta

Olá Aldeny! Tudo joia?

Sua sugestão de melhoria na implementação do método criaNovo utilizando polimorfismo é uma abordagem muito interessante e eficaz para lidar com cenários específicos, como o da rota de matrícula. Ao sobrescrever o método na MatriculaController, você garante que o estudante_id seja corretamente extraído dos parâmetros da URL e incluído nos dados de criação, o que é essencial para o funcionamento correto dessa rota.

A vantagem de usar polimorfismo aqui é que você mantém a estrutura base da superclasse Controller, evitando duplicação de código e garantindo que as necessidades específicas de cada rota sejam atendidas. Isso também melhora a coesão e o reaproveitamento de código, já que você está utilizando herança para adaptar o comportamento de métodos genéricos a contextos específicos.

Seu exemplo é claro e mostra bem como a herança e o polimorfismo podem ser aplicados para resolver problemas de design em APIs. Isso não só melhora a flexibilidade do código, mas também facilita a manutenção e a expansão futura do sistema.

B estudos!