Princípio do Aberto-Fechado, em pt-BR.
Este postulado define o seguinte:
Entidades de software devem ser abertas para extensão, mas fechadas para modificação.1
Em outras palavras:
- “aberta para extensão”: significa que o comportamento da classe pode ser extendido. Podemos fazer um método da classe se comportar de forma diferente de acordo com as mudanças exigidas pela aplicação ao qual ele pertence, ou para ir de encontro as necessidades de novas aplicações.
- ”fechadas para modificação”: o código fonte da classe é inviolável. Ninguém tem a permissão de alterar o código fonte original da classe para atender a novos requisitos da aplicação. O risco de alterar o código fonte da classe é que isso pode impactar no funcionamento de outras rotinas que dependem do comportamento dessa classe.
Com exemplo, vamos considerar a seguinte classe que representa as figuras geométricas quadrado e circulo.
e
Também temos uma classe que calcula a área dessas figuras e retornar o resultado na tela:
O problema da classe ShapeAreaCalculator
é que, cada vez que uma nova figura geométrica for adicionada, temos que adicionar um novo if
para verificar o tipo da figura, fazendo com que o método calc_area
fique cada vez maior. Em outras palavras, a classe ShapeAreaCalculator
não esta fechada para modificação.
Para iniciar os ajustes, vamos melhorar as classes de figuras geométricas criando uma classe base Shape
, que irá possuir um método area
, que será herdado por todas as figuras que extender essa classe:
Atualizando Square
e Circle
:
e
Agora, qualquer nova figura geométrica deve extender a classe Shape
e implementar seu próprio método area
. As classes de figura agora estão abertas para extensão e fechadas para modificação (não será necessário alterar nenhuma delas quando uma nova figura for adicionada).
Agora, vamos corrigir o método calc_area
de modo a deixá-lo fechado para modificação:
Agora, o método calc_area
está fechado para modificação. Independente do número de figuras geométricas que forem adicionadas na nossa aplicação.