You are on page 1of 22

RESUMO Frameworks e bibliotecas mudar sua API. Migrao de um aplicativo para a nova API tedioso e interrompe o processo de desenvolvimento.

to. Embora algumas ferramentas e ideias tm sido propostaspararesolver a evoluo de APIs , a maioriadas atualizaes so feitasmanualmente.Paraentendermelhorosrequisitosparaasferramentasdemigrao, estudamos as mudanas na API de quatro quadros e uma biblioteca . Descobrimos que as mudanas que aplicaes quebrar existentes no so aleatrias , mas tendem a cair em determinadas categorias . Mais de80 % destas mudanas so refatoraes. Isto sugere que as ferramentas demigrao de base de refatorao deveser usado para atualizaraplicaes. Direitos de autor ? C 2006 John Wiley & Sons , Ltd. Recebeu 16Setembrode2005Revisado 30 de novembro, 2005 , aceito 15 de dezembro de 2005 PALAVRASCHAVE : evoluo API refatorao estruturas bibliotecas reutilizao de componentes compatibilidade com versesanteriores 1.INTRODUO Parte da manuteno de um sistema de software est atualizando o para usar a verso mais recentede seus componentes. Desenvolvedores como a reutilizaodecomponentes de software , pois permitelhes construir um sistema mais rapidamente, mas em seguida, o sistemadepende doscomponentesquetenhamreutilizados.Idealmente,ainterfacede um componente nunca muda. Na prtica , as novas verses de componentes de software muitas vezes mudam suas interfaces e assim por exigem sistemas que utilizam os componentes a ser mudado antes de as novas verses podem ser usadas . Evoluo do software tem sido um tema de estudo [1] . Outros [ 2,3 ] tmse centrado sobre o porqu de software mudanas , queremos descobrir como ele muda. Nosso objetivo reduzir acarga de reutilizao em manuteno. Issorequertantoreduzindoaquantidadedealteraoou reduo do custo de adaptao mudana. Os desenvolvedores de componentes no quer aprender uma nova lngua ou escrever especificaes adicionais para um componente. Os desenvolvedores de aplicativos deseja um fcil ( pushbutton ) e seguro (comportamento de preservao )formadeatualizarosaplicativosbaseadosemcomponentes . Este trabalho o incio de nossa misso de atender a necessidades, tanto de componente e developers.What aplicao uma representao adequada para as alteraes que aconteceu em um componente? Pode ser recolhida automaticamente? Ser que esta representao transportar tanto a sintaxe easemnticadasmudanas? Quepodelevaraseguro,atualizao automtica de baseado em componentes aplicaes? Como grande parte do esforo despendidona atualizao de aplicativos baseados em componentes pode ser salvo?Embora existam princpios da evoluo do software que so verdadeirasparao software em qualquer idioma , linguagens deprogramao tm um impacto sobre a evoluo do software.Estamos particularmente interessados naevoluodoscomponentesorientadosaobjetos(referimonos tanto a biblioteca e quadro como componentes , a menos que a distino necessrio). Classes contm uma mistura demtodos pblicos e privados. o pblico mtodossoaqueles que se destinam a ser usadas por programadores de aplicao . O conjunto de mtodos comuns de uma biblioteca de classes compem sua interface de programadorde aplicativos (API). Alteraes aos mtodos particulares e classes no representar umproblemapara

desenvolvedoresde aplicativos, poiseles s se preocupam commudanasnaAPI. Um tipo importante de mudana de software orientada a objetos uma refatorao [4]. refatoraes so Transformaes de programa que alteram a estrutura de um programa, mas no o seu comportamento. refatoraes incluem aulas de renomear ou mtodos , mtodos ou variveis entre classes em movimento, e dividindo mtodos ou classes . A refatorao que muda a interface de um objeto deve mudartodososseusclientespara usar o novo interface. Whenuma bibliotecadeclassesquereutilizadoemmuitossistemas reformulado , os sistemas que a reutilizao deve mudar. No entanto, aqueles em desenvolvimento a biblioteca muitas vezes no sabem todos os sistemas que reutilizlo. A nova verso dabibliotecaumrefactoringdoseu pontodevista,masnodopontodevistados desenvolvedoresdeaplicativosquesoseusclientes.Otrabalhooriginalsobrearefatoraofoi motivado pela evoluo framework. Opdyke e Johnson [5 ] olhou para o sistema operacional Escolhas e do tipo de refatoraes queocorreram comoeleevoluiu.Graver[6]estudaramum quadro compilador orientado a objeto,umavez que passouportrsiteraes.TokudaeBatory [7] descrever a evoluo dedois quadros , com focoemcomoarquitetnicograndemudanas pode ser conseguida por uma sequncia de refatoramentos . No entanto , nenhum destes estudos determinaram a fraco de alteraes que so refatoramentos . do alteraes que causam problemas para os mantenedores , qual frao so refatoraes ? So refatoraes como importante na prtica, como esses autores implica? Os autores tudo discutir oapoio da ferramenta, embora geralmentedo ponto de vista de um componente revelador , e no de um reuser componente. No entanto, catchup [8] uma ferramenta que usa descries de refatoraes para ajudar os desenvolvedores de aplicativos migrarsuas aplicaes para uma nova verso de um componente. Como muita da evoluo componente podeserexpressoem termos de refatoraes?Anicamaneiradesaber olharparamudanasemumcomponente ao longo do tempo e categorizlos . Este artigo analisa quatro quadros e uma biblioteca (ver Tabela I e Seo 2) desenvolvidos porcincogruposdiferentes.Quatrosocomumenteusados open source e um framework proprietrio. Todo o estudosdecasososoftwaremaduro,ou seja, componentes que esto em produo h mais de trsanos.Atagoraelesprovaramser uma base de clientes til e, portanto, adquiriu grande . Nesta fase, mudanas na API tem o potencial para danificaracompatibilidadecommuitasaplicaesantigas.Compatibilidadecom verses anteriores e diferentes estratgias para preservla so o tema da Seo 3 . Ns analisar e classificar as mudanas na API , nos cinco sistemas. Ns descrevemos algumas tcnicas utilizadasparamanteracompatibilidadecomversesanteriores(Seo3),enquanto o foco principal sobre as mudanas na API que quebram compatibilidade com aplicativos maisantigos(Seo4).Aprendemosqueentreduasversesparacadaumdoscincosistemas estudados , 84% , 81%, 90 %, 97% e 94% da quebra API mudanas so refatoraes . A maioria das mudanasna API ocorrer como a responsabilidade transferidaentre as classes (por exemplo , mtodos ou campos movimentados ) e as mudanas de protocolo de colaborao(porexemplo,renomearoualteraraassinaturadomtodo).

Estes resultados nos fez acreditar que a refatorao desempenha um papel importante como componentes maduros evoluir. Uma vez que mais de 80% das alteraes significativas nos

