Black November

ATÉ 50% OFF

TÁ ACABANDO!

0 dias

0 horas

0 min

0 seg

1
resposta

[Dúvida] Escalabilidade do UsuarioController

Vimos no projeto que o UsuarioController precisa injetar uma dependência para cada caso de uso, porém e se o Usuario tivesse diversos casos de uso, uns 10 por exemplo. Ficaria inviável colocar 10 argumentos no construtor do UsuarioController. Como eu poderia contornar isso?

Classe UsuarioController com seu construtor

Matricule-se agora e aproveite até 50% OFF

O maior desconto do ano para você evoluir com a maior escola de tecnologia

QUERO APROVEITAR
1 resposta

Olá, Luis! Como vai?

Essa é uma questão comum quando trabalhamos com muitos casos de uso em um controlador. Uma abordagem para resolver isso é utilizar um padrão de projeto chamado "Command Pattern" ou "Service Locator". Vou te explicar como cada um pode ajudar:

  1. Command Pattern:

    • Você pode criar uma interface comum para todos os casos de uso, por exemplo, UsuarioCommand.
    • Cada caso de uso implementaria essa interface.
    • No UsuarioController, você teria uma lista ou mapa de comandos em vez de injetar cada um individualmente.
    • Isso permite adicionar novos casos de uso sem modificar o construtor do controlador.
    public interface UsuarioCommand {
        void execute();
    }
    
    public class CriarUsuario implements UsuarioCommand {
        public void execute() {
            // lógica para criar usuário
        }
    }
    
    // No controlador
    private final Map<String, UsuarioCommand> comandos;
    
    public UsuarioController(Map<String, UsuarioCommand> comandos) {
        this.comandos = comandos;
    }
    
  2. Service Locator:

    • Você pode criar um serviço que localiza e fornece a instância correta do caso de uso.
    • Isso reduz a quantidade de dependências diretas no controlador.
    public class UsuarioServiceLocator {
        private final Map<String, Object> casosDeUso;
    
        public UsuarioServiceLocator() {
            casosDeUso = new HashMap<>();
            casosDeUso.put("criar", new CriarUsuario());
            // adicionar outros casos de uso
        }
    
        public Object getCasoDeUso(String nome) {
            return casosDeUso.get(nome);
        }
    }
    
    // No controlador
    private final UsuarioServiceLocator serviceLocator;
    
    public UsuarioController(UsuarioServiceLocator serviceLocator) {
        this.serviceLocator = serviceLocator;
    }
    

Essas abordagens ajudam a manter o controlador mais limpo e escalável. Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.