O Projeto
No início de setembro fui contratado pela CPD Informática para trabalhar como consultor no CCA-BR - Centro de Computação da Aeronáutica do Brasil. Desde o início trabalhei em conjunto com o Francisco Freire, profissional que destaca por sua competência. O projeto que estamos desenvolvendo chama-se PLAMTAX - PLANO DE MISSÕES TÉCNICO-ADMINISTRATIVAS NO EXTERIOR - e visa o planejamento e controle orçamentário de missões no exterior.
Ao chegar fomos informados que o projeto era para ser desenvolvido com as seguintes tecnologias:
Parte do sistema já estava desenvolvida e era necessário o desenvolvimento de 15 novos casos de uso. Por se tratar de sistema já existente, resolvemos, eu e o Francisco, estudar o que já havia sido feito com o objetivo de averiguarmos a possibilidade de aproveitar o modelo de programação que foi desenvolvido.
Refazer
Após duas semanas de estudo, eu e o Francisco, chegamos a conclusão que a arquitetura original do projeto não estava sendo atendida. Pois, originalmente havia sido pensado que a camada servidora seria desenvolvida em Delphi, o MTS cuidaria das transações e a camada de apresentação não interagiria com o banco de dados, somente com a camada servidora, que o paradigma da orientação a objeto seria usado e que haveria uma clara distinção entre camada de apresentação, regra de negócio e persistência.
De fato, muito pouco do que foi idealizado, havia sido feito:
- Não havia separação entre a camada de persistência e as demais camadas;
- os componentes MTS não estavam funcionando;
- as transações não estavam sendo controladas nem pelo MTS, nem pela aplicação;
- não havia sido adotado bons princípios de codificação, ocorrendo que logo que a aplicação servidora era iniciada e alocava algum recurso qualquer do sistema, em geral, esse recurso permanecia alocado, o que ocasionava em pouco tempo o travamento do servidor e outros problemas mais;
- o sistema não era escalonável;
- não foi utilizado apropriadamente o paradigma da orientação a objetos.
Como consequência verificamos que seria necessário:
- separar a camada de persistência das demais;
- começar o desenvolvimento dos novos casos a partir do ponto zero, ou seja, não aproveitariámos nada do que já havia sido desenvolvido. Creio que esta decisão não poderia ser diferente dado ao que tinhamos em mão;
- simplificar e estruturar a camada de apresentação;
- levar o controle das transações para o MTS/COM+
- utilizar os recursos de cache e poolling do MTS/COM+
- racionar recursos de banco.
Solução
Fomos surpreendidos ao verificar a quase inexistência de tecnologias de persistência e mapeamento objeto-relacional para Delphi. De fato encontramos somente duas opções para este proposito, o Depo e o tiOPF. Após fazermos algum teste e estudo, concluímos que não seria viável adotá-las.
Optamos por criar nossa própria solucação para o mapeamento e persistência objeto/relacional. Nós baseamos em parte no bom Hibernate. Desenvolvemos uma linguagem de consulta a objetos e outra para atualização, são elas:
- OQL - Object Query Language
- OML - Object Manipulation Language
Apesar de tentarmos deixá-la simples devido a limitações de tempo e orçamento, a linguagem suporta diversos tipos de expressões e ficou bem fléxivel. Alguns recursos como retorno de mais de uma coluna e agregação, não foram implementados. No entanto, creio ser fácil fazê-lo.
A maior dificuldade que tive foi em criar o analisador sintático/semântico e o gerador de SQL/DML. Sem dúvida este foi um desafio, dado que desconhecia completamente a tecnologia envolvida na criação de compiladores. Ao todo li muitos artigos na Internet, estudei alguns exemplos simples (e outros nem tanto), li um livro inteiro e usei mais dois para referência. Sendo que destes recomendo:
O compilador implementado baseado no modelo recursivo descendente. No total levei três semanas para terminá-lo. Após entender a lógica do analisador, ficou natural usá-la para gerar a SQL/DML de forma automática. Porém, não houve muitas otimizações na SQL gerada. No entanto, ficamos satisfeitos com o resultado.
Uma visão da arquitetura adotada no sistema pode ser vista abaixo.
No momento, a camada de persistência está dependente da ADO e acumulou algumas particularidades do PLAMTAX. Caso eu venha a desenvolver algum sistema em Delphi e seja possível usar arquitetura semelhante a do PLAMTAX, espero poder melhorá-la. Tenho algumas idéias que poderiam torná-la um bom produto. Não penso em comercializá-la. Se fizer algo será free.
De qualquer forma, penso em trabalhar um pouco nela para poder abrí-la a quem puder interessar. Se houver disponibilidade de tempo irei publicá-la no sourceforge.net.
Conclusão
Deveremos terminar o projeto até o fim deste mês, novembro de 2004. Infelizmente dos quize casos requeridos, somente um será entregue para produção. Ainda falta gerar a documentação do sistema, tarefa que não me caberá, pois somente documentarei o código.
Com a total independência entre camadas, creio que o PLAMTAX se tornou um dos melhores sistemas que eu já tenha participado do desenvolvimento. Parte do sucesso se deve aos responsáveis pela arquitetura e projeto. Agradeço a todos pela tolerância, colaboração, presteza e empenho que foi dado ao projeto durante todo o tempo que participei dele. Após conhecer o Coronel Correia, Major Amilton e Capitão Marques fiquei orgulhoso do CCA-BR.
Agradeço a todos os demais que participaram do projeto, especialmente Francisco Freire, que foi crucial para o desenvolvimento da regra de negócios e em muitos momentos do desenvolvimento.
Labels: it