Existem muitas heurísticas associadas ao design orientado a objetos. Por exemplo, “todas as variáveis de membro devem ser privadas” ou “variáveis globais devem ser evitadas” ou “o uso da identificação do tipo de tempo de execução (RTTI) é perigoso”. Qual é a fonte dessas heurísticas? O que os torna verdadeiros? Eles sempre são verdadeiros? Esta coluna investiga o princípio de design subjacente a essas heurísticas - o princípio aberto-fechado.
Como disse Ivar Jacobson: “Todos os sistemas mudam durante seus ciclos de vida. Isso deve ser lembrado ao desenvolver sistemas que duram mais que a primeira versão. ”Como podemos criar designs estáveis diante das mudanças e que durarão mais que a primeira versão? Bertrand Meyer nos deu orientação desde 1988, quando cunhou o agora famoso princípio de aberto-fechado. Parafraseando-o:
ENTIDADES DE SOFTWARE (CLASSES, MÓDULOS, FUNÇÕES, ETC.) DEVEM SER ABERTAS PARA EXTENSÃO, MAS FECHADAS PARA MODIFICAÇÃO.
Quando uma única alteração em um programa resulta em uma cascata de alterações nos módulos dependentes, esse programa exibe os atributos indesejáveis que passamos a associar ao design “ruim”. O programa se torna frágil, rígido, imprevisível e irrecusável. O princípio aberto-fechado ataca isso de uma maneira muito direta. Diz que você deve projetar módulos que nunca mudam . Quando os requisitos mudam, você amplia o comportamento de tais módulos adicionando novo código, não alterando o código antigo que já funciona.
Descrição
Módulos que estão em conformidade com o princípio aberto-fechado têm dois atributos principais.
- Eles são "abertos para extensão".
Isso significa que o comportamento do módulo pode ser estendido. Que possamos fazer com que o módulo se comporte de maneiras novas e diferentes conforme os requisitos do aplicativo mudam, ou para atender às necessidades de novos aplicativos.
- Eles estão "fechados para modificação".
O código fonte desse módulo é inviolável. Ninguém tem permissão para fazer alterações no código fonte.
Parece que esses dois atributos estão em desacordo. A maneira normal de estender o comportamento de um módulo é fazer alterações nesse módulo. Pensa-se que um módulo que não pode ser alterado tenha um comportamento fixo. Como esses dois atributos opostos podem ser resolvidos?
A abstração é a chave ...