estudos de casos foram refatoramentos , propomos que ferramentasquerefatoraesrecord and playback so usados para atualizar os aplicativos (Seo 5). Este artigo uma verso expandida de uma conferncia de papel [9], incluindo mais umestudo de caso, mais tipos de refatoraes , e uma anlise detalhada de cada refactoring . O novo estudo de caso deu semelhanteresultadoscomoosoutros. 2.VISOGERALDOSESTUDOSDECASO Esta seo descreve resumidamente os componentes que usamos como estudos de caso . Ns escolhemos quatro conhecido frameworks e bibliotecas do reino opensource . Para verificar se o ambiente de produo afeta o tipo de mudanas na API , optamos por uma framework.We mais proprietria tentou ser imparcial em a seleo dos estudos de caso , a principal preocupao que os sistemas possuem uma boa documentao . Para cada componente que escolhemos para comparao de dois grandes lanamentos que abrangem grande arquitetnico mudanas . H dois benefcios para a escolha de grandes lanamentos como pontos de comparao. Primeiro , provvel que no havermuitasmudanasentreas duas verses . Em segundo lugar,provvelqueessasalteraesserdocumentados,assim, forneceralgumpontodepartidaparaumaanlisedetalhadadasmudanasnaAPI. 2.1.Eclipseplataforma Eclipse ( http://www.eclipse.org ) foi inicialmente desenvolvido pela IBM e posteriormente liberado para o opensource comunidade. A plataforma Eclipse fornece muitas APIs e muitas estruturas menores diferentes . A estrutura de chave no Eclipse uma estrutura do plugin Based que pode ser utilizado para desenvolver e integrar ferramentas de software . Este quadro freqentemente usado para desenvolver ambientes de desenvolvimento integrado ( IDEs) . Aplataforma EclipseescritoemJava.EscolhemosduasprincipaisversesdoEclipse , ou seja, 2,1 ( Maro de 2003) e 3.0 (junho de 2004 ) . Eclipse 3.0 veio com alguns dos principais temas que afetam as APIs.Otemaresponsividadeasseguradoquemaisoperaes executadas em segundo plano , sem bloquear o usurio. Novas APIspermitem operaes de longa durao como compilaes e pesquisas a serem executadas em segundo plano enquantoousuriocontinuaatrabalhar. Outro tema importante no 3.0 plataformas richclient . Eclipse foi concebido como um IDE universal. No entanto ,muitos componentes do Eclipse nosoparticularmenteespecficasde IDEs e pode ser reutilizada em outras aplicaes richclient (por exemplo, plugins,osistema de ajuda ,gerenciador deatualizao, GUIsjanelabased).Estetemaarquitetnicoenvolvidos elementos especficos de IDE factoring out. APIs fortemente afetado por esta mudar so aqueles que fizeram uso dos recursos do sistema de arquivos . Por exemplo, um IWorkbenchPage interface usada para abrir um editor para um arquivo deentrada . Todos os mtodos que eram especficas recurso (aqueles que tratadas com a abertura em cima de arquivos editores ) foram removidas a partir da interface . Um cliente que abre um editorpara um arquivo deveconvertloemprimeirolugaraumaentrada editorgenrico.Agora,ointerface pode ser utilizado por ambos os no IDE clientes (por exemplo , um cliente de correio eletrnicoqueeditaocorpodamensagem),bemcomoosclientesIDE.

2.2.quadroMortgage Uma grande corporao bancria no CentroOeste foi a construo de um quadro dehipoteca para alavancar existente expertise financeira ao escrever novas aplicaes. O quadro de hipoteca permite diversas aplicaes bancrias desenvolvidas dentro da empresa para comunicar uns com os outros e com os sistemas legados . O quadro recebe solicitaes de sistemas ou servios de frontend , avalia as suas necessidades , e redireciona a solicitao para um destino especfico , ou destinos, como um mecanismo de fixao de preos ou o motor de fechamento custo. Depois de receber uma resposta adequada , o quadro refina la para um canal pedido especfico e,emseguida,encaminhalovoltarparaosolicitante.Quando visitou a instituio bancria , eles estavam finalizando a integraoentre a hipoteca quadro e outro quadro middleware desenvolvido de forma independente em outra agncia do banco . Frameworks so projetados paraa extenso no para a integrao [10] . Como resultado do casamento entre as duasestruturas , os desenvolvedores de aplicativos tiveram de migrar os servios existentes. a empresa relataram que todo o processo de integrao e modernizao durou um vero. No momento da escrita, h cerca de 50serviosqueusam o framework. 2.3.frameworkStruts Struts ( http://www.struts.apache.org ) um framework open source para a construo de aplicaes Web em Java. O quadro uma variao do ModelView Controller ( MVC ) paradigma design. Struts fornece seu prprio componente Controller e se integra com outras tecnologias para fornecer o modelo e a Ver . Para o Modelo , Struts pode interagir com as tecnologias de acesso de dados padro , tais como JDBC e EJB , assim como a maioria quaisquer pacotes de terceiros , tais como Hibernate , iBATIS,ou objetoponterelacional.Para o Vista, StrutsfuncionabemcomJavaServerPages,bemcomomodelosdevelocidade,XSLT e outros sistemas de apresentao . Devido a esta separao de interesses , Struts pode ajudar a mudana de controle em um Web projetar e promover a especializaodo trabalho. Escolhemosparacomparaoverso1.1(Junhode2003),umgrandelanamentopassado,e 1.2.4 (setembro de 2004 ) , a ltima verso estvel . Todas as mudanas na API revelar trabalho de consolidao que foi feito entre o dois lanamentos . Os desenvolvedores do frameworkeliminadocdigoduplicadoeremovidosemmanutenooucdigodebuggy. 2.4.Bibliotecalog4j log4j ( http://www.logging.apache.org/log4j ) uma biblioteca Java popular para habilitar o log sem modificar o binriodo aplicativo . Ele permite ao desenvolvedor controlar quaisinstrues de log so emitidos com granularidade arbitrria usando arquivos de configurao externos. Logging tem seus inconvenientes.podedesacelerarumaplicativo.Seformuitodetalhada,que pode causar cegueira scrolling . Para aliviar estas preocupaes, log4j projetado para ser confivel , rpido e extensvel. log4j usa uma hierarquia logger para controlar quais so as declaraes de registro de sada. Isto ajuda a reduzir o volume de produo registrado e minimizar os custosdeexploraomadeireira.Oalvodasadadologpodeserumarquivo,um OutputStream , um java.io.Writer , um servidor log4j remotoouumcontrole remotoUnixsyslog

daemon logger entre muitas outras metas deproduo.Escolhemosparacomparaoverso 1.2(Maiode2002)eaverso1.3alpha6(janeirode2005).Abibliotecapassouporumafasede expanso e cresceu de 30 para 62 KLOC KLOC ( KLOC significa mil linhas de cdigo). A biblioteca cresceu , melhorando em componentes existentes (como Chainsaw , um kit de ferramentas de visualizao para os madeireiros ) ou a adio de novos componentes (tais comosuporteparaplugins,comoformadeestenderabiblioteca). 2.5.JHotDraw JHotDraw ( http://www.jhotdraw.org/ ) uma estrutura grfica bidimensional para o desenho estruturado editores que escritoemJava.ElefoioriginalmentedesenvolvidoemSmalltalkpor KentBecke WardCunningham.ErichGammaeThomasEggenschwilerdesenvolveuaverso Java , ento ele tornouse um projeto open source . O HotDraw original foi um dos primeiros projetos especificamente projetados para reutilizao e rotulados como um quadro . Foi tambm um dos primeiros sistemas documentados termos de padres de projeto [11] . Em contraste com a biblioteca grfica Swing, JHotDraw define um esqueletobsicoparaumeditor baseadoem GUI com ferramentas em uma paleta de ferramentas,pontosdevistadiferentes, figuras grficas definidas pelo usurio e suporte para a economia , carregamento, e os desenhos de impresso. O quadro tem sido usado para criar muitos editores diferentes Ferramentas CASE para um editor de diagramas Pert ( http://www.jhotdraw.org/survey/applications.html ) . Escolhemos para comparaoverso4.0e 5.0. O objetivo da verso 5.0 era usar recursos ( novo em naquela poca)disponveisemJDK 1.1 como modelodeevento,oacessoaosrecursos,serializao,rolagem,impresso,etcEle tambm consolidou a estrutura de empacotamento e melhor suporte para conectividade de diagramas. 2.6.Acoletadosdados Os componentes do estudo de caso so de mdio a grande porte ( Mortgage 50 KLOC , Eclipse mais ou menos 20 000 KLOC ) . difcil descobrir as mudanas em um sistema grande e muitos autores sugerem que asferramentas deve ser utilizado para detectar alteraes. Por exemplo,Demeyer et ai. [12] descrevem como usaram mtricas ferramentas para descobrir refatoraes . No entanto ,a maioria dasmudanasnaAPIseguirumlongo depreciar substituir remove ciclo de preservar a compatibilidade com verses anteriores . Isto significa que uma API obsoleto pode coexistir como novoAPIpara um longo perodo detempo.Istointroduzrudosuficientepara queferramentaspodemnos enganarsobreotipoexatodemudanaqueaconteceu. Considere , por exemplo, uma mudana como renomear Categoria classe para classe Logger em log4j . A fim de manter a compatibilidade com clientes antigos , classe Logger(o novo nome)herdadaclasseCategoria.Oconstrutordacategoriatornouseprotegidosde modo que os usurios no podem criar categorias diretamente, mas em vez invocar o mtodo creational getInstance (). EstemtodoretornainstnciasdanovaclasseLogger . Qualquer mtodo na categoria que retornou um objeto do tipo Categoria tornouse obsoleto. Os clientes devemsubstituirtodasasrefernciasacategoriacomreferncias

a Logger . As duas classes ainda coexistem, mas a categoria ser excluda eventualmente. Tal threestep mudana teria sido mal interpretado por uma ferramenta, mas um especialista humano pode facilmente detectar isso como uma renomeao. Por estas razes , escolhemos em vez de fazer uma anlise manual das mudanas deAPI.Mesmo para o maiorcomponentes,foipossvelporquenscomeamosapartirdoslogsdealteraes que descrevem as mudanas na API para cada verso . Para Eclipse ns usamos o sistema de ajuda , os documentos chamados de " incompatibilidades entre Eclipse 2.1 e 3.0 'e' Adotando 3,0 mecanismos e API . Para Struts estudamos os ' Release Notes ' para a verso 1.2.4 . Para Log4J estudamos 'Preparao para o log4j verso 1.3 ' . Para JHotDraw estudmos dos Release Notes "para a verso 5.0 , embalados juntamente com a documentao do quadro . s vezes, os documentos de autorizao seria vago , lendo , por exemplo, "mtodo M na classe X obsoleta . Devido aos ciclos deprecate substituir remover muitos tipos de mudanas so mascaradas pelo mecanismo de depreciao . Nesses casos, lidos e comparados as duas verses do cdigofonte fim de descobrir a inteno por trs da depreciao . Quando um mtodo deprecated ele simplesmente delega ao seu mtodo de substituio. Ao ler ocdigo soubemos se onovo mtodo apenas uma mudana de nome do mtodo preterido,seaintenoeramoveromtodo a outra classe ou, se o mtodo deprecated foi substitudo por um mtodo semanticamente equivalente , que oferece um melhor desempenho. Para o quadro de Hipoteca, durante dois dias, entrevistamos os desenvolvedores de enquadramento e aplicao e , emseguida,estudouocdigofonte. ClassificamostodasasalteraesdequebradeAPI dos estudos de caso emmudanas estruturaisecomportamentais(anlise qualitativa), ento gravamos quantasvezescadatipodealteraoocorreu(anlisequantitativa).O suporte da ferramenta atual [ 1215 ] para deteco e classificao evoluoestruturalmuito limitado: foram tentadas a ser detectada apenas em alguns tipos de refatoramentos (principalmente fusoeseparao).Porconseguinte,parafazerumaanlisequalitativaglobal das alteraes recentes , o mtodo manual Parece que overificado duas vezesnossaanlise quantitativasalternative.Weusandoumaferramenta(Van[16])eheurstica(comoem[12]). Para cada tipo de refatorao, ns escrevemos consultas em Van que retornam dessas estruturas suspeita de que arefatorao especfico. Por exemplo, para detectar alteraes nos tipos de 'parmetros de mtodo , que procuroumtodos que tm omesmo nome, em ambas as verses de uma classe , tm o mesmo nmero de argumentos , tm o mesmo tipo de retorno , mas tenhaaassinaturadiferente.Depoisdeanalisareeliminar os falsos positivos , os restantes candidatos foram encontrados entre aqueles que j foram detectados a partir de a mudana de logs. Van encontrado emalguns outroslugares suspeitos de refatorao , mas o nmero menordoque4%doqueosdetectadospor apartir dos registos de mudana.TambmVannoconseguiramdetectarvrioslugaresondeum certo refactoring ocorreu. Isso aconteceu por causa do rudo introduzido pela deprecate substituir remover ciclo descrito above.We s poderia fazer referncia cruzada nossos resultados para Struts e log4j .A ferramenta no escalar para o Eclipse e no possui o cdigo fonte do Mortgage proprietrio framework. Estudo de caso JHotDraw foi adicionado numa data posterior e desde Van no produzir novos dados os estudos de caso anteriores,decidimosnoexecutloemJHotDraw.

3.HOWAPISCHANGE Nestaseo,classificarasmudanasnaAPIemrelaoacomoelesafetamacompatibilidade Seo 3.1 fala sobre APIs eo que isso significa para uma mudana de API para quebrar a compatibilidade com aplicaes. Na Seo 3.2 , descrevemos algumas tcnicas usadas para fazer mudanas na API , sem quebrar aplicaes. Seo 3.3 apresenta os dados empricos coletadosapartirdasmudanasquequebramObservamosemoscincoestudosdecaso. 3.1.MudanasnaAPIecompatibilidade Uma API a interface que um componenteforneceaosdesenvolvedoresdeaplicativos e sua descrio parte do documentao do componente. O prazo foi estendido para qualquer componente que suposto para ser reutilizado por clientese,assim,esperase que seja estvel . APIs fazer uso das regras de visibilidade da lngua em que o componente foi implementado . Por exemplo, em Java ou C + + somente os membros que so declaradas pblico ou protegido pode ser parte da API. No entanto,nem todas as classes e membros de classe que so pblicos so destinados a aparecer no cdigo docliente. Normalmente noh recursos de linguagem que distinguem entre entidades pblicas que se destinam a parte das entidades da API pblica e que no so. As convenes denomenclaturapodeser usadopara identificar aqueles componentes que so " publicados " (para ser reutilizado)a partir desses componentes que so "pblico" , mas no so destinase a serreutilizado . [17]Porexemplo, Eclipse coloca uma classe pblicaquenouma APInumpacotecom'interna'como prefixo. Essa classe um jogo justo a alterao sem aviso prvio. Com o tempo, as mudanas so feitas para APIs ou comportamento APIs " . Dependendo se so ou no compatvel com verses anteriores , mudanas na API pode ser classificada como mudanas na API no quebrarouquebrarAPImudanas. Aalteraodequebranocompatvel. Causaria um aplicativo criado com um antigo verso do componente falhar em uma nova verso. Se o problema imediatamente visvel , o aplicativo no compilar ou vincular . Ou o aplicativo pode compilar tudo bem, mas se comportam de forma diferente em tempo de execuo. Por comportamento que significa um comportamento funcional , por exemplo , o conjunto de sadas observveis para um dado conjunto dos insumos. Se a nica diferena perceptvel que um aplicativo um pouco mais rpido ou mais lento ou tem um footprintdememriadiferente,noconsiderloumamudanaderuptura?.

Amudananoquebracompatvel. Tal modificao pode ser um acessrio tal como a adio de novos mdulos para estender a funcionalidade do componente, ou pode ser umdesempenho otimizaoou aremoodeerro.

Uma mudana aparentemente sem quebra , como a fixao de umbugno componente pode ser um quebramudar.Seosdesenvolvedoresdeaplicativoscontornadoobug,ento,quandoo bug removido ocomponente,oaplicativopodesecomportardeformadiferente.Emborahaja um nmero de tcnicas utilizadas para facilitar as alteraes de componentessemquebraros clientes [18] , quebrando mudanas na API acontecem o tempo todo . Nosso objetivo final fornecermigraoferramentasquepodemincorporaralteraessignificativas. 3.2.MudanasnaAPInoseparveis Esta seo discutemudanas na API que preservar a compatibilidadecom versesanteriores do componente. Tambm apresentamos algumas tcnicas que os desenvolvedores de componentes usar para manter a compatibilidade com os mais velhos aplicaes. Novos recursos do componente so geralmente embalados em mdulos separados e no afetam o aplicaes existentes . Os desenvolvedores ainda tm que aprender as novas APIs para usar as extenses. Outras vezes, os designers de componentes empregarcom sucesso tcnicas de engenharia de software estabelecidas como ocultao de informaes , encapsulamento e abstrao para introduzir mudanas sem problemas. Tal " sob a capa" muda frequentemente incluem otimizaes de desempenho , melhorias de segurana, de bugscorrees , e outros detalhes de implementao. Por exemplo , a instituio financeira que visitamos fez uma grande mudana arquitetnica sua estrutura empresarial. Por motivos de desempenho que substituiu EJB beans de entidade com o Data Access Objects . Eles empregaram esconder informao para isolar as mudanas a partir de os servios da Web que usam o framework . Todos os servios estochamandoBeanFacadeSessionqueofereceamesmainterfacecom o mundo exterior. Para os desenvolvedores de aplicativos estas mudanas aconteceram perfeitamentesempedirrecodificao. Nos cinco estudos de caso, notamos uma srie de outras tcnicas utilizadas para facilitar as mudanassemquebrarosaplicativosdocliente. (1)Deprecation. Isto usado para degradar graciosamente velho APIs e alertar os desenvolvedores de aplicativos quecertoAPIsnoserosuportadosemversesfuturas.Osdesenvolvedores podem planejar comantecednciaparaamigraoeevitaracorreriadeltimahora.Aspartes da API que so obsoletos so marcados com especial anotaes ( por exemplo , @ tag deprecatedemJavadoc).AAPIobsoletatambmdevefornecerumdescriodecomoas aplicaesmigramparaanovaAPI. (2)Delegao. s vezes, possvel fazer a aplicao de idade delegado API para o novo implementao para que os clientes fazem uso dos acessrios. No entanto, eles devem planejar para migrar para a nova API . Por exemplo , esta tcnica muito utilizada quando renomear um mtodo em Struts . No ActionServlet classe, destroyApplications method () mudou seu nomear para destroyModules . A fim de manter a compatibilidade , a classe suportadaambososmtodosparaumtempo:

/** *@Deprecated *SubstitudopordestroyModules() */ destroyApplicationsprotectedvoid(){ destroyModules()} (3)Convenesdenomenclatura. Desenvolvedores doEclipse usar este estilo quando eles estendem uma interface.Por exemplo,aversoinicialdoIMarkerResolutiondeinterfacefoi InterfaceIMarkerResolutionpblico{ publicStringgetLabel() publicvoidrun(IMarkermarcador) } Anovainterfaceadicionamaismtodossemquebrarasimplementaesexistentesde IMarkerResolution: interfacepblicaIMarkerResolution2estendeIMarkerResolution{ getDescriptionpublicString() ImagempblicagetImage() } O '2 ' conveno de nomenclatura sugere que esta uma extenso da interface original.O novo interface pode ser usado sempre que o antigo era esperado. No entanto , os clientesteroqueusardiretoresparaacessarosnovosmtodos. (4)Interruptordetempodeexecuo. Lidar com aulas removidos ou retirados os mtodos de umainterface um pouco mais complicado. Eclipse oferece um plugin de compatibilidade que " acrescenta back ' as entidades removidos em tempo de execuo. Por exemplo , Eclipse 2.1 API oferecida um mtodoqueremovidanaverso3.0:

interfacepblicaIWorkbenchPage{ IEditorPartopenEditor(arquivoIFile)//aserexcluda ... } Eclipse3.0verificaseumaplicativoclientecompatvelcomaverso2.1ou3.0.Quandoum cliente mais velho faz umachamadaparaomtododeretirada,estachamadaenviada para uma instantiator do verso mais antiga da interface (que adicionadoecarregado

emtempodeexecuo). (5)consultainterfacedeestiloCOM. A componente fornece vrias verses de uma interface. A cliente ir primeiro consultar uma interface queelesabe como interagircomele.Seocomponenteaindasuportaainterfacemais velho que o cliente est solicitando , o cliente eo componente pode comunicar. Em Eclipse, o documento inicial IDocument Interface adquiriu vrias extenses chamadas IDocumentExtension , IDocumentExtension2 , IDocumentExtension3 . A cliente verifica se o documentoretornadoporgetDocument()temumainterfacequeelesabecomofalar. 3.3.QuebrandomudanasnaAPI Quebrando as mudanas so extremamente perturbador no ciclo de vidade desenvolvimento de baseado em componentes aplicaes. Quandoos engenheiros de aplicao estonomeio do desenvolvimento , a atualizao de um componente poderia prejudicar custos e cronogramas . A menos que haja um alto retorno sobre o investimento , desenvolvedoresde aplicativosno querem migrar para anovaverso docomponente [19]. Tabela II lista os tipos de quebra mudanas na API que observamos nos componentes que estudados. A primeira coluna identifica o tipo de alterao . Essas mudanas em itlico so refatoraes . As restantes colunas do o nmerodevezes quecadatipodealteraoocorreu nos componentes. Colunas Eclipse * (E *) e Struts * ( S * ) lidar com as mudanas " recomendados ". designers de componentes marcado estes como mudanas que sero aplicadas no prximo grande lanamento . Embora tecnicamenteestes no esto quebrando mudanas para a verso atual ( que foram isolados pelo mecanismo de depreciao ) inclumos lhes oferecer a tendncia de quebrar as mudanas que esto vindo em prximas verses . Baseado quantas vezes cada tipo de mudanaocorreu,nsclassificamosaslinhas paraqueasmudanasmaispopularesaparecememprimeirolugar. 4.UmcatlogodealteraessignificativasdaAPI EstaseocategorizaasmudanasnaTabelaIIdeacordocomcomoelasafetamasemntica da componente.Astransformaesestruturaisso mudanassemnticasdepreservao ( refatoraes ), enquanto o mudanas comportamentais so mudanas modificadoras semnticas. uso extensivode callbacks (mtodos hook ) em quadros , existem dois tipos de clientes da API Mtodos: chamadores e implementadores . Algumas mudanas afetam ambos os tipos de clientes, enquanto outras mudanas afetar apenas um tipo de clientes. JHotDraw ilustra algumas das sutilezas das mudanas na API sobre o cdigo do cliente . AbstractFigure fornece a implementao padro para as classes de figura. Ns encapsular semelhanas entre os diferentes figuras de classe, usando o padro de projeto Template Method [20]. Assim , o mtodo moveBy (referido como mtodo template) contm o algoritmo fixo para mover uma figura ( ver Figura 1) : primeiro, anuncia que uma figura est prestes a mudar algo que vai afetar sua caixa de exibio ( pelo mtodo de chamada willChange ) , em

seguida, a figura movido com o delta especificada ( por chamado mtodo basicMoveBy ) e, finalmente, ele informa que a figura modificada a rea de sua caixa display ( chamando o mtodomodificado). A sequncia destestrspassos comum para todas as figuras , o quemudadefigurapara figura estencapsuladonomtodoabstratobasicMoveBy.Portanto,estemtodotornase o ponto de charneira no algoritmo , ou o mtodo de gancho . Os clientes que desejam adicionar novos tipos de dados deve implementar esse mtodo. Ao invs de cdigo do cliente chamando o quadro , o quadro vai chamar esse mtodo quando o utilizador move uma figura (portanto,anaturezaderetornodestemtodo). Agora, qualquer alterao que afete a assinatura ou o nome do mtodo gancho potencialmente alterando a comportamento do cdigo do cliente. Uma alterao do mtodo deganchoquequebraaimperiosapolimrficacomummtododeclienteirresultarno mtodo de cliente que so saltados semprequeo mtodochamadomolde.Portanto, menos mtodos clientes so chamados . O inverso tambm pode acontecer. Uma alterao no mtodo de gancho thatmakes que se o mtodo de um super clientmethod diferente resultar na clientmethod sendo chamado ( acidentalmente ) sempre que o mtodo de modelo chamado. Steyaert et ai. [ 21], referemse ao primeiro caso como Mtodo inconsistente e ao segundo como mtodo de captura. Desde Mtodo de captura e inconsistente Mtodo no produzem erros de compilao , podese falaciosamente assumirqueamodernizaoeraseguro. Quando o mtodo de gancho declarado comoum mtodo resumo ,se o mtodo de gancho de modo que haja alteraes no so mais os mtodos de clientes substituindolo , o compilador sinaliza um erro Mtodo Unimplemented no classe cliente. Tanto o mtodo de inconsistente, Mtodo de captura ou Mtodo Unimplemented podeocorrer,dependendosobre a natureza da alterao do mtodo de gancho e os mtodos existentes, na classe declientes. Suponhase que uma classe cliente chamado BackgroundFigure tem, entre outros mtodos , osseguintesmtodos: BackgroundFigurepublicclassAbstractFigure{ vaziobasicMoveBy(intdx,intdy){ //Substituiomtodoganchonasuperclasse ... } vaziomoveByDelta(intdx,intdy){ //Ummtodoauxiliar } } Se osdesignersquadromoveromtodoganchobasicMoveByparaoutraclasseeatualizarseu site de chamada no mtodo template moveBy , o basicMoveBy em BackgroundFigure no

substitui o mtodo gancho. Quando o mtodo de modelo chamado em uma instncia de BackgroundFigure , sua basicMoveBy no chamado por mais tempo , levando a Mtodo inconsistente. Se, ao invs , os designers quadro renomear o mtodo deganchobasicMoveBy para moveByDelta , uma vez que no existe um mtodo com esta assinatura na classe do cliente , este mtodo ser ( acidentalmente ) chamado sempre que o mtodo template invocado, portanto, levando para o mtodo de captura. Caso contrrio, se os designers renomeia quadro resumo do mtodo de gancho de tal modo que no existe um mtodo em BackgroundFigure que substitui lo, o compilador sinaliza um erro Mtodo Unimplemented em BackgroundFigureclasse. 4.1.transformaesestruturais Para melhorar a capacidade de reutilizao efacilidadedemanutenodo componente, o cdigo reestruturada ( reformulado ) . Refatoraes afetam apenas a estrutura do cdigo e so destinadas a preservar o comportamento funcional do o componente. Considere, por exemplo , o que acontece quando um mtodo renomeado. Designers de componentes renomear um mtodo de instncianocomponente.Eleslocalizareatualizartoda a chamadores e implementadores do mtodo para refletir o novonome . Para o componente em si , esta mudana seguro e no modifica seu comportamento. No entanto, aplicaes remotas que chamam a renamedmethod so quebrado. Assim, uma mudana de comportamentodepreservao(refatorao)paraocomponentepodelevaraumaquebra mudar para a aplicao. Mais cdigo do aplicativo vezes no est disponvel para os desenvolvedores de componentes quando eles fazemestrutural mudanas.Oresultadoque asaplicaespodemnemcompilarcomanovaversodocomponente. Uma vez que o desenvolvedor do aplicativo resolve os erros decompilao,ocomportamento do aplicativo o mesmo ( mudanas estruturais na componente no introduzir um novo comportamento ) . Nos casos em que o estrutural alteraes acidentalmente comportamento modificado induzida (tal como noModo de Captura Mtodo ouinconsistentedescritoacima),o desenvolvedor do aplicativo ter que fazer alteraes no cdigo semnticas para combater equilibrarasalteraesnocomponente.

mtodomovido A formamaiscomumqueosmtodosdeinstnciamovidaemEclipse, tornandosemtodos estticos em novas aulas de acolhimento. O raciocnio era para mover a camada quebrar mtodos em classes de servios pblicos para preservar a convenincia dos mtodos de idade. Normalmente, o mtodo mudou levar a classe antiga casacomo um extra argumento. Isto ir assegurar queo mtodomudoupodeacessarmembrospblicosdaclasseantigacasa . No Struts , mtodos de instncia permanecer mtodos de instncia depoisse deslocam para outras classes. chamadores Velho do mtodo de perguntar a ummtodode fbrica para uma instncia da nova classe casae ,emseguida,chamaromoveumtodo.Outrasformasqueos mtodos foram transferidossovariaesdoMtodoMoverefatoraodescritaporFowleretal

. [4 ] . Os implementadores do mtodo mudou no ir compilar se fazer umachamada para o mtodo super() . Como paraoschamadoresdomtodomovido,elespodemcompilarouno, dependendo se omtodo usadopolimorficamente.Seomtodomudoudeclaradoemuma classe pai e substitudo na classe de cliente e o mtodo invocadoatravsdoenviode uma mensagem para um objecto com o tipo de cliente classe , o comportamento preservada.No entanto, os bons princpios de orientao a objetos recomendam que instncia ou variveis locais so declaradas com o supertipo mais geral. Neste caso , num idioma digitado esttica um erro de compilao ir avisar que no h um mtodo, na classe pai . Mover um mtodo anzol dos resultados da classe me no Mtodo inconsistente (descrito acima) umavez queo mtododeclientesubstituindooganchonomaischamado. campomovido A encapsulao requer que as variveis que caracterizam o estado de um objecto no esto expostos. No entanto,por vezes, os campos so publicamente exposto quer por convenincia ou porque representar constantes. Quando os campos so espaos reservados para as constantes globais so geralmente declarado como campos estticos. Em Eclipse, Struts , e log4j , apenas camposque foram constantes mudouse para outraclassedeorigem.Movendo umpblicoresultadosdecampoemerrosdecompilaoparaosclientesqueacesslo. mtodoexcludos Normalmente, isso acontecedepoisqueummtodorenomeadooumovidoparaoutraclasse. Por razes de compatibilidade , produtores de componentes apoiar tanto o mtodo antigo e novo por um tempo. Depoisque todas as referncias ao mtodo antigo foram substitudos , o mtodo excludoumavezqueumremanescentedaAPIobsoletos.Istonormalmenteresulta em erros de compilao para os clientes chamar o mtodo. A excluso de um gancho resultados do mtodo noMtodo inconsistente uma vez que omtododeclientesubstituindoo ganchonomaischamado. Mudoutipodeargumento Observamos vrios tipos de tipo de argumento mudanas . (1) O tipo de um argumento de mtodo substitudoporseusupertipopara tornaromtodomaisgeral.Estaalteraopodeou no pode quebrar um pedido existente , dependendose a aplicao chama todos os mtodos que no so visveis atravs da interface do supertipo . ( 2) O tipo de argumento mtodo substitudo por um outro tipo , enquanto a relao entre a dois a agregao . Este frequentemente o caso quando a substituio de um tipo primitivo comum tipode objeto (por exemplo, em Java substituir int comInteger ) . Outro caso especial asubstituiodeumtipo com um coleo que contm vrios elementos do tipo anterior. A fim de considerar estas mudanas como refatoraes automatizadas , preciso saber como acessar o membro do invlucroecomoobterowrapperapropriadoparaummembro.NombitoMortgageomtodo processo ( String message ) mudou de processo (Envelope e) com Envelope encapsular a mensagem. Chamadores do processo () terquepassarporumenvelopeemvezdisso,que obtida a partir de um mtodo de fabricao . Os implementadores de processo () deve aumentar sua implementao para coincidir com o novo tipo. Eles vo primeiro obter a

mensagem de Cordas de o envelope. Esta mudana resulta em erros de compilao para os clienteschamaromtodo. Se o argumentos de um mtodo de gancho so alterados, o que pode resultar em qualquer mtododecaptura,inconsistenteMtodoouUnimplementedMethod. Chamadademtodosubstitudo Os clientes de um mtodo deve chamar outro mtodo que semanticamente equivalente e oferecido na mesma classe. Quando no houver mais chamadas para o mtodo original , geralmente excluda. No Struts , por exemplo , os clientes de FieldChecks.validateRange (.. ) deve chamar FieldChecks.validateIntRange (.. ) em vez disso. Se o mtodo for substitudo era um mtodo de gancho , esta alterao pode resultar em qualquerumdosCaptura,mtodoinconsistenteouUnimplementedMethod. Mtodo renomeado, classe renomeado, campo renomeado, e pacote renomeado Estes so utilizados para dar inteno reveladoras , nomes auto explicativos aos mtodos , classes , campos de classe , e pacotes. Estesrefatoraessobemdescritosnarefatoraocatlogos (ver [ 4] ) . Mudaronomedeummtodogeralmenteresultaemerrosdecompilaopara os chamadores do mtodo. Mudar o nome de um mtodo de gancho pode resultarem qualquer um dos Captura , mtodo inconsistente , ou Mtodo Unimplemented . Renomeaes resultado Classe em erros de compilao para ambos os instantiators e implementadores da classe. Renomeaes campo resultar em errosde compilaopara os clientes que os acessam . Renomeaes Pacote resultar em erros de compilao paraosclientesqueasentidadesdeusodopacoterenomeado. Novomtododegancho Os fabricantes de componentes fator um mtodo para fornecer "pontosquentes" que esto a ser especializada em subclasses ( ver o Template Method in [ 20] ) . Eles adicionar um novo mtodo de gancho na super classe (geralmente como um mtodo abstrato ) que todas as subclasses no abstratas deve substituir . Nsilustraristocomumexemplo doStruts.Mtodo validar()naclasseValidatorFormchamaomtodorecentementeintroduzido getValidationKey(): ActionErrorspblicasvalidar(mapeamentoActionMapping,HttpServletRequestrequest) { ... CordasvalidationKey= getValidationKey(mapeamento,request) ... } CordasgetValidationKey(mapeamentoActionMapping,HttpServletRequestrequest){ voltarmapping.getAttribute() }

Subclasses substituir getValidationKey () para fornecer o comportamento desejado. Pode acontecer que uma subclasse existente j tem um mtodo com amesmaassinaturaque oganchorecentementeintroduzidomtodo.Nestecaso,omtodofornecidopeloinheritor capturado pela classe pai embora o herdeiro no pretendia isso, portanto Mtodo de captura ocorre .Usandoumaferramentaparaexecutarrefatorao estamudanairiaavisarquandoum mtodocapturaacontece. argumentoextra Muitas vezes, duas assinaturas mtodos so muito semelhantes ,elesdiferemapenasporum argumento . Os dois mtodos fazer coisas semelhantes , mas um mtodo pode fazer coisas extras,fazendousodoargumentoextra.Aoeliminarcdigorepetido ,omtodocom menos argumentos geralmente ser substitudo pela mtodo com mais argumentos. Para os sites de chamada do mtodo de deslocados, essa mudana aparece como se o mtodo ganhou mais umargumento.Aschamadasdomtodoantigocommenosargumentos tero que chamar o novo mtodo e passar um valor padro para o parmetro extra. Desenvolvedores doquadro Mortgage decidiu que as conexes de banco de dados devemser reutilizados de uma pool de conexo em vez de ser criado cada vez que uma operao de bancodedadosfoinecessrio. Afimdepersistirumobjetoquesechamariaomtodoaseguirnoquadro: booleanpersistir(BusinessObject) Dentro do mtodo persistir uma conexo de banco de dados seria criado. A verso posterior destemtodooseguinte: booleanpersistir(BusinessObject,DBConnection) Quando o servioaWebchamaessemtodovaipassaraolongodeumaconexodebancode dados existente ( nocaso em que que possui um). Quandooobjetonulopassado,omtodo persistcriarumaconexoemtemporeal. Esta mudana geralmente produz erros de compilao para os clientes que chamam a method. When um mtodo gancho ganha mais argumentos , qualquer um dos mtodos decaptura,MtodoinconsistenteoumtodoUnimplementedpodeocorrer. classeexcluda Os fabricantes de componentes excluir umaclassequandoelenomaissuportadoou conservado devido falta de recursos ou porque a implementao muito buggy. No Struts vrias classes agiucomo recipientes para determinados objetos. O nome do recipiente sugeriria que contm objetos de um certo tipo (por exemplo, ActionMappings contm uma coleo de objetos ActionMapping ) . Em uma verso mais recente , os recipientes so substitudas por classes de coleo de propsito geral e , em seguida, excludo. Classe resultados de excluso em compilao erros para ambos os instantiators e implementadoresdaclasse.

Interfaceextrado Os desenvolvedores de componentes extrair as assinaturas dos mtodos pblicos oferecidos por uma classe em uma interface (em Java ,asinterfacessoentidadesdeprimeiraclasse). Clientes da antiga classedevechamarseusmtodosatravsnainterface.Estaalterao destinase a tornar o cdigo componente mais extensvel desde novas classes implementar a interface pode ser passada como uma implementao concreta da interface, sem ter para alterar o cdigo do cliente .EmJHotDraw5.0,todasasabstracesprincipaissoextradosdo seuprvioaulascomointerfaces. A interface utiliza o nome da classe da qual foi extrado. o velho classe implementa a interface em uma de duas maneiras: como classe abstrata ou como classe padro. As classes abstratas (como AbstractFigure ) fornecer implementao padro, mas aindaprecisa ser uma subclasse . padroclasses(taiscomoStandardDrawing ) podeserusadocomoest.Onovo prefixo da classe ( abstrata ou padro ) faz com que seja fcil distinguir entre elas. Esta mudana no afeta os clientes que s eram invocar mtodos da classe . No entanto, os herdeiros dos antigos aulas deve ser alterada para herdar as classes abstratas ou padro correspondente,otherwiseMethoderrosnoimplementadossojogadosporocompilador. objetoMethod Esta uma variao do mtodo do objeto descrito por Beck [22]eilustrarcomumexemplode Eclipse. Na classe AbstractDocumentProvider , o modificador de SaveDocument () Mtodo mudou para a final para que subclasses no pode substituir isso. Umnovo mtodo chamado doSaveDocument () foi introduzida e todo o cdigo deSaveDocument()mudouseparaonovo mtodo. Um objeto DocumentProviderOperationoferece ummtodoexecute()quedelegapara doSaveDocument () . A nova implementao de SaveDocument () cria uma instncia do DocumentProviderOperation e , em seguida, chama o mtodo execute () . Todos os implementadores anteriores SaveDocument () deve substituir doSaveDocument () em seu lugar. Empurrado mtodo para baixo Um servio jnooferecidapelasuperclassemas apenas pelas subclasses . Assim, dizemos que o methodwas correspondentes empurrado para baixo nos resultados da mudana hierarchy.This classe em erros de compilao para os clientes antigos mtodos que chamam o mtodo mudou atravs da interface de sua classe original . No entanto, uma mudana de comportamento muito mais sutil pode ocorrersem ser notado pelo compilador. Imagine o cenrio na Figura 2. Nolado docomponente,asuperclasse A define mtodo m. Thismethod substitudo na subclasse B. Classe C outra classe de componentequeherdadeB.Doladodaaplicao,aclasseDherdadeBe,portanto,qualquer chamada que faz o mtodo m expedida para a implementao fornecida por B. Na prxima verso do componente, sem estar ciente da presena de classe do clienteD,fornecedoresde componentesempurrarparabaixoaimplementaodemdeBparaC.OclienteDircompilar tudo bem, mas quando ele chama o mtodo m, a chamada enviada para a implementao fornecida por A, assim deixandopara um comportamento diferente do que quando se utiliza a versoanterior.

classemovido Uma classe transferida para um pacote diferente para aumentar a coeso do pacote. Essa mudana quebra ambos os instantiators e implementadores da classe movida. Puxou mtodo Ummtodomovidonaclassepaiparaquetodospossamtirarproveitodalgicasuperclasse. Essa mudana no ir produzir qualquer erro de compilao , mas pode levar a um comportamento incorreto.ConsidereocenrionaFigura3.Antesdefazeroupgrade,quandoo cliente classe D chama o mtodo m, esta chamada despachado para a implementao fornecida pela superclasse A. Na prxima verso do componente, m () puxado para cimade C para B. Quando o cliente D chama, a mensagem ser enviada para a implementao fornecidapelaclasseB. pacotedividido A fim de aumentar acoesodeclassesdeumpacote,osdesenhadoresdocomponente dividir um pacote em unidades menores, mais coesa. Em JHotDraw ,umpacotedefiguras foibifurcada paraforadopadropacote.Estepacoteforneceumkitdedadospadroe suaala relacionados e as classes de ferramentas. Estaalteraoresultaemerrosdecompilaopara ambosinstantiatorseimplementadoresdasclassesquepertencemdeumnovopacote. classedediviso Cada classe deve ter apenas alguns responsibilities.When uma classe adquire muitas responsabilidades , o coesividade classe inicial ser fraccionado em conjuntos de mtodos e campos que interagem unscom os outrodeperto.Designersdecomponentes escolherpara'purificar'aclassedesordenadomovendoresponsabilidadeoutrasclasses.Isso geralmente feito utilizando composio deobjetosouherana.EmJHotDraw,AbstractFigure foi dividido . Ele j no mantm o controle dos atributos de uma figura . O dicionrio agora mantido numa subclasse chamado AttributeFigure . Esta mudana permite criar figura aulas sem ter que usar implementao atributos da figura . Clientes que estavam chamando ou implementaodemtodosdaAPIatributosrelacionadosnomaiscompilao. 4.2.modificaescomportamentais Vimos que as transformaes estruturais preservar o comportamento do componente, mas pode causar aplicaes para deixar de compilar . Em contraste , as modificaes comportamentais no componente pode causar o aplicativo para compilar bem com a nova verso. Noentanto,oaplicativonoirsecomportaromesmoporqueanovaversousa diferenteshipteses. Novocontratomtodo Um contrato umacordoentreoprestadordemtodoe deseusclientes[23].Aprcondio que o mtodo assume ser verdadeira antes da execuo. A pscondio que um mtodo garante a ser verdadedepoisdeocorpodomtodofoiexecutadocomsucesso ( presumindose que a prcondio segura ) . Des Rivires [18] mostra o efeito do fortalecimento ou enfraquecimento prcondies e pscondies em clientesde um mtodo tal como visto na Tabela III.Aprimeira coluna identificaquepartedasalteraescontratuais.A

segundacolunaindicaadireodamudana:ofortalecimentoouenfraquecimentodocontrato. O prximo duas colunas mostram se a mudana compatvel ou se rompe clientes mtodo existente. ConsidereoseguintemtodooferecidopelainterfaceColeco: /**@Paramcollumacoleononulo*/ publicbooleanaddAll(Coleocoll) Designers pensar enfraquecer a prcondio para que seja aceitvel para passar um objeto nulo. As chamadas deste mtodo no so afetados. No entanto, um implementador como essa abaixo irlanarumNullPointerExceptionquandoeleenviasize()mensagemaum objetonulo: publicbooleanaddAll(Coleocoll){ //umaimplementao intsize=coll.size() .... } Se a condio foram reforados (por exemplo , passada de recolha no deve serinferioraum limiar) alguns chamadores existentes , o mtodo pode no satisfazer os requisitos causando assim algumas defeituoso comportamento. Os implementadores existentes no seroafetadas,umavezqueassumiuamenosdoqueoqueoferecidoagora. Implementarnovainterface Os desenvolvedores do componente substituir a interface implementada poruma classe com uma interface diferente (com diferentes tipos de contratos ) . Ou adicionar umanova interface para aqueles de uma classe j implementa . No Struts , a ltima verso do LabelValueBean classe implementa uma nova interface, ou seja comparvel Aclasseagoraoverridesmethods compareTo (Object) , equals(Object)ehashCode().Aplicativosmaisantigosqueos casos em comparao desta classe para a igualdadepodesecomportardemaneiradiferente, agoraqueaclasseforneceseuprpriocaminhoparaverificaesdeigualdade. Mudouparaeventos Semelhante aomaestros,quadroscontrolarocdigocontribudoporaplicaes.Normalmente, o aplicaes apenas responder quando o condutor lhes d o sinal para participate.When a aplicao fazer suposies sobre a ordem em que os eventos so gerados , vulnervel aqualquer mudana no a seqncia de eventos .Porexemplo,noEclipse3.0, seleo de itens em tabelas e rvores gera a seqncia de eventos PremirOBotoDoRato Seleo SoltarOBotoDoRato . Na verso 2.1 , a ordem evento foi diferente sob algumas plataformas com o evento de Seleco sendo gerado em primeirolugar,isto,asequnciade selecodePremirOBotoDoRatoSoltarOBotoDoRato. Novaconstanteenumerao Esta alterao afectaos clientes quedependemdoconjuntodetodososcampospossveisem

uma enumerao. Em Eclipse 2.1, IStatus uma enumerao com quatro constantes: OK , INFO, WARNING e ERROR. Alguns clientes usados uma instruo case switch para verificar todos os valores de umaenumerao. Eles trataram o caso de erro nao ramo padro da instruo switch. Eclipse 3.0 adiciona uma nova constante , ou seja, CANCELAR . quando CANCELAR passada ao redor , os antigos clientes iro interceptar anovaconstanteemseuramopadro,assimtratandoocomoocasodeerro . diverso Alm de mudanas na API , existemoutrostiposdealteraesquepodemcausarbaseado em componentes aplicaesaavaria.Algumasdessasmudanaspodemocorreralteraesde implantao , a ordem classloader alterados, mudanas para construir scripts e outros arquivos de configurao , formato e interpretao alteraes de dados . Percebemos mudanas na configurao XML e arquivos de metadados em todos os quatro quadros estudados. No entanto, estes esto fora do escopo deste artigo .Atabela IV um sumrio da Tabela II. A primeira coluna lista os componentes que ns estudamos . Como fizemos no Tabela II , Eclipse *e Struts * denotamalteraesrecomendadas,ouseja,mudanasqueiro tornarse quebrar mudanas na prxima verso . A segunda coluna indica o nmero total de quebrar mudanas na API ( estruturais e comportamentais) . A ltima coluna mostra como muitasdasalteraesdequebraAPIso refatoraes. Nossos resultados sugerem que as mudanas quebrando mais API so pequenas mudanas estruturais. Isso faz sentido porque as mudanas em larga escala levar aos clientes que abandonam o componente. Para um componente para se manter vivo , deve mudar atravs de uma srie de pequenos passos ao invs , a maioria refatoraes . Para Struts e log4j analisamos qual a percentagem de todas as mudanas na API ( incluindo a adio de novosAPI)estorepresentadosporrefatoramentos(verTabelaV).UsamosVan[16] parasaberonmerodeadioeexclusodeclassesdeAPIemtodos. AsegundalinharesumeosmtodosdeAPI que foramadicionadosouexcludosdeclassesque existem em ambos os verses , o nmero de classes de API que foram adicionados ou eliminados entre as duas verses , e o nmero de quebrar mudanas na API que no so refatoraes . " Percentual de refatoraes ' a linha retrata quantos de todas as mudanas na API (incluindo alteraessemquebras , comoaadiodenovasAPIs)so refatoraes . "Impacto de refatoraes ' a linha retrata quantosde todas as mudanas que quebram existentes clientesso refatoraes . A TabelaVmostraque,emborarefatoramentos so uma pequena percentagem de todosAPImudanas(incluindoaadiode umaAPI),que tmumgrandeimpactosobreacompatibilidade. Portanto, as ferramentas de migraodeveseconcentraremrealizarestestiposdealteraes . 5.ONmigraodeaplicaesbaseadoemcomponentes

Descobrimos que, entre as duas verses estudmos para cada umdoscincosistemas,mais do que 80 % das alteraes recentes foram refatoramentos . Se todas as alteraes recentes foram refatoraes , no faria sentido usar uma ferramenta de refatorao para incorporar essas mudanas nas aplicaes . No entanto, ns sentimos que se ferramentas poderiam suportarat80%dasmudanas,elesiriamreduziracargadeManualatualizaes. A ferramenta de migrao com base em refatoraes precisa automatizar trs etapas. Primeiro, ele precisa controlar as refatoraes que aconteceram entre duas verses de um componente (sem sobrecarga para o componente produtores ). Refatoraes pode ser registada logo no momento em que foram realizadas sobre o componente. Isso exige que o mecanismoderefatoraoregistraautomaticamentecadarefatoraoexecutada. A maioria das ferramentas de refatorao , incluindo Eclipse , representam refatoraescomo objetos , mas no necessrio fazer o registro todas as informaes necessrias para fazer essas refatoraespersistente.Assim,elesterodeseralteradosparacriarumlogpersistente de refatoraes . Os desenvolvedores de componentes vai enviareste log de refatoraes ao longocomanovaversodocomponente. Em segundo lugar, no local da aplicao, a ferramenta de migrao precisa carregar a representao do refatoraes em objetos de refatorao ao vivo. Se refatoraes j so objetos, ento isso pode ser to simples como reconstruir o objetoquetenhasidopreviamente armazenado. Em terceiro lugar, a ferramenta de migrao reproduz o log de refatoraes no local da aplicao. agora, porque componente de aplicao e residir na mesma rea de trabalho,detodasasrefernciassoactualizadoscorrectamente. Durante esta etapa, a ferramenta precisa de lidar com esses casos,quandouma refatorao no podem ser reproduzidas na novo contexto. Por exemplo, no local de componente era possvel mudar o nome de um mtodo de API , mas ao local de aplicao desta renomeao resulta em um conflito, porque o aplicativo j define um mtodo comonovonome.Catchup[8] um prottipo de pesquisa que tem como objetivo atualizar os aplicativos por gravar e reproduzir as refatoraes . No entanto, apenas algumas refatoraestmregistrocompletoe suporte replay. Tambm faz no lidarcom conflitos que possam surgir no passo ( 3). Eclipse verso3.2Milestone4estprevistaparaestender seu mecanismo derefatorao com suporte completo para registro e plano playback.We para avaliarnofuturocomoelaeficazparaatualizaraplicativosusandoessaabordagem. 6.TrabalhosRelacionados Para o nosso conhecimento , nenhum estudo quantitativo foi publicado sobre o tipo de mudanas na API que ocorrerem componentes. Diversas categorias de trabalho relacionadas podem ser distinguidas e so fornecidosabaixo.Bansiya[24]eMattsoneBosch[25]mtricas usadas para avaliara estabilidade das estruturas Suasmtricasspodemdetectaroefeitode alteraes na estrutura e no o tipo exato de mudana (por exemplo , observaram que o mtodo argumentotiposforamalteradosentreas versesposterioresenquantoobservamosse

eles mudaram porcausada adio / remoo de parmetros ou por causa demudar ostipos de argumentos ) . Mattson e Bosch [3] identificou quatro categorias de evoluo nos quadros : reorganizao interna , alterando a funcionalidade, que se estende a funcionalidade, e reduzir a funcionalidade . Nossos achados confirmam tudo quatro das evolues foram descrevem . Existe alguma ferramenta de suporte limitado para deteco e classificao evoluo estrutural. deteco de diviso de classe e fuso foi o tar principal obter das ferramentas descritas em [ 1215 ] . clone de deteco pode ser usado para detectar alguns refatoramentos comorenomear oumtodomovido.Umavezquenenhumadestasferramentas tentou encontrar todos os tipos de evoluo estrutural , tivemos que analisar as mudanas manualmente. Ferramenta de suporte paraaplicaesdemodernizaotemsidouminteressedelongadata. Em [ 2628 ] ,diferenteanotaessodiscutidosno cdigofontedocomponentequepodeser usado por ferramentas para atualizar aplicaes. No entanto, escrever essas anotaes complicado . Balaban et al. [29] teve como objetivo substituir automaticamente as classes de biblioteca obsoletos com os seus homlogos mais recentes . Os desenvolvedores de componentes tem que fornecer mapeamentos entre as classes legadas e suas substituies. Umaabordagemmaisatraenteseriaseferramentaspodemgerarestainformao. Como uma alternativa para refatoramentos Steyaert , et al.[21]introduziuanoodecontratos de Reutilizao para garantir a compatibilidade estrutural e comportamental entre quadros e instanciaes . no mesma linhade base , Tourwe eHomens[30]metapatternsintroduzidase suas transformaes associadas para documentar as mudanas de enquadramento.Devido semntica ricos transportadas em tal documentao , suporte automatizado para migrao de aplicaes pode ser possvel. Concordamos que a refatoraopor si s no pode resolver todos os problemas de migrao. No entanto , a refatorao automatizada suportado pelo mais recente IDEs.We mostrou que refatoraes pode efetivamente descrever mais de 80% dasalteraesdequebraAPIquerealmenteocorrernaevoluodocomponente. 7.CONCLUSESEFuturework API mudanas tm um impacto sobre as aplicaes. Podese argumentar queosengenheiros da biblioteca deve manter verses antigas da bibliotecaparaqueosaplicativoscriados nessas verses continuar a executar. No entanto, esta resulta na proliferao de verses e altos custos de manuteno para o produtor. Na prtica, isto a aplicao engenheiros que se adaptem s mudanas na biblioteca. Olhamos para uma quadros opensource proprietrios e trs e uma biblioteca e estudou o que mudou entre dois grandes lanamentos. Em seguida, analisamos as mudanas em detalhes e descobriu que nos cinco estudos de casos , 84 %, 81 %, 90 % , 97%, e 94% das alteraes de quebra de API so estruturais comportamento de preservao transformaes ( refatoraes ) . H vrias implicaes dos nossos resultados . Primeiro, eles confirmam que a refatorao desempenha um importante papel na evoluo dos componentes. Em segundo lugar, eles oferecem um ranking de refatoraes combase na freqncia que foram utilizados para ascincosistemas. Fornecedores de refatorao deve priorizar para apoiar os mais freqentemente usado refatoraes . Terceiro, eles sugeremque os produtoresdecomponentesdevedocumentaras

mudanas em cadalanamento do produtoem termosderefatoraes.Comorefatoramentos transportar semntica ricos ( para alm da sintaxe de alteraes) eles podem servir como documentao explcita para atualizaes manuais e automatizados . Em quarto lugar, ferramentas de migrao devem concentrar no apoio para integrar aplicaes dessas refatoraes realizadas em o componente. Nosso trabalho futuro pretende produzir essasferramentasdemigraocombaseemrefatoraes. Motores de refatorao garantir que as mudanas estruturais que desempenham no vai quebrar o aplicaes. A ferramenta de migrao com base em motores de refatorao deve ser capaz de fazer a maior parte do tedioso trabalho de atualizao para uma nova verso. Os desenvolvedores de aplicativos ter que levar apenas uma pequena frao ( inferior a 20 %) dos restantes alteraes. Estas so as mudanas que exigem percia humana. O trabalhofuturo ir avaliar o quanto o esforode migrao salvo usando uma ferramenta de migrao baseado refatorao. Nossos resultados no podem provar sem sombra de dvida que a maioria das API de quebra mudanas so refatoraes , mas eles nos do a confiana de que esta a tendncia . Alm disso, os cinco estudos de caso so Java sistemas. Talvez a linguagem de programao tem uma influncia sobre os tipos de alteraes queocorremno componentes. Podeser que para lnguas em que o custo da mudana relativamente baixo , no haveria haver mais mudanas do que em linguagens onde o custo alto . Mais pesquisas e estudos de caso so necessrios para provar a nossa posio. A disponibilidade de ferramentas de migrao poderosos tambmvai mudarascoisasparaos designers de componentes. Sem medo de que eles vo quebrar osclientes,osdesignersvo ser mais ousado no tipo de mudanas que pode fazer para seus projetos. Diante dessa nova liberdade encontrada , os designers noterquerealizarumprojetoruimdecisestomadas no passado.Elesvolimparoprojetoparasermaisfcildeentenderereutilizar.

You might also like