Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Open-Closed Principle

Caso eu queira adicionar um novo comando, eu teria que adicionar mais uma cláusula no switch e um println do começo, isso não feriria o Open-Closed Principle ?? se sim, como resolver ?

1 resposta
solução!

Olá, Pedro! Tudo bem?

O Open-Closed Principle (OCP) é um princípio de design de software que afirma que "software entities (classes, modules, functions, etc.) should be open for extension, but closed for modification". Isso significa que você deve ser capaz de adicionar novas funcionalidades ou comportamentos a uma entidade de software sem alterar seu código existente.

No caso do código que você está trabalhando, sempre que você quiser adicionar um novo comando, você terá que adicionar um novo caso ao seu switch. Isso, de fato, viola o OCP.

Uma maneira de resolver isso seria usar um padrão de design chamado Command Pattern. Em vez de ter um switch que decide qual comando executar, você teria uma interface de comando que define um método execute(). Cada comando específico seria uma classe que implementa essa interface e fornece a implementação específica do método execute().

Aqui está um exemplo de como isso poderia parecer:

public interface Command {
    void execute();
}

public class ListarAbrigoCommand implements Command {
    @Override
    public void execute() {
        // Código para listar abrigos
    }
}

public class CadastrarAbrigoCommand implements Command {
    @Override
    public void execute() {
        // Código para cadastrar abrigos
    }
}

Então, em vez de um switch, você teria um mapa de comandos:

Map<Integer, Command> commands = new HashMap<>();
commands.put(1, new ListarAbrigoCommand());
commands.put(2, new CadastrarAbrigoCommand());
// Adicione mais comandos conforme necessário

E, finalmente, para executar um comando, você faria algo assim:

int opcaoEscolhida = // obtenha a opção escolhida pelo usuário
Command command = commands.get(opcaoEscolhida);
if (command != null) {
    command.execute();
} else {
    // Trate o caso em que o usuário digitou uma opção inválida
}

Dessa forma, sempre que você quiser adicionar um novo comando, você só precisa criar uma nova classe que implementa a interface Command e adicionar uma entrada para ela no mapa de comandos. O código existente não precisa ser alterado, o que está em conformidade com o Open-Closed Principle.

Espero ter ajudado e bons estudos!