SOLID Padrões de Projeto Open Closed.
SOLID Padrões de Projeto Open Closed, este é o segundo post sobre SOLID.
Classes devem ser abertas para serem estendidas(herança), mas fechadas para serem modificadas.
Uma classe é aberta quando somos capazes de estender está classe por herança. Oque é herança em Orientação Objetos? Bom, vamos relembrar um pouco sobre isto.
A herança é um recurso utilizado na POO, para que uma outra classe possa reaproveitar a estrutura de uma outra classe. Exemplo prático: Temos uma classe para representar os
funcionários de uma empresa ela é capaz de representar as características e comportamentos gerais dos funcionários e temos no sistemas outros tipos de funcionários: como o gerente,
contador e o estagiário. Todos são funcionários, mas cada um tem algumas regras específicas que serão tratadas em uma nova classe, como por exemplo um método para calcular o salário.
Isso permite a classe filho herdar os métodos e propriedades da sua classe pai.
Vamos ver isso com um exemplo prático.
Temos uma classe responsável por conectar com o servidor
A nossa classe se conecta ao nosso servidor por ftp.
class Conexao { public $host; public $port; public $stusuario; public $stsenha; function conectarFtp() { } }
Agora queremos uma classe para conectar por ssh. A nossa classe conexão, vai precisar ser alterada para atender a este novo recurso.
Então seguem as alterações:
class Conexao { public $host; public $port; public $stusuario; public $stsenha; public function conectarFtp() { } public function conectarSSH() { } }
Foi preciso alterar a nossa classe Conexão e isso quebra o que foi proposto no princípio aberto/fechado. (Aberto para extensão e fechado para alteração).
Agora vamos refatorar esse código: interface Conexao { public function conectarServidor() } class Ftp implements Conexao { public function conectarServidor() { echo 'Conecta por ftp no servidor'; } } class SSH implements Conexao { public function conectarServidor() { echo 'Conecta por ssh no servidor'; } }
Desta forma a nossa classe segue o principio aberto/fechado.
E caso seja preciso adicionar um novo protocolo para conexão com servido, nós criamos uma nova classe que implemente a nossa interface.