sábado, 6 de março de 2010

Design Pattern Adapter aplicado a Frameworks de terceiros

Caro leitor,
Venho compartilhar um pouco da minha experiência com design patterns para desenvolvimento.

Com a crescente demanda de tempo e produtividade, surgiu o mercado de Frameworks terceirizados, eles fornecem uma base de código que agiliza e melhora o desenvolvimento das aplicações.


Entretanto temos um incoveniente: Como garantir que sua aplicação irá funcionar se o Framework for atualizado?

Neste contexto entra o Padrão Adapter: o principal problema que pode, e acontece, é de alguma funcionalidade contida em uma versão presente do Framework, não ser mais suportada no futuro.

Se você tem uma aplicação desenvolvida utilizando esta funcionalidade não poderá atualizar o Framework sem fazer uma intervenção na sua aplicação.

Com o Padrão Adapter você também terá de fazer esta intervenção, mas esta será localizada em apenas um lugar e sua aplicação já estará rodando sobre a nova versão.

Vejam o exemplo abaixo:

Suponha que o Zend Framework deixe de dar suporte ao método Zend_Db_Table_Abstract::fetchAll() e o método recomendado seja Zend_Db_Table_Abstract::findAll()
Então vamos dizer que você tem uma aplicação com 30 Controllers, 30 modelos e etc...

Exemplo de código comprometido por alteração no Framework

DbTable Clientes: <?php class Application_Model_DbTable_Clientes extends Zend_Db_Table{ ... } ClientesController: <?php class ClientesController extends Zend_Controller_Action{ public function indexAction(){ $tabela = new Application_Model_DbTable_Clientes(); $rowset= $tabela->fetchAll(); ... ... } } 

Para cada classe que tiver esta chamada teremos que fazer a alteração.
O problema: Como garantir que sua aplicação funcione mesmo quando houver mudança em uma base de código terceirizada?
A solução: Criar uma camada intermediária entre a aplicação e a base de código, desta forma em uma alteração no código terceirizado, o problema poderá ser corrigido fazendo uma intervenção nesta camada intermediária.

Exemplo de adapters utilizando herança

Adapter ExtZend_Db_Table: (versão anterior à atualização do Framework) <?php class ExtZend_Db_Table extends Zend_Db_Table{ } Adapter ExtZend_Db_Table: (com as devidas correções para suportar o novo Framework) <?php class ExtZend_Db_Table extends Zend_Db_Table{ public function fetchAll($where = null, $order = null, $count = null, $offset = null) return $this->findAll($where,$order, $count,$offset); } } DbTable Clientes: <?php class Application_Model_DbTable_Clientes extends Zend_Db_Table ExtZend_Db_Table{ ... } ClientesController: <?php class ClientesController extends Zend_Controller_Action{ public function indexAction(){ $tabela = new Application_Model_DbTable_Clientes(); $rowset= $tabela->fetchAll();//sem nenhuma alteração ... ... } } 

  Como pode ser observado nos exemplos acima, foi criada uma classe ExtZend_Db_Table que estende de Zend_Db_Table sem nenhuma funcionalidade, apenas servindo de camada intermediária para uma possível alteração futura, assim a aplicação desenvolvida não utiliza diretamente as classes do Zend Framework, mas as classes do ExtZend.

Referências:

2 comentários:

  1. Muito boa a matéria, você tem boa didática e aborda o assunto de forma simples e clara.
    Parabéns, sucesso!

    ResponderExcluir
  2. Ae Reinaldo, legal o seu blog, também programo um pouco em PHP, to seguindo o seu blog, segue o meu também!

    http://thiago-programmer.blogspot.com/

    Abraços

    ResponderExcluir