Um Ambiente para Refatoração de Código Java

Propaganda
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.
Download