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.