Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Dúvida] Sobre o OCP

Eu entendi o conceito, mas de primeiro momento me pareceu estranho criar classes novas em vez de trabalhar nas que já existem. Imaginando que uma mesma classe desenrole 5 mudanças no ciclo de vida do projeto, desenvolveríamos 5 classes para atender as demandas. Não corremos o risco de não sabermos qual era a classe mais recente antes da nossa próxima melhoria?

Outra dúvida que me pegou foi a seguinte: as classes DefaultAdminService e ArquivamentoAdminService implementam a mesma interface pois compartilham os mesmos comportamentos. Mas e se a demanda do cliente exigir que adicionemos um novo método? Esse não deveria ser informado na interface? Caso adicionemos esse novo método na interface, todas as classes de implementações deverão ter esse novo método, e isso implica em mexer numa classe fechada, certo? Como resolver esse cenário?

2 respostas
solução!

Oi Fellipe, tudo bem?

É comum que, ao princípio, pareça estranho criar novas classes em vez de modificar as existentes. No entanto, esse princípio nos ajuda a manter o código mais estável e menos propenso a erros.

Quando temos uma classe que precisa passar por várias mudanças ao longo do ciclo de vida do projeto, é recomendado criar novas classes para atender às demandas específicas. Dessa forma, cada classe terá uma única responsabilidade e será mais fácil de entender e manter.

Quanto à preocupação de não saber qual classe é a mais recente antes da próxima melhoria, é importante manter um bom controle de versão do seu código. Utilizar um sistema de controle de versão, como o Git, pode ajudar a acompanhar as mudanças feitas em cada classe ao longo do tempo.

Em relação à sua segunda dúvida, quando temos classes que implementam a mesma interface, é verdade que, se adicionarmos um novo método na interface, todas as classes de implementação deverão ter esse novo método. Isso pode parecer uma violação do princípio OCP, pois estamos modificando uma classe fechada.

Uma maneira de resolver esse cenário é utilizar o padrão de design Strategy. Com esse padrão, você pode criar uma nova implementação da interface que inclua o novo método exigido pelo cliente. Dessa forma, você mantém a classe original fechada para alterações, mas pode adicionar novas implementações conforme necessário, mantendo o código aberto para extensões.

Por exemplo, suponha que você tenha a interface IAdminService e as classes DefaultAdminService e ArquivamentoAdminService que a implementam. Se o cliente exigir um novo método, você pode criar uma nova classe, como NovoAdminService, que implemente a interface IAdminService com o novo método. Em seguida, você pode usar a injeção de dependência para substituir a implementação padrão pela nova implementação quando necessário.

Espero que essas informações possam te ajudar a entender melhor o princípio OCP e como lidar com mudanças em suas classes.

Um abraço e bons estudos.

Vou tentar aplicar essa explicação na prática, e tentar digerir isso de criar novas classes em vez de mexer nas existentes. Também vou procurar conhecer mais sobre esse padrão Strategy.

Obrigado pelo help!