Reengenharia de Software usando Transformações (RST) Valdirene Fontanette, Vinícius C. Garcia, Adriano A. Bossonaro, Angela B. Perez, Antonio F. Prado Universidade Federal de São Carlos - Departamento de Computação Rod. Washington Luiz, km 235 - São Carlos – São Paulo C.P. 676 - CEP 13565-905 Fone/Fax: 16-260-8232 {valdirene, vinicius, bossonaro, angela, prado}@dc.ufscar.br ABSTRACT This work presents a strategy for Software Reengineering using Transformations, which integrates a software transformation system, a CASE tool and other technologies to reconstruct legacy systems using distributed components. The strategy is accomplished in 4 steps: Organize Legacy Code, Recover Project, Reproject and Reimplement. In the Organize Legacy Code step, the legacy code is organized, using transformations, according to the principles of the Object Orientation, segmenting it in supposed classes, attributes and methods. The Recover Project step starts off with the organized legacy code and also using software transformations, generates its project description in the Modeling Domain Language, MDL. The MDL descriptions are read in a CASE tool, recovering the legacy code project, represented with UML techniques. In the Reproject step, the Software Engineer reprojects the system with distributed software components. New functional and non-functional requirements can be added in this step. The Catalysis method is used to reproject the distributed component-oriented system. Finally, in the Reimplement step, the system reimplementation is done in an executable language target of the reimplementation. The system final code can be generated in a CASE tool or using transformations. The CASE tool generates the code through the specifications of the new distributed component-oriented project and the transformational system through its MDL description. Keywords: Software Reengineering, Reverse Engineering, Object Orientation, Software Transformation, Distributed Components and Reuse. 1. INTRODUÇÃO Vários projetos na área de Reengenharia de Software têm como objetivo pesquisar técnicas modernas para automatizar grande parte das tarefas de manutenção de software, reduzindo seus custos. Atualmente, existe um grande número de empresas que continuam trabalhando com sistemas implementados em linguagens de programação antigas, cujas manutenções são árduas e onerosas. Sistema de software é um artefato evolutivo e requer constantes modificações, seja para corrigir erros, melhorar desempenho, adicionar novos requisitos ou mesmo para adaptá-lo para novas plataformas de hardware e software. Ao longo dos anos, esses sistemas incorporam conhecimentos substanciais do seu contexto, incluindo novos requisitos e regras de negócio. Esses conhecimentos tornam estes sistemas a principal fonte de recursos para sua evolução contínua. Na maioria dos casos, estes sistemas, denominados legados, ainda são de muita utilidade aos seus usuários e muitas vezes, suas reconstruções, usando técnicas modernas de desenvolvimento de software, poderiam ser a solução para suas reutilizações sem ter que construir um novo sistema. Normalmente, os sistemas legados não possuem documentação ou quando possuem, a mesma está desatualizada, e nem sempre a pessoa que desenvolveu o sistema é a responsável pela sua manutenção. Fatores como estes tornam difícil e de alto custo a manutenção, fazendo com que os desenvolvedores até abandonem o sistema. Esta dificuldade em atualizar sistemas legados para a utilização de tecnologias recentes, como distribuição e componentização, tem motivado os pesquisadores a investigar novas soluções para diminuir seu custo de desenvolvimento, garantir funcionalidade do sistema legado e um tempo de vida maior, e facilitar sua manutenção[1,2]. As técnicas recentes utilizam a Orientação a Objetos e a Computação Distribuída como base. A simples adoção da Orientação a Objetos, sem a existência de um padrão de reuso e de um processo de desenvolvimento de software orientado ao reuso, não fornece o sucesso esperado para a produção de software em grande escala[3]. A reengenharia de software é também uma forma de obter a reutilização de software e o entendimento do domínio da aplicação. As informações das etapas de análise e projeto são recuperadas e organizadas de forma coerente e reutilizável. Motivados por estas idéias pesquisou-se uma estratégia de reengenharia cujo objetivo é recuperar o projeto do sistema legado, reconstruindo-o principalmente para atender novos requisitos e ser executado em novas plataformas de hardware e software. A estratégia suporta reconstrução do sistema, inclusive com alteração da sua estrutura original, garantindo sua evolução contínua através da reutilização de componentes de software distribuídos. Um componente pode ser visto como um bloco de software, independente, contendo dados e operações, que pode ser utilizado na reconstrução de um sistema. Um dos atributos principais desejáveis em um componente de software relaciona-se a sua