Archive for the ‘cbd’ Category

MVC e Camadas

Monday, August 28th, 2006

Acabo de escrever um artiguinho novo. Eu ia responder na Java-BR pela enésima vez sobre a diferença entre Camadas e MVC, resolvi criar algo que possa apenas linkar.

Bom, esperando feedback: MVC e Camadas.

Bases de Dados São Recursos?

Thursday, August 24th, 2006

Quase todo sistema acaba persistindo dados de alguma forma, geralmente em grandes repositórios conhecidos como bancos de dados. Recentemente, os Sistemas gerenciadores de Bancos de Dados vêm perdendo sua posição como centro do universo para aplicações coorporativas e vem a pergunta: qual o papel do banco de dados num sistema coorporativo moderno? O banco de dados faz parte do seu sistema ou é apenas um recurso acessado por ele, como um filesystem ou servidor de e-mails?

Bancos de dados coorporativos foram o grande xodó das empresas (ainda são em boa parte delas). O raciocínio é simples: o objetivo do sistema é manipular e armazenar dados. Se eu preciso que vários sistemas (processadores de dados) acessem o mesmo dado, é bom que eles estejam em um lugar comum, daí o SGBD.

Banco Corporativo

O SGBD é o repositório de dados supremo, formando o Banco de Dados Coorporativo. Este, que fisicamente pode estar espalhado em diversos SGBDs de fabricantes diversos, é acessado por todos os sistemas. Na verdade, ao especificar um sistema neste ambiente a coisa mais problemática costuma ser sentar-se com a equipe de DBAs responsável para que esta avalie suas necessidades, geralmente criando views que permitem ao seu sistema acessar os dados.

O problema neste caso é que na evolução da tecnologia, não são apenas os dados que são comuns a diversos sistemas, mas também a lógica, o processamento. Não é admissível num sistema moderno a existência de lógica duplicada, um sistema deve reutilizar os componentes (ou serviços) providos por outros.

Ok, mas e os dados? Bem, os componentes de software (sejam business components vindos de CBD ou serviços SOA ou qualquer outra coisa neste sentido) possuem como grande característica o seu encapsulamento. A lógica interna ao componente, suas estruturas de dados e demais aspectos não devem vazar para fora deste. Isto inclui os dados.

Os dados pertencentes a um componente não devem vagar para fora dele. De uma maneira geral, um componente recebe e retorna apenas objetos por valor, ou seja: cópias dos objetos que mantêm dentro dele, que podem ser modificados pelo cliente e não vão interferir os objetos reais. Com a tecnologia atual e dependendo da granularidade do componente isto nem sempre é viável ou desejável, mas é a teoria (para este tipo de decisão que você precisa de um arquiteto experiente).

Componentes

Então, se nossos componentes têm por princípio básico proteger a implementação de algum conceito, devemos permitir acesso direto á base de dados? Não, pelo menos não enquanto pudermos evitar. O acesso aos dados deve ser feito unicamente pela API do componente, nunca quebrando o encapsulamento deste para injetar dados diretamente no banco. Veja o diagrama acima, bases de dados sequer são mencionadas!

Independente de o seu sistema ser construído com componentes, serviços ou apenas uma grande massa monolítica de código (como são a maioria dos sistemas), é importante definir o que é banco de dados corporativo do que é o repositório que guarda os dados da sua aplicação/componente/serviço.

Se sua aplicação (/componente/serviço) não guarda dados encapsulados, ou seja: se sua empresa insiste que você use um banco de dados coorporativo, trate o SGBD como um outro sistema com o qual você se comunica. Se seu sistema não pode garantir que os dados neste depósito não serão alterados por outros sistemas então o que você tem é uma integração, não um lugar para guardar seus objetos. Neste caso, utilize as técnicas clássicas de Mappers e Anticorruption-Layers.

