Não é incomum ao desenvolvermos um sistema de informação encontrarmos várias vezes o mesmo problema de programação. A solução que muitos encontram é copiar e colar código. Em um projeto grande o que acaba acontecendo é que no MESMO sistema o MESMO problema é programado de forma diferente por cada programador. Isto realmente não é uma boa solução. Por isto alguns programadores enfrentam um problemão quando precisam alterar ou continuar um projeto feito por outro que não seguiu padrão nenhum. Uma solução muito melhor e largamente aceita é o uso de Design Patterns (Padrões de Projeto). Um Design Pattern é um padrão para solução de um problema comum amplamente testado e aceito. Por isto, sempre que possível, é aconselhado o uso destes padrões, pois isto facilitará a manutenção e legibilidade de nosso código. Outra vantagem é que outros programadores (se conhecerem Padrões de Projeto) poderão continuar nossos trabalhos com facilidade já que conhecem a solução que adotamos. Assim sendo toda a equipe de desenvolvimento será beneficiada. Por esta razão os Design Patterns são considerados formas de descrever as melhores práticas em programação*.
* Design Patterns não se referem apenas a padrões a serem usados em sistemas de informação. Outras áreas das ciências utilizam este conceito
O próximo passo é conhecermos e implementarmos um design pattern como exemplo.
Factory
Segundo a documentação do PHP “o padrão Factory permite a instanciação de objetos em tempo de execução. É chamado de Factory uma vez que é responsável por ‘produzir’ um objeto. O Factory parametrizado recebe como argumento o nome da classe para instanciar.”
Vamos agora implementar nosso próprio factory. Para isto criaremos uma classe chamada ‘FactoryPattern’ com apenas um método estático – factory. Este método receberá como parâmetro o nome da classe para instanciar e retornará um novo objeto desta classe OU uma Exception caso o arquivo desta classe não seja encontrado. Criaremos assim um padrão factory exatamente aos moldes da solução proposta pela documentação do PHP.
Na solução que produzi utilizei a classe RecursiveDirectoryIterator. A finalidade disto é explicada no próprio código da classe ‘FactoryPattern’. Caso você queira saber mais sobre DirectoryIterator clique aqui.
Obs.: Não foi incluída no código a classe “Cliente” usada no exemplo
<?php
/**
* Classe responsável pela criação dos objetos do sistema
* @author Lucas Soler
* @copyright Copyright 2009 Lucas Soler
* @package www
* @subpackage www
* @version 1.0
*/
class FactoryPattern
{
/**
* Cria um objeto da classe passada como parâmetro varrendo
* o diretório informado recursivamente em busca do arquivo da classe
* @access public
* @param string $class Classe do objeto a ser instanciado
* @exception A classe informada não foi localizada
* @return object Retorna um objeto genérico
*/
public static function factory($classe)
{
//Nome do diretório onde estão as classes ou/e subdiretórios de classes do sistema. No nosso caso será o diretório "classes"
$diretorio = ".";
$arqs = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($diretorio));
foreach($arqs as $name => $arq){
if($arq->isFile()){
/* Se o arquivo corrente for o que armazena a classe
do parâmetro um objeto desta classe é instanciado e retornado */
if($arq->getFilename() == $classe.".php" || $arq->getFilename() == $classe.".class.php"){
include_once $arq->getPathname();
return new $classe;
}
}
}
// Caso a classe não exista uma exceção é lançada
throw new Exception ("A classe {$classe} não foi encontrada!");
}
}
$cliente = FactoryPattern::factory("Cliente");
echo $cliente->__get("nome");
?>