Um Ambiente para Refatoração de Código Java Utilizando Tecnologias XML Paulo H. M. Maia1, Nabor C. Mendonça2, Rossana M. C. Andrade1, Leonardo A. Fonseca2 1 Departamento de Computação – Universidade Federal do Ceará (UFC) Campus do Pici, Bloco 910 – Fortaleza – CE – Brasil 2 Mestrado em Informática Aplicada – Universidade de Fortaleza (UNIFOR) Av. Washington Soares, 1321 – Fortaleza – CE – Brasil e-mail: [pauloh, rossana]@lia.ufc.br, [nabor, leonardo]@unifor.br Abstract Refactoring, i.e., the process of changing a software system to improve its internal quality while preserving its external behavior, is gaining increasing acceptance among software developers. Refactoring can be particularly useful as an aid to convert a monolithic application to a componentbased one, or to evolve a component-based application to a new component technology. Even though many refactoring tools are now available for a variety of programming languages, most of them offer no standard way of representing and manipulating source code information, which makes them difficult to customize, extend and reuse. This paper presents a refactoring environment for Java programs that relies on XML technologies as a standard mechanism for source code representation and transformation. The environment comprises the RefaX4Java refactoring tool, and a plugin for using the tool in the Eclipse IDE. Keywords: Refactoring, XML, Eclipse Resumo Refatoração, o processo de mudar um software visando melhorar sua qualidade interna sem, contudo, alterar seu comportamento externo, está ganhando grande aceitação entre os desenvolvedores de software. Refatoração pode ser particularmente útil no processo de conversão de uma aplicação monolítica para uma aplicação funcionalmente equivalente, baseada em componentes, ou na evolução de uma aplicação baseada em componente para uma nova tecnologia. Embora muitas ferramentas de refatoração estejam disponíveis para uma variedade de linguagens de programação, a maioria delas não oferece mecanismos padronizados para representação e manipulação das estruturas de código fonte, o que as torna de difícil customização, extensão e reuso. Este artigo apresenta um ambiente para refatoração de código Java que utiliza tecnologias XML como forma padronizada para representar e manipular estruturas de código. O ambiente é constituído de uma ferramenta de refatoração para Java, denominada RefaX4Java, e um plugin para permitir o uso da ferramenta no ambiente de desenvolvimento Eclipse. Palavras-chave: Refatoração, XML, Eclipse 1. Introdução Refatoração (ou refactoring) consiste no processo de mudar um software para melhorar sua qualidade interna preservando seu comportamento externo[13]. Seu principal propósito é reduzir a complexidade do código, que cresce rapidamente à medida que o software evolui, tornando-o mais extensível, modular, reutilizável e manutenível. A crescente adoção de refatoração se deve principalmente ao fato dele ser um dos pilares da Programação Extrema [2], uma metodologia emergente e cada vez mais popular, e pela grande disseminação do catálogo de refatorações criado por Fowler [5]. Refatoração pode ser particularmente útil no desenvolvimento baseado em componentes; por exemplo, como apoio no processo de conversão de uma aplicação monolítica para uma aplicação funcionalmente equivalente, baseada em componentes, ou na evolução de uma aplicação baseada em componente para uma nova tecnologia de componentes ou paradigma de programação. Em ambos os exemplos, o comportamento externo da aplicação ficaria, em princípio, preservado. Assim como outras técnicas de transformação de código, como reestruturação e reengenharia, refatorações são mais facilmente realizadas através de ferramentas automatizadas. Isso reduz o risco de introduzir novos erros devido a intervenções manuais, e minimiza a quantidade de testes necessários sempre que o código é alterado. Uma quantidade considerável de ferramentas de refatoração está agora disponível para uma variedade de linguagens de programação [13]. Apesar disso, é virtualmente impossível encontrar uma ferramenta de refatoração, ou um conjunto delas, que satisfaça plenamente as necessidades de todos os desenvolvedores. Isso acontece principalmente porque essas ferramentas apenas fornecem um conjunto fixo de operações de refatoração, o que pode não ser adequado para tarefas de manutenção. Além disso, a maioria das ferramentas disponíveis não é de fácil customização, tornando difícil, ou até impossível para um desenvolvedor, criar novas operações de refatoração, ou mesmo adaptar as existentes para sua realidade. A necessidade de ferramentas de refatoração mais flexíveis também é discutida em [13]. Esse artigo apresenta um ambiente para refatoração de código Java, composto por uma plugin para o ambiente de desenvolvimento Eclipse [4] e pela ferramenta RefaX4Java, que consiste numa instância do arcabouço RefaX [11] para a linguagem Java. Sua principal característica é utilizar padrões e tecnologias XML tanto para representar como manipular informações de código, o que torna o ambiente uma alternativa mais flexível para a utilização, customização e reuso de refatorações[12]. O restante do artigo é organizado da seguinte maneira: a seção 2 mostra as principais características de RefaX, enquanto a seção 3 apresenta como RefaX foi instanciado para a linguagem Java e integrado ao Eclipse. Por fim, os trabalhos relacionados são mostrados na seção 4, e as conclusões e trabalhos futuros, na seção 5. 2. RefaX: Um Arcabouço para Refatoração de Código Utilizando XML RefaX [11] é um arcabouço para refatoração de código que baseia-se em tecnologias e padrões XML, oferecendo ao desenvolvedor um poderoso mecanismo para construção de ferramentas de refatoração mais facilmente extensíveis e customizáveis. Tradicionalmente, um processo de refatoração se divide em cinco etapas: detecção de trechos de código com possibilidade de aplicação de refatorações; determinação das refatorações que serão aplicas a esses trechos; garantia que as refatorações preservarão o comportamento; aplicação de tais refatorações; e, por fim, verificação se o comportamento do programa foi realmente preservado após a aplicação das refatorações [13]. RefaX propõe um processo baseado em XML que foca nas três últimas etapas do processo de refatoração convencional. Essas etapas foram redefinidas em quatro novas etapas visando uma adequação às tecnologias e padrões XML utilizados. Essas novas etapas são mostradas na Figura 1 e uma breve descrição de cada uma segue abaixo. Conversão do código fonte para XML: primeiramente o usuário seleciona os arquivos do código fonte que serão convertidos para a representação XML escolhida através de uma ferramenta automatizada, a qual chamamos de conversor. 1 Código fonte original Código fonte modificado / Código para XML 2 3 Repositório de dados XML 4 XML para código Ferramenta de consulta # Ferramenta de atualização - Pré-condições - Pós-condições -Operações de refatoração Catálogo de refatorações Figura 1: Processo de refatoração de código baseado em XML. Armazenamento dos dados XML gerados: uma vez convertido o código fonte, é necessário que essa nova representação seja armazenada em um repositório adequado para manipulá-la. Esse repositório pode ser desde um simples sistema de arquivos, até um robusto banco de dados nativo XML. Refatoração via manipulação dos dados XML: nessa etapa, o usuário seleciona qual refatoração deseja aplicar ao código convertido. Depois de feita a escolha, RefaX testa se o comportamento externo do sistema será preservado através da validação de pré-condições. As pré-condições são descritas através de funções de análise, como por exemplo, IsClass(className), que testa se existe uma classe denominada className no sistema. Como as funções de análise apenas acessam o código em XML, sem alterá-lo, elas são especificadas através da linguagem de consulta XQuery [16]. Uma vez garantida a preservação do comportamento, as operações necessárias para a refatoração são aplicadas ao código através de uma linguagem de transformação ou atualização de dados XML. Por fim, após as modificações terem sido feitas, o comportamento é verificado através de pós-condições, que assim como as pré-condições, também são descritas por funções de análise e especificadas em XQuery. Conversão de XML para Código fonte: o último passo consiste na conversão do código fonte em XML alterado para a sua representação textual original. A ferramenta responsável por realizar esse mapeamento de volta é chamada de reversor. 3. A Ferramenta RefaX4Java Para demonstrar a viabilidade de RefaX, foi implementada uma ferramenta para refatoração de código Java, a partir de uma instanciação do arcabouço, denominada RefaX4Java. Essa ferramenta constitui o núcleo do nosso ambiente de refatoração, a partir do qual é possível construir diferentes interfaces para a interação do usuário com a ferramenta. Para que a ferramenta tenha uma maior aceitação por parte dos usuários, é necessário que ela esteja integrada ao seu ambiente de desenvolvimento, ou então ela própria seja uma nova IDE. Sabendo que existem ambientes de desenvolvimento para Java amplamente utilizados em todo o mundo, a segunda opção não seria interessante. Assim, decidimos disponibilizar RefaX4Java na forma de um plugin gratuito para o ambiente de desenvolvimento Eclipse [4], o que facilitará sua utilização pelos usuários. A seguir, mostramos como RefaX4Java foi implementado instanciando RefaX e como a ferramenta interage com o plugin, criando um ambiente de refatoração para código Java. 3.1. Detalhes de implementação Para instanciar RefaX, é necessário escolher um conjunto de tecnologias XML para preencher seus pontos de extensão. As escolhas feitas para RefaX4Java foram: • Representação de código Java em XML: JavaML [1], pois é um formato que representa por inteiro o código fonte, sem perda de informação, e permite especificar mais facilmente consultas; • Conversor: usamos Jikes, uma adaptação de compilador da IBM fornecido pelo próprio autor do formato JavaML; • Ferramenta de consulta XML: o processador de consulta IPSI-XQ [7], pois implementa a versão mais recente de XQuery; • Linguagem de atualização XML: XUpdate [18], pois é uma linguagem que facilita a especificação de operações de atualização. • Repositório de dados XML: XIndice [17], um banco de dados nativo XML gratuito; • Ferramenta de atualização XML: usamos a própria engine embutida em XIndice; • Reversor: usamos transformações XSLT também fornecidas pelo autor do formato JavaML. As funções de acesso ao código acessam os elementos de código representados em JavaML. É através delas que é feito qualquer acesso à representação XML. As pré e póscondições de uma refatoração são definidas por um conjunto de funções de análise, e estas por sua vez, utilizam diversas funções de acesso ao código. Por exemplo, getClass($doc) é uma função de acesso ao código que retorna todos os nós XML que representem uma classe no documento $doc; para saber o nome de uma classe contida no nó XML $class, usamos a função de acesso ao código getClassName($class). Essas e outras funções de acesso ao código, juntamente com suas especificações no formato JavaML, são mostradas abaixo: • getClass($doc): $doc//class • getClassName($class): $class/@name • getMethod($class): $class//method • getConstructor($class): $class//constructor • getVariable($method): $method//local-variable • getVariableName($var): $var/@name RefaX4Java atualmente implementa seis refatorações primitivas: Rename Class, Rename Attribute, Add Method, Add Class, Add Attribute e Remove Attribute. As refatorações primitivas podem ser combinadas para formarem refatorações compostas[13]. 3.2. RefaX4JavaPlugin : Um Plugin para o Eclipse O plugin para Eclipse que interage com RefaX4Java, denominado RefaX4JavaPlugin, disponibiliza, no momento, as refatorações Rename Class e Rename Attribute, já que as outras refatorações implementadas em RefaX não fazem sentido para o usuário se utilizadas isoladamente. Ele foi desenvolvido através da implementação do ponto de extensão org.eclipse.ui.popupMenu. Os dois tipos de contribuição para esse ponto de extensão (objectContribution e viewerContribution) foram utilizados para permitir que o usuário aplique a refatoração apropriada a partir do código mostrado no editor, ou a partir de uma das visões disponíveis no Eclipse, como a Outliner e a Navigation. Sempre que o usuário seleciona uma refatoração, um formulário é mostrado solicitando que ele digite os dados necessários. Por exemplo, caso ele escolha aplicar a refatoração Rename Class, uma janela é aberta solicitando que ele informe o novo nome da Figura 2: Aplicação da refatoração Rename Class a partir de RefaX4JavaPlugin. classe. Esse exemplo é mostrado na Figura 2. Uma vez preenchidos os dados, o plugin interage com RefaX4Java através da camada RefaX Facade, que fornece uma interface para acessar todos os serviços da ferramenta. Como o próprio nome sugere, essa camada implementa o padrão de projeto Facade[6]. Um detalhamento maior da arquitetura de RefaX4Java pode ser encontrado em [12]. A ferramenta então se encarrega de testar as pré-condições, aplicar as operações de refatoração, verificar as pós-condições e mostrar na tela as alterações realizadas no formato original do código. 4. Trabalhos relacionados Podemos comparar o ambiente proposto com outros trabalhos relacionados sobre dois aspectos: o primeiro diz respeito às ferramentas de refatoração de código Java existentes, e o segundo à forma como as refatorações são implementadas. Quanto às ferramentas existentes, a grande maioria oferece praticamente o mesmo conjunto de refatorações, como é caso, por exemplo, de JFactor [8] e JRefactory [9]. O que as diferencia do nosso ambiente é a tecnologia para refatoração que cada um implementa, já que todos se baseiam em representações e mecanismos de manipulação do código próprios, enquanto o nosso é baseado em tecnologias e padrões XML abertos. Com relação à implementação das refatorações, podemos destacar dois trabalhos. Em [14], Tichelaar et al. descreve FAMIX, um meta-modelo para representar código fonte de forma independente de linguagem. FAMIX foi usado para desenvolver algumas ferramentas de manutenção independentes de linguagem, incluindo uma engine para refatoração, denominada Moose, para as linguagens Java e Smalltalk. Este trabalho difere do nosso pois foca exclusivamente no requisito de independência de linguagem, usando mecanismos de manipulação e representação de código próprios para cada linguagem, dificultando seu reuso fora do seu próprio ambiente de execução. Outro trabalho relacionado é descrito por Collard em [3], onde o autor propõe uma infra-estrutura para fornecer construções (semi) automatizadas de refatorações via uma abordagem de diferenciação no nível sintático. A idéia principal é inferir operações de refatoração a partir de duas versões do mesmo código, ambas no formato srcML [10], representando o código antes e depois de uma determinada alteração. Esse trabalho difere do nosso uma vez que o autor não considera pré e pós-condições como parte do processo de refatoração. Collard também usa diferenciação entre duas representações do mesmo código em XML para inferir novas refatorações, enquanto em nosso trabalho buscamos facilitar a implementação e reuso de refatorações já consolidadas na literatura. 5. Conclusões e Trabalhos Futuros Este artigo apresentou um ambiente para refatoração de código Java, constituído de dois módulos: o primeiro é a ferramenta RefaX4Java, desenvolvida a partir da instanciação do arcabouço RefaX para a linguagem Java; a segunda é a interface construída para a interação dessa ferramenta com o usuário, para a qual foi criado um plugin para o Eclipse. Com o ambiente, mostramos que o uso de padrões de processamento e representação de código abertos e baseados em XML pode ser utilizado como mecanismo para desacoplar o processo de refatoração das tecnologias utilizadas e oferece uma efetiva contribuição para o desenvolvimento de ferramentas de manutenção de software mais flexíveis e customizáveis. Atualmente estamos implementando novas e mais elaboradas refatorações para RefaX4Java. Como trabalhos futuros pretendemos aplicar RefaX4Java para sistemas de diferentes tamanhos e domínios de aplicação, bem como investigar sua performance e escalabilidade, especialmente comparada às ferramentas de refatoração existentes para a linguagem Java. Outro ponto que também nos interessa é criar outros plugins para diferentes IDEs, como NetBeans e JBuilder. 6. Referências [1] Badros, G. J., “JavaML: A Markup Language for Java Source Code”, in Proc. of the 9th Int. World Wide Web Conference (WWW9), Amsterdam, Netherlands, May 2000. [2] Beck, K. “Extreme Programming Explained: Embrace Change”. Addison-Wesley, 1999. [3] Collard, M. L. “An Infrastructure to Support Meta-Differencing and Refactoring of Source Code”. In Proc. of the 18th IEEE Int. Conf. on Automated Software Engineering, Montreal, Quebec, Canada, October 2003. [4] Eclipse Home page. Available at http://www.eclipse.org. Accessed on 25/06/2004. [5] Fowler, M. “Refactoring: Improving the Design of Existing Programs”. Addison-Wesley. 1999. [6] Gamma, E., Helm, R., Johnson, R., Vlissides, J. “Design Patterns: Elements of Reusable Object-Oriented Software”. Addison-Wesley, 1994. [7] IPSI-XQ. Available at http://www.ipsi.fraunhofer.de/oasys/projects/ipsixq/index_e.html. Accessed on 04/03/2004. [8] JFactor Homepage. Available at http://www.instantiations.com/jfactor/. Accessed on 01/05/2004 [9] JRefactory Home page. Available at: http://jrefactory.sourceforge.net/. Accessed on 01/05/2004 [10] Maletic, J.I., Collard, M.L. and Marcus, A., “Source Code Files as Structured Documents”, in Proc. of the 10th Int. Workshop on Program Comprehension (IWPC ’02), Paris, France, pp. 289–292, June, 2002. [11] Mendonça, N. C., Maia, P.H.M., Fonseca, L. A., Andrade, R. M. C., “RefaX: A Refactoring Framework Based on XML”, in Proc. of the 20th. IEEE Int. Conf. on Software Maintenace (ICSM 2004), September, Chicago, USA, 2004. [12] Mendonça, N. C., Maia, P.H.M., Fonseca, L. A., Andrade, R. M. C., “Building Flexible Refactoring Tools with XML”, in Anais do 18º. Simpósio Brasileiro de Engenharia de Software (SBES 2004), Outubro, Brasília, Brasil, 2004. [13] Mens, T. and Tourwé, T. “A Survey of Software Refactoring”. IEEE Transactions on Software Engineering, Vol. 30, No. 2, February 2004. [14] Tichelaar, S. et al. “A Meta-model for Language-Independent Refactoring”, in Proc. of the Int. Symposium on Principles of Software Evolution (ISPSE 2000). Kanazawa, Japan, November 2000. [15] W3C. “Extensible Markup Language (XML)”. Available at http://www.w3.org/TR/xml. Accessed on 04/03/2004. [16] W3C. “XQuery 1.0 : An XML Query Language”. W3C Working Draft 12 November 2003. Available at http://www.w3.org/TR/xquery/. Accessed on 04/03/2004. [17] XIndice Home Page. Available at http://xml.apache.org/xindice/. Accessed on 04/03/2004. [18] XML:DB. “XUpdate – XML Update Language Working Draft”. Available at http://www.xmldb.org/xupdate/. Accessed on 04/03/2004.