Se você precisa acessar dados em um SGBD corporativo, utilize também estas técnicas. Não é porque seu sistema se comunica com este outro componente (o banco corporativo) via JDBC que ele é sua persistência. Utilizar um framework de ORM como Hibernate ou EJB 3.0 (JPA) é algo que eu não recomendaria porque o framework vai considerar que o banco de dados é sua persistência, não um outro sistema a ser integrado. EJB 3.0 por exemplo traz o mapeamento entre classes e tabelas para dentro dos seus arquivos-fonte, isto só é desejável se esta informação representa metadados do seu aplicativo, não configuração. Uma abordagem mais sadia mantendo a produtividade de um framework (afinal, ninguém gosta de escrever JDBC…) pode ser obtida utilizando frameworks ORM com propostas diferentes, como o iBatis.

Nestes dois casos, o SGBD é um recurso, não uma parte da aplicação. É como o servidor de e-mail: pode ser crucial para seu sistema funcionar mas não faz parte dele. Mais que esconder a implementação da persistência, a Camada do seu sistema que tem contato com o SGBD deve se preocupar em checar entradas e saídas, pré e pós condições, exatamente como quando fazemos chamadas a outros sistemas ou componentes.

Integracao

Já no caso oposto, com seu sistema encapsulando completamente o banco de dados, temos o SGBD como o local onde nossos objetos são armazenados. Neste caso o banco de dados faz parte da aplicação e devemos utilizar a Camada de Persistência para acessá-lo. Esta Camada tem por dever esconder da Camada de Negócios detalhes sobre como a persistência é implementada, na verdade ela esconde simplesmente que existe algo chamado Persistência, visto que para a Camada de Negócios persistência é algo transparente.

Integrado

Apesar de o banco de dados ser fisicamente uma entidade separada do programa (seu binário, WAR, EAR ou o que for), conceitualmente ele faz parte da aplicação. Note que isto não quer dizer que existe um esquema de dados físico (table schema, database ou coisa parecida) para cada componente. O esquema de dados pode residir em qualquer SGBD, mesmo um compartilhado. O que importa é que quem lê e edita aqueles dados é apenas sua aplicação.

Enquanto componentes ou serviços não fazem parte da arquitetura corporativa das empresas vamos conviver com bancos de dados corporativos, é bom que nossos sistemas se preparem para conviver pacificamente com eles.

Rafael Divaga: Componentes x SOA

Wednesday, August 16th, 2006

O tema que tem atraído meu interesse também motivou um post do Rafael, muito boa leitura.

Componentização: Bioengenharia Entende mais que TI

Friday, July 28th, 2006

Tem bastante tempo eu escrevi num dos meus blogs anteriores (não lembro qual deles) sobre como existe um mercado de componentes. O ponto é que ao contrário do que o hype de CBD (Component-Based Design) quis passar, não existem tantos componentes de negócio. Os componentes existentes são quase sempre horizontais, como bibliotecas para envio de e-mails, parsers de XML, implementações de especificações como EJBs… Os tais componentes de negócio, no mundo maravilhoso onde você encontraria seu software de RH na prateleira, ficaram nos livros.

A lembrança sobre este tema me veio a cabeça ontem, lendo a Scientific American Brasil no metrô. A edição de Julho traz uma matéria interessantíssima sobre como a biotecnologia busca industrialização através da componentização de seus produtos.

O diferencial é que eles estão seguindo exatamente o modelo da engenharia eletrônica. Em eletrônica nós temos componentes horizontais que formam sistemas verticais. Por exemplo, uma TV é formada por uma enormidade de pequenos componentezinhos. Cada componente deste possui especificações técnicas que dizem quais entradas eles esperam e que saída esperar deles.

O ponto é que uma TV ou um composto biológico é um artigo de massa. Você não entra na loja e monta uma TV com características que deseja. Um sistema de informação é exatamente o oposto, cada empresa quer características próprias. Neste cenário pensar em componentes verticais de granularidade grossa fica muito complicado.

Então, o que CBDtrouxe foi uma forma de organizar um sistema de informação em componentes, mas o sonho off-the-shelf (componentes de prateleira) não vingou.

