Por que plugins salvam a sua vida?

Em Seg, 2005-12-19 às 14:50 -0200, Donato Azevedo escreveu:
explicando o contexto:
> a empresa aonde trabalho mantem uma aplicação web sob tres versoes
> diferentes (3 produtos) que dividem grande parte parte do código mas
> sao mantidos em arvores diferentes no cvs. Deste modo:
> 1. Nao existe uma versao basica a partir da qual se possa criar uma
> nova do zero, ou vender como uma solução mínima para alguem
> 2. Um bug encontrado em uma versao deve ser corrigido e testado nas
> outras 2.... Isto porque só temos 2! se fossem 30......
      

Você chegou ao problema que todos que desenvolvem sistemas de informação como produtos (software houses) inevitavelmente um dia vão chegar :)

A questão é, você precisa atender necessidades diferentes mas ainda assim tem uma porção de códigos que fazem a mesma coisa, por exemplo, para o cliente A você precisa que tal regra seja assim e para o cliente B tal regra tem que ser assada.

Depois de muitos anos montando arquiteturas de sistemas de informação, eu cheguei a dois termos:

Na verdade, o ideal seria os dois, mas se você sabe que vai estar trabalhando na mesma linguagem sempre, e se os mecanismos de comunicação do seu aplicativo já estão consolidados (o que pode ser simplesmente um módulo chamando outro), o primeiro já vai salvar a sua vida.

Como isso funciona?

Em primeiro lugar, você precisa estabelecer uma interface (no caso, a regra em que falei), e então você precisa estabelecer as implementações dessa interfaces (assim e assado são implementações daquela interface).

Bem, até aí não tem nada demais, é apenas aquilo que a orientação a objetos já previa mesmo, mas como o que você quer é que exatamente o mesmo código seja usado nos dois clientes (A e B), você precisa que você possa substituir a implementação assim pela implementação assada on-the-fly. Existe um Design Pattern que resolve esse problema, e o nome dele é "Class Factory".

Como o Class Factory Funciona?

Bem, em primeiro lugar, isso não se aplica apenas a orientação a objetos, mas pode ser analogamente usado como um wrapper em programação funcional. Esse Class Factory irá buscar em algum lugar (uma tabela das implementações daquela interface, por exemplo) qual implementação deve ser utilizada e só então obter a classe ou as funções a serem utilizadas.

Em Perl, sabemos que isso é moleza, pois é só uma questão de acessar o pacote Regra::Assim ou Regra::Assado (tanto para OO quanto para funcional). Em Java o negócio é mais chato, você tem que usar a introspecção da linguagem (que é devidamente complicada (assim como tudo em Java)), para obter a classe correta. Não faço a menor idéia de como VB faz introspecção, mas em último caso um módulo wrapper com if's também vai resolver o problema (de forma tremendamente horrorosa, mas resolve).

Dessa forma, você vai conseguir utilizar exatamente a mesma distribuição do sistema nos dois clientes e reduzir exponencialmente a complexidade do gerenciamento do desenvolvimento e correções de bugs.


Daniel Ruoso
Last modified: Mon Dec 19 15:07:04 BRT 2005