Padrão de Projeto – Builder


A complexidade de um software é bem interessante. Os requisitos de uma aplicação são complexos como as funcionalidades e equivalentes  ao código que é gerado para construir as funcionalidades. O objetivo do Design Pattern Builder é abordar a criação de modo a favorecer a manutenabilidade, uma arquitetura integra e reduzir a complexidade. Com a quantidade de objetos complexos que compõem a maioria dos repositórios de software, uma solução é o Design Pattern Builder facilita trabalhar com eles.

Name: Builder

O Design Pattern Builder define a arquitetura de um objeto para manipular a criação de objetos complexos.

Problema e Solução

Quando uma classe é instanciada, tecnicamente gera um objeto completo. Alguns objetos tem seu escopo bem definido e podem sem usados e propagados para outros objetos. Mas existem objetos mais “complexos” que necessitam a execução de alguns outros métodos publicos para que seu objeto seja considerado “completo”.

É importante intender que quando me refiro a “complexo”, digo no contexto da quantidade de passos, métodos, que são necessários serem executados para montarmos um objeto com todas as suas caracteristicas.

Quando um objeto “complexo” é escrito, uma arquitetura comum gira em torno do método construtor. Alguns desenvolvedores acreditam que a lógica de toda a criação de um objeto deve estar contida no construtor. Outros reconhecem que faz mais sentido distribuir a lógica em vários métodos adicionais. Nenhuma destas soluções são muito flexíveis. Na verdade, eles são fundamentalmente uma solução errada.

Pode ser que seja necessário o construtor gerar um objeto baseado em uma regra de negócios. Neste caso em particular, as regras de negócios já devem ter sido escritas e testadas. Pois somente parte do objeto será definida. De fato, se todas as partes estiverem completamente definida, pode causar outros resultados imprevisíveis, pois a regra de negócio pode gerar um resultado errado.

UML

O diagrama detalha um Design de Classes utilizando o Design Pattern Builder

Design Patter Builder

Design Patter Builder

 

Exemplo de Código

Este projeto contém uma classe que cria um objeto complexo de produto. Essa classe contém três métodos necessários para tornar o objeto completo. Se um dos métodos não for chamado quando o objeto for criado, a classe não estará completa, faltando atributos a serem definidos o que pode gerar algum tipo de erro durante o processo de execução da aplicação. Os métodos que me refiro são os setTipo(), setCor() e setTamanho(). A versão inicial deste código foi desenhado para que a criação seja seguida da execução deste métodos.

class produto {

protected $_tipo = ”;

protected $_tamanho = ”;

protected $_cor = ”;

public function setTipo ($tipo){

$this->_tipo = $tipo;

}

public function setTamanho ($tamanho){

$this->_tamanho = $tamanho;

}

public function setCor ($cor) {

$this->_cor = $cor;

}

}

Para criar um objeto completo de  Produto é necessário definir toda a configuração individualmente por cada um dos métodos da classe Produto.

// a nós recebemos a nossa configuração do produto por alguma outra funcionalidade;

$produtoConfiguracao = array(‘tipo’=>’shirt’, ‘tamanho’=>’XL’, ‘cor’=>”vermelho”);

$produto = new  Produto();

$produto->setTipo($produtoConfiguracao[‘tipo’]);

$produto->setTamanho($produtoConfiguracao[‘tamanho’]);

$produto->setCor($produtoConfiguracao[‘cor’]);

Neste caso precisamos chamar cada um destes métodos quando o objeto é criado, isso não é uma boa prática. Entretanto um objeto deve ser baseado no Design Pattern Builder para a criação da sua instancia para seguir as boas práticas.

A classe produtoBuilder é arquitetada pra aceitar as opções de configuração necessárias para gerar um objeto completo de Produto. O produtoBuilder armazena todas as opções de configuração e uma instancia da classe de Produto. O método build() é responsável por chamar cada método do objeto Produto e assim gerar um objeto completo. Finalmente o método getProduto() retorna o objeto Produto gerado pelo build().

class produtoBuilder {

protected $_produto = null;

protected $_configuracao = null;

public function __construct ($configuracao){

$this->_produto = new produto();

$this->_configuracao = $configuracao

}

public function build () {

$this->_produto->setTamanho($this->_configuracao[‘tamanho’]);

$this->_produto->setTipo($this->_configuracao[‘tipo’]);

$this->_produto->setCor($this->_configuracao[‘cor’]);

}

public function getProduto(){

return $this->_produto;

}

}

Observe que o método build() executa todas as chamadas necessárias para a criação completa de uma instância do objeto Produto. Se no futuro a classe produto sofrer alguma alteração, somente o método build() da classe produtoBuilder deverá ser alterado. O código abaixo demonstra como é a criação de um objeto Produto usando a classe produtoBuilder.

$builder = new produtoBuilder($produtoConfiguracao);

$builder->build();

$produto = $builder->getProduto();

O Design Pattern Builder eliminou a construção complexa do objeto Produto. O Design Pattern Builder não é a única boa prática para isso, mas ajuda a reduzir as chances que as alterações corriqueiras em objetos complexos necessitem uma avaliação de todos os pontos que deverão ser alterados.

Você pode seguir este artigo através do RSS 2.0 feed. Você pode deixar uma resposta, ou trackback do seu próprio site.

2 Comments »

 
 

Deixe um Comentário

Time limit is exhausted. Please reload CAPTCHA.

*