Os principais princípios e técnicas de engenharia de software, tem geralmente diversos objetivos, como padronização, organizar componentes, separação de responsabilidades, como também, extensibilidade e composição. A muito tempo que se buscam soluções, que permitam que sejam construídos sistemas que sejam fáceis de se modificar, mais que também, possam serem estendidos com facilidade. O fluxo de mudanças em determinados tipos de negócios, tem uma variação muito grande e os softwares que visam atender os mesmos, caso não sejam fáceis te se estender, adicionando funcionalidades facilmente, certamente irão fracassar.

Atualmente, se vê no cenário mundial de arquitetura de software, um esforço grande em tornar real, este desejo de softwares que sejam fáceis de estender, ou seja, sistemas que sejam como um “Lego”, em que peças são adicionadas com facilidade ao mesmo. Martin Fowler, em seu livro Padrões de Arquitetura de Aplicações Corporativa, apresenta um pattern chamado PlugIn Pattern, que tem a descrição da seguinte forma:

“Conecta classes durante a configuração em vez de na compilação.”

Figura 1

Figura 1

    Esta frase simples sobre o pattern, nos dá a idéia central do mesmo. O Plugin, como seu próprio nome diz,  tem o objetivo de em tempo de execução, conectar objetos que respeitem um determinado  contrato de serviço, e  que os mesmos possam ser carregados em tempo de execução. O Plugin pattern, é uma das formas, que podemos utilizar para ter uma arquitetura extensível.

Extensibilidades e Contratos de Serviço

     É necessário entender que, precisamos estender o que muda, o que varia, ou seja, utilizar a extensibilidade com sabedoria. Para conseguir ter um software extensível, precisamos enxergar os pontos que terão um maior fluxo de mudança e definir contratos de serviço ou uma interface de comunicação. Um contrato de serviço ou interface de comunicação, é um contrato em que será especificado regras a serem respeitadas, ou seja, justamente o que é essencial para aquele contrato e que também pode ter implementações diferentes, como por exemplo Loggin, Tratamento de Exceções e outras questões. Vejamos um exemplo, observe o diagrama abaixo:

Figura 2

Figura 2

Listagem 1: O contrato de serviço ou interface de comunicação, propriamente dito

public interface ICalculaJurosFinanciador
{
	decimal CalculaJuros(int MesesFinanciamento, decimal ValorFinanciado);
}

    Veja que é definido um contrato, ou seja, alguém que calcule os juros do financiamento, haja vista, que quando um financiamento é realizado, alguma instituição financeira está por trás do mesmo e cada instituição tem seu modo de calcular os juros. Veja que o cálculo dos juros é um ponto de extensão, ou se ja, um ponto em que se faz necessário trabalhar com a extensibilidade. Poderíamos também já partindo para a parte de infraestrutura, tornar extensível a parte do sistema que trata de Log de informações, seja ela, log de erro ou de transação por exemplo. Veja o outro exemplo:

Figura 3

Figura 3

Veja que no caso de tornar o mecanismo de efetuar logs extensível, temos um contrato de serviço que define o que um “logger” precisa fazer, e temos as classes concretas que efetuam log de diversas maneira, como banco de dados, arquivo XML, Log no Event Viewer do windows e note, que no caso do Log de banco de dados, a classe aponta para uma abstração de um repositório, que sendo o mesmo abstrato, também define um contrato de serviço, sendo assim, se hoje o log quando é feito no banco de dados o mesmo é feito em um servidor SQL Server por exemplo, amanhã se passar a ser feito no Oracle, esta mudança não causará impacto no mecanismo de Loggin.

Veja como a extensibilidade, faz com que o software seja como um “Lego” , em que o contrato de serviço, é como se fosse a parte em que será feito o “encaixe” e a implementação concreta, age como o “pino” de encaixe, fazendo assim, com que haja uma arquitetura flexível e de fácil manutenção e evolução. Bom pessoal espero que tenham gostado do artigo, e que seja de bom proveito para o crescimento e amadurecimento profissional de cada um dos leitores deste artigo. Em breve estaremos abordando tecnologias para auxiliar na criação de Arquiteturas flexíveis como o MEF, pot exemplo . Abraços e até a próxima.