O princípio de aberto-fechado (OCP) afirma que um objeto deve estar aberto para extensão, mas fechado para modificação. Acredito que entendo e uso em conjunto com o SRP para criar classes que fazem apenas uma coisa. E tento criar muitos métodos pequenos que possibilitam extrair todos os controles de comportamento em métodos que podem ser estendidos ou substituídos em alguma subclasse. Assim, termino com classes que têm muitos pontos de extensão, seja através de: injeção e composição de dependências, eventos, delegação, etc.
Considere o seguinte uma classe simples e extensível:
class PaycheckCalculator {
// ...
protected decimal GetOvertimeFactor() { return 2.0M; }
}
Agora diga, por exemplo, que as OvertimeFactor
alterações para 1,5. Como a classe acima foi projetada para ser estendida, eu posso facilmente subclasses e retornar uma diferente OvertimeFactor
.
Mas ... apesar da classe ser projetada para extensão e aderência ao OCP, modificarei o método único em questão, em vez de subclassificar e substituir o método em questão e depois reconectar meus objetos no meu contêiner de IoC.
Como resultado, violei parte do que o OCP tenta realizar. Parece que estou apenas com preguiça, porque o exposto acima é um pouco mais fácil. Estou entendendo mal o OCP? Eu realmente deveria estar fazendo algo diferente? Você aproveita os benefícios do OCP de maneira diferente?
Atualização : com base nas respostas, parece que este exemplo artificial é ruim por várias razões diferentes. O principal objetivo do exemplo era demonstrar que a classe foi projetada para ser estendida, fornecendo métodos que, quando substituídos, alterariam o comportamento de métodos públicos , sem a necessidade de alterar o código interno ou privado. Ainda assim, eu definitivamente não entendi o OCP.