ESTUDO E IMPLEMENTAÇÃO DE UM GERADOR DE CÓDIGO PARA MIGRAÇÃO DE APLICAÇÕES LEGADAS Resumo. O objetivo deste trabalho é apresentar um estudo sobre manutenção de aplicações legadas, sob a perspectiva dos geradores de código: como eles podem ajudar neste processo de migração, padronização e qualidade do código gerado. Como resultado, foi desenvolvido um gerador de código com para auxiliar a migração de aplicações legadas, padrão xBase, para tecnologias e padrões atuais. Abstract. The aim of this paper is to present a study on maintenance the legacy applications, from the perspective of code generators: how they can help in this migration process, standardization and quality of generated code. As a result, we developed a code generator to help with the migration of legacy applications, standard xBase based to current technologies and patterns. 1 Introdução Anos atrás, a programação representava a maior parte do trabalho de produção de software, havendo basicamente uma única maneira de fazer as coisas. A análise de sistemas era pouco explorada, resumindo-se apenas a normalização de dados e programação. Os paradigmas das linguagens de programação mudaram e muitos dos sistemas que existem foram criados em linguagens estruturadas imperativas sem a utilização dos recursos de reutilização de código (SEBESTA, 2000). A maioria das empresas necessita reprojetar seus sistemas para tirar vantagem das novas tecnologias, eliminando redundâncias e burocracia, dotando os seus colaboradores de meios que os permitam agilizar a gestão da organização. Para tanto, quando houver mudanças nas políticas organizacionais, os sistemas devem se regenerar com rapidez para refletir essas mudanças (MARTIN, 1997). Um software, ao longo do tempo, passa por uma série de modificações para que este possa atender às expectativas do cliente e do negócio. Estas modificações são necessárias para suportar a evolução da aplicação. Uma das formas de realizar modificações no software é usar técnicas de manutenção, como Reengenharia e Engenharia Reversa (SWEBoK, 2004; SOMMERVILLE, 2003). Além destas técnicas, faz-se necessário o uso de ferramentas de conversão e geradores de código para apoiar este processo (FONTANETTE, 2004). Conforme (MARTIN & McCLURE, 1991), os geradores de código são ferramentas que geram artefatos, a partir de especificações de alto nível. Além disso, são extremamente práticos quando o fator tempo e time são determinantes para o projeto em questão (SANTOS, 2002). Apesar dos ganhos em ordem de grandeza proporcionados pela adoção de geradores de código, poucas organizações se beneficiam desta técnica (FRANCA & STAA, 2002). Esta baixa adoção pode ser explicada pela complexidade envolvida na construção de geradores, ressaltando que, como qualquer outra nova tecnologia, após os aspectos técnicos serem dominados, os aspectos gerenciais e culturais devem ser considerados para garantir o sucesso na introdução de geradores no processo de desenvolvimento das organizações (FRANCA & STAA, 2002). O objetivo principal deste artigo é apresentar um estudo sobre manutenção e aplicações legadas, sob a perspectiva dos geradores de código: como eles podem ajudar neste processo de migração, padronização e qualidade no código da aplicação resultante. 2 Fundamentação Teórica 2.1 Aplicações Corporativas e Sistemas Legados Existem diferentes tipos de software, cada qual com seus próprios desafios e complexidades (SEACORD, 2003). As aplicações corporativas muitas vezes têm dados complexos – e uma quantidade grande deles – para trabalhar, aliados a regras de negócio específicas. Embora algumas técnicas e padrões sejam relevantes para todos os tipos de software, muitos são relevantes apenas para um ramo específico (HEUVEL, 2007). Segundo (FOWLER, 2006), as aplicações corporativas normalmente envolvem: dados persistentes (múltiplas execuções; alterações nos programas que usam estes dados; sobrevida em relação ao hardware e sistemas operacionais; alterações na estrutura de dados para armazenar novas informações; passível de migração de dados), grande quantidade de dados (gerência de um grande volume de dados, gerando novos papéis em times de software), acesso a dados concorrentes (controle de transações), interface com usuário e comunicação com outras aplicações corporativas (sistemas legados, tecnologias de comunicação, diferentes fornecedores de produto). Estratégias foram definidas para conversão e migração destas aplicações para novas tecnologias (O´BRIEN, 2006; SOFTWAREREMINING, 2009). A figura 1 apresenta algumas destas estratégias. Figura 1 – Estratégias de migração de sistemas (O´BRIEN, 2006) A construção de um gerador de código para auxiliar na migração de aplicações xBase é justificada devido ao fato de existir um grande número de aplicações legadas, como aplicações FoxPro e Clipper (LONG, 1993; COSTA, 1998). 2.2 Geradores de Código Os geradores de código são criados com o intuito de diminuir o trabalho do desenvolvedor para rotinas repetitivas e que tomam certo tempo (SANTOS, 2002). Dentre as principais características observadas nos geradores de código são a possibilidade de troca de linguagem pelo desenvolvedor para uma aplicação e a utilização de diferentes bancos de dados. Cabe ao gerador de código escrever código automaticamente para a linguagem escolhida e para o banco de dados escolhido. O gerador é apresentado como uma importante solução para implementação de uma linha de produtos de software. O desenvolvimento para Web, onde técnicas de geração são utilizadas para produção de páginas dinâmicas, também contribui para que o tema geradores de código, passando a ser discutido por uma maior número de desenvolvedores (FRANCA & STAA, 2002). Figura 2 - Arquitetura padrão de um gerador de artefatos (FRANCA e STAA, 2002) A figura 2 sintetiza a arquitetura padrão de um gerador de código. Os componentes básicos da arquitetura são o analisador de especificação e o gerador de artefato. A utilização dos geradores apresenta algumas vantagens, descritas a seguir: Operação Automática: Uma vez que a aplicação tenha sido carregada com as informações a serem processadas e instruções do que fazer, poderá processar a informação sem qualquer intervenção humana. Flexibilidade: Após a criação do código de saída, surge a possibilidade de serem mudadas as sequências de instruções de controle. Padronização: O código de saída pode conter/ser definido a partir de uma nomenclatura padrão, facilitando a intervenção humana no código gerado. Existem inúmeros tipos de geradores de código e de aplicações, que vão desde o mais básico (compiladores), passado por IDEs até os mais avançados, geradores baseados em templates e metaprogramação (MAIA & OLIVEIRA, 2002). 3 GISCODE: Protótipo de Gerador de Código O GISCODE é um protótipo de gerador de código, desenvolvido com o objetivo de auxiliar na migração de aplicações legadas, baseadas em tecnologia xBase, inicialmente, para tecnologia .NET. Alguns trabalhos influenciaram a concepção e desenvolvimento do GISCODE, como (CODEGENERATION, 2009; CODEPROJECT, 2009; CODESMITH, 2009; MYGENERATION, 2009; SANTOS, 2002). O GISCODE foi concebido, devido à necessidade de migrar aplicações desenvolvidas em diferentes versões do FoxPro (LONG, 1993; SIEGEL, 1994; COSTA, 1998; SILVA, 2000; VASQUEZ, 2003), usando o paradigma estruturado para um paradigma mais atual, a Orientação a Objetos (LARMAN, 2007). A tecnologia inicialmente escolhida foi a plataforma .NET (MICROSOFT, 2001; GALUPPO, 2004; ARAUJO, 2006; MCNEISH, 2002) e o SGBD SQLServer (BATISTTI, 2005; ELMASRI, 2005). Na figura 3, é apresentada a arquitetura do GISCODE. Figura 3 – Arquitetura do GISCODE Através do mapeamento dos dados de aplicações FoxPro (versões 2.5, 2.6, 5.0, 7, 8 e 9), o GISCODE gera código fonte para linguagem C#, com instruções SQL e mapeamentos para já definidos para SQLServer. Nas figuras 4 e 5, apresentam-se o diagrama de pacotes e classes do GISCODE. Figura 4 – Diagrama de Pacotes Figura 5 – Diagrama de Classes Conforme apresentado na figura 5, através do uso do pattern Abstract Factory (GAMMA, 2000), o GISCODE permite acoplar outros tipos de linguagens e bancos de dados para outros tipos de gerações. O processo de uso do GISCODE é descrito a seguir: 1) Definir a pasta de origem das tabelas do FoxPro; 2) O usuário do gerador seleciona quais arquivos deverão ser lidos (figura 6); 3) Poderão ser definidos novos nomes para modelo de classes de objeto e modelo de classes de acesso a dados (figura 7); 4) Os campos da tabela poderão ser configurados (figura 8); 5) O GISCODE cria a estrutura de tabelas para SQLServer, migrando os dados e gerando as classes do modelo. Estas classes geradas são definidas pelo padrão MVC (figura 9 e figura 10). Figura 6 – Protótipo do GISCODE Figura 7 – Propriedades da Tabela de Dados Figura 8 – Propriedades da Tabela - Campos Figura 9 – Modelo de Classe de Objeto (DTL) Figura 11 - Estrutura de Diretório gerado pelo GISCODE Figura 10 – Modelo de Classe de Acesso a Dados (DAL) Conforme apresentado na figura 11, o código fonte gerado para o modelo de objetos é inserido automaticamente na pasta DTL (Data Transfer Layer) e o código fonte gerado para o modelo de classes de acesso a dados é inserido na pasta DAL (Data Acess Layer). A pasta BLL (Business Logic Layer) é criada, mas não recebe código fonte do gerador de código. Após criado o código fonte, o gerador dará possibilidade de visualização dos modelos de objetos e dos modelos de classes de acesso a dados. 6 Estudo de Caso e Considerações Finais Neste trabalho, procurou-se apresentar um estudo sobre migração de aplicações legadas, sob a ótica dos geradores de código. Como estudo de caso, o GISCODE foi utilizado em um projeto real na empresa CREDMIL Administradora de Cartões de Crédito, sediada em Porto Alegre. A CREDMIL possui um sistema administrativo desenvolvido em Visual FoxPro, versão 9.0. Através do uso do GISCODE, foi possível importar os dados de arquivos .DBF para SQLServer em questão de minutos, sem a re-digitação das informações. Além da migração, o GISCODE gerou as camadas de acesso a dados e modelo de objetos, permitindo a integração com outra aplicação desenvolvida em ASP.NET, para acesso através da Web. Neste processo de migração conseguiu-se, através do uso da ferramenta, minimizar os problemas de importação e migração dos dados para um SGBD, além de gerar o código para sua manipulação em C#. A criação de um gerador de código traz a vantagem do aumento da produtividade aliado a uma alta qualidade no desenvolvimento, uma vez que produtos finais são gerados seguindo uma padronização, facilitando a identificação de erros. É evidente a importância da manutenção de software e modernização no ciclo de vida do produto de software, pois as aplicações hoje existentes, um dia serão sistemas legados. Neste contexto, o gerador de código minimiza o trabalho dos desenvolvedores pela adoção de padrões para futuras aplicações a serem desenvolvidas. Ainda se pretende, como extensão deste trabalho, analisar o uso de tecnologias como XML/XSLT como alternativa ao pattern Abstract Factory existente, transformando o GISCODE em um produto que suporte várias linguagens de programação e gerenciadores de banco de dados. Agradecimentos Os autores agradecem o apoio da empresa INFO SAFE Informática LTDA, (empresa que usou o GISCODE na empresa cliente), a CREDMIL, que serviu de estudo de caso e, finalmente, a FACENSA – Faculdade Cenecista Nossa Senhora dos Anjos. Referências ARAUJO, Anderson Viçoso de. Treinamento Avançado em .NET. 1ª Edição, São Paulo: Digerati Books, 2006. BATTISTI, Julio. SQL Server 2005 Administração e Desenvolvimento - Curso Completo. Rio de Janeiro: Axcel Books do Brasil, 2005. CODEGENERATION. The code generation network. Disponível em: <http://www.codegeneration.net>. Consultado em Março de 2009. CODEPROJECT. NHibernate Helper Kit. Disponível em: <http://www.codeproject.com/KB/dotnet/NHibernate_Helper_Kit.aspx>. Consultado em Junho de 2009. CODESMITH. The best .NET, C#, VB, SQL and more template based source code generator tool. Disponível em: <http://www.codesmithtools.com/>. Consultado em Junho de 2009. COSTA, Ricardo Peralva. Visual FoxPro 5.0: Guia de Desenvolvimento. São Paulo: Érica, 1998. ELMASRI, Ramez. Sistemas de Banco de Dados. São Paulo: Pearson Addison Wesley, 2005. FRANCA, Luiz Paulo Alves – STAA, Arndt Von. Uma Arquitetura Aberta para geradores de Artefatos. Disponível em: <http://www.lbd.dcc.ufmg:8080/colecoes/sbes/2002/001.pdf>. Consultado em março de 2009. FONTANETTE, Valdirene; PRADO, Antonio; OLIVEIRA, Andre Luis. Uma Abordagem para Migração Gradativa de Aplicações Legadas. In: SBES - Simpósio Brasileiro de Engenharia de Software, 2004. FOWLER, Martin. Padrões de Arquitetura de Aplicações Corporativas. Porto Alegre: Bookman, 2006. GALUPPO, Fabio Matheus, Vanclei e SANTOS Wallace, Desenvolvendo com C#. Editora Bookman 2004. GAMMA, Erich. HELM, Richard. JOHNSON, Ralph, VLISSIDES, John. Padrões de Projeto – Soluções reutilizáveis de Software Orientado a Objetos. Bookman, 2000. HEUVEL, Willem-Jan van den. Aligning modern business processes and legacy systems: A component-based perspective. Massachusetts Institute of Technology, 2007. LARMAN, Craig, Utilizando UML e Padrões: uma introdução à análise e ao projeto orientado a objetos. 3ª edição, Porto Alegre: Bookman, 2007. LONG, Jeb. FoxPro 2.5 for Windows Guia do Programador. Rio de Janeiro: Berkeley, 1993. MAIA, Marcelo; OLIVEIRA, Ademir. JPearl – Uma Linguagem para Descrição de Reestruturações em Programas Java. In: SBPL Simpósio Brasileiro de Linguagens de Programação, 2002. MARTIN, James. Princípios de Análise e projeto baseados em objetos. Rio de Janeiro: Campus, 1997. MARTIN, James; McCLURE, Carma. Técnicas Estruturadas e CASE. São Paulo: Makron Books, 1991. MCNEISH, Kevin. .NET for Visual FoxPro Developers. Hentzenwerke Publishing, 2002. Microsoft Corporation. Microsoft C# Segredos da Linguagem/Microsoft Corporation. Rio de Janeiro: Campus, 2001 MYGENERATION. MyGeneration – Code Generation and OR Mapping. Disponível em: <http://www.mygenerationsoftware.com/portal/default.aspx>. Consultado em Junho de 2009. O’ BRIEN, James A. Sistemas de informação e as decisões gerenciais na era da Internet. 2ª ed. São Paulo: Saraiva, 2006. SANTOS, Edgar. CodeCharge: Gerador de Códigos para Aplicações Web. Campinas: UNICAMP, 2002. SEACORD, Robert C.; PLAKOSH, Daniel; LEWIS, Grace A. Modernizing Legacy Systems: Software Technologies, Engineering Processes, and Business Practices. Addison Wesley, 2003. SEBESTA, Robert W. Conceitos de Linguagens de Programação. 4ª ed. Porto Alegre: Bookman, 2000. SIEGEL, Charles. Dominando o FoxPro 2.5 for Windows e DOS. São Paulo: Editora Makron Books, 1994. SILVA, Antonio F. Bernardo da; SILVA, Marcelo R. Bernardo da; SILVA, Mauricio R. Bernardo da. Desenvolvendo com Microsoft Visual FoxPro 6. Rio de Janeiro: Book Express, 2000. SOFTWAREMINING. Breathing life into legacy applications. Disponível em: <http://www.softwaremining.com/index.jsp>. Consultado em Maio de 2009. SOMMERVILLE, Ian. Engenharia de Software. São Paulo: Addison Wesley, 2003. SWEBOK. Guide to the Software Engineering Body of Knowledge. IEEE: Computer Society, 2004. Disponível em: <http://www2.computer.org/portal/web/swebok/htmlformat>. Consultado em Maio de 2009. VAZQUEZ, Fábio. Visual FoxPro 8 para Desenvolvedores: Prefácio de Les Pinter. Rio de Janeiro: Axcel Books do Brasil, 2003.