Interessante notar que SOA traz uma proposta um pouco mais realista neste sentido. As empresas constroem seus próprios serviços, dispnibilizados para consumidores externos ou internos. Não existe necessidade de serviços de prateleira, se você quer consumir um serviço disponibilizado por alguém tudo que você precisa é se conectar a ele. Estamos aproveitando as características de CBD que se provaram úteis (encapsulamento, contratos, controle de dependências, reuso, separação de artefatos…) e eliminando uma parte que não vingou.

Desmitificando Picaretas do SOA: 1 - Qual a Diferença entre Serviços e Componentes Distribuídos?

Tuesday, July 25th, 2006

Já que o post anterior gerou comentários pedindo as respostas das perguntas, vamos tentar elaborar os tópicos. O primeiro é “Qual a Diferença entre Serviços e Componentes Distribuídos?”.

Vamos primeiro tentar entender o que chamamos por Componentes Distribuídos. Componentes são artefatos de software reutilizáveis, baseados nos princípios de engenharia eletrônica. Se você não sabe o que são componentes eletrônicos, abra seu computador (após ler este artigo!) e olhe todos aqueles quadradinhos pretos na placa-mãe.

Os Componentes possuem uma interface bem definida e oferecem operações aos seus clientes. Um Componente pode ser substituído por outro que obedeça a um contrato compatível com o publicado por sua interface. Para substituir um Componente, precisamos alterar o processo de lookup, quando um componente obtêm uma referência para o outro.

Componentes podem ser reaproveitados em outros sistemas que necessitem utilizar as mesmas operações já providas por este. A arquitetura baseada em componentes é chamada CBD - Component-Based Development.

Basicamente, ao criar um Componente você agrupa diversos objetos em um pacote com uma interface definida. os objetos não precisam ter responsabilidade semelhante, o que diferencia Componentes de Camadas, mas você pode usar Camadas para implementar os internos de um Componente. Camadas também não são necessariamente reutilizáveis, aliás é muito raro que o sejam.

A idéia é obter economia de escala, reutilizando um Componente eternamente sem precisar reimplementar aquela funcionalidade. CBD pode ser visto como um OO de maior granularidade, já que classes também são criadas para serem reutilizáveis (apesar de existirem malucos que criam suas próprias java.lang.String).

Componentes Distribuídos expõem suas interfaces numa rede. Eles deixam de ser internos à aplicação que os ‘publica’ (disponibiliza) e passam a oferecer suas operações na rede. EJB, por exemplo, é uma tecnologia criada com foco na criação deste tipo de componente.

Distribuído ou não, um Componente possui seu contrato onde estão publicadas as Operações que este disponibiliza. Qualquer um que saiba trabalhar com este contrato consegue utilizar o Componente.

Um Serviço é algo bem parecido fisicamente. É uma unidade de software que recebe mensagens. A diferença neste nível é na granularidade da mensagem recebida pelo Serviço. Enquanto o Componente recebe pequenas mensagens, o Serviço recebe uma ou pouco mais grandes.

Outra diferença básica é que um Componente possui um contrato que define suas operações, mas num Serviço os contratos são por operação. Isso quer dizer que para usar uma operação disponibilizada por um Serviço você não precisa conhecer as outras operações que este também oferece e, mais ainda, que as operações podem ser movidas de um Serviço para outro e só é necessário modificar os seus consumidores, e geralmente uma arquitetura SOA automatiza este tipo de modificação com indireção criada através de ESBs, por exemplo.

Claro que como quase tudo em tecnologia estes conceitos não são verdades absolutas. Dependendo da bibliografia, do fabricante ou do dia da semana os conceitos mudam bastante. Por enquanto fixe a diferença entre CBD e SOA nestes pontos:

  • CBD tem mensagens com granularidade fina e síncronas
  • SOA Tem granularidade grossa e mensagens geralmente assíncronas
  • Em CBD a unidade atõmica de reusabilidade é o Componente
  • Em SOA a unidade atômica de reusabilidade é cada operação