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.