Motivação

Olá pessoal, vamos ver nesta tips um pouco sobre padrões de projeto no PHP.

Sem dúvida o que não falta hoje são opções de linguagens orientadas a objetos para desenvolvermos nossos projetos, seja para desktop ou mesmo para Web o fato e que não são raras as situações que os programadores se encontram. Eles acabam sendo vitimas de suas próprias armadilhas, usam tanto a herança que ao se modificar um simples método na classe cliente, por exemplo, todo o modelo para de funcionar, ou pelo menos não funciona mais como deveria. Isso se deve ao fato do projeto está totalmente acoplado, os mais otimistas dizem “Integrado”. Porem se repararmos em todos os projetos que vamos desenvolver passa pelos mesmos problemas.

Na década de 70 um engenheiro civil chamado Cristopher Alexander começou e reparar que embora muito diferentes, as construções daquela época seguiam um padrão de arquitetura, da menor a mais sofisticada, todas passavam pelos mesmos problemas e que as soluções para estes problemas eram quase sempre as mesmas.

Foi ai que ele decidiu catalogar esses problemas e apresentar para cada um deles uma solução comum. Daí surgiu a bíblia da Engenharia Civil (The Timeless Way of Building) que tratava exatamente de padrões para construção na área da engenharia civil.

Segundo Christopher Alexander, "Cada Pattern descreve um problema o qual ocorre repetidamente em nosso ambiente, e então descreve um conjunto de soluções para este problema, de maneira que você possa usar esta solução um milhão de vezes, sem o fazer da mesma maneira duas vezes."

Foi ai que tudo começou, pois foi a partir deste trabalho que Eric Gama e seus amigos decidiram escrever padrões de projetos porem aplicados ao desenvolvimento softwares orientados a objetos e em 1995 lançaram a bíblia do desenvolvimento de software Design Patterns: Elements of Reusable Object-Oriented Software” - 1995 que veio a ser o ponto de referencia para todo programador que desenvolve OO.

Os padrões do GOF (Gang of Four), como são conhecidos, são divididos em três categorias: Criacionais, Estruturais e Comportamentais.

Criacionais

Padrões criacionais abstraem o processo de instanciação. Ajudam a criar um sistema independente de como o objeto é criado, composto e representado. Exemplo:

  • Singleton;
  • Propotype;
  • Factory Method;
  • Abstract Factory;
  • Builder.

Estruturais

Padrões estruturais definem como as classes e os objetos são compostos para dar forma a estruturas maiores. Exemplo:

  • Adapter;
  • Composite;
  • Façade;
  • Proxy.

Comportamentais

Padrões comportamentais definem a maneira pela quais iremos interagir com as classes e objetos e como eles interagem entre si.

Exemplo:

  • Iterator;
  • Observer;
  • State;
  • Strategy;
  • Template Method.

Os padrões GOF são no total de 23, aqui eu destaquei apenas os principais.

Esses padrões não pertencem a esta ou aquela linguagem, eles são na verdade boas praticas de desenvolvimento de softwares que se utilizadas nos garantem que evitaremos uma serie de problemas comuns no desenvolvimento de software. Portanto para utilizarmos no PHP devemos apenas seguir essas padrões no desenvolvimento de nossas classes e Objetos. E lembre-se um patterns é classificado segundo o problema que ele resolve e não quanto ao local em que e implementado.

A seguir veremos com mais detalhe dois tipos de padrão.

Singleton

Há caso em que se faz necessário garantir que uma e apenas uma instância de uma classe possa estar em uso no nosso modelo, um bom exemplo seria uma classe usuario, para que ter dois objetos quando um já seria suficiente. Este é um problema e para eles temos um pattern então pra que reinventar a roda? Observe:

class Usuario{
          static private $instance = null;
          private $nome;
          private $senha;
          private function __construct(){
 
          }
 
          static function getinstance(){
                 if (self::$instance == null){
                     self::$instance = new Usuario;
                 }
                     return self::$instance;
          }

Veja que o construtor da classe usuário e private e isso tem um motivo claro. Não podemos permitir que um novo usuário seja criado pelo método new e sim através da função estática getinstance e esta se encarrega de criar um novo objeto ou retorna um já existente. Com isso garantirmos que um e somente um usuário estará instanciado por vez.

Factoty Method

Em outros casos precisamos concentrar a maneira como os nossos objetos são criados em um mesmo lugar e com isso se uma nova regra surgir em relação a criação desses objetos alteramos em apenas um local. Para isso criamos uma classe central que fica responsável por criar nossos objetos.

    interface ICarro{
       function Ligar();
    }
 
    class Gol implements ICarro{
          function Ligar(){echo "Gol Ligado !!!!"; }
    }
 
    class Palio implements ICarro{
          function Ligar(){echo "Palio Ligado !!!!"; }
    }

Temos ai duas classes que implementam a mesma interface que possui um método Ligar() que e implementado de maneira pertinente a cada classe. Agora criaremos uma classe que ficara encarregada de criar nossos objetos:


class FactoryCar{
   static function CriarCarro($marca){
     switch ($marca){
        case "Gol":  $obj = new Gol;
                         $obj->Ligar();
        break;
        case "Palio": $obj = new Palio;
                          $obj->Ligar();
     }
   }
}

Basta agora fazermos uso desta ultima classe para instanciarmos nossos objetos:

FactoryCar::CriarCarro(“Palio”);  ou FactoryCar::CriarCarro(“Gol”);

Sem duvida programar com PHP 5 é muito mais eficiente do que em outras versões. Temos disponíveis hoje recursos que nos permitem criar aplicações profissionais. Lembre-se Orientação a Objetos não é uma característica desta ou daquela linguagem é uma filosofia de desenvolvimento que aliada a padrões nos permitem atingir a excelência em nossos projeto.