
Todo software sofre evolução. É difícil pensar em um software que seja feito e nunca receba algum tipo de manutenção. Então, estamos sempre pensando em adicionar uma nova funcionalidade em nosso software e, sendo assim, pensamos logo em modificarmos o código para acrescentar o que é necessário, mas evitar modificações é uma boa prática. Quanto maior o número de modificações uma classe sofre, maior a probabilidade de erros, menor a sua confiabilidade, maior o risco ao se acoplada por outra classe e pior se torna a sua manutenabilidade. Mas como o software evolui evitando modificar o código que está nele? A solução está em estender o código e não modificar o que já está pronto.
Em um projeto orientado a objetos, quando precisamos adicionar um comportamento ou funcionalidade nova, espera-se que as classes responsáveis possam ser estendidas e um novo trecho de código possa a ser escrito. O segredo está em tornar nossas classes possíveis de serem estendidas para que assim evitemos modificá-las. Exemplificando, vamos no maior número de casos possíveis estar criando novas classes para novas funcionalidades ao invés modificar classes já existentes.
O Princípio do Aberto Fechado, que faz parte do SOLID, estipula que toda a classe deve estar aberta para ser estendida e fechada para ser modificada. Esse princípio zela de forma indireta pela estabilidade do código das classes e pelos controle dos riscos dos acoplamentos, pois modificações em códigos podem gerar novos erros em uma classe que talvez já estivesse estável e consequentemente as classes do acoplamento refletirão esse erro como em um “efeito dominó”. Evitando modificações nos códigos e priorizando extensões, o código é mantido intacto, confiável e os acoplamentos passam a ter o risco reduzido. Criar código extensível é uma responsabilidade do desenvolvedor maduro, utilizar design duradouro para um software de boa qualidade e manutenibilidade. Mas como fazer com que suas classes estejam abertas para a extensão e fechadas para as modificações? Através das abstrações. O famoso “programar voltado pra interfaces”, tópico que pretendo falar melhor mais à frente.
Quando aprendemos sobre orientação a objetos com certeza ouvimos sobre abstração, é ela que permite que este princípio funcione. Se um software possui abstrações bem definidas logo ele estará aberto para extensão.