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.