Este é provavelmente o mais difícil dos princípios sólidos de explicar. Deixe-me tentar. Imagine que você escreveu uma classe de fatura que funciona perfeitamente e não possui bugs. Faz um PDF de uma fatura.
Então alguém diz que quer uma fatura HTML com links nela. Você não altera nenhum código na fatura para atender a essa solicitação. Em vez disso, você cria outra classe, HTMLInvoice, que faz o que deseja agora. Você aproveita a herança para não precisar escrever muito código duplicado no HTMLInvoice.
O código antigo que estava usando a fatura antiga não é quebrado ou realmente afetado de forma alguma. O novo código pode usar HTMLInvoice. (Se você também usar a Substitutability Liskov , o L sólido, poderá fornecer instâncias HTMLInvoice ao código existente que espera instâncias de Invoice.) Todo mundo vive feliz para sempre.
A fatura é fechada para modificação, aberta para extensão. E você deve escrever a fatura corretamente com antecedência para que isso funcione.
Você já leu o artigo The Open-Closed Principle, dos amigos do tio Bob no ObjectMentor? Eu acho que é uma das melhores explicações por aí.
fonte
A resposta de Kate Gregory é muito boa, mas considere uma situação diferente em que um novo requisito pode ser atendido por uma mudança relativamente pequena na
Invoice
classe existente . Por exemplo, digamos que um novo campo deve ser adicionado ao PDF da fatura. De acordo com o OCP, ainda devemos criar uma nova subclasse, mesmo que o novo campo possa ser adicionado na implementação existente, alterando algumas linhas de código.No meu entender, o OCP reflete a realidade dos anos 80 e início dos anos 90, onde os projetos nem sequer usavam controle de versão, muito menos tinham testes de regressão automatizados ou o benefício de ferramentas sofisticadas de refatoração. OCP foi uma tentativa de evitar o risco de quebra de código que havia sido testado e colocado manualmente em produção. Hoje, temos melhores maneiras de gerenciar o risco de quebrar o software de trabalho (sistemas de controle de versão, TDD e testes automatizados e ferramentas de refatoração).
fonte
Pessoalmente, acho que esse princípio deve ser tomado com uma pitada de sal. O código é orgânico, as empresas mudam e o código muda de acordo com as necessidades de uma empresa à medida que o tempo passa.
Acho muito difícil entender o fato de que a abstração é fundamental. E se a abstração estivesse originalmente errada? E se a função comercial tiver mudado significativamente?
Esse princípio garante essencialmente que as intenções e o comportamento ORIGINAL de um design nunca devem mudar. Isso provavelmente funciona para aqueles que têm APIs públicas e seus clientes têm problemas para acompanhar os novos lançamentos e alguns outros casos extremos. No entanto, se uma empresa possui TODO o código, desafio esse princípio.
Ter uma boa cobertura de teste do seu código deve facilitar a refatoração da sua base de códigos. Isso significa que não há problema em fazer as coisas erradas - seus testes ajudarão a guiá-lo para um design melhor.
Dizendo que, se não houver nenhum teste, esse princípio é válido.
fonte