caracterizando a adoção de expressões lambda em código...

64
Universidade de Brasília Instituto de Ciências Exatas Departamento de Ciência da Computação Caracterizando a Adoção de Expressões Lambda em Código Java Legado Aline Laís Gomes Tavares Filipe Cardoso Caldas Monografia apresentada como requisito parcial para conclusão do Bacharelado em Ciência da Computação Orientador Prof. Dr. Rodrigo Bonifácio de Almeida Brasília 2017

Upload: lamxuyen

Post on 21-Jan-2019

215 views

Category:

Documents


0 download

TRANSCRIPT

Universidade de BrasiacuteliaInstituto de Ciecircncias Exatas

Departamento de Ciecircncia da Computaccedilatildeo

Caracterizando a Adoccedilatildeo de Expressotildees Lambda emCoacutedigo Java Legado

Aline Laiacutes Gomes TavaresFilipe Cardoso Caldas

Monografia apresentada como requisito parcialpara conclusatildeo do Bacharelado em Ciecircncia da Computaccedilatildeo

OrientadorProf Dr Rodrigo Bonifaacutecio de Almeida

Brasiacutelia2017

Universidade de BrasiacuteliaInstituto de Ciecircncias Exatas

Departamento de Ciecircncia da Computaccedilatildeo

Caracterizando a Adoccedilatildeo de Expressotildees Lambda emCoacutedigo Java Legado

Aline Laiacutes Gomes TavaresFilipe Cardoso Caldas

Monografia apresentada como requisito parcialpara conclusatildeo do Bacharelado em Ciecircncia da Computaccedilatildeo

Prof Dr Rodrigo Bonifaacutecio de Almeida (Orientador)CICUnB

Profa Dra Edna Dias Canedo Prof Dr Vinicius Ruela Pereira BorgesFGAUnB CICUnB

Prof Dr Rodrigo Bonifaacutecio de AlmeidaCoordenador do Bacharelado em Ciecircncia da Computaccedilatildeo

Brasiacutelia 8 de Agosto de 2017

Dedicatoacuteria

Dedicamos este trabalho agraves nossas famiacutelias que sempre noacutes apoiaram a todos os nossosamigos colegas e professores da universidade que nos ajudaram durante a nossa graduaccedilatildeoe colaboraram de alguma forma para nossa formatura Dedicamos tambeacutem ao nossoorientador professor doutor Rodrigo Bonifaacutecio que nos ajudou durante o desenvolvimentodeste trabalho

iii

Agradecimentos

Agradecemos aos nossos familiares que sempre nos apoiam incondicionalmente durantetoda a nossa vida e especialmente durante o nosso periacuteodo na Universidade diante detodos os desafios enfrentados acreditando sempre no nosso sucesso

Ao nosso orientador professor doutor Rodrigo de Almeida Bonifaacutecio por trabalharconosco no desafio de desenvolver este projeto

E por fim a todos os nossos amigos que ingressaram no curso de ciecircncia de computaccedilatildeona UnB conosco no segundo semestre de 2010

iv

Resumo

Este trabalho apresenta um estudo sobre como as expressotildees lambda introduzidas nalinguagem Java desde 2014 estatildeo sendo utilizadas em projetos Java open-source Atraveacutesde uma amostragem de 99 projetos populares existentes na plataforma Github observou-se como e quando esta caracteriacutestica foi introduzida nestes projetos identificando padrotildeesadotados e meacutetodos de refatoraccedilatildeo de coacutedigo caso estes existam Foi realizado um estudogeral para identificar padrotildees gerais aleacutem de estudos de caso com o objetivo de obter umaanaacutelise mais aprofundada sobre o assunto Foram escolhidos cinco projetos previamenteclassificados de acordo com a abordagem distinta de introduccedilatildeo de expressotildees lambdapara realizar os estudos de caso

Palavras-chave Mineraccedilatildeo em Repositoacuterios de Software git Java Expressotildees LambdaAnonymous Inner Class

v

Abstract

This work presents a study about how lambda expressions are being used in open-soruceJava projects Using a sample of 99 popular projectsrsquo repositories in Github it wasanalyzed how and when this feature was introduced within those projects identifyingpatterns used to implement such feature and possible code refactoring approaches in caseany code was refactored It was conducted a general study to identify similarities amongprojects and the way they use lambda expressions and also case studies that intendedto realize a richer analysis about the subject For the case studies it was chosen fiveprojects previously classified according to the distinct approach used when introducinglambda expressions

Keywords Mining Software Repositories git Java Lambda Expressions AnonymousInner Class

vi

Sumaacuterio

1 Introduccedilatildeo 111 Contexto 112 Objetivos 2

121 Objetivos Gerais 2122 Objetivos Especiacuteficos 2

13 Metodologia 314 Organizaccedilatildeo do Trabalho 3

2 Evoluccedilatildeo e Mineraccedilatildeo de Repositoacuterios de Software 521 Evoluccedilatildeo de Software 622 MSR Mineraccedilatildeo de dados e a Engenharia de Software 8

221 Classificaccedilatildeo 823 Trabalhos Relacionados 11

3 Java SE 8 e JDK 8 1331 Histoacuterico 1332 Princiacutepios 1433 Evoluccedilatildeo 1534 Expressotildees Lambda 18

341 Sintaxe 18342 Principais formas de uso 19

4 Estudo e o Processo de Mineraccedilatildeo 2241 Questotildees de Pesquisa 2342 Fonte de Dados e Objetos de Estudo 2443 Processo de Mineraccedilatildeo 25

431 static-analysis 26432 BDAnalisador 27

44 Classificaccedilatildeo e Anaacutelise 29441 Meacutedia de Lambda 30

vii

442 Anaacutelise Temporal 30443 Refatoraccedilatildeo de Coacutedigo 32444 Casos de Uso 32

5 Resultados Obtidos e Anaacutelise 3351 Visatildeo Geral 33

511 Projetos Selecionados 34512 agera 34513 vertx 35514 Android-CleanArchitecture 36515 RxJava 37516 guava 38

52 Refatoraccedilatildeo de Coacutedigo 3953 Estudos de Caso 41

6 Consideraccedilotildees Finais 46

Referecircncias 48

Anexo 51

I Projetos utilizados 52

viii

Lista de Figuras

21 Taxonomia em camadas adaptada do trabalho de Kagdi et al [1] 9

41 Processo utilizado para realizaccedilatildeo do estudo 2242 Metodologia implementada para coleta e tratamento de dados 2643 Diagrama de classes UML do BDAnalisador 2844 Modelo relacional do banco de dados populado pelo BDAnalisador Imagem

gerada com software DBeaver [2] 2945 Classificaccedilatildeo dos projetos 31

51 Graacuteficos dos projetos separados por ano de introduccedilatildeo de expressotildees lambdae meacutedia de lambda por snapshot 34

52 Graacuteficos de anaacutelise temporal do projeto agera 3553 Graacuteficos de anaacutelise temporal do projeto Vertx 3654 Graacuteficos de anaacutelise temporal do projeto Android-CleanArchitecture 3755 Graacuteficos de anaacutelise temporal do projeto RxJava 3856 Graacuteficos de anaacutelise temporal do projeto Guava 3957 Comparaccedilatildeo entre todos os projetos com expressatildeo lambda sobre refatora-

ccedilatildeo de coacutedigo no mecircs de introduccedilatildeo da caracteriacutestica 4058 Commit de refatoraccedilatildeo de coacutedigo do projeto Vertx [3] 4259 Exemplo de um arquivo do commit de adiccedilatildeo de coacutedigo novo em Java 8 do

projeto Guava [4] 43510 Commit de adiccedilatildeo da biblioteca Retrolambda no projeto Agera [5] 44511 Commit de remoccedilatildeo de Lambdas e volta para o uso de AICs no projeto

RXJava [6] 45

ix

Lista de Tabelas

31 As versotildees anteriores de java e principais caracteriacutesticas 14

41 Informaccedilotildees mensais sobre o projeto agera 30

x

Capiacutetulo 1

Introduccedilatildeo

11 Contexto

A evoluccedilatildeo e manutenccedilatildeo de software eacute uma caracteriacutestica intriacutenseca do desenvolvimentode sistemas considerando que a partir do momento em que um software comeccedila a serdesenvolvido satildeo realizadas constantes manutenccedilotildees [7] Apesar de o conceito de evolu-ccedilatildeo de software representar uma grande aacuterea de pesquisa na engenharia de software nemsempre pesquisadores reconhecem a importacircncia da evoluccedilatildeo das linguagens de progra-maccedilatildeo como um grande fator influenciador na evoluccedilatildeo de software [8] uma vez que umsoftware que natildeo evolui junto com a sua linguagem tem a sua capacidade de evoluccedilatildeolimitada [9]

Surge entatildeo a necessidade de alinhar estudos empiacutericos com o intuito de investigar esteprocesso de evoluccedilatildeo do software juntamente com a evoluccedilatildeo de sua linguagem atraveacutesde investigaccedilatildeo e anaacutelise de seu coacutedigo fonte que pode ser feita por meio de anaacutelise de re-positoacuterios de software em grande escala o que deu origem a abordagem de Mineraccedilatildeo emRepositoacuterio de Software (MSR) O MSR tem como base o estudo sistemaacutetico e empiacutericode repositoacuterios de software com o objetivo de analisaacute-los utilizando informaccedilotildees estatis-ticamente uacuteteis coletadas para observar diversos padrotildees como a evoluccedilatildeo do softwarepadrotildees de projetos dentre outros [10]

A complexidade e dificuldade de realizar tal estudo empiacuterico eacute alta pois atualmenteexistem diversos tipos de plataformas para coleta de dados linguagens e focos variadosAssim para escolher o foco do objeto de estudo eacute necessaacuterio levar em consideraccedilatildeo estasdificuldades e especificaccedilotildees e dessa forma este trabalho tem como foco a anaacutelise desistemas de software na linguagem Java

Ateacute a data deste trabalho de acordo com os dados do TIOBE [11] Java eacute a linguagemde programaccedilatildeo com mais linhas de codigo catalogadas no mundo Isso faz com queseja extremamente interessante o estudo empiacuterico da evoluccedilatildeo da linguagem e software

1

desenvolvidos nela desde sua primeira versatildeo antes de se tornar uma linguagem populare ainda com poucos pacotes ateacute a sua atual versatildeo estaacutevel com uma grande quantidadede novas caracteriacutesticas

A versatildeo mais recente do Java a JDK 8 possui diversas adiccedilotildees interessantes para aorganizaccedilatildeo do coacutedigo e facilidade do programador Dessas novas implementaccedilotildees con-ceitos de linguagem funcional como expressotildees lambda e iteradores externos que recebemuma expressatildeo lambda como argumento como o map() filter() e forEach() tornarama escrita de coacutedigo paralelo mais simples e permitiram ganhos de performance [12]

Diversas linguagens de programaccedilatildeo tambeacutem populares como Javascript e Ruby jaacutepossuiacuteam expressotildees lambda desde suas versotildees iniciais sendo o Java 8 em 2014 maisuma linguagem a introduzir esse novo conceito Podemos descrever as expressotildees comopequenas funccedilotildees normalmente feitas em apenas uma linha sem um nome identificadorElas podem ser retornadas de outras funccedilotildees ou passadas como paracircmetro Um exemplode expressatildeo lambda pode ser visualizado pela funccedilatildeo de soma de dois inteiros escrita daforma (int x int y)rarr x + y [13]

Antes da inclusatildeo de expressotildees lambda em Java o mesmo comportamento era possiacutevelutilizando classes anocircnimas ou AICs (Anonymous inner classes) Contudo eacute necessaacute-rio a criaccedilatildeo de uma interface com apenas um meacutetodo e instanciaacute-la como uma AIC Autilizaccedilatildeo de AICs gera inuacutemeras linhas de coacutedigo adicionais que poderiam ser encapsu-ladas em apenas uma linha com a utilizaccedilatildeo de expressotildees lambda Como eacute interessantepara o programador ter um coacutedigo sempre mais legiacutevel e sucinto torna-se interessante arefatoraccedilatildeo de coacutedigo que utiliza uma tecnologia mais antiga para a nova

Assim este trabalho visa conduzir um estudo de mineraccedilatildeo em repositoacuterios de softwareopen-source desenvolvidos na linguagem Java para entender como desenvolvedores estatildeose adaptando agraves novas mudanccedilas introduzidas no Java 8

12 Objetivos

121 Objetivos Gerais

Este trabalho tem como objetivo geral caracterizar o uso de expressotildees lambda entre osprojetos Java mais populares desenvolvidos pela comunidade do GitHub

122 Objetivos Especiacuteficos

Sabendo do benefiacutecio da refatoraccedilatildeo de coacutedigo para o uso de expressotildees lambda e dapouca quantidade de estudos acadecircmicos sobre o assunto surge entatildeo uma oportunidadede pesquisa para melhor entender a forma como essa caracteriacutestica estaacute sendo adotada por

2

projetos com foco em refatoraccedilatildeo de coacutedigo o que originou a necessidade deste estudoAssim para alcanccedilar o objetivo deste trabalho foram traccedilados em forma de questotildees depesquisa os objetivos especiacuteficos a serem alcanccedilados por este trabalho

bull Quando os projetos Java de coacutedigo aberto comeccedilaram a introduzir o uso de expres-sotildees lambda em seus coacutedigos e quatildeo significativo eacute esse uso

bull Como as equipes de desenvolvimento estatildeo utilizando expressotildees lambda atraveacutesde refatoraccedilatildeo de coacutedigo ou introduzindo apenas em coacutedigo novo

bull Quais satildeo os padrotildees tipicamente adotados para o uso de expressotildees lambda

13 Metodologia

Este trabalho foi desenvolvido utilizando uma abordagem de MSR que dentro da clas-sificaccedilatildeo de Kagdi et al [1] pode ser divido em quatro grandes etapas Primeiramentedefiniu-se a fonte de dados a ser utilizada e dentre as possibilidades encontradas na lite-ratura [14] optou-se por utilizar repositoacuterios de controle de versatildeo mais especificamenteo Github tendo como criteacuterio de seleccedilatildeo os 99 repositoacuterios Java mais populares na plata-forma Em seguida definiu-se o propoacutesito do estudo no caso os objetivos em forma deperguntas de pesquisa a serem respondidas

A terceira grande etapa foi a definiccedilatildeo do meacutetodo em si a forma como seria realizadoo estudo e este por sua vez constitui-se de download de todos os 99 repositoacuterios maispopulares realizaccedilatildeo de uma anaacutelise estaacutetica para coletar informaccedilotildees necessaacuterias de cadaprojeto por versatildeo e armazenamento de informaccedilotildees pertinentes em uma base de dados

A etapa final foi a realizaccedilatildeo da avaliaccedilatildeo dos dados obtidos atraveacutes de meacutetricas eanaacutelises quantitativas para melhor responder as questotildees de pesquisa aleacutem de estudos decaso feitos com cinco projetos escolhos de acordo com a maneira distinta em que estesfazem o uso de expressotildees lambda

14 Organizaccedilatildeo do Trabalho

Este trabalho se divide em seis capiacutetulos

bull Capiacutetulo 2 Apresenta um referencial teoacuterico sobre evoluccedilatildeo de software demons-trando as estrateacutegias utilizadas e a importacircncia da evoluccedilatildeo em um projeto de coacutedigoaberto aleacutem de enunciar as leis de evoluccedilatildeo de software de Lehman O capiacutetulo tam-beacutem apresenta o processo de mineraccedilatildeo de dados explicando cada uma das camadasda classificaccedilatildeo e demonstra trabalhos relacionados a esse toacutepico que serviram debase para este trabalho

3

bull Capiacutetulo 3 Traz um contexto histoacuterico e teacutecnico da linguagem Java necessaacuteriospara entender a importacircncia que as novas caracteriacutesticas adicionadas na versatildeo8 fornecem para os desenvolvedores de projetos determinados a manter o projetosempre evoluiacutedo Tambeacutem eacute apresentada uma seccedilatildeo para demonstrar os detalhese formas de utilizaccedilatildeo das expressotildees Lambda que satildeo o foco dos objetivos destetrabalho

bull Capiacutetulo 4 Descreve a metodologia e processo utilizados para o desenvolvimentoe obtenccedilatildeo dos resultados deste trabalho O capiacutetulo desenvolve o contexto dasquestotildees de pesquisa e explica os motivos e processos de desenvolvimento das fer-ramentas utilizadas para minerar os dados aleacutem de determinar a classificaccedilatildeo dosresultados obtidos em grupos para facilitar a organizaccedilatildeo dos dados de forma queas perguntas sejam respondidas claramente

bull Capiacutetulo 5 Apresenta os resultados obtidos e de que forma eles ajudaram a respon-der as questotildees de pesquisa Eacute descrita uma anaacutelise de um projeto de cada categoriaespecificada no capiacutetulo anterior a fim de contextualizar cada tipo de resultado paraque o leitor entenda a forma que os projetos Java estatildeo lidando com as expressotildeesLambda

bull Capiacutetulo 6 Descreve as dificuldades e problemas obtidos durante o trabalho e deque forma eles influenciaram nos resultados Tambeacutem eacute apresentada uma seccedilatildeocontendo as ideias surgidas durante o desenvolvimento deste trabalho que ficarampara ser feitas no futuro devido agrave gama de informaccedilotildees que a mineraccedilatildeo dos dadostrouxe

4

Capiacutetulo 2

Evoluccedilatildeo e Mineraccedilatildeo deRepositoacuterios de Software

As linguagens de programaccedilatildeo estatildeo sempre evoluindo aumentando sua complexidade eexpressividade Da mesma forma aleacutem de se preocupar com dificuldades de estabelecercompatibilidade do software em relaccedilatildeo a tecnologias antigas desenvolvedores tambeacutemprecisam acompanhar essa evoluccedilatildeo das linguagens para que suas ferramentes natildeo setornem obsoletas [9] Isso agrega um grande desafio no desenvolvimento e evoluccedilatildeo desoftware

O conceito de evoluccedilatildeo de software amadureceu e se tornou um grande foco de pes-quisa Poreacutem nem sempre estudos de evoluccedilatildeo de software reconhecem a importacircncia daevoluccedilatildeo da linguagem de programaccedilatildeo no contexto do desenvolvimento de software [8]Quando um coacutedigo natildeo evolui junto com a linguagem com o objetivo de manter umacompatibilidade com versotildees anteriores sua capacidade de evoluccedilatildeo se torna limitada [9]

A refatoraccedilatildeo de coacutedigo que consiste em realizar mudanccedilas no coacutedigo fonte sem modi-ficar o comportamento observado do software [15] permite que a evoluccedilatildeo de linguagens eferramentas aconteccedilam mais naturalmente No entanto novos desafios surgem como porexemplo saber quando e como realizar a refatoraccedilatildeo de coacutedigo de forma eficiente e coesaDentre as teacutecnicas de pesquisa em engenharia de software para entender esse problematorna-se interessante explorar as teacutecnicas de mineraccedilatildeo de dados aplicados a repositoacuteriosde software com o objetivo de entender o relacionamento entre evoluccedilatildeo e refatoraccedilatildeo

Assim este capiacutetulo busca esclarecer conceitos e estrateacutegias de evoluccedilatildeo de softwaremineraccedilatildeo de repositoacuterios de software e o estado da arte sobre o assunto

5

21 Evoluccedilatildeo de Software

Durante o processo de produccedilatildeo e manutenccedilatildeo de software haacute a necessidade de diversastomadas de decisotildees sobre seu desenvolvimento como por exemplo decidir como melho-rar a qualidade do software Tais decisotildees precisam ser tomadas levando em consideraccedilatildeoo ambiente em que se estaacute inserido com novas tecnologias surgindo todos os dias fe-edback de usuaacuterios exigentes e concorrentes produzindo um software similar com ideiasinovadoras

Tudo isso acontece em um ritmo de constante mudanccedila e assim como diria Lehmaneacute imprescindiacutevel que software de sistemas sejam capazes de evoluir ou os mesmos correm orisco de sofrer uma morte prematura [16] fazendo assim da evoluccedilatildeo de software um con-ceito importante dentro do seu processo de desenvolvimento Essa evoluccedilatildeo deve ocorrerconsiderando o ambiente em que o software estaacute inserido o qual possui aspectos teacutecnicos esociais sua infraestrutura que pertence ao seu ambiente teacutecnico o qual sempre necessitamanutenccedilatildeo e ao mesmo tempo usuaacuterios que utilizam o software e estatildeo constantementeformando opiniotildees oferecendo feedback e na expectativa por novidades [7] Assim a me-dida que novas caracteriacutesticas satildeo desenvolvidas novas tecnologias de infraestrutura satildeonecessaacuterias novos requisitos satildeo adicionados e o sistema de software deve se adaptar aessas mudanccedilas

Com relaccedilatildeo aos aspectos sociais que envolvem a evoluccedilatildeo do software eacute importanteressaltar os conceitos baacutesicos de como essa evoluccedilatildeo acontece Durante um estudo empiacutericopioneiro na aacuterea de evoluccedilatildeo de software para sistemas de grande escala Lehman e seuscolaboradores formularam um conjunto de observaccedilotildees que hoje satildeo conhecidas como asleis da evoluccedilatildeo de software ou simplesmente Leis de Lehman [16] No geral as leis deevoluccedilatildeo de software podem ser descritas da seguinte forma [16]

1 Mudanccedila contiacutenua um sistema se tornaraacute progressivamente menos satisfatoacuteriopara seus usuaacuterios com o tempo a menos que se adapte continuamente agraves necessi-dades que surgiratildeo

2 Complexidade Crescente um sistema se tornaraacute cada vez mais complexo amenos que se trabalhe para explicitamente reduzir sua complexidade

3 Auto-regulaccedilatildeo o processo de evoluccedilatildeo de software eacute auto-regulatoacuterio no que dizrespeito agraves distribuiccedilotildees dos artefatos e produtos produzidos

4 Conservaccedilatildeo da estabilidade organizacional a taxa meacutedia de atividade globalefetiva em um sistema em evoluccedilatildeo natildeo muda com o tempo ou seja a meacutedia detrabalho e esforccedilo colocado em cada entrega do sistema permanece a mesma

6

5 Conservaccedilatildeo de familiaridade a quantidade de conteuacutedo novo em cada entregado sistema tende a se manter constante com o tempo

6 Crescimento contiacutenuo A quantidade de funcionalidades em um sistema cresceraacutecom o tempo com o objetivo de satisfazer seus usuaacuterios

7 Decliacutenio de qualidade Um sistema seraacute percebido com qualidade inferior como passar do tempo a menos que seu design tenha uma manutenccedilatildeo minuciosa e seadapte a novas restriccedilotildees

8 Sistema de Feedback Evoluir um sistema com sucesso requer reconhecer que oprocesso de desenvolvimento acontece em um sistema de feedback de vaacuterios ciclosagentes e niacuteveis

Os aspectos teacutecnicos que envolvem a evoluccedilatildeo de software levam em consideraccedilatildeo astecnologias utilizadas para o seu desenvolvimento desde a linguagem de programaccedilatildeo agravesmaacutequinas onde o software seraacute hospedado que sofrem atualizaccedilotildees recebem novas versotildeescom novas caracteriacutesticas implementadas

Um estudo realizado por Lavre mostra como a evoluccedilatildeo das linguagens de programa-ccedilatildeo no contexto da evoluccedilatildeo de software muitas vezes satildeo subestimadas uma vez quemuitos podem considerar em seus estudos a linguagem de computaccedilatildeo como um artefatoimutaacutevel [8] Por exemplo coloca-se muita ecircnfase e cuidado para realizar o versionamentode coacutedigo fonte de um software mas este pode ser tornar inutilizaacutevel futuramente se nin-gueacutem souber qual versatildeo de compilador determinada versatildeo de coacutedigo foi desenvolvida

Para natildeo se deixar estagnar linguagens de programaccedilatildeo precisam se adaptar e evoluirQuando uma linguagem de programaccedilatildeo atualiza softwares que eram antes consideradosatualizados podem se tornar rapidamente obsoletos E ao mesmo tempo que novascaracteriacutesticas satildeo adicionadas a linguagem precisa fornecer compatibilidade com versotildeesanteriores aumentando sua complexidade Desenvolvedores entatildeo encontram-se tambeacutemem um empasse buscando um equiliacutebrio entre manter a compatibilidade da ferramentacom versotildees anteriores da linguagem e atualizaacute-la para manter o software atualizado [9]

A estrateacutegia de refatoraccedilatildeo de coacutedigo pode ser uma opccedilatildeo que permite a linguageme o software co-evoluiacuterem com um menor grau de dificuldade [9] Refatoraccedilatildeo (do inglecircsrefactoring) eacute o processo de modificaccedilatildeo de um software com o objetivo de melhorar a es-trutura interna do mesmo sem alterar sua percepccedilatildeo externa Eacute uma maneira disciplinadade melhorar o design do coacutedigo apoacutes ele jaacute ter sido implementado Por exemplo dividiruma funcionalidade grande feita em apenas um bloco de coacutedigo em vaacuterios moacutedulos [15]

A refatoraccedilatildeo de coacutedigo pode ser um meio utilizado para evoluir o software adaptandoo coacutedigo com caracteriacutesticas novas introduzidas pela linguagem modificando o design dosistema sem comprometer sua integridade No entanto novos desafios surgem visto que

7

refatorar o coacutedigo fonte de um sistema de grande porte natildeo eacute uma tarefa faacutecil havendo anecessidade de ferramentas que possam automatizar o processo ou realizar um estudo paraentender como as novas caracteriacutesticas da linguagem podem ser utilizadas para substituirou melhorar funcionalidades obsoletas [9]

22 MSR Mineraccedilatildeo de dados e a Engenharia deSoftware

Com o objetivo de compreender prever e planejar os vaacuterios aspectos do desenvolvimentode um projeto em especial tudo que possa impactar na evoluccedilatildeo de software a teacutecnicade mineraccedilatildeo de dados tem sido bastante utilizada em engenharia de software [17]

O termo Mineraccedilatildeo de Repositoacuterios de Software (MSR) tem sido utilizado para descre-ver vaacuterias maneiras de se examinar repositoacuterios de software Um repositoacuterio de softwarepode ser considerado um artefato que eacute produzido e arquivado durante a evoluccedilatildeo desoftware [1] Estes responsoacuterios armazenam informaccedilotildees que podem fornecer todos osdetalhes de desenvolvimento do software provendo meios necessaacuterios para uma anaacuteliseaprofundada de evoluccedilatildeo de software

Repositoacuterios de software satildeo comumente utilizados para armazenar e acompanhar ohistoacuterico de desenvolvimento do software mas raramente usados para tomada de deci-sotildees em relaccedilatildeo ao projeto Assim pesquisadores de MSR buscam modificar a impressatildeode que tais repositoacuterios satildeo estaacuteticos que servem apenas para manutenccedilatildeo de registrostransformando-os em repositoacuterios ativos que podem auxiliar na tomada de decisatildeo em pro-jetos de software modernos atraveacutes da identificaccedilatildeo de padrotildees para realizar a propagaccedilatildeode mudanccedilas [18]

221 Classificaccedilatildeo

De acordo com Kagdi et al dentre as abordagens de MSR utilizadas atualmente eacute possiacuteveldescrevecirc-las para entatildeo comparaacute-las e possivelmente classificaacute-las levando em considera-ccedilatildeo uma taxonomia de quatro dimensotildees os repositoacuterios de software utilizados (fontes dedados) o propoacutesito do MSR a metodologia e a avaliaccedilatildeo da abordagem [1] como mostraa Figura 21 onde as taxonomias destacadas em amarelo satildeo as que prevaleceram poreacutemnatildeo exclusivamente na metodologia adotada por este trabalho

8

Figura 21 Taxonomia em camadas adaptada do trabalho de Kagdi et al [1]

Fontes de Dados

As fontes de informaccedilatildeo variam de acordo com a abordagem utilizada e dentre as informa-ccedilotildees mineradas em repositoacuterios de software inclui-se as seguintes categorias os artefatosde software e suas versotildees as diferenccedilas entre os artefatos de software e suas versotildees e osmetadados sobre as mudanccedilas no software

As fontes de dados podem ser melhor classificadas de acordo com Hassan et al [17]

bull Repositoacuterios de controle de Versatildeo estes repositoacuterios guardam o histoacuterico de desen-volvimento de um projeto armazenando todas as mudanccedilas no coacutedigo fonte assimcomo os metadados associados com cada mudanccedila Exemplos git SVN

bull Bug repositories Estes repositoacuterios rastreiam o histoacuterico de resoluccedilatildeo de bugs quesatildeo reportados por usuaacuterios e desenvolvedores Exemplos Bugzilla e Jira

9

bull Histoacuterico de Comunicaccedilatildeo (Archived communications) estes repositoacuterios rastreiamdiscussotildees sobre os vaacuterios aspectos de um projeto de software por sua vida uacutetil Porexemplo listas de e-mails

bull Deployment logs logs com informaccedilotildees do software gerados por ferramentas dedesenvolvimento

bull Repositoacuterios de software Repositoacuterios onde o coacutedigo fonte de vaacuterios projetos satildeoarmazenados como por exemplo Sourceforgenet

No contexto deste trabalho estes repositoacuterios consistem em fontes de coacutedigo armaze-nadas em sistemas de controle de versatildeo especificamente coacutedigos na plataforma Github

O propoacutesito

O propoacutesito da mineraccedilatildeo de repositoacuterios de software se resume nas perguntas de pes-quisa que podem ser respondidas utilizando mineraccedilatildeo Assim existem duas classes deperguntas de pesquisa para MSR [1]

A primeira eacute a pergunta de anaacutelise market-basket1 ldquoSe A acontece o que mais podeacontecerrdquo A resposta para este tipo de pergunta eacute um conjunto de regras descrevendotendecircncias de relacionamentos como por exemplo se A acontecer entatildeo B e C acontecemdurante um periacuteodo X

A segunda classe diz respeito agraves perguntas de prevalecircncia (Prevalence Questions -PQ) como por exemplo perguntas do tipo ldquoA funcionalidade Y foi modificadardquo quepossuem uma resposta booleana ou ldquoQuantas vezes esta funcionalidade Y foi modificadardquocontendo uma resposta quantitativa

As perguntas de pesquisa deste trabalho se encaixam majoritariamente na segundaclasse onde o objetivo traccedilado eacute respondido de forma quantitativa com algumas tentativasde classificaccedilatildeo de tipos de repositoacuterios como seraacute descrito nos capiacutetulos seguintes

A metodologia

A metodologia corresponde a maneira como as questotildees de MSR iratildeo ser respondidas evaacuterias abordagens estatildeo disponiacuteveis Poreacutem Kagdi indica duas estrateacutegias baacutesicas quepodem ser utilizadas

Primeiramente pode-se utilizar a mediccedilatildeo indireta e anaacutelise da evoluccedilatildeo do softwareEsta abordagem pode ser realizada da seguinte forma extrair e computar informaccedilotildeesde cada versatildeo de um software separadamente e em seguida individualmente comparar

1Anaacutelise Market-basket eacute uma teacutecnica de modelagem baseada na teoria de que se vocecirc comprar certostipos de produtos vocecirc haacute uma probabilidade maior (ou menor) de comprar outros tipos de produtos [19]

10

propriedades encontradas como por exemplo comparar duas versotildees distintas de umsoftware atraveacutes de um repositoacuterio github realizando uma investigaccedilatildeo de alto niacutevel noque diz respeito a evoluccedilatildeo do software [1]

A segunda perspectiva de metodologia que pode ser utilizada corresponde agrave mediccedilatildeodireta e anaacutelise da evoluccedilatildeo do software Ela diz respeito agraves investigaccedilotildees que estudamos mecanismos que leva um software a ser modificado de uma versatildeo para outra focandonas diferenccedilas especiacuteficas entre estas versotildees como por exemplo examinando mudanccedilasespeciacuteficas das classes arquivos funccedilotildees de cada parte do coacutedigo [1]

Assim eacute possiacutevel descrever explicitamente que este trabalho utiliza em sua maioriauma metodologia com mediccedilotildees diretas atraveacutes da anaacutelise estaacutetica de informaccedilotildees docoacutedigo fonte de diferente versotildees para analisar os diferentes padrotildees de desenvolvimentoem que expressotildees lambda (definidas no capiacutetulo seguinte) satildeo utilizadas

A Avaliaccedilatildeo

Por fim existem diversas formas para se avaliar o estudo realizado sempre levando emconsideraccedilatildeo a validade dos resultados obtidos Pode-se utilizar de meacutetricas para avaliar osdados considerando o quanto das informaccedilotildees obtidas satildeo relevantes Outra forma de seavaliar seria atraveacutes da utilizaccedilatildeo de modelos probabiliacutesticos seguindo uma abordagemde teoria da informaccedilatildeo Assim foram utilizadas determinadas meacutetricas quantitativaspara avaliar os resultados obtidos neste trabalho

23 Trabalhos Relacionados

Como ressaltado na introduccedilatildeo o foco deste trabalho encontra-se em utilizar teacutecnicas deMSR para caracterizar a adoccedilatildeo de expressotildees lambda em repositoacuterios Java Ao reali-zar um estudo sobre o estado da arte encontrou-se diversos trabalhos que utilizam deMSR para obter informaccedilotildees relevantes sobre repositoacuterios de software em diversos focose em especial trabalhos que investiguem repositoacuterios na linguagem Java Jaacute existemtambeacutem alguns trabalhos que apresentam ferramentas de refatoraccedilatildeo de coacutedigo para im-plementaccedilatildeo de expressotildees lambda com foco na evoluccedilatildeo do software Dentre os trabalhosencontrados mencionados destacam-se

bull Em um trabalho sobre utilizaccedilatildeo de refatoraccedilatildeo de coacutedigo para realizar a transiccedilatildeode coacutedigo Java para as novas caracteriacutesticas implementadas no Java 8 Gyori et alapresenta uma ferramenta que automatiza com sucesso o trabalho de conversatildeo decoacutedigo como Annonymous Inner Class para expressotildees lambda [12] O capiacutetulo aseguir descreve em detalhes estes conceitos

11

bull Regrowing a Language de Overbey apresenta um estudo sobre a importacircncia da co-evoluccedilatildeo entre a linguagem de programaccedilatildeo e os projetos de software focando naslinguagens Fortran e Java e provando como ferramentas de refatoraccedilatildeo de coacutedigoauxiliam para que o software consiga evoluir juntamente com sua linguagem deprogramaccedilatildeo [9]

bull O trabalho sobre a adoccedilatildeo de generics em coacutedigo Java feito por Parnin utiliza demineraccedilatildeo de dados para realizar uma investigaccedilatildeo empiacuterica avaliando projetos decoacutedigo aberto com o objetivo de observar como desenvolvedores destes projetos estatildeoutilizando generics em Java [20]

Os estudos mencionados focam em assuntos particulares pertinentes a este trabalhoem que de um lado tem-se trabalhos que mostram a necessidade de refatoraccedilatildeo de coacutedigopara evoluccedilatildeo de software e do outro tem-se trabalhos que mostram que eacute possiacutevel utilizarde MSR para entender melhor como a evoluccedilatildeo da linguagem de programaccedilatildeo Java temafetado projetos reais de coacutedigo aberto e como estes projetos estatildeo se adaptando a estasevoluccedilotildees

12

Capiacutetulo 3

Java SE 8 e JDK 8

Este trabalho tem como objetivo caracterizar a adoccedilatildeo de expressotildees Lambda em siste-mas Java que podem ser considerados legados pois foram concebidos em um momentoanterior a introduccedilatildeo dessa nova caracteriacutestica na linguagem Java Com o intuito de faci-litar o entendimento do leitor sobre tais construccedilotildees esse capiacutetulo apresenta informaccedilotildeeshistoacutericas referentes agrave linguagem Java desde sua criaccedilatildeo ateacute a sua ascensatildeo como umadas linguagens de programaccedilatildeo mais populares Aleacutem disso seratildeo apresentadas as novascaracteriacutesticas presentes na versatildeo Java SE 8 com destaque nas expressotildees Lambda e deque forma vieram para auxiliar no desenvolvimento de sistemas

31 Histoacuterico

Java eacute uma linguagem de programaccedilatildeo orientada a objetos para propoacutesitos gerais [21] Alinguagem nasceu com o nome de Oak no ano de 1991 com o foco em televisotildees digitais acabo mas devido agrave complexidade e poder da linguagem logo expandiu-se para os outrosdomiacutenios principalmente a Internet [22] Posteriormente a linguagem recebeu o nome deGreentalk devido agrave marca Oak jaacute ser registrada por outra empresa e o principal projeto daequipe se chamar Green Por fim o nome Java foi o mais votado pela equipe da Sun emuma reuniatildeo para decidir o mais raacutepido possiacutevel um nome definitivo para a linguagem [23]

Em 1995 em sua primeira versatildeo puacuteblica 10 a linguagem Java jaacute comeccedilava a terum crescimento em sua popularidade como Web Applet nos navegadores mais popularesfornecendo seguranccedila e rapidez nas plataformas mais utilizadas [24] A cada nova versatildeopublicada novas funcionalidades e plataformas eram adicionadas e tornavam a linguagemmais difundida no meio computacional fazendo com que em 2006 a linguagem fosse divi-dida em Java EE (foco em rede e serviccedilos web) Java ME (foco em sistemas embarcados)e Java SE (foco em desktops e servidores) [25]

13

Apoacutes anos de evoluccedilatildeo e aprimoramento atraveacutes de diversas versotildees como visto naTabela 31 hoje o Java se tornou uma das linguagens de programaccedilatildeo mais utilizadas nomundo estando em aproximadamente 15 das linhas de coacutedigo disponiacuteveis pela inter-net [11] A quantidade de plataformas suportadas pela linguagem e com o advento dosistema operacional Android sendo rodado na maior parte dos smartphones do mundoaleacutem da simplicidade em codificar no paradigma orientado a objetos foram os fatoresrelevantes para que a linguagem se popularizasse no mundo digital [26]

Tabela 31 As versotildees anteriores de java e principais caracteriacutesticasVersatildeo Principais caracteriacutesticasJava 10 JVM e JDKJava 2 Event Listeners

Kestrel (Java 3) HotSpot JVMMerlin (Java 4) Diversas novas APIs como Assertion e expressotildees regularesTiger (Java 5) Generics

Mustang (Java 6) Web ServicesDolphin (Java 7) Suporte a linguagens dinamicas

32 Princiacutepios

Com o foco em alcanccedilar a Web e participar mais ativamente do mercado virtual e e-Commerce foram projetados princiacutepios que permitissem com que a linguagem pudessealcanccedilar seus objetivos principais ao mesmo tempo que mantinha a facilidade e fami-liarizaccedilatildeo da linguagem a seus desenvolvedores [27] Dessa forma a equipe da Oracledeterminou cinco princiacutepios que caracterizariam o foco da linguagem Java

bull simples orientada a objeto e familiar projetada para ser orientada a objeto epermitir que seus desenvolvedores comecem a codificar rapidamente sem a necessi-dade de uma curva de aprendizagem acentuada

bull segura e robusta projetada para prover software confiaacutevel por meio de checagensa tempo de compilaccedilatildeo e execuccedilatildeo Haacute uma grande preocupaccedilatildeo com seguranccediladevido agrave larga utilizaccedilatildeo da linguagem em sistemas distribuiacutedos

bull de arquitetura neutra e portaacutevel projetada para ser independente de qualquerarquitetura bastando rodar a JVM dessa forma garantindo a portabilidade paravaacuterios ambientes e dispositivos

14

bull executada em alta performance projetada para fornecer a maior performancepossiacutevel em tempo de execuccedilatildeo com a utilizaccedilatildeo do garbage collector em uma threadde baixa prioridade

bull interpretada dinacircmica e threaded projetada para ser interpretada por qual-quer dispositivo que possua JVM desenvolvida garantindo um desenvolvimento raacute-pido e em ciclos O uso da classe Thread permite que a linguagem acompanhe atendecircncia do paralelismo Aleacutem disso a ligaccedilatildeo de classes eacute feita em tempo real esomente quando necessaacuteria tornando-a dinacircmica

33 Evoluccedilatildeo

A primeira versatildeo do Java 8 foi lanccedilada em 2014 [28] e apresentou diversas atualizaccedilotildeesespalhadas em categorias como linguagem seguranccedila Collections ferramentas deployentre outras Dentre a grande quantidade de mudanccedilas os destaques se encontraram nasnovas melhorias presentes na linguagem que afetaram de forma mais direta a maneiracom que os desenvolvedores passaram a tratar e organizar o coacutedigo fonte As atualizaccedilotildeesreferentes a linguagem descritas oficialmente pela Oracle [29] satildeo

1 Lambda Expressions ou apenas Expressotildees Lambda correspondem a uma novacaracteriacutestica que permite que uma pequena funcionalidade possa ser utilizada comoum argumento de um meacutetodo facilitando a escrita de accedilotildees que seratildeo feitas repetida-mente em uma Collection ou quando um processo se completa ou quando encontraum erro Eacute tambeacutem uma forma compacta de se escrever coacutedigo que previamenteera escrito com anonymous inner classes [29] A Listagem 31 mostra uma classehipoteacutetica Calculator cujo meacutetodo operateBinary() recebe como paracircmetro doisinteiros e um objeto da classe IntegerMath que representa a operaccedilatildeo que deveraacuteser realizada ou seja uma funcionalidade dinacircmica

1 pub l i c c l a s s Ca l cu la to r 2

3 i n t e r f a c e IntegerMath 4 i n t opera t i on ( i n t a i n t b) 5 6

7 pub l i c i n t operateBinary ( i n t a i n t b IntegerMath op ) 8 re turn op opera t i on (a b) 9

10

11 pub l i c s t a t i c void main ( St r ing a rgs ) 12

15

13 Calcu la to r myApp = new Ca lcu la to r ( ) 14 IntegerMath add i t i on = (a b) minusgt a + b 15 IntegerMath subt ra c t i on = (a b) minusgt a minus b 16 System out p r i n t l n ( 40 + 2 = +17 myApp operateBinary (40 2 add i t i on ) ) 18 System out p r i n t l n ( 20 minus 10 = +19 myApp operateBinary (20 10 sub t ra c t i on ) ) 20 21 22

Listagem 31 Exemplo de coacutedigo com o uso de Expressatildeo Lambda [30]

2 Method References Frequentemente expressotildees lambda criam meacutetodos anocircni-mos Algumas vezes poreacutem satildeo utilizadas para chamar um meacutetodo jaacute existentena classe Ao inveacutes de escrever a expressatildeo Lambda para esse caso pode-se optarpor utilizar um Method Reference que facilita a escrita e leitura desse uso de ex-pressatildeo Lambda [29] A Listagem 32 mostra um exemplo de um meacutetodo estaacuteticoque compara duas pessoas pelas suas idades e a Listagem 33 a utilizaccedilatildeo de MethodReference para aplicar a utilizaccedilatildeo desse meacutetodo em um array e reduzir a escrita deuma expressatildeo lambda a uma forma mais legiacutevel

1 pub l i c s t a t i c i n t compareByAge ( Person a Person b) 2 re turn a b i r thday compareTo (b b i r thday ) 3 4

Listagem 32 Exemplo de meacutetodo de uma classe Pessoa [31]

1 Arrays s o r t ( rosterAsArray Person compareByAge ) 2

Listagem 33 Exemplo de uso de Method Reference [31]

3 Default Methods satildeo meacutetodos com a palavra-chave default que servem para adi-cionar implementaccedilotildees de meacutetodos a uma interface de alguma biblioteca mantendoa compatibilidade binaacuteria com versotildees mais antigas dessa interface Tambeacutem pos-sibilita a implementaccedilatildeo de meacutetodos estaacuteticos em interfaces [29] A Listagem 34apresenta a inclusatildeo de um meacutetodo default na interface TimeClient

1 pub l i c i n t e r f a c e TimeClient 2 void setTime ( i n t hour i n t minute i n t second ) 3 void setDate ( i n t day i n t month i n t year ) 4 void setDateAndTime ( i n t day i n t month i n t year 5 i n t hour i n t minute i n t second )

16

6 LocalDateTime getLocalDateTime ( ) 7

8 s t a t i c ZoneId getZoneId ( S t r ing zoneStr ing ) 9 t ry

10 re turn ZoneId o f ( zoneStr ing ) 11 catch ( DateTimeException e ) 12 System e r r p r i n t l n ( I n v a l i d time zone + zoneStr ing

+13 us ing d e f a u l t time zone in s t ead ) 14 re turn ZoneId systemDefault ( ) 15 16 17

18 d e f a u l t ZonedDateTime getZonedDateTime ( St r ing zoneStr ing ) 19 re turn ZonedDateTime o f ( getLocalDateTime ( ) getZoneId (

zoneStr ing ) ) 20 21 22

Listagem 34 Exemplo de interface com um meacutetodo default [32]

4 Repeating Annotations permitem a implementaccedilatildeo e utilizaccedilatildeo de anotaccedilotildees deum mesmo tipo que podem ser utilizadas mais de uma vez para a mesma declara-ccedilatildeo [29] A Listagem 35 apresenta duas anotaccedilotildees iguais com paracircmetros diferentespermitindo uma customizaccedilatildeo maior na aplicaccedilatildeo de um tipo de anotaccedilatildeo

1 Schedule ( dayOfMonth= l a s t )2 Schedule (dayOfWeek= Fr i hour= 23 )3 pub l i c void doPeriodicCleanup ( ) 4

Listagem 35 Exemplo de Repeating Annotations [33]

5 Type Annotations permitem que anotaccedilotildees possam ser utilizadas em tipos aleacutemde declaraccedilotildees dessa forma pode-se garantir que um campo sempre atenda agraves suasexpectativas e evite testes desnecessaacuterios [29] A Listagem 36 mostra um exemplo derestriccedilatildeo a uma String que nunca poderaacute ser nula devido agrave anotaccedilatildeo de NonNull

1 NonNull S t r ing s t r

Listagem 36 Exemplo de Type Annotation garantindo que o campo nunca seja null [34]

17

34 Expressotildees Lambda

Uma das mudanccedilas mais interessantes implementadas no Java 8 foi a adiccedilatildeo de expressotildeeslambda As expressotildees lambda permitem que a linguagem Java possa atuar parcialmentecomo uma linguagem de programaccedilatildeo funcional onde comportamentos satildeo avaliados eaplicados diferentemente da programaccedilatildeo imperativa que foca na mudanccedila de estadosNa praacutetica um comportamento pode ser passado como paracircmetro de um meacutetodo atraveacutesde uma escrita mais reduzida e legiacutevel Os benefiacutecios de utilizar expressotildees lambda incluemuma melhora na legibilidade e organizaccedilatildeo de coacutedigo que antes era escrito com AnonymousInner Class aleacutem de permitir uma forma simples de utilizar comportamento paralelo como uso de Streams

341 Sintaxe

A sintaxe de uma expressatildeo lambda eacute dividida nas seguintes partes [30]

bull Uma lista de paracircmetros separados por viacutergulas

bull Um token representado por uma seta -gt

bull Um corpo que pode ser representado por uma expressatildeo uacutenica ou um bloco de coacutedigodentro de chaves

As Listagens 37 e 38 mostram duas formas diferentes de se aplicar expressotildees Lambdacom uma sintaxe similar A primeira aplica a expressatildeo diretamente apoacutes a seta utilizadanormalmente para trechos de coacutedigo pequenos e simples e a segunda utiliza-se de chavespara incorporar o coacutedigo e da palavra-chave return para especificar o retorno forma maisutilizada para uma quantidade maior de coacutedigo

1 p minusgt p getGender ( ) == Person Sex MALE2 ampamp p getAge ( ) gt= 183 ampamp p getAge ( ) lt= 25

Listagem 37 Exemplo de expressatildeo lambda com uma expressatildeo [30]

1 p minusgt 2 re turn p getGender ( ) == Person Sex MALE3 ampamp p getAge ( ) gt= 184 ampamp p getAge ( ) lt= 25 5

Listagem 38 Exemplo de expressatildeo lambda com um bloco de coacutedigo [30]

18

342 Principais formas de uso

Anonymous Inner Class

Antes do Java 8 a necessidade de passar funccedilotildees ou expressotildees como paracircmetro de algummeacutetodo era suprida atraveacutes de Anonymous Inner Classes A utilizaccedilatildeo desse tipo dedeclaraccedilatildeo junto com a anotaccedilatildeo de Override permite sobrescrever um meacutetodo de umainterface funcional e ao mesmo tempo passa-la como argumento para um meacutetodo Umaexpressatildeo lambda se comporta da mesma forma poreacutem a quantidade de coacutedigo escritopela Anonymous Inner Class eacute maior e pode dificultar a leitura de coacutedigo pois conteacutemmuita informaccedilatildeo natildeo utilizada para efetivo entendimento do que estaacute sendo feito naqueletrecho

A Listagem 39 apresenta a instanciaccedilatildeo da classe EventHandler internamente ao meacute-todo setOnAction() de forma que o desenvolvedor possa escrever o comportamento quedeseja passar como paracircmetro do meacutetodo atraveacutes da substituiccedilatildeo do meacutetodo handle()que jaacute existe pelo meacutetodo handle() criado e escrito pelo desenvolvedor

1 btn setOnAction (new EventHandlerltActionEvent gt() 2 Override3 pub l i c void handle ( ActionEvent event ) 4 System out p r i n t l n ( He l lo World ) 5 6 )

Listagem 39 Exemplo de uso de Anonymous Inner Class [35]

Interface funcional

Ao projetar um coacutedigo novo o desenvolvedor que optar por utilizar expressotildees lambdadeve iniciar com a criaccedilatildeo de uma interface funcional Esse tipo de interface possui umuacutenico meacutetodo abstrato permitindo que expressotildees lambda sejam usadas para sobrescrevero comportamento do meacutetodo abstrato Uma interface funcional pode possuir outros meacuteto-dos desde que sejam default Uma nova anotaccedilatildeo FunctionalInterface foi adicionadacom a atualizaccedilatildeo do Java 8 para conferir em tempo de compilaccedilatildeo se a interface satisfazos requisitos desse modelo de interface

A Listagem 310 apresenta um exemplo de interface funcional com o objetivo de permi-tir o uso de expressotildees lambda que utilizaratildeo de dois Double como paracircmetro e jaacute utilizada nova anotaccedilatildeo FunctionalInterface introduzida no Java 8

1 Funct iona l Inte r face2 pub l i c i n t e r f a c e DoubleOp 3 pub l i c Double apply ( Double a Double b)

19

4

Listagem 310 Exemplo de interface funcional

Dessa forma conforme as Listagens 311 e 312 o meacutetodo apply() pode tomar formade qualquer operaccedilatildeo entre dois Double que seraacute especificada quando a expressatildeo lambdafor montada dando o aspecto de linguagem funcional agrave linguagem e mais facilidade eliberdade ao desenvolvedor

1 pub l i c c l a s s Ca l cu la to r 2 pub l i c s t a t i c Double c a l c ( Double op1 Double op2 DoubleOp operator ) 3 re turn operator apply ( op1 op2 ) 4 5

Listagem 311 Exemplo de aplicaccedilatildeo da interface funcional

1 Double r e s u l t 1 = Ca lcu la to r c a l c (10d 50d ( a b ) minusgt a + b)

Listagem 312 Uso de expressatildeo lambda para o exemplo anterior

Collections

Dentre as atualizaccedilotildees de pacotes do Java 8 foi adicionado um meacutetodo stream() nainterface Collection Esse meacutetodo trata as Collection como streams o que significa queapesar de natildeo ser possiacutevel acessar elementos diretamente algumas novas manipulaccedilotildeessatildeo possiacuteveis Essas manipulaccedilotildees satildeo na verdade meacutetodos da interface Stream quepodem receber como paracircmetro uma expressatildeo lambda ou seja um comportamento a seraplicado agrave Collection Dentre os meacutetodos temos

bull filter() O meacutetodo filter() recebe uma expressatildeo lambda contendo uma condiccedilatildeopara filtragem da collection

bull map() O meacutetodo map() mapeia os elementos de uma Collection em outro objetocomo uma String A expressatildeo lambda passada por paracircmetro deve retornar o tipode objeto ao qual seraacute mapeado

bull forEach() O meacutetodo forEach() aplica uma operaccedilatildeo especiacutefica para cada ele-mento da Collection A expressatildeo lambda a ser passada deve conter a operaccedilatildeo aser realizada

bull min() e max() Os meacutetodos min() e max() retornam o elemento menor ou maiorda Collection dependendo da expressatildeo lambda passada como paracircmetro

20

A Listagem 313 demonstra como vaacuterias operaccedilotildees com uma Collection podem seraplicadas de uma vez de forma que lendo a expressatildeo lambda jaacute eacute possiacutevel saber oresultado da aplicaccedilatildeo do meacutetodo agrave Collection

1 r o s t e r2 stream ( )3 f i l t e r (4 p minusgt p getGender ( ) == Person Sex MALE5 ampamp p getAge ( ) gt= 186 ampamp p getAge ( ) lt= 25)7 map(p minusgt p getEmailAddress ( ) )8 forEach ( emai l minusgt System out p r i n t l n ( emai l ) )

Listagem 313 Exemplo de utilizaccedilatildeo de meacutetodos de stream com expressotildees lambda [30]

21

Capiacutetulo 4

Estudo e o Processo de Mineraccedilatildeo

A definiccedilatildeo da metodologia utilizada para realizaccedilatildeo deste trabalho eacute importante para queexista uma padronizaccedilatildeo e melhor entendimento de como os resultados foram obtidos paraque a replicaccedilatildeo do mesmo possa ser realizada em trabalhos futuros [36]

Figura 41 Processo utilizado para realizaccedilatildeo do estudo

O esquema representado na Figura 41 descreve o processo seguido para a realizaccedilatildeodeste trabalho que foi divido em trecircs grandes etapas a de planejamento definindo osobjetivos questotildees de pesquisa e meios de investigaccedilatildeo deste projeto a etapa de execuccedilatildeorealizando todo o procedimento metodoloacutegico definido para a coleta e refinamento de

22

dados e a etapa de avaliaccedilatildeo onde foram classificados e avaliados os dados coletadospara responder agraves questotildees de pesquisa

A seguir na primeira seccedilatildeo seratildeo apresentadas em detalhes as questotildees de pesquisa aserem respondidas Em seguida seraacute feito uma breve descriccedilatildeo da fonte de dados utilizada- especificamente os projetos utilizados como objetos de estudo deste trabalho e por fimtodo o restante da metodologia que foi de fato desenvolvida para obter os resultadosnecessaacuterios

41 Questotildees de Pesquisa

Com o objetivo de entender e caracterizar melhor o uso de expressotildees lambda foramdefinidas as seguintes questotildees de pesquisa a serem respondidas

bull PQ-1 Quando os projetos comeccedilaram a introduzir o uso de expressotildees lambda emseus coacutedigos e qual a meacutedia de expressotildees lambda por snapshots caso existam

bull PQ-2 Como as equipes de desenvolvimento estatildeo utilizando expressotildees lambdaatraveacutes de refatoraccedilatildeo de coacutedigo ou introduzindo apenas em coacutedigo novo

bull PQ-3 Quais satildeo os padrotildees tipicamente adotados para o uso de expressotildees lambda

A primeira pergunta de pesquisa gira em torno de como projetos populares open-sourceestatildeo se adaptando agrave introduccedilatildeo de expressotildees lambda em Java muitos projetos jaacute estatildeoutilizando as expressotildees lambda Se sim a partir de quando comeccedilaram a utilizaacute-lasdesde o iniacutecio da introduccedilatildeo das mesmas no Java 8 ou em um periacuteodo mais tardio Aleacutemdisso eacute interessante descobrir se a utilizaccedilatildeo dessa nova caracteriacutestica tem acontecido deforma expressiva ou natildeo

Em seguida para melhor entender a forma como as expressotildees lambda estatildeo sendointroduzidas em projetos eacute interessante investigar se as equipes de desenvolvimento estatildeose preocupando em refatorar coacutedigo com o objetivo de evoluir o software ou se estatildeoexperimentando utilizar expressotildees lambda apenas em coacutedigo novo introduzido

Como a introduccedilatildeo de novas funcionalidades em projetos open-source de grande escaladepende do objetivo do projeto e os padrotildees de projeto utilizados [37] espera-se obser-var diversas abordagens quanto a utilizaccedilatildeo de expressotildees lambda para entatildeo poderclassificar estes softwares quanto a abordagem utilizada

Eacute de grande importacircncia para este estudo conseguir identificar na praacutetica comoexpressotildees lambda estatildeo sendo tipicamente adotadas nestes projetos Assim a terceirapergunta de pesquisa busca identificar alguns exemplos de utilizaccedilatildeo atraveacutes da realizaccedilatildeode alguns estudos de caso

23

Eacute importante ressaltar que apesar de as expressotildees lambda serem uma alternativa aouso de AIC elas natildeo os substituem completamente Existem precondiccedilotildees para que umaAIC possa ser substituiacuteda por expressotildees lambda [12] descritas a seguir

bull AIC deve instanciar-se de uma interface

bull AIC natildeo deve possuir nenhum campo e declarar apenas um meacutetodo

bull AIC natildeo deve possuir uma referecircncia para this ou super

bull AIC natildeo deve declarar um meacutetodo recursivo

Para responder agrave primeira pergunta apenas dados gerais sobre todos os projetos seratildeonecessaacuterios ao passo que pelas perguntas 2 e 3 possuiacuterem uma natureza mais complexaseraacute necessaacuterio aleacutem de uma anaacutelise geral estatiacutestica a realizaccedilatildeo de alguns estudos decaso para obter resultados mais completos

42 Fonte de Dados e Objetos de Estudo

Para responder agraves perguntas de pesquisa estabelecidas foram selecionados os 99 projetosmais populares na linguagem Java dentro da plataforma github ateacute a data da coleta dosdados feita em Abril de 2017 Satildeo considerados populares os repositoacuterios que possuema maior quantidade possiacutevel de estrelas (stars) A decisatildeo de escolher os 99 projetos maispopulares foi por sua natureza imparcial e ao mesmo tempo para que se possa analisarprojetos que satildeo de familiaridade e conhecimento da comunidade do github e de domiacuteniopuacuteblico Os 99 projetos estatildeo listados no Anexo I

Para entender a transiccedilatildeo feita por esses projetos entre as versotildees anteriores do Java eo Java 8 com as expressotildees lambda eacute necessaacuterio analisar o coacutedigo de vaacuterias versotildees a fimde observar alguma mudanccedila para cada projeto Como satildeo 99 projetos e vaacuterios dessesprojetos possuem milhares de linhas de coacutedigo e commits seria impossiacutevel avaliar todosos commits Optou-se entatildeo por coletar snapshots mensais de cada projeto conformeprocedimento tambeacutem seguido anteriormente [38] Cada snapshots representa o estadodo projeto em um determinado mecircs e como criteacuterio de escolha padratildeo todos os snapshotsequivalem ao uacuteltimo commit realizado no determinado mecircs que este representa

O proacuteximo passo eacute determinar o periacuteodo de tempo em que esses snapshots seriamcoletados Como Java 8 (e consequentemente as expressotildees lambda) foi introduzidoapenas em meados de 2014 [28] coletar dados de projetos a partir de um periacuteodo muitoantes deste ano natildeo agregaria valor ao estudo em questatildeo Definiu-se entatildeo um periacuteodopara a coleta mensal desses snapshots atraveacutes dos anos Janeiro de 2013 um ano antesda introduccedilatildeo do Java 8 para que se pudesse identificar para todos os projetos o mecircs

24

exato em que expressotildees lambda foram introduzidas ateacute o mecircs da coleta de dados Abrilde 2017

Eacute importante ressaltar que a definiccedilatildeo dos meses foi definida do dia primeiro de ummecircs ao dia primeiro do proacuteximo mecircs e por consequecircncia alguns snapshots que deveriamrepresentar o final de determinado mecircs correspondem na verdade a commits realizadosno dia primeiro do mecircs seguinte Por exemplo pode existir casos em que o commit querepresente o mecircs de Marccedilo de 2016 seja na verdade o commit realizado no dia primeirode Abril de 2016 Isso se deve a natureza da forma como os resultados de log de commitssatildeo obtidos pelo git [39] Poreacutem isso natildeo interfere nas anaacutelises ou no propoacutesito destetrabalho uma vez que foram realizadas verificaccedilotildees e validaccedilotildees para que natildeo existamdatas repetidas (e consequentemente commits repetidos) por repositoacuterio

Neste trabalho o termo projeto e repositoacuterio foram utilizados de forma intercaladapara representar a mesma coisa o software desenvolvido que possui um repositoacuterio naplataforma github Os termos commit snapshops e versotildees tambeacutem representam a mesmacoisa uma vez que foi definido que seriam utilizados apenas um commit por mecircs pararepresentar um determinado snapshot ou versatildeo do repositoacuterio em questatildeo

Todos os 99 projetos seratildeo utilizados para a realizaccedilatildeo de uma anaacutelise geral de ca-racterizaccedilatildeo do uso de expressotildees lambda Para as anaacutelises aprofundadas foi feito umcriteacuterio de classificaccedilatildeo para que apenas alguns projetos possam ser analisados em niacutevelde coacutedigo como estudos de caso

Resumindo foram escolhidos os 99 projetos mais populares de Java no github cole-tando dados mensais de seus commits a partir do ano de 2013 ateacute a data da coleta dosdados lembrando que nem todos os projetos existem desde 2013 (projetos mais recentes)

43 Processo de Mineraccedilatildeo

A abordagem utilizada para coletar e analisar os 99 projetos escolhidos como mostra aFigura 42 foi realizada de forma automatizada utilizando scripts python e dois projetosdesenvolvidos em Java para a coleta e tratamento de dados como descrito a seguir

Primeiramente foi realizado uma coacutepia dos repositoacuterios atuais de todos os 99 projetosmais populares do github em Java Para automatizar o processo foi desenvolvido umscript em python que lista todos os projetos escolhidos clona todos os repositoacuterios emuma pasta na maacutequina local e cria um arquivo temporaacuterio com as informaccedilotildees do nomede cada repositoacuterio e seu caminho absoluto na maacutequina local

25

Figura 42 Metodologia implementada para coleta e tratamento de dados

Em seguida foi necessaacuterio realizar o checkout de todas as versotildees entre Janeiro de2013 a Abril de 2017 de cada projeto Por motivos de otimizaccedilatildeo de espaccedilo da maacutequinalocal e automatizaccedilatildeo no processo de checkout utilizou-se de um segundo script pythonque realizava as seguintes tarefas para cada mecircs em cada projeto verificar se dentreo mecircs estipulado houve algum commit para aquele projeto se sim pega-se o hash douacuteltimo commit do mecircs realiza o checkout conta-se a quantidade de linhas de coacutedigo emJava que o projeto tem utilizando a biblioteca cloc e armazena todas as informaccedilotildeespertinentes referentes a todos os projetos que naquele mecircs tiveram commits para que oprojeto static-analysis possa entatildeo ser executado sobre esses projetos naquele determinadomomento As informaccedilotildees coletadas que satildeo utilizadas pelo static-analysis correspondemao nome do projeto o hash do commit para aquela versatildeo a pasta onde o projeto estaacutearmazenado na maacutequina local a quantidade de linhas de coacutedigo Java do projeto e datareferente ao commit Essas informaccedilotildees satildeo pertinentes para que o projeto static-analysisconsiga funcionar de forma correta projeto este descrito em detalhes a seguir

431 static-analysis

O static-analysis foi um projeto desenvolvido anteriormente a este trabalho pelos alunosThiago Cavalcanti e Vinicius de Almeida cujo objetivo eacute realizar a anaacutelise estaacutetica de

26

coacutedigos-fonte Java e gerar arquivos de saiacuteda contendo informaccedilotildees de classes e meacutetodoscom suas devidas ocorrecircncias de caracteriacutesticas da linguagem [40]

A anaacutelise estaacutetica de coacutedigo consiste em analisar um coacutedigo-fonte sem a necessidadede executaacute-lo Esse tipo de anaacutelise eacute de extrema importacircncia para manter um coacutedigo dequalidade evitar futuras refatoraccedilotildees e obter informaccedilotildees estatiacutesticas de forma raacutepida epraacutetica [41]

Seguindo esse princiacutepio o static-analysis foi projetado para receber um arquivo deentrada csv seguindo o padratildeo

Tipo da Aplicaccedilatildeo Inicio do projeto Antes ou Apoacutes Java 5 Nome do ProjetoVersatildeo Caminho absolutoQuantidade de linhas de coacutedigo

Atraveacutes da informaccedilatildeo do caminho absoluto do projeto o static-analysis varre osdiretoacuterios em busca dos arquivos fonte java realiza o parse desses arquivos e utilizade Visitors para extrair as informaccedilotildees desejadas e exporta-las em arquivos csv Ouso de Visitors permite que sejam escolhidas as informaccedilotildees desejadas para a consultacomo expressotildees Lambda e AIC s aleacutem de possibilitar que sejam implementados novosVisitors conforme a linguagem evolua ou as necessidades mudem

Para este trabalho foram utilizados os Visitors de expressotildees Lambda map() filter()AICs e declaraccedilotildees de meacutetodos

432 BDAnalisador

Apoacutes obter todas as informaccedilotildees necessaacuterias geradas pelo static-analysis era preciso ma-nipular os dados de forma que facilitasse a coleta de dados para o estudo proposto Comovaacuterios arquivos em formato csv satildeo de difiacutecil manipulaccedilatildeo foi desenvolvido entatildeo umaferramenta chamada BDAnalisador Esta ferramenta eacute responsaacutevel por processar os arqui-vos em csv gerados pelo static-analysis e popular uma base de dados relacional MySQLcom as informaccedilotildees pertinentes a este estudo

O BDAnalisador foi desenvolvido com a intenccedilatildeo de tornar mais simples o trabalhocom os dados resultantes do static-analysis de forma que consultas em SQL pudessemser feitas a ponto de permitir a obtenccedilatildeo de resultados mais complexos Seguindo esseobjetivo o framework Hibernate foi escolhido como ferramenta para persistecircncia devidoa ser um framework jaacute consolidado no mercado e que de forma simples relaciona osobjetos Java ao banco de dados MySQL [42] A divisatildeo de classes foi projetada em quatroentidades Projeto Versao Classe e Metodo cada uma com seus respectivos camposcontendo as informaccedilotildees necessaacuterias para a pesquisa como pode ser visto na Figura 44Eacute importante ressaltar que a tabela de Versao guarda hashs de commits devido agrave escolhade utilizar commits para obter mais informaccedilatildeo de evoluccedilatildeo de coacutedigo em um menor

27

espaccedilo de tempo Aleacutem disso para este trabalho optou-se por persistir todos os meacutetodose classes de cada versatildeo sem se importar com a repeticcedilatildeo desses dados pois a hipoacutetesede haver grandes refatoraccedilotildees entre versotildees poderia comprometer a confiabilidade dasinformaccedilotildees

Figura 43 Diagrama de classes UML do BDAnalisador

Como visto na Figura 43 seguindo parcialmente a arquitetura MVC cada entidadepossui sua respectiva classe DAO(Data Access Object) para persistecircncia dos dados eapenas uma classe Controlador no projeto responsaacutevel pela manipulaccedilatildeo e parse dosdados dos arquivos csv gerados pelo static analysis para serem enviados agraves classes DAOO sistema inicia chamando o meacutetodo inicializar() da classe Controlador Esse meacutetodoeacute responsaacutevel por ler um arquivo de entrada csv que segue o mesmo modelo do arquivo dostatic-analysis citado na seccedilatildeo anterior O arquivo conteacutem os dados de todos os projetose suas respectivas versotildees dessa forma o meacutetodo instancia um objeto da classe Projetoe persiste o projeto no banco de dados Para cada versatildeo encontrada no arquivo deentrada o inicializar() aciona os meacutetodos responsaacuteveis por instanciar e preencher aslistas da classe Classe e Metodo Os meacutetodos responsaacuteveis por preencher as listas varremos arquivos csv gerados pelo static-analysis e fazem o parse das informaccedilotildees relevantescomo nomes dos meacutetodos e quantidades de lambdas para construir os objetos que seratildeogravados Ao final dos preenchimentos o objeto Versatildeo eacute instanciado e gravado no bancode dados atraveacutes de sua classe DAO ao mesmo tempo que grava suas respectivas Classese Metodos

28

Apoacutes vaacuterios testes e correccedilotildees de bugs o banco de dados se encontrava finalmente comas informaccedilotildees de 99 projetos Java open-source separados por um commit por mecircs desde2013 cada um com suas respectivas informaccedilotildees de classes meacutetodos e a quantidade deexpressotildees lambda filters e maps em cada meacutetodo Filter ou Filter pattern eacute o padratildeode projeto que tem como objetivo filtrar objetos de uma coleccedilatildeo (Collection) de acordocom algum criteacuterio Jaacute o map ou map pattern eacute um padratildeo que ldquomapeia os elementosde uma coleccedilatildeo aplicando uma funccedilatildeo a eles para uma nova coleccedilatildeo [43] A coleta deinformaccedilotildees sobre esses padrotildees podem ser uacuteteis para possiacuteveis anaacutelises de oportunidadesde uso de expressotildees lambda para refatoraccedilatildeo de coacutedigo

A Figura 44 mostra o esquema de como o banco de dados resultante foi gerado

Figura 44 Modelo relacional do banco de dados populado pelo BDAnalisador Imagemgerada com software DBeaver [2]

44 Classificaccedilatildeo e Anaacutelise

Com o banco de dados populado restam apenas as etapas de classificaccedilatildeo e anaacutelise pararesponder as questotildees de pesquisa propostas Para isso inicialmente houve uma tentativade se utilizar apenas queries SQL para analisar os dados de acordo com as informaccedilotildeesrelevantes Poreacutem devido ao fato de o banco de dados conter todas as informaccedilotildees detodos os projetos e todas as suas versotildees queries que possuem uma alta complexidadedemoravam muito tempo para retornar os dados

Assim com o objetivo de facilitar o trabalho alguns scripts python foram desenvolvi-dos para rodar as queries separadamente e individualmente para cada projeto de formaautomatizada a fim de melhorar o tempo de resposta para obtenccedilatildeo dos resultados

29

441 Meacutedia de Lambda

O primeiro script retorna a quantidade de expressotildees lambda (ou AICs) por n snapshotsque contenha expressotildees lambda O objetivo eacute ter uma visatildeo geral da meacutedia de expressotildeeslambda e AICs utilizadas por cada projeto e como nem todos os snapshots coletados decada projeto possuem expressotildees lambda e AICs apenas aqueles com alguma expressatildeolambda ou AIC satildeo incluiacutedos no caacutelculo da meacutedia

Mmedia =sumn qtdLambdai

n

442 Anaacutelise Temporal

O segundo script retorna para cada projeto a soma total da quantidade de expressotildeeslambda AIC map() e filter() no projeto inteiro para cada versatildeo Ou seja tem-seo total de cada uma das quatro propriedades selecionadas para cada mecircs do projetoobtendo assim uma visatildeo temporal de evoluccedilatildeo do uso das caracteriacutesticas descritas ATabela 41 ilustra parcialmente o resultado obtido para o projeto agera onde idVersaoeacute o identificador no banco de dados referente ao hash do commit mensal coletado qtd eacutea quantidade de cada uma das caracteriacutesticas escolhidas e a data do commit encontra-seno formato americano

Tabela 41 Informaccedilotildees mensais sobre o projeto ageraidVersao Data do Commit qtd lambda qtd AIC qtd maps qtd filter

823 512016 0 29 4 0755 612016 13 28 4 0686 6152016 13 29 4 0621 812016 13 29 4 0555 8162016 13 30 4 0485 922016 13 30 4 0422 10132016 14 30 4 0356 11282016 14 30 4 0295 12212016 21 30 5 0232 212017 21 30 5 0175 312017 21 30 5 0112 3312017 21 36 5 048 4242017 21 48 5 0

Os resultados obtidos com esta anaacutelise temporal permitiu a identificaccedilatildeo de padrotildees nautilizaccedilatildeo de expressotildees lambda em relaccedilatildeo a utilizaccedilatildeo de AIC por todos os projetos Foi

30

possiacutevel classificar todos os projetos em 6 grupos ilustrado na Figura 45 Primeiramenteseparou-se os projetos entre os que possuem expressotildees lambda e os que natildeo possuemDentre os que possuem identificou-se cinco categorias

1 Grupo 1 Quantidade de AICs e expressotildees lambda aumentam com o tempo pro-porcionalmente

2 Grupo 2 Quantidade de AICs diminui agrave medida que a quantidade de expressotildeeslambda aumentam e a quantidade de expressotildees lambda ultrapassa a quantidade deAIC em um determinado momento

3 Grupo 3 Quantidade de AICs diminui agrave medida que a quantidade de expressotildeeslambda aumentam mas a quantidade de AIC permanece superior agrave quantidade delambda

4 Grupo 4 Expressotildees lambda satildeo introduzidas e existem por um pequeno periacuteodode tempo mas satildeo completamente removidas posteriormente

5 Grupo 5 Quantidade de expressotildees lambda eacute constante e muito inferior compa-rado com a quantidade de AICs no projeto Foi determinado que para pertencera esta classificaccedilatildeo o projeto precisa ter uma razatildeo de meacutedia de expressotildees lamb-dasnapshot por meacutedia de AICsnapshot inferior a 020 Esse paracircmetro foi esta-belecido com o objetivo de definir um padratildeo para o que pode ser considerado umprojeto com poucas expressotildees lambda

Figura 45 Classificaccedilatildeo dos projetos

31

443 Refatoraccedilatildeo de Coacutedigo

O uacuteltimo script teve como objetivo realizar uma tentativa inicial de identificar refatoraccedilatildeode coacutedigo da seguinte maneira para todos os projetos que possuem expressotildees lambdaforam identificados o mecircs imediatamente antes da introduccedilatildeo de expressotildees lambda e omecircs seguinte onde houve a primeira ocorrecircncia de lambda no projeto Assim realizou-se uma anaacutelise do tamanho em quantidade de linhas de coacutedigo de todos os meacutetodosdo projeto que no mecircs seguinte tiveram introduccedilatildeo de lambda Em seguida fez-se umacomparaccedilatildeo com os mesmos meacutetodos em relaccedilatildeo ao mecircs anterior e assim foi possiacuteveldetectar quais meacutetodos tiveram a quantidade de linhas de coacutedigo reduzidas o que seriaum indicativo natildeo necessariamente exclusivo de que uma refatoraccedilatildeo de coacutedigo possa terocorrido

Sabe-se que este meacutetodo de detecccedilatildeo de refatoraccedilatildeo de coacutedigo possui suas limitaccedilotildeesuma vez que as comparaccedilotildees para saber se um meacutetodo existe em ambas versotildees eacute feitopuramente por comparaccedilatildeo de String (nome do meacutetodo) e a classe que este pertence

444 Casos de Uso

Os meacutetodos descritos acima ajudaram a identificar alguns padrotildees e facilitar a anaacutelise dosdados Poreacutem natildeo satildeo suficientes para que se possa responder agraves questotildees de pesquisaDessa forma apoacutes a identificaccedilatildeo dos grupos de classificaccedilatildeo para os projetos foramescolhidos um projeto de cada grupo (com exceccedilatildeo do grupo dos projetos sem expressotildeeslambda) para realizar um breve estudo de caso com o objetivo de identificar e caracterizarmelhor a adoccedilatildeo de expressotildees lambda Os projetos escolhidos foram agera vertxAndroid-CleanArchitecture RxJava e guava

32

Capiacutetulo 5

Resultados Obtidos e Anaacutelise

Neste capiacutetulo seratildeo apresentados os dados obtidos e anaacutelise com o objetivo de responderagraves questotildees de pesquisa propostas Como mencionado anteriormente as perguntas seratildeorespondidas de duas maneiras algumas com informaccedilotildees gerais sobre todos os projetose outras com breve estudos de caso envolvendo cinco projetos

51 Visatildeo Geral

Dentre os repositoacuterios coletados para a anaacutelise 74 (7474) natildeo utilizaram nenhumaexpressatildeo lambda no projeto durante todo o periacuteodo analisado (Janeiro de 2013 a Abrilde 2017) restando apenas 25 repositoacuterios (2525) com expressotildees lambda Eacute interessantedestacar que apesar de a quantidade de repositoacuterios que natildeo possuem expressotildees lambdaser relativamente expressiva muitos destes repositoacuterios satildeo de projetos em Java que umdia foram populares e atualmente natildeo estatildeo sendo mais desenvolvidos (por exemplo umaplicativo que soacute funciona para Android 23 atualmente descontinuado)

Levando em consideraccedilatildeo apenas os projetos que possuem expressotildees lambda exis-tem dois tipos de dados que podem ser analisados para responder agrave primeira questatildeo depesquisa atraveacutes dos dados obtidos pelo meacutetodo anteriormente mencionado como anaacutelisetemporal e a meacutedia de lambda por snapshot mencionados no capiacutetulo anterior

Com relaccedilatildeo ao ano em que a primeira ocorrecircncia foi encontrada 6 projetos introduzi-ram expressotildees lambda jaacute em 2014 8 comeccedilaram a utilizar em 2015 7 em 2016 e apenas4 tiveram a primeira ocorrecircncia de expressotildees lambda em 2017 Dessa forma percebe-seque os projetos estatildeo relativamente bem distribuiacutedos em grupos quanto ao ano em que seintroduziu expressotildees lambda

Pela meacutedia de lambda por snapshot (lambdasnapshot) a maioria (11 projetos) possuiuma quantidade expressiva acima de 100 lambdasnapshot (com 6 projetos entre 20 e 100lambdasnapshot e 8 projetos com menos de 20 lambdasnapshot) como apresentados no

33

graacutefico da Figura 51 Isso mostra que essa nova caracteriacutestica jaacute estaacute sendo bem utilizadanos projetos que comeccedilaram a migrar para a nova versatildeo do Java

Figura 51 Graacuteficos dos projetos separados por ano de introduccedilatildeo de expressotildees lambdae meacutedia de lambda por snapshot

Com isso pode-se observar que apesar de a quantidade de projetos que possuemexpressotildees lambda natildeo ser tatildeo alta eacute possiacutevel obter resultados expressivos uma vez quea quantidade dos projetos com lambda estatildeo bem dispersos quanto ao periacuteodo em quecomeccedilaram a adotar essa caracteriacutestica e a quantidade de expressotildees lambda por snapshot

511 Projetos Selecionados

Atraveacutes dos grupos de classificaccedilatildeo identificados pela anaacutelise temporal descritos na Figura45 cinco projetos foram selecionados para uma anaacutelise detalhada levando em consideraccedilatildeoo grupo em que eles pertencem Estes projetos seratildeo apresentados a seguir

512 agera

Agera eacute uma biblioteca Android que ajuda a introduzir programaccedilatildeo funcional reativa(functional reactive programming) em projetos Android Eacute um projeto recente lanccediladoem 2016 pela Google [44] e encontra-se no grupo dos projetos que introduziram expressotildeeslambda em 2016 no mesmo ano de seu lanccedilamento contendo uma meacutedia de expressotildeeslambda de 16 lambdasnapshot

Na classificaccedilatildeo estabelecida agera pertence ao Grupo 1 onde a quantidade de ex-pressotildees lambda no projeto com o tempo aumentam juntamente com a quantidade deAICs como mostra o graacutefico de anaacutelise temporal na Figura 52

34

Figura 52 Graacuteficos de anaacutelise temporal do projeto agera

513 vertx

Eclipse Vertx eacute um conjunto de ferramentas para criaccedilatildeo de reactive applications namaacutequina virtual Java (JVM) em grande escala [45] Seu primeiro lanccedilamento aconteceuem 2011 e a primeira ocorrecircncia de expressotildees lambda no projeto aconteceu em 2014 Esteprojeto possui uma meacutedia de 2867 lambdasnapshot e dentre os projetos consideradosneste trabalho eacute o que possui a maior quantidade de expressotildees lambda

Este projeto pertence ao Grupo 2 onde a quantidade de expressotildees lambda aumen-tou consideravelmente pelos meses ultrapassando a quantidade de AICs que diminuiudrasticamente como mostra a Figura 53

35

Figura 53 Graacuteficos de anaacutelise temporal do projeto Vertx

514 Android-CleanArchitecture

Apesar de ser uma amostra de projeto Android-CleanArchitecture que tem como objetivoconstruir aplicaccedilotildees Android utilizando clean architecture foi lanccedilado em 2014 mas semanteacutem sempre atualizado [46]

A introduccedilatildeo de expressotildees lambda que aconteceu no ano de 2015 se deu de formatiacutemida com uma meacutedia de 35 lambdasnapshot De qualquer forma este projeto conseguerepresentar com seu graacutefico de anaacutelise temporal o grupo 3 composto por projetos em quea quantidade de expressotildees lambda aumentou mas sem ultrapassar AICs que diminuiacuteramdemonstrado no graacutefico da Figura 54

36

Figura 54 Graacuteficos de anaacutelise temporal do projeto Android-CleanArchitecture

515 RxJava

Dentre os repositoacuterios estudados RxJava eacute considerado o mais popular Como umaimplementaccedilatildeo de Reactive Extensions para a JVM RxJava teve seu lanccedilamento dadoem 2013 [47] Expressotildees lambda apareceram pela primeira vez no ano de 2015 comuma meacutedia de 766 lambdasnapshot

Apesar de uma meacutedia relativamente alta o tempo de vida das expressotildees lambda nesteprojeto foi bem curto caracterizando assim projetos do grupo 4 houve a introduccedilatildeo dasexpressotildees lambda no projeto poreacutem houve a remoccedilatildeo completa de todas as expressotildeeslambda previamente introduzidas desaparecendo completamente do projeto ateacute a datada coleta de dados (Figura 55)

37

Figura 55 Graacuteficos de anaacutelise temporal do projeto RxJava

516 guava

Guava eacute um conjunto de bibliotecas para Java da Google lanccedilado em 2011 A atualizaccedilatildeodo coacutedigo do projeto para Java 8 aconteceu somente em 2016 e apesar do projeto conteruma meacutedia de 281 lambdasnapshot ele foi escolhido como representante dos projetosdo Grupo 5 (Figura 56) que possuem expressotildees lambda mas de forma natildeo expressiva osuficiente quando comparado com a quantidade de AIC pelo fato de sua razatildeo de meacutedia delambdasnapshot por meacutedia de AICsnapshot ser 004 Ou seja embora o projeto tenhaexpressotildees lambda estas satildeo consideradas muito poucas quando inseridas no contextogeral deste projeto que eacute considerado um projeto grande

38

Figura 56 Graacuteficos de anaacutelise temporal do projeto Guava

52 Refatoraccedilatildeo de Coacutedigo

Com o objetivo de caracterizar melhor como as expressotildees lambda estatildeo sendo utilizadaseacute interessante identificar se estas estatildeo sendo introduzidas atraveacutes de refatoraccedilatildeo de coacutedigoou em coacutedigo novo

Os projetos classificados como pertencentes ao Grupo 2 possuem em comum o fatode expressotildees lambda aumentarem a medida que AICs diminuem ultrapassando-as eessa caracteriacutestica em comum pode indicar que nestes projetos possivelmente houve re-fatoraccedilatildeo de coacutedigo visto que AIC sendo substituiacutedo por expressotildees lambda dentro dascondiccedilotildees determinadas eacute a maneira mais comum de se identificar refatoraccedilatildeo de coacute-digo para introduccedilatildeo de expressotildees lambda [12] Os projetos que compotildeem o grupo 2representam 44 de todos os projetos estudados que possuem expressotildees lambda o quepode ser um indicativo caso a hipoacutetese de refatoraccedilatildeo de coacutedigo seja positiva de quemuitos projetos que estatildeo adotando o Java 8 estatildeo se preocupando de alguma formacom refatoraccedilatildeo se coacutedigo Fazem parte desse grupo os seguintes projetos elasticsearchjava-design-patterns PocketHub presto RxJava-Android-Samples spark vertx zipkinjava8-tutorial dropwizard e material-dialogs

39

Outra maneira de verificar possiacuteveis indicadores de refatoraccedilatildeo de coacutedigo foi atraveacutesda anaacutelise dos tamanhos (em quantidade de linhas de coacutedigo) dos meacutetodos com expressotildeeslambda no mecircs em que se introduziu expressotildees lambda e um mecircs imediatamente antesdeste Essa anaacutelise mostra que dos 25 projetos com expressotildees lambda 12 (48) projetostiveram ao menos um meacutetodo em que houve uma diminuiccedilatildeo no tamanho o que podeser considerado um indicativo de refatoraccedilatildeo de coacutedigo A Figura 57 mostra todos osprojetos em relaccedilatildeo agrave quantidade total de meacutetodos que possuem lambda no primeiro mecircsde introduccedilatildeo do mesmo em vermelho comparado com a quantidade desses meacutetodos quetiveram uma diminuiccedilatildeo no tamanho quando comparados com o coacutedigo do mecircs anteriorem azul

Figura 57 Comparaccedilatildeo entre todos os projetos com expressatildeo lambda sobre refatoraccedilatildeode coacutedigo no mecircs de introduccedilatildeo da caracteriacutestica

Ainda observando a figura 57 com relaccedilatildeo aos projetos que natildeo tiveram nenhummeacutetodo com diminuiccedilatildeo de tamanho (barra azul) percebe-se que todos os 13 projetossequer tiveram uma quantidade significativa de meacutetodos que possuem expressotildees lambda(com o maior tendo apenas 5 meacutetodos) no mecircs de introduccedilatildeo da caracteriacutestica no projetoe ao mesmo tempo jaacute existiam no mecircs em que natildeo existia lambda no projeto Essa eacuteuma observaccedilatildeo importante porque projetos como vertx sendo este o que possui a maiormeacutedia de lambdasnapshot de todos os projetos e ao mesmo tempo tendo apenas trecircsmeacutetodos que continham expressotildees lambda no mecircs da introduccedilatildeo e que existiam no mecircs

40

anterior permitem inferir que todas as outras expressotildees lambda existentes no projetopara este determinado mecircs de introduccedilatildeo encontram-se em coacutedigo novo introduzido

Eacute importante ressaltar que somente essa anaacutelise natildeo eacute exclusivamente suficiente paradeterminar se estes projetos estatildeo realmente introduzindo lambda em coacutedigo novo ourealizando refatoraccedilatildeo uma vez que como a comparaccedilatildeo aconteceu apenas no mecircs deintroduccedilatildeo com o mecircs imediatamente anterior natildeo reflete todo o ciclo de vida do pro-jeto Por exemplo algumas equipes podem escolher refatorar o coacutedigo depois de umtempo de adaptaccedilatildeo apoacutes a transiccedilatildeo para a nova versatildeo da linguagem Assim paraobter uma melhor anaacutelise sobre refatoraccedilatildeo de coacutedigo ou natildeo feita nestes projetos aleacutemde outras anaacutelises referentes aos padrotildees tipicamente adotados para implementaccedilatildeo delambda nestes projetos seratildeo apresentados a seguir os estudos de caso dos cinco projetospreviamente selecionados

Outro ponto importante eacute o fato de que apesar das informaccedilotildees quanto agraves quantida-des de filter e map terem sido incluiacutedas inicialmente no trabalho para observar possiacuteveispadrotildees de refatoraccedilatildeo de coacutedigo percebeu-se que estas natildeo satildeo utilizadas de forma con-sideraacutevel pelos projetos estudados e para fins de anaacutelises generalizadas natildeo apresentaramtanta influecircncia na utilizaccedilatildeo de expressotildees lambda quanto a quantidade de AICs noprojeto

53 Estudos de Caso

Dentre os projetos analisados verificou-se que os projetos de pequeno e meacutedio porte op-taram por refatorar de uma vez seus coacutedigos para incluir expressotildees lambda em situaccedilotildeesem que se utilizava AICs anteriormente ou em alguns poucos casos de utilizaccedilatildeo deCollection Os projetos de grande porte natildeo apresentaram nenhuma refatoraccedilatildeo de coacute-digo ou uma refatoraccedilatildeo parcial gradativa provavelmente devido agrave grande quantidade dearquivos e coacutedigo que possuem o que pode tornar o trabalho de refatoraccedilatildeo extenso ecansativo

O projeto vertx que pertence ao grupo 2 dos projetos em que a quantidade de ex-pressotildees lambda aumentaram e as de AICs diminuiacuteram com lambda ultrapassando AICsexecutou inicialmente commits em maio de 2014 com adiccedilatildeo de coacutedigo novo utilizandoexpressotildees lambda e apoacutes um mecircs realizou um commit maior com a refatoraccedilatildeo de todasas AICs para expressotildees lambda Apoacutes a refatoraccedilatildeo o projeto se preocupou em mantera utilizaccedilatildeo de expressotildees lambda ao mesmo tempo que o uso de AICs se manteve apenasaos casos de classes com interfaces natildeo funcionais A Figura 58 apresenta uma parte docommit de refatoraccedilatildeo de coacutedigo que mostra em vermelho a parte eliminada do coacutedigo(AIC) e em verde o coacutedigo novo representando a substituiccedilatildeo por uma expressatildeo lambda

41

Figura 58 Commit de refatoraccedilatildeo de coacutedigo do projeto Vertx [3]

Alguns projetos ainda natildeo se preocuparam em refatorar o coacutedigo para o uso de ex-pressotildees lambda ateacute a data deste trabalho que eacute o caso do projeto guava que apresentouum commit em 03112016 com a atualizaccedilatildeo do projeto para Java 8 Mas a partir daatualizaccedilatildeo se preocupou em utilizar as expressotildees lambda apenas na implementaccedilatildeo decoacutedigo novo O cenaacuterio em que a refatoraccedilatildeo natildeo eacute prioridade ainda eacute a realidade de vaacuteriosprojetos de grande porte visto que os dados de projetos sem nenhuma expressatildeo lambdasatildeo o maior nuacutemero neste trabalho Poreacutem projetos que jaacute adotaram a utilizaccedilatildeo do Java8 tendem a mudar isso com o passar do tempo A Figura 59 apresenta em verde umaadiccedilatildeo de coacutedigo novo com expressatildeo lambda sem a eliminaccedilatildeo de algum coacutedigo anteriora esse que estaria em vermelho

42

Figura 59 Exemplo de um arquivo do commit de adiccedilatildeo de coacutedigo novo em Java 8 doprojeto Guava [4]

Na categoria de projetos em que os AICs e expressotildees lambda aumentam proporci-onalmente (grupo 1) o projeto agera realizou um commit em 19052016 com a adiccedilatildeoda biblioteca retrolambda como dependecircncia do projeto Essa biblioteca utilizada prin-cipalmente por projetos Android permite executar coacutedigo Java 8 contendo expressotildeeslambda em Java 5 6 e 7 [48] O commit tambeacutem apresenta refatoraccedilatildeo dos AICs ad-vindos de interfaces funcionais para expressotildees lambda Apesar de o projeto continuar autilizar as expressotildees lambda em seus commits posteriores o nuacutemero de AICs tambeacutemcontinuou a aumentar visualizando os commits posteriores notou-se que esses AICs satildeorelativos a interfaces natildeo funcionais ou seja que possuem mais de um meacutetodo O projetoAndroid-CleanArchitecture eacute similar ao agera pois tambeacutem optou pela instalaccedilatildeo da bi-blioteca retrolambda para uso de expressotildees lambda em seus coacutedigos e como tambeacutem eacuteum projeto de pequeno porte houve uma pequena refatoraccedilatildeo dos AICs A Figura 510mostra a parte do commit de refatoraccedilatildeo de coacutedigo em que o desenvolvedor adiciona abiblioteca retrolambda como dependecircncia

43

Figura 510 Commit de adiccedilatildeo da biblioteca Retrolambda no projeto Agera [5]

Outro caso interessante eacute o do projeto RxJava que em 2015 optou pela refatoraccedilatildeodo coacutedigo para a utilizaccedilatildeo de expressotildees lambda quase eliminando por completo o usode AICs mas que no ano seguinte reverteu os commits de forma que eliminasse comple-tamente o uso de expressotildees lambda para manter a retrocompatibilidade com o Java 6A Figura 511 demonstra uma parte do commit de reversatildeo do coacutedigo para Java 6 emque pode ser visto em vermelho o coacutedigo anterior com expressotildees lambda e o verde como novo coacutedigo utilizando AIC novamente

44

Figura 511 Commit de remoccedilatildeo de Lambdas e volta para o uso de AICs no projetoRXJava [6]

Essa preocupaccedilatildeo com retrocompatibilidade de coacutedigo pode ser um fator crucial nadecisatildeo das equipes de desenvolvimento na hora de decidir como fazer o software co-evoluircom a linguagem sem perder a compatibilidade com versotildees anteriores

45

Capiacutetulo 6

Consideraccedilotildees Finais

Este estudo permitiu entender melhor como projetos estatildeo realizando a migraccedilatildeo para oJava 8 em especial utilizando uma nova caracteriacutestica introduzida expressatildeo lambdaApesar de a maioria dos projetos populares considerados natildeo possuiacuterem nenhuma ocor-recircncia de expressotildees lambda os projetos que tinham expressotildees lambda foram suficientespara realizar um primeiro estudo de caracterizaccedilatildeo no uso desta caracteriacutestica e com osprojetos efetivamente utilizados para estudo foi possiacutevel agrupaacute-los quanto a maneira emque as expressotildees lambda estavam sendo utilizadas quando comparadas com AICs em 5grandes grupos quando AIC e lambda aumentam proporcionalmente quando AIC dimi-nui e lambda aumenta ultrapassando AIC quando AIC diminui mas continua superior aolambda crescente expressotildees lambda que foram introduzidas e retiradas completamentedo coacutedigo e expressotildees lambda que natildeo existem em quantidades expressivas

Foi possiacutevel entatildeo realizar um estudo aprofundado levando em consideraccedilatildeo as di-ferentes maneiras com que as expressotildees lambda foram adotadas nos projetos atraveacutes daescolha de um projeto que representasse cada grupo para anaacutelise Dentre os cinco projetosestudados foi possiacutevel observar alguns padrotildees tipicamente adotados por desenvolvedorespara implementar expressotildees lambda em seus projetos como a utilizaccedilatildeo da bibliotecas(retrolambda) que permitissem uma flexibilizaccedilatildeo na utilizaccedilatildeo de expressotildees lambda oucomo lambda eacute primariamente utilizada para substituir determinados AICs ou operaccedilotildeesem Collection

Aleacutem disso foi possiacutevel observar como a refatoraccedilatildeo de coacutedigo acontece em cada umdesses projetos Observou-se como projetos menores tendem a refatorar coacutedigo maisfacilmente ao passo que projetos maiores e mais complexos fazem menos refatoraccedilatildeo oudemoram mais entre o periacuteodo em que houve a primeira migraccedilatildeo de coacutedigo para a novaversatildeo da linguagem ateacute o periacuteodo em que realmente decidem refatorar coacutedigo Aleacutem dacomplexidade do projeto influenciar na decisatildeo de migrar o projeto para uma versatildeo maisrecente da linguagem a preocupaccedilatildeo com retrocompatibilidade com versotildees anteriores da

46

linguagem tambeacutem podem ser uma barreira para que projetos comecem a evoluir o coacutedigojuntamente com a evoluccedilatildeo da linguagem

Ainda assim foi possiacutevel observar que a preocupaccedilatildeo com a co-evoluccedilatildeo do software-linguagem existe entre os desenvolvedores de projetos mas a realizaccedilatildeo da migraccedilatildeo aindaacontece lentamente devido agrave diversos fatores que precisam ser levados em consideraccedilatildeopara a manutenccedilatildeo do projeto

Para trabalhos e contribuiccedilotildees futuras seria interessante desenvolver uma ferramentaque pudesse analisar diretamente no coacutedigo-fonte as oportunidades de aplicaccedilatildeo de ex-pressotildees lambda dessa forma poderiam ser analisadas as porcentagens de conversatildeo decoacutedigo para Java 8 e obter melhores conclusotildees sobre a importacircncia que os projetos estatildeodando para a evoluccedilatildeo de seus coacutedigos Outro fator interessante seria aplicar mais Visitorsagrave ferramenta static-analysis e fazer este mesmo estudo aplicado agrave outras caracteriacutesticasda linguagem

47

Referecircncias

[1] Kagdi Huzefa Michael L Collard e Jonathan I Maletic A survey and taxonomyof approaches for mining software repositories in the context of software evolution2007 ix 3 8 9 10 11

[2] DBeaver Dbeaver - features httpdbeaverjkissorgdocsfeatures ix 29

[3] Eclipse Vertx commit Java8-ify code httpsgithubcomeclipsevertxcommit93f95e9c77419f442a42fe711b6eeaef88192fd3 ix 42

[4] Google Guava commit Release java 8 changes to guava httpsgithubcomgoogleguavacommit73e382fa877f80994817a136b0adcc4365ccd904 ix 43

[5] Google Agera commit Collapsed testapp with retrolambda httpsgithubcomgoogleageracommit5e518b7b05f9e7a34a314945f68deff7b2c3e334 ix 44

[6] ReactiveX Rxjava commit 2x full jdk 6 compatible backport + includ-ing bugfixes up to today httpsgithubcomReactiveXRxJavacommit000a174d87a901135f9665d3b11f3627fd2dc4ed ix 45

[7] Godfrey M W e D M German The past present and future of software evolutionEm 2008 Frontiers of Maintenance paacuteginas 129ndash138 Sept 2008 1 6

[8] Favre J M Languages evolve too changing the software time scale Em Principles ofSoftware Evolution Eighth International Workshop on paacuteginas 33ndash42 IEEE 20051 5 7

[9] Overbey Jeffrey L e Ralph E Johnson Regrowing a language refactoring tools allowprogramming languages to evolve Em ACM SIGPLAN Notices volume 44 paacuteginas493ndash502 ACM 2009 1 5 7 8 12

[10] Grechanik Mark Collin McMillan Luca DeFerrari Marco Comi Stefano CrespiDenys Poshyvanyk Chen Fu Qing Xie e Carlo Ghezzi An empirical investiga-tion into a large-scale java open source code repository Em Proceedings of the2010 ACM-IEEE International Symposium on Empirical Software Engineering andMeasurement ESEM rsquo10 paacuteginas 111ndash1110 New York NY USA 2010 ACMISBN 978-1-4503-0039-1 httpdoiacmorg10114518527861852801 1

[11] TIOBE Tiobe httpswwwtiobecomtiobe-index 1 14

48

[12] Gyori Alex Lyle Franklin Danny Dig e Jan Lahoda Crossing the gap from im-perative to functional programming through refactoring Em Proceedings of the 20139th Joint Meeting on Foundations of Software Engineering ESECFSE 2013 paacute-ginas 543ndash553 New York NY USA 2013 ACM ISBN 978-1-4503-2237-9 httpdoiacmorg10114524914112491461 2 11 24 39

[13] OpenJDK State of the lambda httpcropenjdkjavanet~briangoetzlambdalambda-state-4html 2

[14] Han Jiawei Micheline Kamber e Jian Pei Data Mining Concepts and TechniquesMorgan Kaufmann Publishers Inc San Francisco CA USA 3rd ediccedilatildeo 2011ISBN 0123814790 9780123814791 3

[15] Fowler Martin e Kent Beck Refactoring improving the design of existing codeAddison-Wesley Professional 1999 5 7

[16] Lehman M M J F Ramil P D Wernick D E Perry e W M Turski Met-rics and laws of software evolution - the nineties view Em Proceedings of the4th International Symposium on Software Metrics METRICS rsquo97 paacuteginas 20ndashWashington DC USA 1997 IEEE Computer Society ISBN 0-8186-8093-8 httpdlacmorgcitationcfmid=823454823901 6

[17] Hassan Ahmed E e Tao Xie Software intelligence The future of mining softwareengineering data Em Proceedings of the FSESDP Workshop on Future of SoftwareEngineering Research FoSER rsquo10 paacuteginas 161ndash166 New York NY USA 2010ACM ISBN 978-1-4503-0427-6 httpdoiacmorg101145188236218823978 9

[18] Hassan Ahmed E The road ahead for mining software repositories Em Frontiers ofSoftware Maintenance 2008 FoSM 2008 paacuteginas 48ndash57 IEEE 2008 8

[19] Berry Michael J e Gordon Linoff Data Mining Techniques For Marketing Salesand Customer Support John Wiley amp Sons Inc New York NY USA 1997ISBN 0471179809 10

[20] Parnin Chris Christian Bird e Emerson Murphy-Hill Java generics adoption hownew features are introduced championed or ignored Em Proceedings of the 8thWorking Conference on Mining Software Repositories paacuteginas 3ndash12 ACM 2011 12

[21] Oracle The java language specification httpsdocsoraclecomjavasespecsjlsse8jls8pdf 13

[22] Oracle The history of java technology httpwwworaclecomtechnetworkjavajavaseoverviewjavahistory-index-198355html 13

[23] Murphy Kieron So why did they decide to call itjava httpwwwjavaworldcomarticle2077265core-javaso-why-did-they-decide-to-call-it-java-html 13

[24] McGraw Tata Object-oriented Programming with Java Essentials and ApplicationsHill Education 13

49

[25] Oracle Differences between java ee and java se httpdocsoraclecomjavaee6firstcupdocgkhoyhtml 13

[26] Lindsey Clark S The History of Java Cambridge 14

[27] Oracle The java language environment httpwwworaclecomtechnetworkjavaintro-141325html 14

[28] Oracle Jdk 8 httpopenjdkjavanetprojectsjdk8 15 24

[29] Oracle Enhancements in java se 8 httpdocsoraclecomjavase8docstechnotesguideslanguageenhancementshtmljavase8 15 16 17

[30] Oracle Lambda expressions httpdocsoraclecomjavasetutorialjavajavaOOlambdaexpressionshtml 16 18 21

[31] Oracle Method references httpdocsoraclecomjavasetutorialjavajavaOOmethodreferenceshtml 16

[32] Oracle Default methods httpdocsoraclecomjavasetutorialjavaIandIdefaultmethodshtml 17

[33] Oracle Repeating annotations httpdocsoraclecomjavasetutorialjavaannotationsrepeatinghtml 17

[34] Oracle Type annotations httpdocsoraclecomjavasetutorialjavaannotationstype_annotationshtml 17

[35] Oracle Anonymous inner classes httpsdocsoraclecomjavasetutorialjavajavaOOanonymousclasseshtml 19

[36] Kothari CR Research Methodology Methods and Techniques New Age Interna-tional (P) Limited 2004 ISBN 9788122415223 httpsbooksgooglecombrbooksid=8c6gkbKi-F4C 22

[37] Nakakoji Kumiyo Yasuhiro Yamamoto Yoshiyuki Nishinaka Kouichi Kishida eYunwen Ye Evolution patterns of open-source software systems and communitiesEm IWPSE rsquo02 Proceedings of the International Workshop on Principles of SoftwareEvolution paacuteginas 76ndash85 New York NY USA 2002 ACM Press ISBN 1581135459httpdxdoiorg101145512035512055 23

[38] Rahman Foyzur Christian Bird e Premkumar Devanbu Clones What is that smellEmpirical Software Engineering 17(4-5)503ndash530 2012 24

[39] Chacon Scott Pro Git Apress Berkely CA USA 1st ediccedilatildeo 2009ISBN 1430218339 9781430218333 25

[40] Cavalcanti Thiago Gomes e Viniacutecius Correa de Almeida Caracterizaccedilatildeo do uso deconstruccedilotildees da linguagem java em projetos open-source Publicaccedilatildeo online 2016httpbdmunbbrhandle1048315733 27

50

[41] Parr Terence Language Implementation Patterns Create Your Own Domain-Specific and General Programming Languages Pragmatic Bookshelf 1st ediccedilatildeo 2009ISBN 193435645X 9781934356456 27

[42] Janssen Thorben 5 reasons to use jpa hibernate Publicaccedilatildeo online httpswwwsitepointcom5-reasons-to-use-jpa-hibernate 27

[43] Franklin Lyle Alex Gyori Jan Lahoda e Danny Dig Lambdaficator From imperativeto functional programming through automated refactoring Em Proceedings of the2013 International Conference on Software Engineering ICSE rsquo13 paacuteginas 1287ndash1290 Piscataway NJ USA 2013 IEEE Press ISBN 978-1-4673-3076-3 httpdlacmorgcitationcfmid=24867882486986 29

[44] Google Agera httpsgithubcomgoogleagerawiki 34

[45] Eclipse Eclipse vertx httpvertxio 35

[46] Cejas Fernando Android cleanarchitecture httpsgithubcomandroid10Android-CleanArchitecture 36

[47] ReactiveX Rxjava httpsgithubcomReactiveXRxJava 37

[48] Luontola Esko Retrolambda httpsgithubcomorfjackalretrolambda 43

51

Anexo I

Projetos utilizados

fastjson

platform_frameworks_base

netty

material-dialogs

kotlin

okhttp

tinker

AndroidUtilCode

RxJava

spring-boot

java-design-patterns

elasticsearch

ExoPlayer

kafka

vertx

realm-java

guava

zipkin

bazel

stetho

Signal-Android

glide

agera

fresco

plaid

presto

libgdx

spark

52

disruptor

lottie-android

flexbox-layout

PocketHub

zxing

spring-framework

deeplearning4j

dropwizard

interviews

BaseRecyclerViewAdapterHelper

uCrop

DanmakuFlameMaster

lottie-react-native

android-UniversalMusicPlayer

AndroidInterview-Q-A

greenDAO

retrofit

MaterialDrawer

BottomBar

druid

MPAndroidChart

Hystrix

guice

recyclerview-animators

dubbo

androidannotations

RxJava-Android-Samples

PhotoView

clojure

CircleImageView

AndroidSwipeLayout

jedis

MaterialViewPager

butterknife

junit4

RxBinding

leakcanary

SimianArmy

picasso

UltimateRecyclerView

53

AndroidViewAnimations

AppIntro

FizzBuzzEnterpriseEdition

ion

cheesesquare

physical-web

RxAndroid

Android-CleanArchitecture

Calligraphy

Android-Bootstrap

iosched

Android_Data

MaterialDesignLibrary

ListViewAnimations

EventBus

java8-tutorial

AndroidSlidingUpPanel

dagger

okhttputils

logger

HomeMirror

Material-Animations

android-Ultra-Pull-To-Refresh

android-async-http

Android-ObservableScrollView

Android-Universal-Image-Loader

ActionBarSherlock

SlidingMenu

storm

PagerSlidingTabStrip

Android-PullToRefresh

54

  • Dedicatoacuteria
  • Agradecimentos
  • Resumo
  • Abstract
  • Introduccedilatildeo
    • Contexto
    • Objetivos
      • Objetivos Gerais
      • Objetivos Especiacuteficos
        • Metodologia
        • Organizaccedilatildeo do Trabalho
          • Evoluccedilatildeo e Mineraccedilatildeo de Repositoacuterios de Software
            • Evoluccedilatildeo de Software
            • MSR Mineraccedilatildeo de dados e a Engenharia de Software
              • Classificaccedilatildeo
                • Trabalhos Relacionados
                  • Java SE 8 e JDK 8
                    • Histoacuterico
                    • Princiacutepios
                    • Evoluccedilatildeo
                    • Expressotildees Lambda
                      • Sintaxe
                      • Principais formas de uso
                          • Estudo e o Processo de Mineraccedilatildeo
                            • Questotildees de Pesquisa
                            • Fonte de Dados e Objetos de Estudo
                            • Processo de Mineraccedilatildeo
                              • static-analysis
                              • BDAnalisador
                                • Classificaccedilatildeo e Anaacutelise
                                  • Meacutedia de Lambda
                                  • Anaacutelise Temporal
                                  • Refatoraccedilatildeo de Coacutedigo
                                  • Casos de Uso
                                      • Resultados Obtidos e Anaacutelise
                                        • Visatildeo Geral
                                          • Projetos Selecionados
                                          • agera
                                          • vertx
                                          • Android-CleanArchitecture
                                          • RxJava
                                          • guava
                                            • Refatoraccedilatildeo de Coacutedigo
                                            • Estudos de Caso
                                              • Consideraccedilotildees Finais
                                              • Referecircncias
                                              • Anexo
                                              • Projetos utilizados

Universidade de BrasiacuteliaInstituto de Ciecircncias Exatas

Departamento de Ciecircncia da Computaccedilatildeo

Caracterizando a Adoccedilatildeo de Expressotildees Lambda emCoacutedigo Java Legado

Aline Laiacutes Gomes TavaresFilipe Cardoso Caldas

Monografia apresentada como requisito parcialpara conclusatildeo do Bacharelado em Ciecircncia da Computaccedilatildeo

Prof Dr Rodrigo Bonifaacutecio de Almeida (Orientador)CICUnB

Profa Dra Edna Dias Canedo Prof Dr Vinicius Ruela Pereira BorgesFGAUnB CICUnB

Prof Dr Rodrigo Bonifaacutecio de AlmeidaCoordenador do Bacharelado em Ciecircncia da Computaccedilatildeo

Brasiacutelia 8 de Agosto de 2017

Dedicatoacuteria

Dedicamos este trabalho agraves nossas famiacutelias que sempre noacutes apoiaram a todos os nossosamigos colegas e professores da universidade que nos ajudaram durante a nossa graduaccedilatildeoe colaboraram de alguma forma para nossa formatura Dedicamos tambeacutem ao nossoorientador professor doutor Rodrigo Bonifaacutecio que nos ajudou durante o desenvolvimentodeste trabalho

iii

Agradecimentos

Agradecemos aos nossos familiares que sempre nos apoiam incondicionalmente durantetoda a nossa vida e especialmente durante o nosso periacuteodo na Universidade diante detodos os desafios enfrentados acreditando sempre no nosso sucesso

Ao nosso orientador professor doutor Rodrigo de Almeida Bonifaacutecio por trabalharconosco no desafio de desenvolver este projeto

E por fim a todos os nossos amigos que ingressaram no curso de ciecircncia de computaccedilatildeona UnB conosco no segundo semestre de 2010

iv

Resumo

Este trabalho apresenta um estudo sobre como as expressotildees lambda introduzidas nalinguagem Java desde 2014 estatildeo sendo utilizadas em projetos Java open-source Atraveacutesde uma amostragem de 99 projetos populares existentes na plataforma Github observou-se como e quando esta caracteriacutestica foi introduzida nestes projetos identificando padrotildeesadotados e meacutetodos de refatoraccedilatildeo de coacutedigo caso estes existam Foi realizado um estudogeral para identificar padrotildees gerais aleacutem de estudos de caso com o objetivo de obter umaanaacutelise mais aprofundada sobre o assunto Foram escolhidos cinco projetos previamenteclassificados de acordo com a abordagem distinta de introduccedilatildeo de expressotildees lambdapara realizar os estudos de caso

Palavras-chave Mineraccedilatildeo em Repositoacuterios de Software git Java Expressotildees LambdaAnonymous Inner Class

v

Abstract

This work presents a study about how lambda expressions are being used in open-soruceJava projects Using a sample of 99 popular projectsrsquo repositories in Github it wasanalyzed how and when this feature was introduced within those projects identifyingpatterns used to implement such feature and possible code refactoring approaches in caseany code was refactored It was conducted a general study to identify similarities amongprojects and the way they use lambda expressions and also case studies that intendedto realize a richer analysis about the subject For the case studies it was chosen fiveprojects previously classified according to the distinct approach used when introducinglambda expressions

Keywords Mining Software Repositories git Java Lambda Expressions AnonymousInner Class

vi

Sumaacuterio

1 Introduccedilatildeo 111 Contexto 112 Objetivos 2

121 Objetivos Gerais 2122 Objetivos Especiacuteficos 2

13 Metodologia 314 Organizaccedilatildeo do Trabalho 3

2 Evoluccedilatildeo e Mineraccedilatildeo de Repositoacuterios de Software 521 Evoluccedilatildeo de Software 622 MSR Mineraccedilatildeo de dados e a Engenharia de Software 8

221 Classificaccedilatildeo 823 Trabalhos Relacionados 11

3 Java SE 8 e JDK 8 1331 Histoacuterico 1332 Princiacutepios 1433 Evoluccedilatildeo 1534 Expressotildees Lambda 18

341 Sintaxe 18342 Principais formas de uso 19

4 Estudo e o Processo de Mineraccedilatildeo 2241 Questotildees de Pesquisa 2342 Fonte de Dados e Objetos de Estudo 2443 Processo de Mineraccedilatildeo 25

431 static-analysis 26432 BDAnalisador 27

44 Classificaccedilatildeo e Anaacutelise 29441 Meacutedia de Lambda 30

vii

442 Anaacutelise Temporal 30443 Refatoraccedilatildeo de Coacutedigo 32444 Casos de Uso 32

5 Resultados Obtidos e Anaacutelise 3351 Visatildeo Geral 33

511 Projetos Selecionados 34512 agera 34513 vertx 35514 Android-CleanArchitecture 36515 RxJava 37516 guava 38

52 Refatoraccedilatildeo de Coacutedigo 3953 Estudos de Caso 41

6 Consideraccedilotildees Finais 46

Referecircncias 48

Anexo 51

I Projetos utilizados 52

viii

Lista de Figuras

21 Taxonomia em camadas adaptada do trabalho de Kagdi et al [1] 9

41 Processo utilizado para realizaccedilatildeo do estudo 2242 Metodologia implementada para coleta e tratamento de dados 2643 Diagrama de classes UML do BDAnalisador 2844 Modelo relacional do banco de dados populado pelo BDAnalisador Imagem

gerada com software DBeaver [2] 2945 Classificaccedilatildeo dos projetos 31

51 Graacuteficos dos projetos separados por ano de introduccedilatildeo de expressotildees lambdae meacutedia de lambda por snapshot 34

52 Graacuteficos de anaacutelise temporal do projeto agera 3553 Graacuteficos de anaacutelise temporal do projeto Vertx 3654 Graacuteficos de anaacutelise temporal do projeto Android-CleanArchitecture 3755 Graacuteficos de anaacutelise temporal do projeto RxJava 3856 Graacuteficos de anaacutelise temporal do projeto Guava 3957 Comparaccedilatildeo entre todos os projetos com expressatildeo lambda sobre refatora-

ccedilatildeo de coacutedigo no mecircs de introduccedilatildeo da caracteriacutestica 4058 Commit de refatoraccedilatildeo de coacutedigo do projeto Vertx [3] 4259 Exemplo de um arquivo do commit de adiccedilatildeo de coacutedigo novo em Java 8 do

projeto Guava [4] 43510 Commit de adiccedilatildeo da biblioteca Retrolambda no projeto Agera [5] 44511 Commit de remoccedilatildeo de Lambdas e volta para o uso de AICs no projeto

RXJava [6] 45

ix

Lista de Tabelas

31 As versotildees anteriores de java e principais caracteriacutesticas 14

41 Informaccedilotildees mensais sobre o projeto agera 30

x

Capiacutetulo 1

Introduccedilatildeo

11 Contexto

A evoluccedilatildeo e manutenccedilatildeo de software eacute uma caracteriacutestica intriacutenseca do desenvolvimentode sistemas considerando que a partir do momento em que um software comeccedila a serdesenvolvido satildeo realizadas constantes manutenccedilotildees [7] Apesar de o conceito de evolu-ccedilatildeo de software representar uma grande aacuterea de pesquisa na engenharia de software nemsempre pesquisadores reconhecem a importacircncia da evoluccedilatildeo das linguagens de progra-maccedilatildeo como um grande fator influenciador na evoluccedilatildeo de software [8] uma vez que umsoftware que natildeo evolui junto com a sua linguagem tem a sua capacidade de evoluccedilatildeolimitada [9]

Surge entatildeo a necessidade de alinhar estudos empiacutericos com o intuito de investigar esteprocesso de evoluccedilatildeo do software juntamente com a evoluccedilatildeo de sua linguagem atraveacutesde investigaccedilatildeo e anaacutelise de seu coacutedigo fonte que pode ser feita por meio de anaacutelise de re-positoacuterios de software em grande escala o que deu origem a abordagem de Mineraccedilatildeo emRepositoacuterio de Software (MSR) O MSR tem como base o estudo sistemaacutetico e empiacutericode repositoacuterios de software com o objetivo de analisaacute-los utilizando informaccedilotildees estatis-ticamente uacuteteis coletadas para observar diversos padrotildees como a evoluccedilatildeo do softwarepadrotildees de projetos dentre outros [10]

A complexidade e dificuldade de realizar tal estudo empiacuterico eacute alta pois atualmenteexistem diversos tipos de plataformas para coleta de dados linguagens e focos variadosAssim para escolher o foco do objeto de estudo eacute necessaacuterio levar em consideraccedilatildeo estasdificuldades e especificaccedilotildees e dessa forma este trabalho tem como foco a anaacutelise desistemas de software na linguagem Java

Ateacute a data deste trabalho de acordo com os dados do TIOBE [11] Java eacute a linguagemde programaccedilatildeo com mais linhas de codigo catalogadas no mundo Isso faz com queseja extremamente interessante o estudo empiacuterico da evoluccedilatildeo da linguagem e software

1

desenvolvidos nela desde sua primeira versatildeo antes de se tornar uma linguagem populare ainda com poucos pacotes ateacute a sua atual versatildeo estaacutevel com uma grande quantidadede novas caracteriacutesticas

A versatildeo mais recente do Java a JDK 8 possui diversas adiccedilotildees interessantes para aorganizaccedilatildeo do coacutedigo e facilidade do programador Dessas novas implementaccedilotildees con-ceitos de linguagem funcional como expressotildees lambda e iteradores externos que recebemuma expressatildeo lambda como argumento como o map() filter() e forEach() tornarama escrita de coacutedigo paralelo mais simples e permitiram ganhos de performance [12]

Diversas linguagens de programaccedilatildeo tambeacutem populares como Javascript e Ruby jaacutepossuiacuteam expressotildees lambda desde suas versotildees iniciais sendo o Java 8 em 2014 maisuma linguagem a introduzir esse novo conceito Podemos descrever as expressotildees comopequenas funccedilotildees normalmente feitas em apenas uma linha sem um nome identificadorElas podem ser retornadas de outras funccedilotildees ou passadas como paracircmetro Um exemplode expressatildeo lambda pode ser visualizado pela funccedilatildeo de soma de dois inteiros escrita daforma (int x int y)rarr x + y [13]

Antes da inclusatildeo de expressotildees lambda em Java o mesmo comportamento era possiacutevelutilizando classes anocircnimas ou AICs (Anonymous inner classes) Contudo eacute necessaacute-rio a criaccedilatildeo de uma interface com apenas um meacutetodo e instanciaacute-la como uma AIC Autilizaccedilatildeo de AICs gera inuacutemeras linhas de coacutedigo adicionais que poderiam ser encapsu-ladas em apenas uma linha com a utilizaccedilatildeo de expressotildees lambda Como eacute interessantepara o programador ter um coacutedigo sempre mais legiacutevel e sucinto torna-se interessante arefatoraccedilatildeo de coacutedigo que utiliza uma tecnologia mais antiga para a nova

Assim este trabalho visa conduzir um estudo de mineraccedilatildeo em repositoacuterios de softwareopen-source desenvolvidos na linguagem Java para entender como desenvolvedores estatildeose adaptando agraves novas mudanccedilas introduzidas no Java 8

12 Objetivos

121 Objetivos Gerais

Este trabalho tem como objetivo geral caracterizar o uso de expressotildees lambda entre osprojetos Java mais populares desenvolvidos pela comunidade do GitHub

122 Objetivos Especiacuteficos

Sabendo do benefiacutecio da refatoraccedilatildeo de coacutedigo para o uso de expressotildees lambda e dapouca quantidade de estudos acadecircmicos sobre o assunto surge entatildeo uma oportunidadede pesquisa para melhor entender a forma como essa caracteriacutestica estaacute sendo adotada por

2

projetos com foco em refatoraccedilatildeo de coacutedigo o que originou a necessidade deste estudoAssim para alcanccedilar o objetivo deste trabalho foram traccedilados em forma de questotildees depesquisa os objetivos especiacuteficos a serem alcanccedilados por este trabalho

bull Quando os projetos Java de coacutedigo aberto comeccedilaram a introduzir o uso de expres-sotildees lambda em seus coacutedigos e quatildeo significativo eacute esse uso

bull Como as equipes de desenvolvimento estatildeo utilizando expressotildees lambda atraveacutesde refatoraccedilatildeo de coacutedigo ou introduzindo apenas em coacutedigo novo

bull Quais satildeo os padrotildees tipicamente adotados para o uso de expressotildees lambda

13 Metodologia

Este trabalho foi desenvolvido utilizando uma abordagem de MSR que dentro da clas-sificaccedilatildeo de Kagdi et al [1] pode ser divido em quatro grandes etapas Primeiramentedefiniu-se a fonte de dados a ser utilizada e dentre as possibilidades encontradas na lite-ratura [14] optou-se por utilizar repositoacuterios de controle de versatildeo mais especificamenteo Github tendo como criteacuterio de seleccedilatildeo os 99 repositoacuterios Java mais populares na plata-forma Em seguida definiu-se o propoacutesito do estudo no caso os objetivos em forma deperguntas de pesquisa a serem respondidas

A terceira grande etapa foi a definiccedilatildeo do meacutetodo em si a forma como seria realizadoo estudo e este por sua vez constitui-se de download de todos os 99 repositoacuterios maispopulares realizaccedilatildeo de uma anaacutelise estaacutetica para coletar informaccedilotildees necessaacuterias de cadaprojeto por versatildeo e armazenamento de informaccedilotildees pertinentes em uma base de dados

A etapa final foi a realizaccedilatildeo da avaliaccedilatildeo dos dados obtidos atraveacutes de meacutetricas eanaacutelises quantitativas para melhor responder as questotildees de pesquisa aleacutem de estudos decaso feitos com cinco projetos escolhos de acordo com a maneira distinta em que estesfazem o uso de expressotildees lambda

14 Organizaccedilatildeo do Trabalho

Este trabalho se divide em seis capiacutetulos

bull Capiacutetulo 2 Apresenta um referencial teoacuterico sobre evoluccedilatildeo de software demons-trando as estrateacutegias utilizadas e a importacircncia da evoluccedilatildeo em um projeto de coacutedigoaberto aleacutem de enunciar as leis de evoluccedilatildeo de software de Lehman O capiacutetulo tam-beacutem apresenta o processo de mineraccedilatildeo de dados explicando cada uma das camadasda classificaccedilatildeo e demonstra trabalhos relacionados a esse toacutepico que serviram debase para este trabalho

3

bull Capiacutetulo 3 Traz um contexto histoacuterico e teacutecnico da linguagem Java necessaacuteriospara entender a importacircncia que as novas caracteriacutesticas adicionadas na versatildeo8 fornecem para os desenvolvedores de projetos determinados a manter o projetosempre evoluiacutedo Tambeacutem eacute apresentada uma seccedilatildeo para demonstrar os detalhese formas de utilizaccedilatildeo das expressotildees Lambda que satildeo o foco dos objetivos destetrabalho

bull Capiacutetulo 4 Descreve a metodologia e processo utilizados para o desenvolvimentoe obtenccedilatildeo dos resultados deste trabalho O capiacutetulo desenvolve o contexto dasquestotildees de pesquisa e explica os motivos e processos de desenvolvimento das fer-ramentas utilizadas para minerar os dados aleacutem de determinar a classificaccedilatildeo dosresultados obtidos em grupos para facilitar a organizaccedilatildeo dos dados de forma queas perguntas sejam respondidas claramente

bull Capiacutetulo 5 Apresenta os resultados obtidos e de que forma eles ajudaram a respon-der as questotildees de pesquisa Eacute descrita uma anaacutelise de um projeto de cada categoriaespecificada no capiacutetulo anterior a fim de contextualizar cada tipo de resultado paraque o leitor entenda a forma que os projetos Java estatildeo lidando com as expressotildeesLambda

bull Capiacutetulo 6 Descreve as dificuldades e problemas obtidos durante o trabalho e deque forma eles influenciaram nos resultados Tambeacutem eacute apresentada uma seccedilatildeocontendo as ideias surgidas durante o desenvolvimento deste trabalho que ficarampara ser feitas no futuro devido agrave gama de informaccedilotildees que a mineraccedilatildeo dos dadostrouxe

4

Capiacutetulo 2

Evoluccedilatildeo e Mineraccedilatildeo deRepositoacuterios de Software

As linguagens de programaccedilatildeo estatildeo sempre evoluindo aumentando sua complexidade eexpressividade Da mesma forma aleacutem de se preocupar com dificuldades de estabelecercompatibilidade do software em relaccedilatildeo a tecnologias antigas desenvolvedores tambeacutemprecisam acompanhar essa evoluccedilatildeo das linguagens para que suas ferramentes natildeo setornem obsoletas [9] Isso agrega um grande desafio no desenvolvimento e evoluccedilatildeo desoftware

O conceito de evoluccedilatildeo de software amadureceu e se tornou um grande foco de pes-quisa Poreacutem nem sempre estudos de evoluccedilatildeo de software reconhecem a importacircncia daevoluccedilatildeo da linguagem de programaccedilatildeo no contexto do desenvolvimento de software [8]Quando um coacutedigo natildeo evolui junto com a linguagem com o objetivo de manter umacompatibilidade com versotildees anteriores sua capacidade de evoluccedilatildeo se torna limitada [9]

A refatoraccedilatildeo de coacutedigo que consiste em realizar mudanccedilas no coacutedigo fonte sem modi-ficar o comportamento observado do software [15] permite que a evoluccedilatildeo de linguagens eferramentas aconteccedilam mais naturalmente No entanto novos desafios surgem como porexemplo saber quando e como realizar a refatoraccedilatildeo de coacutedigo de forma eficiente e coesaDentre as teacutecnicas de pesquisa em engenharia de software para entender esse problematorna-se interessante explorar as teacutecnicas de mineraccedilatildeo de dados aplicados a repositoacuteriosde software com o objetivo de entender o relacionamento entre evoluccedilatildeo e refatoraccedilatildeo

Assim este capiacutetulo busca esclarecer conceitos e estrateacutegias de evoluccedilatildeo de softwaremineraccedilatildeo de repositoacuterios de software e o estado da arte sobre o assunto

5

21 Evoluccedilatildeo de Software

Durante o processo de produccedilatildeo e manutenccedilatildeo de software haacute a necessidade de diversastomadas de decisotildees sobre seu desenvolvimento como por exemplo decidir como melho-rar a qualidade do software Tais decisotildees precisam ser tomadas levando em consideraccedilatildeoo ambiente em que se estaacute inserido com novas tecnologias surgindo todos os dias fe-edback de usuaacuterios exigentes e concorrentes produzindo um software similar com ideiasinovadoras

Tudo isso acontece em um ritmo de constante mudanccedila e assim como diria Lehmaneacute imprescindiacutevel que software de sistemas sejam capazes de evoluir ou os mesmos correm orisco de sofrer uma morte prematura [16] fazendo assim da evoluccedilatildeo de software um con-ceito importante dentro do seu processo de desenvolvimento Essa evoluccedilatildeo deve ocorrerconsiderando o ambiente em que o software estaacute inserido o qual possui aspectos teacutecnicos esociais sua infraestrutura que pertence ao seu ambiente teacutecnico o qual sempre necessitamanutenccedilatildeo e ao mesmo tempo usuaacuterios que utilizam o software e estatildeo constantementeformando opiniotildees oferecendo feedback e na expectativa por novidades [7] Assim a me-dida que novas caracteriacutesticas satildeo desenvolvidas novas tecnologias de infraestrutura satildeonecessaacuterias novos requisitos satildeo adicionados e o sistema de software deve se adaptar aessas mudanccedilas

Com relaccedilatildeo aos aspectos sociais que envolvem a evoluccedilatildeo do software eacute importanteressaltar os conceitos baacutesicos de como essa evoluccedilatildeo acontece Durante um estudo empiacutericopioneiro na aacuterea de evoluccedilatildeo de software para sistemas de grande escala Lehman e seuscolaboradores formularam um conjunto de observaccedilotildees que hoje satildeo conhecidas como asleis da evoluccedilatildeo de software ou simplesmente Leis de Lehman [16] No geral as leis deevoluccedilatildeo de software podem ser descritas da seguinte forma [16]

1 Mudanccedila contiacutenua um sistema se tornaraacute progressivamente menos satisfatoacuteriopara seus usuaacuterios com o tempo a menos que se adapte continuamente agraves necessi-dades que surgiratildeo

2 Complexidade Crescente um sistema se tornaraacute cada vez mais complexo amenos que se trabalhe para explicitamente reduzir sua complexidade

3 Auto-regulaccedilatildeo o processo de evoluccedilatildeo de software eacute auto-regulatoacuterio no que dizrespeito agraves distribuiccedilotildees dos artefatos e produtos produzidos

4 Conservaccedilatildeo da estabilidade organizacional a taxa meacutedia de atividade globalefetiva em um sistema em evoluccedilatildeo natildeo muda com o tempo ou seja a meacutedia detrabalho e esforccedilo colocado em cada entrega do sistema permanece a mesma

6

5 Conservaccedilatildeo de familiaridade a quantidade de conteuacutedo novo em cada entregado sistema tende a se manter constante com o tempo

6 Crescimento contiacutenuo A quantidade de funcionalidades em um sistema cresceraacutecom o tempo com o objetivo de satisfazer seus usuaacuterios

7 Decliacutenio de qualidade Um sistema seraacute percebido com qualidade inferior como passar do tempo a menos que seu design tenha uma manutenccedilatildeo minuciosa e seadapte a novas restriccedilotildees

8 Sistema de Feedback Evoluir um sistema com sucesso requer reconhecer que oprocesso de desenvolvimento acontece em um sistema de feedback de vaacuterios ciclosagentes e niacuteveis

Os aspectos teacutecnicos que envolvem a evoluccedilatildeo de software levam em consideraccedilatildeo astecnologias utilizadas para o seu desenvolvimento desde a linguagem de programaccedilatildeo agravesmaacutequinas onde o software seraacute hospedado que sofrem atualizaccedilotildees recebem novas versotildeescom novas caracteriacutesticas implementadas

Um estudo realizado por Lavre mostra como a evoluccedilatildeo das linguagens de programa-ccedilatildeo no contexto da evoluccedilatildeo de software muitas vezes satildeo subestimadas uma vez quemuitos podem considerar em seus estudos a linguagem de computaccedilatildeo como um artefatoimutaacutevel [8] Por exemplo coloca-se muita ecircnfase e cuidado para realizar o versionamentode coacutedigo fonte de um software mas este pode ser tornar inutilizaacutevel futuramente se nin-gueacutem souber qual versatildeo de compilador determinada versatildeo de coacutedigo foi desenvolvida

Para natildeo se deixar estagnar linguagens de programaccedilatildeo precisam se adaptar e evoluirQuando uma linguagem de programaccedilatildeo atualiza softwares que eram antes consideradosatualizados podem se tornar rapidamente obsoletos E ao mesmo tempo que novascaracteriacutesticas satildeo adicionadas a linguagem precisa fornecer compatibilidade com versotildeesanteriores aumentando sua complexidade Desenvolvedores entatildeo encontram-se tambeacutemem um empasse buscando um equiliacutebrio entre manter a compatibilidade da ferramentacom versotildees anteriores da linguagem e atualizaacute-la para manter o software atualizado [9]

A estrateacutegia de refatoraccedilatildeo de coacutedigo pode ser uma opccedilatildeo que permite a linguageme o software co-evoluiacuterem com um menor grau de dificuldade [9] Refatoraccedilatildeo (do inglecircsrefactoring) eacute o processo de modificaccedilatildeo de um software com o objetivo de melhorar a es-trutura interna do mesmo sem alterar sua percepccedilatildeo externa Eacute uma maneira disciplinadade melhorar o design do coacutedigo apoacutes ele jaacute ter sido implementado Por exemplo dividiruma funcionalidade grande feita em apenas um bloco de coacutedigo em vaacuterios moacutedulos [15]

A refatoraccedilatildeo de coacutedigo pode ser um meio utilizado para evoluir o software adaptandoo coacutedigo com caracteriacutesticas novas introduzidas pela linguagem modificando o design dosistema sem comprometer sua integridade No entanto novos desafios surgem visto que

7

refatorar o coacutedigo fonte de um sistema de grande porte natildeo eacute uma tarefa faacutecil havendo anecessidade de ferramentas que possam automatizar o processo ou realizar um estudo paraentender como as novas caracteriacutesticas da linguagem podem ser utilizadas para substituirou melhorar funcionalidades obsoletas [9]

22 MSR Mineraccedilatildeo de dados e a Engenharia deSoftware

Com o objetivo de compreender prever e planejar os vaacuterios aspectos do desenvolvimentode um projeto em especial tudo que possa impactar na evoluccedilatildeo de software a teacutecnicade mineraccedilatildeo de dados tem sido bastante utilizada em engenharia de software [17]

O termo Mineraccedilatildeo de Repositoacuterios de Software (MSR) tem sido utilizado para descre-ver vaacuterias maneiras de se examinar repositoacuterios de software Um repositoacuterio de softwarepode ser considerado um artefato que eacute produzido e arquivado durante a evoluccedilatildeo desoftware [1] Estes responsoacuterios armazenam informaccedilotildees que podem fornecer todos osdetalhes de desenvolvimento do software provendo meios necessaacuterios para uma anaacuteliseaprofundada de evoluccedilatildeo de software

Repositoacuterios de software satildeo comumente utilizados para armazenar e acompanhar ohistoacuterico de desenvolvimento do software mas raramente usados para tomada de deci-sotildees em relaccedilatildeo ao projeto Assim pesquisadores de MSR buscam modificar a impressatildeode que tais repositoacuterios satildeo estaacuteticos que servem apenas para manutenccedilatildeo de registrostransformando-os em repositoacuterios ativos que podem auxiliar na tomada de decisatildeo em pro-jetos de software modernos atraveacutes da identificaccedilatildeo de padrotildees para realizar a propagaccedilatildeode mudanccedilas [18]

221 Classificaccedilatildeo

De acordo com Kagdi et al dentre as abordagens de MSR utilizadas atualmente eacute possiacuteveldescrevecirc-las para entatildeo comparaacute-las e possivelmente classificaacute-las levando em considera-ccedilatildeo uma taxonomia de quatro dimensotildees os repositoacuterios de software utilizados (fontes dedados) o propoacutesito do MSR a metodologia e a avaliaccedilatildeo da abordagem [1] como mostraa Figura 21 onde as taxonomias destacadas em amarelo satildeo as que prevaleceram poreacutemnatildeo exclusivamente na metodologia adotada por este trabalho

8

Figura 21 Taxonomia em camadas adaptada do trabalho de Kagdi et al [1]

Fontes de Dados

As fontes de informaccedilatildeo variam de acordo com a abordagem utilizada e dentre as informa-ccedilotildees mineradas em repositoacuterios de software inclui-se as seguintes categorias os artefatosde software e suas versotildees as diferenccedilas entre os artefatos de software e suas versotildees e osmetadados sobre as mudanccedilas no software

As fontes de dados podem ser melhor classificadas de acordo com Hassan et al [17]

bull Repositoacuterios de controle de Versatildeo estes repositoacuterios guardam o histoacuterico de desen-volvimento de um projeto armazenando todas as mudanccedilas no coacutedigo fonte assimcomo os metadados associados com cada mudanccedila Exemplos git SVN

bull Bug repositories Estes repositoacuterios rastreiam o histoacuterico de resoluccedilatildeo de bugs quesatildeo reportados por usuaacuterios e desenvolvedores Exemplos Bugzilla e Jira

9

bull Histoacuterico de Comunicaccedilatildeo (Archived communications) estes repositoacuterios rastreiamdiscussotildees sobre os vaacuterios aspectos de um projeto de software por sua vida uacutetil Porexemplo listas de e-mails

bull Deployment logs logs com informaccedilotildees do software gerados por ferramentas dedesenvolvimento

bull Repositoacuterios de software Repositoacuterios onde o coacutedigo fonte de vaacuterios projetos satildeoarmazenados como por exemplo Sourceforgenet

No contexto deste trabalho estes repositoacuterios consistem em fontes de coacutedigo armaze-nadas em sistemas de controle de versatildeo especificamente coacutedigos na plataforma Github

O propoacutesito

O propoacutesito da mineraccedilatildeo de repositoacuterios de software se resume nas perguntas de pes-quisa que podem ser respondidas utilizando mineraccedilatildeo Assim existem duas classes deperguntas de pesquisa para MSR [1]

A primeira eacute a pergunta de anaacutelise market-basket1 ldquoSe A acontece o que mais podeacontecerrdquo A resposta para este tipo de pergunta eacute um conjunto de regras descrevendotendecircncias de relacionamentos como por exemplo se A acontecer entatildeo B e C acontecemdurante um periacuteodo X

A segunda classe diz respeito agraves perguntas de prevalecircncia (Prevalence Questions -PQ) como por exemplo perguntas do tipo ldquoA funcionalidade Y foi modificadardquo quepossuem uma resposta booleana ou ldquoQuantas vezes esta funcionalidade Y foi modificadardquocontendo uma resposta quantitativa

As perguntas de pesquisa deste trabalho se encaixam majoritariamente na segundaclasse onde o objetivo traccedilado eacute respondido de forma quantitativa com algumas tentativasde classificaccedilatildeo de tipos de repositoacuterios como seraacute descrito nos capiacutetulos seguintes

A metodologia

A metodologia corresponde a maneira como as questotildees de MSR iratildeo ser respondidas evaacuterias abordagens estatildeo disponiacuteveis Poreacutem Kagdi indica duas estrateacutegias baacutesicas quepodem ser utilizadas

Primeiramente pode-se utilizar a mediccedilatildeo indireta e anaacutelise da evoluccedilatildeo do softwareEsta abordagem pode ser realizada da seguinte forma extrair e computar informaccedilotildeesde cada versatildeo de um software separadamente e em seguida individualmente comparar

1Anaacutelise Market-basket eacute uma teacutecnica de modelagem baseada na teoria de que se vocecirc comprar certostipos de produtos vocecirc haacute uma probabilidade maior (ou menor) de comprar outros tipos de produtos [19]

10

propriedades encontradas como por exemplo comparar duas versotildees distintas de umsoftware atraveacutes de um repositoacuterio github realizando uma investigaccedilatildeo de alto niacutevel noque diz respeito a evoluccedilatildeo do software [1]

A segunda perspectiva de metodologia que pode ser utilizada corresponde agrave mediccedilatildeodireta e anaacutelise da evoluccedilatildeo do software Ela diz respeito agraves investigaccedilotildees que estudamos mecanismos que leva um software a ser modificado de uma versatildeo para outra focandonas diferenccedilas especiacuteficas entre estas versotildees como por exemplo examinando mudanccedilasespeciacuteficas das classes arquivos funccedilotildees de cada parte do coacutedigo [1]

Assim eacute possiacutevel descrever explicitamente que este trabalho utiliza em sua maioriauma metodologia com mediccedilotildees diretas atraveacutes da anaacutelise estaacutetica de informaccedilotildees docoacutedigo fonte de diferente versotildees para analisar os diferentes padrotildees de desenvolvimentoem que expressotildees lambda (definidas no capiacutetulo seguinte) satildeo utilizadas

A Avaliaccedilatildeo

Por fim existem diversas formas para se avaliar o estudo realizado sempre levando emconsideraccedilatildeo a validade dos resultados obtidos Pode-se utilizar de meacutetricas para avaliar osdados considerando o quanto das informaccedilotildees obtidas satildeo relevantes Outra forma de seavaliar seria atraveacutes da utilizaccedilatildeo de modelos probabiliacutesticos seguindo uma abordagemde teoria da informaccedilatildeo Assim foram utilizadas determinadas meacutetricas quantitativaspara avaliar os resultados obtidos neste trabalho

23 Trabalhos Relacionados

Como ressaltado na introduccedilatildeo o foco deste trabalho encontra-se em utilizar teacutecnicas deMSR para caracterizar a adoccedilatildeo de expressotildees lambda em repositoacuterios Java Ao reali-zar um estudo sobre o estado da arte encontrou-se diversos trabalhos que utilizam deMSR para obter informaccedilotildees relevantes sobre repositoacuterios de software em diversos focose em especial trabalhos que investiguem repositoacuterios na linguagem Java Jaacute existemtambeacutem alguns trabalhos que apresentam ferramentas de refatoraccedilatildeo de coacutedigo para im-plementaccedilatildeo de expressotildees lambda com foco na evoluccedilatildeo do software Dentre os trabalhosencontrados mencionados destacam-se

bull Em um trabalho sobre utilizaccedilatildeo de refatoraccedilatildeo de coacutedigo para realizar a transiccedilatildeode coacutedigo Java para as novas caracteriacutesticas implementadas no Java 8 Gyori et alapresenta uma ferramenta que automatiza com sucesso o trabalho de conversatildeo decoacutedigo como Annonymous Inner Class para expressotildees lambda [12] O capiacutetulo aseguir descreve em detalhes estes conceitos

11

bull Regrowing a Language de Overbey apresenta um estudo sobre a importacircncia da co-evoluccedilatildeo entre a linguagem de programaccedilatildeo e os projetos de software focando naslinguagens Fortran e Java e provando como ferramentas de refatoraccedilatildeo de coacutedigoauxiliam para que o software consiga evoluir juntamente com sua linguagem deprogramaccedilatildeo [9]

bull O trabalho sobre a adoccedilatildeo de generics em coacutedigo Java feito por Parnin utiliza demineraccedilatildeo de dados para realizar uma investigaccedilatildeo empiacuterica avaliando projetos decoacutedigo aberto com o objetivo de observar como desenvolvedores destes projetos estatildeoutilizando generics em Java [20]

Os estudos mencionados focam em assuntos particulares pertinentes a este trabalhoem que de um lado tem-se trabalhos que mostram a necessidade de refatoraccedilatildeo de coacutedigopara evoluccedilatildeo de software e do outro tem-se trabalhos que mostram que eacute possiacutevel utilizarde MSR para entender melhor como a evoluccedilatildeo da linguagem de programaccedilatildeo Java temafetado projetos reais de coacutedigo aberto e como estes projetos estatildeo se adaptando a estasevoluccedilotildees

12

Capiacutetulo 3

Java SE 8 e JDK 8

Este trabalho tem como objetivo caracterizar a adoccedilatildeo de expressotildees Lambda em siste-mas Java que podem ser considerados legados pois foram concebidos em um momentoanterior a introduccedilatildeo dessa nova caracteriacutestica na linguagem Java Com o intuito de faci-litar o entendimento do leitor sobre tais construccedilotildees esse capiacutetulo apresenta informaccedilotildeeshistoacutericas referentes agrave linguagem Java desde sua criaccedilatildeo ateacute a sua ascensatildeo como umadas linguagens de programaccedilatildeo mais populares Aleacutem disso seratildeo apresentadas as novascaracteriacutesticas presentes na versatildeo Java SE 8 com destaque nas expressotildees Lambda e deque forma vieram para auxiliar no desenvolvimento de sistemas

31 Histoacuterico

Java eacute uma linguagem de programaccedilatildeo orientada a objetos para propoacutesitos gerais [21] Alinguagem nasceu com o nome de Oak no ano de 1991 com o foco em televisotildees digitais acabo mas devido agrave complexidade e poder da linguagem logo expandiu-se para os outrosdomiacutenios principalmente a Internet [22] Posteriormente a linguagem recebeu o nome deGreentalk devido agrave marca Oak jaacute ser registrada por outra empresa e o principal projeto daequipe se chamar Green Por fim o nome Java foi o mais votado pela equipe da Sun emuma reuniatildeo para decidir o mais raacutepido possiacutevel um nome definitivo para a linguagem [23]

Em 1995 em sua primeira versatildeo puacuteblica 10 a linguagem Java jaacute comeccedilava a terum crescimento em sua popularidade como Web Applet nos navegadores mais popularesfornecendo seguranccedila e rapidez nas plataformas mais utilizadas [24] A cada nova versatildeopublicada novas funcionalidades e plataformas eram adicionadas e tornavam a linguagemmais difundida no meio computacional fazendo com que em 2006 a linguagem fosse divi-dida em Java EE (foco em rede e serviccedilos web) Java ME (foco em sistemas embarcados)e Java SE (foco em desktops e servidores) [25]

13

Apoacutes anos de evoluccedilatildeo e aprimoramento atraveacutes de diversas versotildees como visto naTabela 31 hoje o Java se tornou uma das linguagens de programaccedilatildeo mais utilizadas nomundo estando em aproximadamente 15 das linhas de coacutedigo disponiacuteveis pela inter-net [11] A quantidade de plataformas suportadas pela linguagem e com o advento dosistema operacional Android sendo rodado na maior parte dos smartphones do mundoaleacutem da simplicidade em codificar no paradigma orientado a objetos foram os fatoresrelevantes para que a linguagem se popularizasse no mundo digital [26]

Tabela 31 As versotildees anteriores de java e principais caracteriacutesticasVersatildeo Principais caracteriacutesticasJava 10 JVM e JDKJava 2 Event Listeners

Kestrel (Java 3) HotSpot JVMMerlin (Java 4) Diversas novas APIs como Assertion e expressotildees regularesTiger (Java 5) Generics

Mustang (Java 6) Web ServicesDolphin (Java 7) Suporte a linguagens dinamicas

32 Princiacutepios

Com o foco em alcanccedilar a Web e participar mais ativamente do mercado virtual e e-Commerce foram projetados princiacutepios que permitissem com que a linguagem pudessealcanccedilar seus objetivos principais ao mesmo tempo que mantinha a facilidade e fami-liarizaccedilatildeo da linguagem a seus desenvolvedores [27] Dessa forma a equipe da Oracledeterminou cinco princiacutepios que caracterizariam o foco da linguagem Java

bull simples orientada a objeto e familiar projetada para ser orientada a objeto epermitir que seus desenvolvedores comecem a codificar rapidamente sem a necessi-dade de uma curva de aprendizagem acentuada

bull segura e robusta projetada para prover software confiaacutevel por meio de checagensa tempo de compilaccedilatildeo e execuccedilatildeo Haacute uma grande preocupaccedilatildeo com seguranccediladevido agrave larga utilizaccedilatildeo da linguagem em sistemas distribuiacutedos

bull de arquitetura neutra e portaacutevel projetada para ser independente de qualquerarquitetura bastando rodar a JVM dessa forma garantindo a portabilidade paravaacuterios ambientes e dispositivos

14

bull executada em alta performance projetada para fornecer a maior performancepossiacutevel em tempo de execuccedilatildeo com a utilizaccedilatildeo do garbage collector em uma threadde baixa prioridade

bull interpretada dinacircmica e threaded projetada para ser interpretada por qual-quer dispositivo que possua JVM desenvolvida garantindo um desenvolvimento raacute-pido e em ciclos O uso da classe Thread permite que a linguagem acompanhe atendecircncia do paralelismo Aleacutem disso a ligaccedilatildeo de classes eacute feita em tempo real esomente quando necessaacuteria tornando-a dinacircmica

33 Evoluccedilatildeo

A primeira versatildeo do Java 8 foi lanccedilada em 2014 [28] e apresentou diversas atualizaccedilotildeesespalhadas em categorias como linguagem seguranccedila Collections ferramentas deployentre outras Dentre a grande quantidade de mudanccedilas os destaques se encontraram nasnovas melhorias presentes na linguagem que afetaram de forma mais direta a maneiracom que os desenvolvedores passaram a tratar e organizar o coacutedigo fonte As atualizaccedilotildeesreferentes a linguagem descritas oficialmente pela Oracle [29] satildeo

1 Lambda Expressions ou apenas Expressotildees Lambda correspondem a uma novacaracteriacutestica que permite que uma pequena funcionalidade possa ser utilizada comoum argumento de um meacutetodo facilitando a escrita de accedilotildees que seratildeo feitas repetida-mente em uma Collection ou quando um processo se completa ou quando encontraum erro Eacute tambeacutem uma forma compacta de se escrever coacutedigo que previamenteera escrito com anonymous inner classes [29] A Listagem 31 mostra uma classehipoteacutetica Calculator cujo meacutetodo operateBinary() recebe como paracircmetro doisinteiros e um objeto da classe IntegerMath que representa a operaccedilatildeo que deveraacuteser realizada ou seja uma funcionalidade dinacircmica

1 pub l i c c l a s s Ca l cu la to r 2

3 i n t e r f a c e IntegerMath 4 i n t opera t i on ( i n t a i n t b) 5 6

7 pub l i c i n t operateBinary ( i n t a i n t b IntegerMath op ) 8 re turn op opera t i on (a b) 9

10

11 pub l i c s t a t i c void main ( St r ing a rgs ) 12

15

13 Calcu la to r myApp = new Ca lcu la to r ( ) 14 IntegerMath add i t i on = (a b) minusgt a + b 15 IntegerMath subt ra c t i on = (a b) minusgt a minus b 16 System out p r i n t l n ( 40 + 2 = +17 myApp operateBinary (40 2 add i t i on ) ) 18 System out p r i n t l n ( 20 minus 10 = +19 myApp operateBinary (20 10 sub t ra c t i on ) ) 20 21 22

Listagem 31 Exemplo de coacutedigo com o uso de Expressatildeo Lambda [30]

2 Method References Frequentemente expressotildees lambda criam meacutetodos anocircni-mos Algumas vezes poreacutem satildeo utilizadas para chamar um meacutetodo jaacute existentena classe Ao inveacutes de escrever a expressatildeo Lambda para esse caso pode-se optarpor utilizar um Method Reference que facilita a escrita e leitura desse uso de ex-pressatildeo Lambda [29] A Listagem 32 mostra um exemplo de um meacutetodo estaacuteticoque compara duas pessoas pelas suas idades e a Listagem 33 a utilizaccedilatildeo de MethodReference para aplicar a utilizaccedilatildeo desse meacutetodo em um array e reduzir a escrita deuma expressatildeo lambda a uma forma mais legiacutevel

1 pub l i c s t a t i c i n t compareByAge ( Person a Person b) 2 re turn a b i r thday compareTo (b b i r thday ) 3 4

Listagem 32 Exemplo de meacutetodo de uma classe Pessoa [31]

1 Arrays s o r t ( rosterAsArray Person compareByAge ) 2

Listagem 33 Exemplo de uso de Method Reference [31]

3 Default Methods satildeo meacutetodos com a palavra-chave default que servem para adi-cionar implementaccedilotildees de meacutetodos a uma interface de alguma biblioteca mantendoa compatibilidade binaacuteria com versotildees mais antigas dessa interface Tambeacutem pos-sibilita a implementaccedilatildeo de meacutetodos estaacuteticos em interfaces [29] A Listagem 34apresenta a inclusatildeo de um meacutetodo default na interface TimeClient

1 pub l i c i n t e r f a c e TimeClient 2 void setTime ( i n t hour i n t minute i n t second ) 3 void setDate ( i n t day i n t month i n t year ) 4 void setDateAndTime ( i n t day i n t month i n t year 5 i n t hour i n t minute i n t second )

16

6 LocalDateTime getLocalDateTime ( ) 7

8 s t a t i c ZoneId getZoneId ( S t r ing zoneStr ing ) 9 t ry

10 re turn ZoneId o f ( zoneStr ing ) 11 catch ( DateTimeException e ) 12 System e r r p r i n t l n ( I n v a l i d time zone + zoneStr ing

+13 us ing d e f a u l t time zone in s t ead ) 14 re turn ZoneId systemDefault ( ) 15 16 17

18 d e f a u l t ZonedDateTime getZonedDateTime ( St r ing zoneStr ing ) 19 re turn ZonedDateTime o f ( getLocalDateTime ( ) getZoneId (

zoneStr ing ) ) 20 21 22

Listagem 34 Exemplo de interface com um meacutetodo default [32]

4 Repeating Annotations permitem a implementaccedilatildeo e utilizaccedilatildeo de anotaccedilotildees deum mesmo tipo que podem ser utilizadas mais de uma vez para a mesma declara-ccedilatildeo [29] A Listagem 35 apresenta duas anotaccedilotildees iguais com paracircmetros diferentespermitindo uma customizaccedilatildeo maior na aplicaccedilatildeo de um tipo de anotaccedilatildeo

1 Schedule ( dayOfMonth= l a s t )2 Schedule (dayOfWeek= Fr i hour= 23 )3 pub l i c void doPeriodicCleanup ( ) 4

Listagem 35 Exemplo de Repeating Annotations [33]

5 Type Annotations permitem que anotaccedilotildees possam ser utilizadas em tipos aleacutemde declaraccedilotildees dessa forma pode-se garantir que um campo sempre atenda agraves suasexpectativas e evite testes desnecessaacuterios [29] A Listagem 36 mostra um exemplo derestriccedilatildeo a uma String que nunca poderaacute ser nula devido agrave anotaccedilatildeo de NonNull

1 NonNull S t r ing s t r

Listagem 36 Exemplo de Type Annotation garantindo que o campo nunca seja null [34]

17

34 Expressotildees Lambda

Uma das mudanccedilas mais interessantes implementadas no Java 8 foi a adiccedilatildeo de expressotildeeslambda As expressotildees lambda permitem que a linguagem Java possa atuar parcialmentecomo uma linguagem de programaccedilatildeo funcional onde comportamentos satildeo avaliados eaplicados diferentemente da programaccedilatildeo imperativa que foca na mudanccedila de estadosNa praacutetica um comportamento pode ser passado como paracircmetro de um meacutetodo atraveacutesde uma escrita mais reduzida e legiacutevel Os benefiacutecios de utilizar expressotildees lambda incluemuma melhora na legibilidade e organizaccedilatildeo de coacutedigo que antes era escrito com AnonymousInner Class aleacutem de permitir uma forma simples de utilizar comportamento paralelo como uso de Streams

341 Sintaxe

A sintaxe de uma expressatildeo lambda eacute dividida nas seguintes partes [30]

bull Uma lista de paracircmetros separados por viacutergulas

bull Um token representado por uma seta -gt

bull Um corpo que pode ser representado por uma expressatildeo uacutenica ou um bloco de coacutedigodentro de chaves

As Listagens 37 e 38 mostram duas formas diferentes de se aplicar expressotildees Lambdacom uma sintaxe similar A primeira aplica a expressatildeo diretamente apoacutes a seta utilizadanormalmente para trechos de coacutedigo pequenos e simples e a segunda utiliza-se de chavespara incorporar o coacutedigo e da palavra-chave return para especificar o retorno forma maisutilizada para uma quantidade maior de coacutedigo

1 p minusgt p getGender ( ) == Person Sex MALE2 ampamp p getAge ( ) gt= 183 ampamp p getAge ( ) lt= 25

Listagem 37 Exemplo de expressatildeo lambda com uma expressatildeo [30]

1 p minusgt 2 re turn p getGender ( ) == Person Sex MALE3 ampamp p getAge ( ) gt= 184 ampamp p getAge ( ) lt= 25 5

Listagem 38 Exemplo de expressatildeo lambda com um bloco de coacutedigo [30]

18

342 Principais formas de uso

Anonymous Inner Class

Antes do Java 8 a necessidade de passar funccedilotildees ou expressotildees como paracircmetro de algummeacutetodo era suprida atraveacutes de Anonymous Inner Classes A utilizaccedilatildeo desse tipo dedeclaraccedilatildeo junto com a anotaccedilatildeo de Override permite sobrescrever um meacutetodo de umainterface funcional e ao mesmo tempo passa-la como argumento para um meacutetodo Umaexpressatildeo lambda se comporta da mesma forma poreacutem a quantidade de coacutedigo escritopela Anonymous Inner Class eacute maior e pode dificultar a leitura de coacutedigo pois conteacutemmuita informaccedilatildeo natildeo utilizada para efetivo entendimento do que estaacute sendo feito naqueletrecho

A Listagem 39 apresenta a instanciaccedilatildeo da classe EventHandler internamente ao meacute-todo setOnAction() de forma que o desenvolvedor possa escrever o comportamento quedeseja passar como paracircmetro do meacutetodo atraveacutes da substituiccedilatildeo do meacutetodo handle()que jaacute existe pelo meacutetodo handle() criado e escrito pelo desenvolvedor

1 btn setOnAction (new EventHandlerltActionEvent gt() 2 Override3 pub l i c void handle ( ActionEvent event ) 4 System out p r i n t l n ( He l lo World ) 5 6 )

Listagem 39 Exemplo de uso de Anonymous Inner Class [35]

Interface funcional

Ao projetar um coacutedigo novo o desenvolvedor que optar por utilizar expressotildees lambdadeve iniciar com a criaccedilatildeo de uma interface funcional Esse tipo de interface possui umuacutenico meacutetodo abstrato permitindo que expressotildees lambda sejam usadas para sobrescrevero comportamento do meacutetodo abstrato Uma interface funcional pode possuir outros meacuteto-dos desde que sejam default Uma nova anotaccedilatildeo FunctionalInterface foi adicionadacom a atualizaccedilatildeo do Java 8 para conferir em tempo de compilaccedilatildeo se a interface satisfazos requisitos desse modelo de interface

A Listagem 310 apresenta um exemplo de interface funcional com o objetivo de permi-tir o uso de expressotildees lambda que utilizaratildeo de dois Double como paracircmetro e jaacute utilizada nova anotaccedilatildeo FunctionalInterface introduzida no Java 8

1 Funct iona l Inte r face2 pub l i c i n t e r f a c e DoubleOp 3 pub l i c Double apply ( Double a Double b)

19

4

Listagem 310 Exemplo de interface funcional

Dessa forma conforme as Listagens 311 e 312 o meacutetodo apply() pode tomar formade qualquer operaccedilatildeo entre dois Double que seraacute especificada quando a expressatildeo lambdafor montada dando o aspecto de linguagem funcional agrave linguagem e mais facilidade eliberdade ao desenvolvedor

1 pub l i c c l a s s Ca l cu la to r 2 pub l i c s t a t i c Double c a l c ( Double op1 Double op2 DoubleOp operator ) 3 re turn operator apply ( op1 op2 ) 4 5

Listagem 311 Exemplo de aplicaccedilatildeo da interface funcional

1 Double r e s u l t 1 = Ca lcu la to r c a l c (10d 50d ( a b ) minusgt a + b)

Listagem 312 Uso de expressatildeo lambda para o exemplo anterior

Collections

Dentre as atualizaccedilotildees de pacotes do Java 8 foi adicionado um meacutetodo stream() nainterface Collection Esse meacutetodo trata as Collection como streams o que significa queapesar de natildeo ser possiacutevel acessar elementos diretamente algumas novas manipulaccedilotildeessatildeo possiacuteveis Essas manipulaccedilotildees satildeo na verdade meacutetodos da interface Stream quepodem receber como paracircmetro uma expressatildeo lambda ou seja um comportamento a seraplicado agrave Collection Dentre os meacutetodos temos

bull filter() O meacutetodo filter() recebe uma expressatildeo lambda contendo uma condiccedilatildeopara filtragem da collection

bull map() O meacutetodo map() mapeia os elementos de uma Collection em outro objetocomo uma String A expressatildeo lambda passada por paracircmetro deve retornar o tipode objeto ao qual seraacute mapeado

bull forEach() O meacutetodo forEach() aplica uma operaccedilatildeo especiacutefica para cada ele-mento da Collection A expressatildeo lambda a ser passada deve conter a operaccedilatildeo aser realizada

bull min() e max() Os meacutetodos min() e max() retornam o elemento menor ou maiorda Collection dependendo da expressatildeo lambda passada como paracircmetro

20

A Listagem 313 demonstra como vaacuterias operaccedilotildees com uma Collection podem seraplicadas de uma vez de forma que lendo a expressatildeo lambda jaacute eacute possiacutevel saber oresultado da aplicaccedilatildeo do meacutetodo agrave Collection

1 r o s t e r2 stream ( )3 f i l t e r (4 p minusgt p getGender ( ) == Person Sex MALE5 ampamp p getAge ( ) gt= 186 ampamp p getAge ( ) lt= 25)7 map(p minusgt p getEmailAddress ( ) )8 forEach ( emai l minusgt System out p r i n t l n ( emai l ) )

Listagem 313 Exemplo de utilizaccedilatildeo de meacutetodos de stream com expressotildees lambda [30]

21

Capiacutetulo 4

Estudo e o Processo de Mineraccedilatildeo

A definiccedilatildeo da metodologia utilizada para realizaccedilatildeo deste trabalho eacute importante para queexista uma padronizaccedilatildeo e melhor entendimento de como os resultados foram obtidos paraque a replicaccedilatildeo do mesmo possa ser realizada em trabalhos futuros [36]

Figura 41 Processo utilizado para realizaccedilatildeo do estudo

O esquema representado na Figura 41 descreve o processo seguido para a realizaccedilatildeodeste trabalho que foi divido em trecircs grandes etapas a de planejamento definindo osobjetivos questotildees de pesquisa e meios de investigaccedilatildeo deste projeto a etapa de execuccedilatildeorealizando todo o procedimento metodoloacutegico definido para a coleta e refinamento de

22

dados e a etapa de avaliaccedilatildeo onde foram classificados e avaliados os dados coletadospara responder agraves questotildees de pesquisa

A seguir na primeira seccedilatildeo seratildeo apresentadas em detalhes as questotildees de pesquisa aserem respondidas Em seguida seraacute feito uma breve descriccedilatildeo da fonte de dados utilizada- especificamente os projetos utilizados como objetos de estudo deste trabalho e por fimtodo o restante da metodologia que foi de fato desenvolvida para obter os resultadosnecessaacuterios

41 Questotildees de Pesquisa

Com o objetivo de entender e caracterizar melhor o uso de expressotildees lambda foramdefinidas as seguintes questotildees de pesquisa a serem respondidas

bull PQ-1 Quando os projetos comeccedilaram a introduzir o uso de expressotildees lambda emseus coacutedigos e qual a meacutedia de expressotildees lambda por snapshots caso existam

bull PQ-2 Como as equipes de desenvolvimento estatildeo utilizando expressotildees lambdaatraveacutes de refatoraccedilatildeo de coacutedigo ou introduzindo apenas em coacutedigo novo

bull PQ-3 Quais satildeo os padrotildees tipicamente adotados para o uso de expressotildees lambda

A primeira pergunta de pesquisa gira em torno de como projetos populares open-sourceestatildeo se adaptando agrave introduccedilatildeo de expressotildees lambda em Java muitos projetos jaacute estatildeoutilizando as expressotildees lambda Se sim a partir de quando comeccedilaram a utilizaacute-lasdesde o iniacutecio da introduccedilatildeo das mesmas no Java 8 ou em um periacuteodo mais tardio Aleacutemdisso eacute interessante descobrir se a utilizaccedilatildeo dessa nova caracteriacutestica tem acontecido deforma expressiva ou natildeo

Em seguida para melhor entender a forma como as expressotildees lambda estatildeo sendointroduzidas em projetos eacute interessante investigar se as equipes de desenvolvimento estatildeose preocupando em refatorar coacutedigo com o objetivo de evoluir o software ou se estatildeoexperimentando utilizar expressotildees lambda apenas em coacutedigo novo introduzido

Como a introduccedilatildeo de novas funcionalidades em projetos open-source de grande escaladepende do objetivo do projeto e os padrotildees de projeto utilizados [37] espera-se obser-var diversas abordagens quanto a utilizaccedilatildeo de expressotildees lambda para entatildeo poderclassificar estes softwares quanto a abordagem utilizada

Eacute de grande importacircncia para este estudo conseguir identificar na praacutetica comoexpressotildees lambda estatildeo sendo tipicamente adotadas nestes projetos Assim a terceirapergunta de pesquisa busca identificar alguns exemplos de utilizaccedilatildeo atraveacutes da realizaccedilatildeode alguns estudos de caso

23

Eacute importante ressaltar que apesar de as expressotildees lambda serem uma alternativa aouso de AIC elas natildeo os substituem completamente Existem precondiccedilotildees para que umaAIC possa ser substituiacuteda por expressotildees lambda [12] descritas a seguir

bull AIC deve instanciar-se de uma interface

bull AIC natildeo deve possuir nenhum campo e declarar apenas um meacutetodo

bull AIC natildeo deve possuir uma referecircncia para this ou super

bull AIC natildeo deve declarar um meacutetodo recursivo

Para responder agrave primeira pergunta apenas dados gerais sobre todos os projetos seratildeonecessaacuterios ao passo que pelas perguntas 2 e 3 possuiacuterem uma natureza mais complexaseraacute necessaacuterio aleacutem de uma anaacutelise geral estatiacutestica a realizaccedilatildeo de alguns estudos decaso para obter resultados mais completos

42 Fonte de Dados e Objetos de Estudo

Para responder agraves perguntas de pesquisa estabelecidas foram selecionados os 99 projetosmais populares na linguagem Java dentro da plataforma github ateacute a data da coleta dosdados feita em Abril de 2017 Satildeo considerados populares os repositoacuterios que possuema maior quantidade possiacutevel de estrelas (stars) A decisatildeo de escolher os 99 projetos maispopulares foi por sua natureza imparcial e ao mesmo tempo para que se possa analisarprojetos que satildeo de familiaridade e conhecimento da comunidade do github e de domiacuteniopuacuteblico Os 99 projetos estatildeo listados no Anexo I

Para entender a transiccedilatildeo feita por esses projetos entre as versotildees anteriores do Java eo Java 8 com as expressotildees lambda eacute necessaacuterio analisar o coacutedigo de vaacuterias versotildees a fimde observar alguma mudanccedila para cada projeto Como satildeo 99 projetos e vaacuterios dessesprojetos possuem milhares de linhas de coacutedigo e commits seria impossiacutevel avaliar todosos commits Optou-se entatildeo por coletar snapshots mensais de cada projeto conformeprocedimento tambeacutem seguido anteriormente [38] Cada snapshots representa o estadodo projeto em um determinado mecircs e como criteacuterio de escolha padratildeo todos os snapshotsequivalem ao uacuteltimo commit realizado no determinado mecircs que este representa

O proacuteximo passo eacute determinar o periacuteodo de tempo em que esses snapshots seriamcoletados Como Java 8 (e consequentemente as expressotildees lambda) foi introduzidoapenas em meados de 2014 [28] coletar dados de projetos a partir de um periacuteodo muitoantes deste ano natildeo agregaria valor ao estudo em questatildeo Definiu-se entatildeo um periacuteodopara a coleta mensal desses snapshots atraveacutes dos anos Janeiro de 2013 um ano antesda introduccedilatildeo do Java 8 para que se pudesse identificar para todos os projetos o mecircs

24

exato em que expressotildees lambda foram introduzidas ateacute o mecircs da coleta de dados Abrilde 2017

Eacute importante ressaltar que a definiccedilatildeo dos meses foi definida do dia primeiro de ummecircs ao dia primeiro do proacuteximo mecircs e por consequecircncia alguns snapshots que deveriamrepresentar o final de determinado mecircs correspondem na verdade a commits realizadosno dia primeiro do mecircs seguinte Por exemplo pode existir casos em que o commit querepresente o mecircs de Marccedilo de 2016 seja na verdade o commit realizado no dia primeirode Abril de 2016 Isso se deve a natureza da forma como os resultados de log de commitssatildeo obtidos pelo git [39] Poreacutem isso natildeo interfere nas anaacutelises ou no propoacutesito destetrabalho uma vez que foram realizadas verificaccedilotildees e validaccedilotildees para que natildeo existamdatas repetidas (e consequentemente commits repetidos) por repositoacuterio

Neste trabalho o termo projeto e repositoacuterio foram utilizados de forma intercaladapara representar a mesma coisa o software desenvolvido que possui um repositoacuterio naplataforma github Os termos commit snapshops e versotildees tambeacutem representam a mesmacoisa uma vez que foi definido que seriam utilizados apenas um commit por mecircs pararepresentar um determinado snapshot ou versatildeo do repositoacuterio em questatildeo

Todos os 99 projetos seratildeo utilizados para a realizaccedilatildeo de uma anaacutelise geral de ca-racterizaccedilatildeo do uso de expressotildees lambda Para as anaacutelises aprofundadas foi feito umcriteacuterio de classificaccedilatildeo para que apenas alguns projetos possam ser analisados em niacutevelde coacutedigo como estudos de caso

Resumindo foram escolhidos os 99 projetos mais populares de Java no github cole-tando dados mensais de seus commits a partir do ano de 2013 ateacute a data da coleta dosdados lembrando que nem todos os projetos existem desde 2013 (projetos mais recentes)

43 Processo de Mineraccedilatildeo

A abordagem utilizada para coletar e analisar os 99 projetos escolhidos como mostra aFigura 42 foi realizada de forma automatizada utilizando scripts python e dois projetosdesenvolvidos em Java para a coleta e tratamento de dados como descrito a seguir

Primeiramente foi realizado uma coacutepia dos repositoacuterios atuais de todos os 99 projetosmais populares do github em Java Para automatizar o processo foi desenvolvido umscript em python que lista todos os projetos escolhidos clona todos os repositoacuterios emuma pasta na maacutequina local e cria um arquivo temporaacuterio com as informaccedilotildees do nomede cada repositoacuterio e seu caminho absoluto na maacutequina local

25

Figura 42 Metodologia implementada para coleta e tratamento de dados

Em seguida foi necessaacuterio realizar o checkout de todas as versotildees entre Janeiro de2013 a Abril de 2017 de cada projeto Por motivos de otimizaccedilatildeo de espaccedilo da maacutequinalocal e automatizaccedilatildeo no processo de checkout utilizou-se de um segundo script pythonque realizava as seguintes tarefas para cada mecircs em cada projeto verificar se dentreo mecircs estipulado houve algum commit para aquele projeto se sim pega-se o hash douacuteltimo commit do mecircs realiza o checkout conta-se a quantidade de linhas de coacutedigo emJava que o projeto tem utilizando a biblioteca cloc e armazena todas as informaccedilotildeespertinentes referentes a todos os projetos que naquele mecircs tiveram commits para que oprojeto static-analysis possa entatildeo ser executado sobre esses projetos naquele determinadomomento As informaccedilotildees coletadas que satildeo utilizadas pelo static-analysis correspondemao nome do projeto o hash do commit para aquela versatildeo a pasta onde o projeto estaacutearmazenado na maacutequina local a quantidade de linhas de coacutedigo Java do projeto e datareferente ao commit Essas informaccedilotildees satildeo pertinentes para que o projeto static-analysisconsiga funcionar de forma correta projeto este descrito em detalhes a seguir

431 static-analysis

O static-analysis foi um projeto desenvolvido anteriormente a este trabalho pelos alunosThiago Cavalcanti e Vinicius de Almeida cujo objetivo eacute realizar a anaacutelise estaacutetica de

26

coacutedigos-fonte Java e gerar arquivos de saiacuteda contendo informaccedilotildees de classes e meacutetodoscom suas devidas ocorrecircncias de caracteriacutesticas da linguagem [40]

A anaacutelise estaacutetica de coacutedigo consiste em analisar um coacutedigo-fonte sem a necessidadede executaacute-lo Esse tipo de anaacutelise eacute de extrema importacircncia para manter um coacutedigo dequalidade evitar futuras refatoraccedilotildees e obter informaccedilotildees estatiacutesticas de forma raacutepida epraacutetica [41]

Seguindo esse princiacutepio o static-analysis foi projetado para receber um arquivo deentrada csv seguindo o padratildeo

Tipo da Aplicaccedilatildeo Inicio do projeto Antes ou Apoacutes Java 5 Nome do ProjetoVersatildeo Caminho absolutoQuantidade de linhas de coacutedigo

Atraveacutes da informaccedilatildeo do caminho absoluto do projeto o static-analysis varre osdiretoacuterios em busca dos arquivos fonte java realiza o parse desses arquivos e utilizade Visitors para extrair as informaccedilotildees desejadas e exporta-las em arquivos csv Ouso de Visitors permite que sejam escolhidas as informaccedilotildees desejadas para a consultacomo expressotildees Lambda e AIC s aleacutem de possibilitar que sejam implementados novosVisitors conforme a linguagem evolua ou as necessidades mudem

Para este trabalho foram utilizados os Visitors de expressotildees Lambda map() filter()AICs e declaraccedilotildees de meacutetodos

432 BDAnalisador

Apoacutes obter todas as informaccedilotildees necessaacuterias geradas pelo static-analysis era preciso ma-nipular os dados de forma que facilitasse a coleta de dados para o estudo proposto Comovaacuterios arquivos em formato csv satildeo de difiacutecil manipulaccedilatildeo foi desenvolvido entatildeo umaferramenta chamada BDAnalisador Esta ferramenta eacute responsaacutevel por processar os arqui-vos em csv gerados pelo static-analysis e popular uma base de dados relacional MySQLcom as informaccedilotildees pertinentes a este estudo

O BDAnalisador foi desenvolvido com a intenccedilatildeo de tornar mais simples o trabalhocom os dados resultantes do static-analysis de forma que consultas em SQL pudessemser feitas a ponto de permitir a obtenccedilatildeo de resultados mais complexos Seguindo esseobjetivo o framework Hibernate foi escolhido como ferramenta para persistecircncia devidoa ser um framework jaacute consolidado no mercado e que de forma simples relaciona osobjetos Java ao banco de dados MySQL [42] A divisatildeo de classes foi projetada em quatroentidades Projeto Versao Classe e Metodo cada uma com seus respectivos camposcontendo as informaccedilotildees necessaacuterias para a pesquisa como pode ser visto na Figura 44Eacute importante ressaltar que a tabela de Versao guarda hashs de commits devido agrave escolhade utilizar commits para obter mais informaccedilatildeo de evoluccedilatildeo de coacutedigo em um menor

27

espaccedilo de tempo Aleacutem disso para este trabalho optou-se por persistir todos os meacutetodose classes de cada versatildeo sem se importar com a repeticcedilatildeo desses dados pois a hipoacutetesede haver grandes refatoraccedilotildees entre versotildees poderia comprometer a confiabilidade dasinformaccedilotildees

Figura 43 Diagrama de classes UML do BDAnalisador

Como visto na Figura 43 seguindo parcialmente a arquitetura MVC cada entidadepossui sua respectiva classe DAO(Data Access Object) para persistecircncia dos dados eapenas uma classe Controlador no projeto responsaacutevel pela manipulaccedilatildeo e parse dosdados dos arquivos csv gerados pelo static analysis para serem enviados agraves classes DAOO sistema inicia chamando o meacutetodo inicializar() da classe Controlador Esse meacutetodoeacute responsaacutevel por ler um arquivo de entrada csv que segue o mesmo modelo do arquivo dostatic-analysis citado na seccedilatildeo anterior O arquivo conteacutem os dados de todos os projetose suas respectivas versotildees dessa forma o meacutetodo instancia um objeto da classe Projetoe persiste o projeto no banco de dados Para cada versatildeo encontrada no arquivo deentrada o inicializar() aciona os meacutetodos responsaacuteveis por instanciar e preencher aslistas da classe Classe e Metodo Os meacutetodos responsaacuteveis por preencher as listas varremos arquivos csv gerados pelo static-analysis e fazem o parse das informaccedilotildees relevantescomo nomes dos meacutetodos e quantidades de lambdas para construir os objetos que seratildeogravados Ao final dos preenchimentos o objeto Versatildeo eacute instanciado e gravado no bancode dados atraveacutes de sua classe DAO ao mesmo tempo que grava suas respectivas Classese Metodos

28

Apoacutes vaacuterios testes e correccedilotildees de bugs o banco de dados se encontrava finalmente comas informaccedilotildees de 99 projetos Java open-source separados por um commit por mecircs desde2013 cada um com suas respectivas informaccedilotildees de classes meacutetodos e a quantidade deexpressotildees lambda filters e maps em cada meacutetodo Filter ou Filter pattern eacute o padratildeode projeto que tem como objetivo filtrar objetos de uma coleccedilatildeo (Collection) de acordocom algum criteacuterio Jaacute o map ou map pattern eacute um padratildeo que ldquomapeia os elementosde uma coleccedilatildeo aplicando uma funccedilatildeo a eles para uma nova coleccedilatildeo [43] A coleta deinformaccedilotildees sobre esses padrotildees podem ser uacuteteis para possiacuteveis anaacutelises de oportunidadesde uso de expressotildees lambda para refatoraccedilatildeo de coacutedigo

A Figura 44 mostra o esquema de como o banco de dados resultante foi gerado

Figura 44 Modelo relacional do banco de dados populado pelo BDAnalisador Imagemgerada com software DBeaver [2]

44 Classificaccedilatildeo e Anaacutelise

Com o banco de dados populado restam apenas as etapas de classificaccedilatildeo e anaacutelise pararesponder as questotildees de pesquisa propostas Para isso inicialmente houve uma tentativade se utilizar apenas queries SQL para analisar os dados de acordo com as informaccedilotildeesrelevantes Poreacutem devido ao fato de o banco de dados conter todas as informaccedilotildees detodos os projetos e todas as suas versotildees queries que possuem uma alta complexidadedemoravam muito tempo para retornar os dados

Assim com o objetivo de facilitar o trabalho alguns scripts python foram desenvolvi-dos para rodar as queries separadamente e individualmente para cada projeto de formaautomatizada a fim de melhorar o tempo de resposta para obtenccedilatildeo dos resultados

29

441 Meacutedia de Lambda

O primeiro script retorna a quantidade de expressotildees lambda (ou AICs) por n snapshotsque contenha expressotildees lambda O objetivo eacute ter uma visatildeo geral da meacutedia de expressotildeeslambda e AICs utilizadas por cada projeto e como nem todos os snapshots coletados decada projeto possuem expressotildees lambda e AICs apenas aqueles com alguma expressatildeolambda ou AIC satildeo incluiacutedos no caacutelculo da meacutedia

Mmedia =sumn qtdLambdai

n

442 Anaacutelise Temporal

O segundo script retorna para cada projeto a soma total da quantidade de expressotildeeslambda AIC map() e filter() no projeto inteiro para cada versatildeo Ou seja tem-seo total de cada uma das quatro propriedades selecionadas para cada mecircs do projetoobtendo assim uma visatildeo temporal de evoluccedilatildeo do uso das caracteriacutesticas descritas ATabela 41 ilustra parcialmente o resultado obtido para o projeto agera onde idVersaoeacute o identificador no banco de dados referente ao hash do commit mensal coletado qtd eacutea quantidade de cada uma das caracteriacutesticas escolhidas e a data do commit encontra-seno formato americano

Tabela 41 Informaccedilotildees mensais sobre o projeto ageraidVersao Data do Commit qtd lambda qtd AIC qtd maps qtd filter

823 512016 0 29 4 0755 612016 13 28 4 0686 6152016 13 29 4 0621 812016 13 29 4 0555 8162016 13 30 4 0485 922016 13 30 4 0422 10132016 14 30 4 0356 11282016 14 30 4 0295 12212016 21 30 5 0232 212017 21 30 5 0175 312017 21 30 5 0112 3312017 21 36 5 048 4242017 21 48 5 0

Os resultados obtidos com esta anaacutelise temporal permitiu a identificaccedilatildeo de padrotildees nautilizaccedilatildeo de expressotildees lambda em relaccedilatildeo a utilizaccedilatildeo de AIC por todos os projetos Foi

30

possiacutevel classificar todos os projetos em 6 grupos ilustrado na Figura 45 Primeiramenteseparou-se os projetos entre os que possuem expressotildees lambda e os que natildeo possuemDentre os que possuem identificou-se cinco categorias

1 Grupo 1 Quantidade de AICs e expressotildees lambda aumentam com o tempo pro-porcionalmente

2 Grupo 2 Quantidade de AICs diminui agrave medida que a quantidade de expressotildeeslambda aumentam e a quantidade de expressotildees lambda ultrapassa a quantidade deAIC em um determinado momento

3 Grupo 3 Quantidade de AICs diminui agrave medida que a quantidade de expressotildeeslambda aumentam mas a quantidade de AIC permanece superior agrave quantidade delambda

4 Grupo 4 Expressotildees lambda satildeo introduzidas e existem por um pequeno periacuteodode tempo mas satildeo completamente removidas posteriormente

5 Grupo 5 Quantidade de expressotildees lambda eacute constante e muito inferior compa-rado com a quantidade de AICs no projeto Foi determinado que para pertencera esta classificaccedilatildeo o projeto precisa ter uma razatildeo de meacutedia de expressotildees lamb-dasnapshot por meacutedia de AICsnapshot inferior a 020 Esse paracircmetro foi esta-belecido com o objetivo de definir um padratildeo para o que pode ser considerado umprojeto com poucas expressotildees lambda

Figura 45 Classificaccedilatildeo dos projetos

31

443 Refatoraccedilatildeo de Coacutedigo

O uacuteltimo script teve como objetivo realizar uma tentativa inicial de identificar refatoraccedilatildeode coacutedigo da seguinte maneira para todos os projetos que possuem expressotildees lambdaforam identificados o mecircs imediatamente antes da introduccedilatildeo de expressotildees lambda e omecircs seguinte onde houve a primeira ocorrecircncia de lambda no projeto Assim realizou-se uma anaacutelise do tamanho em quantidade de linhas de coacutedigo de todos os meacutetodosdo projeto que no mecircs seguinte tiveram introduccedilatildeo de lambda Em seguida fez-se umacomparaccedilatildeo com os mesmos meacutetodos em relaccedilatildeo ao mecircs anterior e assim foi possiacuteveldetectar quais meacutetodos tiveram a quantidade de linhas de coacutedigo reduzidas o que seriaum indicativo natildeo necessariamente exclusivo de que uma refatoraccedilatildeo de coacutedigo possa terocorrido

Sabe-se que este meacutetodo de detecccedilatildeo de refatoraccedilatildeo de coacutedigo possui suas limitaccedilotildeesuma vez que as comparaccedilotildees para saber se um meacutetodo existe em ambas versotildees eacute feitopuramente por comparaccedilatildeo de String (nome do meacutetodo) e a classe que este pertence

444 Casos de Uso

Os meacutetodos descritos acima ajudaram a identificar alguns padrotildees e facilitar a anaacutelise dosdados Poreacutem natildeo satildeo suficientes para que se possa responder agraves questotildees de pesquisaDessa forma apoacutes a identificaccedilatildeo dos grupos de classificaccedilatildeo para os projetos foramescolhidos um projeto de cada grupo (com exceccedilatildeo do grupo dos projetos sem expressotildeeslambda) para realizar um breve estudo de caso com o objetivo de identificar e caracterizarmelhor a adoccedilatildeo de expressotildees lambda Os projetos escolhidos foram agera vertxAndroid-CleanArchitecture RxJava e guava

32

Capiacutetulo 5

Resultados Obtidos e Anaacutelise

Neste capiacutetulo seratildeo apresentados os dados obtidos e anaacutelise com o objetivo de responderagraves questotildees de pesquisa propostas Como mencionado anteriormente as perguntas seratildeorespondidas de duas maneiras algumas com informaccedilotildees gerais sobre todos os projetose outras com breve estudos de caso envolvendo cinco projetos

51 Visatildeo Geral

Dentre os repositoacuterios coletados para a anaacutelise 74 (7474) natildeo utilizaram nenhumaexpressatildeo lambda no projeto durante todo o periacuteodo analisado (Janeiro de 2013 a Abrilde 2017) restando apenas 25 repositoacuterios (2525) com expressotildees lambda Eacute interessantedestacar que apesar de a quantidade de repositoacuterios que natildeo possuem expressotildees lambdaser relativamente expressiva muitos destes repositoacuterios satildeo de projetos em Java que umdia foram populares e atualmente natildeo estatildeo sendo mais desenvolvidos (por exemplo umaplicativo que soacute funciona para Android 23 atualmente descontinuado)

Levando em consideraccedilatildeo apenas os projetos que possuem expressotildees lambda exis-tem dois tipos de dados que podem ser analisados para responder agrave primeira questatildeo depesquisa atraveacutes dos dados obtidos pelo meacutetodo anteriormente mencionado como anaacutelisetemporal e a meacutedia de lambda por snapshot mencionados no capiacutetulo anterior

Com relaccedilatildeo ao ano em que a primeira ocorrecircncia foi encontrada 6 projetos introduzi-ram expressotildees lambda jaacute em 2014 8 comeccedilaram a utilizar em 2015 7 em 2016 e apenas4 tiveram a primeira ocorrecircncia de expressotildees lambda em 2017 Dessa forma percebe-seque os projetos estatildeo relativamente bem distribuiacutedos em grupos quanto ao ano em que seintroduziu expressotildees lambda

Pela meacutedia de lambda por snapshot (lambdasnapshot) a maioria (11 projetos) possuiuma quantidade expressiva acima de 100 lambdasnapshot (com 6 projetos entre 20 e 100lambdasnapshot e 8 projetos com menos de 20 lambdasnapshot) como apresentados no

33

graacutefico da Figura 51 Isso mostra que essa nova caracteriacutestica jaacute estaacute sendo bem utilizadanos projetos que comeccedilaram a migrar para a nova versatildeo do Java

Figura 51 Graacuteficos dos projetos separados por ano de introduccedilatildeo de expressotildees lambdae meacutedia de lambda por snapshot

Com isso pode-se observar que apesar de a quantidade de projetos que possuemexpressotildees lambda natildeo ser tatildeo alta eacute possiacutevel obter resultados expressivos uma vez quea quantidade dos projetos com lambda estatildeo bem dispersos quanto ao periacuteodo em quecomeccedilaram a adotar essa caracteriacutestica e a quantidade de expressotildees lambda por snapshot

511 Projetos Selecionados

Atraveacutes dos grupos de classificaccedilatildeo identificados pela anaacutelise temporal descritos na Figura45 cinco projetos foram selecionados para uma anaacutelise detalhada levando em consideraccedilatildeoo grupo em que eles pertencem Estes projetos seratildeo apresentados a seguir

512 agera

Agera eacute uma biblioteca Android que ajuda a introduzir programaccedilatildeo funcional reativa(functional reactive programming) em projetos Android Eacute um projeto recente lanccediladoem 2016 pela Google [44] e encontra-se no grupo dos projetos que introduziram expressotildeeslambda em 2016 no mesmo ano de seu lanccedilamento contendo uma meacutedia de expressotildeeslambda de 16 lambdasnapshot

Na classificaccedilatildeo estabelecida agera pertence ao Grupo 1 onde a quantidade de ex-pressotildees lambda no projeto com o tempo aumentam juntamente com a quantidade deAICs como mostra o graacutefico de anaacutelise temporal na Figura 52

34

Figura 52 Graacuteficos de anaacutelise temporal do projeto agera

513 vertx

Eclipse Vertx eacute um conjunto de ferramentas para criaccedilatildeo de reactive applications namaacutequina virtual Java (JVM) em grande escala [45] Seu primeiro lanccedilamento aconteceuem 2011 e a primeira ocorrecircncia de expressotildees lambda no projeto aconteceu em 2014 Esteprojeto possui uma meacutedia de 2867 lambdasnapshot e dentre os projetos consideradosneste trabalho eacute o que possui a maior quantidade de expressotildees lambda

Este projeto pertence ao Grupo 2 onde a quantidade de expressotildees lambda aumen-tou consideravelmente pelos meses ultrapassando a quantidade de AICs que diminuiudrasticamente como mostra a Figura 53

35

Figura 53 Graacuteficos de anaacutelise temporal do projeto Vertx

514 Android-CleanArchitecture

Apesar de ser uma amostra de projeto Android-CleanArchitecture que tem como objetivoconstruir aplicaccedilotildees Android utilizando clean architecture foi lanccedilado em 2014 mas semanteacutem sempre atualizado [46]

A introduccedilatildeo de expressotildees lambda que aconteceu no ano de 2015 se deu de formatiacutemida com uma meacutedia de 35 lambdasnapshot De qualquer forma este projeto conseguerepresentar com seu graacutefico de anaacutelise temporal o grupo 3 composto por projetos em quea quantidade de expressotildees lambda aumentou mas sem ultrapassar AICs que diminuiacuteramdemonstrado no graacutefico da Figura 54

36

Figura 54 Graacuteficos de anaacutelise temporal do projeto Android-CleanArchitecture

515 RxJava

Dentre os repositoacuterios estudados RxJava eacute considerado o mais popular Como umaimplementaccedilatildeo de Reactive Extensions para a JVM RxJava teve seu lanccedilamento dadoem 2013 [47] Expressotildees lambda apareceram pela primeira vez no ano de 2015 comuma meacutedia de 766 lambdasnapshot

Apesar de uma meacutedia relativamente alta o tempo de vida das expressotildees lambda nesteprojeto foi bem curto caracterizando assim projetos do grupo 4 houve a introduccedilatildeo dasexpressotildees lambda no projeto poreacutem houve a remoccedilatildeo completa de todas as expressotildeeslambda previamente introduzidas desaparecendo completamente do projeto ateacute a datada coleta de dados (Figura 55)

37

Figura 55 Graacuteficos de anaacutelise temporal do projeto RxJava

516 guava

Guava eacute um conjunto de bibliotecas para Java da Google lanccedilado em 2011 A atualizaccedilatildeodo coacutedigo do projeto para Java 8 aconteceu somente em 2016 e apesar do projeto conteruma meacutedia de 281 lambdasnapshot ele foi escolhido como representante dos projetosdo Grupo 5 (Figura 56) que possuem expressotildees lambda mas de forma natildeo expressiva osuficiente quando comparado com a quantidade de AIC pelo fato de sua razatildeo de meacutedia delambdasnapshot por meacutedia de AICsnapshot ser 004 Ou seja embora o projeto tenhaexpressotildees lambda estas satildeo consideradas muito poucas quando inseridas no contextogeral deste projeto que eacute considerado um projeto grande

38

Figura 56 Graacuteficos de anaacutelise temporal do projeto Guava

52 Refatoraccedilatildeo de Coacutedigo

Com o objetivo de caracterizar melhor como as expressotildees lambda estatildeo sendo utilizadaseacute interessante identificar se estas estatildeo sendo introduzidas atraveacutes de refatoraccedilatildeo de coacutedigoou em coacutedigo novo

Os projetos classificados como pertencentes ao Grupo 2 possuem em comum o fatode expressotildees lambda aumentarem a medida que AICs diminuem ultrapassando-as eessa caracteriacutestica em comum pode indicar que nestes projetos possivelmente houve re-fatoraccedilatildeo de coacutedigo visto que AIC sendo substituiacutedo por expressotildees lambda dentro dascondiccedilotildees determinadas eacute a maneira mais comum de se identificar refatoraccedilatildeo de coacute-digo para introduccedilatildeo de expressotildees lambda [12] Os projetos que compotildeem o grupo 2representam 44 de todos os projetos estudados que possuem expressotildees lambda o quepode ser um indicativo caso a hipoacutetese de refatoraccedilatildeo de coacutedigo seja positiva de quemuitos projetos que estatildeo adotando o Java 8 estatildeo se preocupando de alguma formacom refatoraccedilatildeo se coacutedigo Fazem parte desse grupo os seguintes projetos elasticsearchjava-design-patterns PocketHub presto RxJava-Android-Samples spark vertx zipkinjava8-tutorial dropwizard e material-dialogs

39

Outra maneira de verificar possiacuteveis indicadores de refatoraccedilatildeo de coacutedigo foi atraveacutesda anaacutelise dos tamanhos (em quantidade de linhas de coacutedigo) dos meacutetodos com expressotildeeslambda no mecircs em que se introduziu expressotildees lambda e um mecircs imediatamente antesdeste Essa anaacutelise mostra que dos 25 projetos com expressotildees lambda 12 (48) projetostiveram ao menos um meacutetodo em que houve uma diminuiccedilatildeo no tamanho o que podeser considerado um indicativo de refatoraccedilatildeo de coacutedigo A Figura 57 mostra todos osprojetos em relaccedilatildeo agrave quantidade total de meacutetodos que possuem lambda no primeiro mecircsde introduccedilatildeo do mesmo em vermelho comparado com a quantidade desses meacutetodos quetiveram uma diminuiccedilatildeo no tamanho quando comparados com o coacutedigo do mecircs anteriorem azul

Figura 57 Comparaccedilatildeo entre todos os projetos com expressatildeo lambda sobre refatoraccedilatildeode coacutedigo no mecircs de introduccedilatildeo da caracteriacutestica

Ainda observando a figura 57 com relaccedilatildeo aos projetos que natildeo tiveram nenhummeacutetodo com diminuiccedilatildeo de tamanho (barra azul) percebe-se que todos os 13 projetossequer tiveram uma quantidade significativa de meacutetodos que possuem expressotildees lambda(com o maior tendo apenas 5 meacutetodos) no mecircs de introduccedilatildeo da caracteriacutestica no projetoe ao mesmo tempo jaacute existiam no mecircs em que natildeo existia lambda no projeto Essa eacuteuma observaccedilatildeo importante porque projetos como vertx sendo este o que possui a maiormeacutedia de lambdasnapshot de todos os projetos e ao mesmo tempo tendo apenas trecircsmeacutetodos que continham expressotildees lambda no mecircs da introduccedilatildeo e que existiam no mecircs

40

anterior permitem inferir que todas as outras expressotildees lambda existentes no projetopara este determinado mecircs de introduccedilatildeo encontram-se em coacutedigo novo introduzido

Eacute importante ressaltar que somente essa anaacutelise natildeo eacute exclusivamente suficiente paradeterminar se estes projetos estatildeo realmente introduzindo lambda em coacutedigo novo ourealizando refatoraccedilatildeo uma vez que como a comparaccedilatildeo aconteceu apenas no mecircs deintroduccedilatildeo com o mecircs imediatamente anterior natildeo reflete todo o ciclo de vida do pro-jeto Por exemplo algumas equipes podem escolher refatorar o coacutedigo depois de umtempo de adaptaccedilatildeo apoacutes a transiccedilatildeo para a nova versatildeo da linguagem Assim paraobter uma melhor anaacutelise sobre refatoraccedilatildeo de coacutedigo ou natildeo feita nestes projetos aleacutemde outras anaacutelises referentes aos padrotildees tipicamente adotados para implementaccedilatildeo delambda nestes projetos seratildeo apresentados a seguir os estudos de caso dos cinco projetospreviamente selecionados

Outro ponto importante eacute o fato de que apesar das informaccedilotildees quanto agraves quantida-des de filter e map terem sido incluiacutedas inicialmente no trabalho para observar possiacuteveispadrotildees de refatoraccedilatildeo de coacutedigo percebeu-se que estas natildeo satildeo utilizadas de forma con-sideraacutevel pelos projetos estudados e para fins de anaacutelises generalizadas natildeo apresentaramtanta influecircncia na utilizaccedilatildeo de expressotildees lambda quanto a quantidade de AICs noprojeto

53 Estudos de Caso

Dentre os projetos analisados verificou-se que os projetos de pequeno e meacutedio porte op-taram por refatorar de uma vez seus coacutedigos para incluir expressotildees lambda em situaccedilotildeesem que se utilizava AICs anteriormente ou em alguns poucos casos de utilizaccedilatildeo deCollection Os projetos de grande porte natildeo apresentaram nenhuma refatoraccedilatildeo de coacute-digo ou uma refatoraccedilatildeo parcial gradativa provavelmente devido agrave grande quantidade dearquivos e coacutedigo que possuem o que pode tornar o trabalho de refatoraccedilatildeo extenso ecansativo

O projeto vertx que pertence ao grupo 2 dos projetos em que a quantidade de ex-pressotildees lambda aumentaram e as de AICs diminuiacuteram com lambda ultrapassando AICsexecutou inicialmente commits em maio de 2014 com adiccedilatildeo de coacutedigo novo utilizandoexpressotildees lambda e apoacutes um mecircs realizou um commit maior com a refatoraccedilatildeo de todasas AICs para expressotildees lambda Apoacutes a refatoraccedilatildeo o projeto se preocupou em mantera utilizaccedilatildeo de expressotildees lambda ao mesmo tempo que o uso de AICs se manteve apenasaos casos de classes com interfaces natildeo funcionais A Figura 58 apresenta uma parte docommit de refatoraccedilatildeo de coacutedigo que mostra em vermelho a parte eliminada do coacutedigo(AIC) e em verde o coacutedigo novo representando a substituiccedilatildeo por uma expressatildeo lambda

41

Figura 58 Commit de refatoraccedilatildeo de coacutedigo do projeto Vertx [3]

Alguns projetos ainda natildeo se preocuparam em refatorar o coacutedigo para o uso de ex-pressotildees lambda ateacute a data deste trabalho que eacute o caso do projeto guava que apresentouum commit em 03112016 com a atualizaccedilatildeo do projeto para Java 8 Mas a partir daatualizaccedilatildeo se preocupou em utilizar as expressotildees lambda apenas na implementaccedilatildeo decoacutedigo novo O cenaacuterio em que a refatoraccedilatildeo natildeo eacute prioridade ainda eacute a realidade de vaacuteriosprojetos de grande porte visto que os dados de projetos sem nenhuma expressatildeo lambdasatildeo o maior nuacutemero neste trabalho Poreacutem projetos que jaacute adotaram a utilizaccedilatildeo do Java8 tendem a mudar isso com o passar do tempo A Figura 59 apresenta em verde umaadiccedilatildeo de coacutedigo novo com expressatildeo lambda sem a eliminaccedilatildeo de algum coacutedigo anteriora esse que estaria em vermelho

42

Figura 59 Exemplo de um arquivo do commit de adiccedilatildeo de coacutedigo novo em Java 8 doprojeto Guava [4]

Na categoria de projetos em que os AICs e expressotildees lambda aumentam proporci-onalmente (grupo 1) o projeto agera realizou um commit em 19052016 com a adiccedilatildeoda biblioteca retrolambda como dependecircncia do projeto Essa biblioteca utilizada prin-cipalmente por projetos Android permite executar coacutedigo Java 8 contendo expressotildeeslambda em Java 5 6 e 7 [48] O commit tambeacutem apresenta refatoraccedilatildeo dos AICs ad-vindos de interfaces funcionais para expressotildees lambda Apesar de o projeto continuar autilizar as expressotildees lambda em seus commits posteriores o nuacutemero de AICs tambeacutemcontinuou a aumentar visualizando os commits posteriores notou-se que esses AICs satildeorelativos a interfaces natildeo funcionais ou seja que possuem mais de um meacutetodo O projetoAndroid-CleanArchitecture eacute similar ao agera pois tambeacutem optou pela instalaccedilatildeo da bi-blioteca retrolambda para uso de expressotildees lambda em seus coacutedigos e como tambeacutem eacuteum projeto de pequeno porte houve uma pequena refatoraccedilatildeo dos AICs A Figura 510mostra a parte do commit de refatoraccedilatildeo de coacutedigo em que o desenvolvedor adiciona abiblioteca retrolambda como dependecircncia

43

Figura 510 Commit de adiccedilatildeo da biblioteca Retrolambda no projeto Agera [5]

Outro caso interessante eacute o do projeto RxJava que em 2015 optou pela refatoraccedilatildeodo coacutedigo para a utilizaccedilatildeo de expressotildees lambda quase eliminando por completo o usode AICs mas que no ano seguinte reverteu os commits de forma que eliminasse comple-tamente o uso de expressotildees lambda para manter a retrocompatibilidade com o Java 6A Figura 511 demonstra uma parte do commit de reversatildeo do coacutedigo para Java 6 emque pode ser visto em vermelho o coacutedigo anterior com expressotildees lambda e o verde como novo coacutedigo utilizando AIC novamente

44

Figura 511 Commit de remoccedilatildeo de Lambdas e volta para o uso de AICs no projetoRXJava [6]

Essa preocupaccedilatildeo com retrocompatibilidade de coacutedigo pode ser um fator crucial nadecisatildeo das equipes de desenvolvimento na hora de decidir como fazer o software co-evoluircom a linguagem sem perder a compatibilidade com versotildees anteriores

45

Capiacutetulo 6

Consideraccedilotildees Finais

Este estudo permitiu entender melhor como projetos estatildeo realizando a migraccedilatildeo para oJava 8 em especial utilizando uma nova caracteriacutestica introduzida expressatildeo lambdaApesar de a maioria dos projetos populares considerados natildeo possuiacuterem nenhuma ocor-recircncia de expressotildees lambda os projetos que tinham expressotildees lambda foram suficientespara realizar um primeiro estudo de caracterizaccedilatildeo no uso desta caracteriacutestica e com osprojetos efetivamente utilizados para estudo foi possiacutevel agrupaacute-los quanto a maneira emque as expressotildees lambda estavam sendo utilizadas quando comparadas com AICs em 5grandes grupos quando AIC e lambda aumentam proporcionalmente quando AIC dimi-nui e lambda aumenta ultrapassando AIC quando AIC diminui mas continua superior aolambda crescente expressotildees lambda que foram introduzidas e retiradas completamentedo coacutedigo e expressotildees lambda que natildeo existem em quantidades expressivas

Foi possiacutevel entatildeo realizar um estudo aprofundado levando em consideraccedilatildeo as di-ferentes maneiras com que as expressotildees lambda foram adotadas nos projetos atraveacutes daescolha de um projeto que representasse cada grupo para anaacutelise Dentre os cinco projetosestudados foi possiacutevel observar alguns padrotildees tipicamente adotados por desenvolvedorespara implementar expressotildees lambda em seus projetos como a utilizaccedilatildeo da bibliotecas(retrolambda) que permitissem uma flexibilizaccedilatildeo na utilizaccedilatildeo de expressotildees lambda oucomo lambda eacute primariamente utilizada para substituir determinados AICs ou operaccedilotildeesem Collection

Aleacutem disso foi possiacutevel observar como a refatoraccedilatildeo de coacutedigo acontece em cada umdesses projetos Observou-se como projetos menores tendem a refatorar coacutedigo maisfacilmente ao passo que projetos maiores e mais complexos fazem menos refatoraccedilatildeo oudemoram mais entre o periacuteodo em que houve a primeira migraccedilatildeo de coacutedigo para a novaversatildeo da linguagem ateacute o periacuteodo em que realmente decidem refatorar coacutedigo Aleacutem dacomplexidade do projeto influenciar na decisatildeo de migrar o projeto para uma versatildeo maisrecente da linguagem a preocupaccedilatildeo com retrocompatibilidade com versotildees anteriores da

46

linguagem tambeacutem podem ser uma barreira para que projetos comecem a evoluir o coacutedigojuntamente com a evoluccedilatildeo da linguagem

Ainda assim foi possiacutevel observar que a preocupaccedilatildeo com a co-evoluccedilatildeo do software-linguagem existe entre os desenvolvedores de projetos mas a realizaccedilatildeo da migraccedilatildeo aindaacontece lentamente devido agrave diversos fatores que precisam ser levados em consideraccedilatildeopara a manutenccedilatildeo do projeto

Para trabalhos e contribuiccedilotildees futuras seria interessante desenvolver uma ferramentaque pudesse analisar diretamente no coacutedigo-fonte as oportunidades de aplicaccedilatildeo de ex-pressotildees lambda dessa forma poderiam ser analisadas as porcentagens de conversatildeo decoacutedigo para Java 8 e obter melhores conclusotildees sobre a importacircncia que os projetos estatildeodando para a evoluccedilatildeo de seus coacutedigos Outro fator interessante seria aplicar mais Visitorsagrave ferramenta static-analysis e fazer este mesmo estudo aplicado agrave outras caracteriacutesticasda linguagem

47

Referecircncias

[1] Kagdi Huzefa Michael L Collard e Jonathan I Maletic A survey and taxonomyof approaches for mining software repositories in the context of software evolution2007 ix 3 8 9 10 11

[2] DBeaver Dbeaver - features httpdbeaverjkissorgdocsfeatures ix 29

[3] Eclipse Vertx commit Java8-ify code httpsgithubcomeclipsevertxcommit93f95e9c77419f442a42fe711b6eeaef88192fd3 ix 42

[4] Google Guava commit Release java 8 changes to guava httpsgithubcomgoogleguavacommit73e382fa877f80994817a136b0adcc4365ccd904 ix 43

[5] Google Agera commit Collapsed testapp with retrolambda httpsgithubcomgoogleageracommit5e518b7b05f9e7a34a314945f68deff7b2c3e334 ix 44

[6] ReactiveX Rxjava commit 2x full jdk 6 compatible backport + includ-ing bugfixes up to today httpsgithubcomReactiveXRxJavacommit000a174d87a901135f9665d3b11f3627fd2dc4ed ix 45

[7] Godfrey M W e D M German The past present and future of software evolutionEm 2008 Frontiers of Maintenance paacuteginas 129ndash138 Sept 2008 1 6

[8] Favre J M Languages evolve too changing the software time scale Em Principles ofSoftware Evolution Eighth International Workshop on paacuteginas 33ndash42 IEEE 20051 5 7

[9] Overbey Jeffrey L e Ralph E Johnson Regrowing a language refactoring tools allowprogramming languages to evolve Em ACM SIGPLAN Notices volume 44 paacuteginas493ndash502 ACM 2009 1 5 7 8 12

[10] Grechanik Mark Collin McMillan Luca DeFerrari Marco Comi Stefano CrespiDenys Poshyvanyk Chen Fu Qing Xie e Carlo Ghezzi An empirical investiga-tion into a large-scale java open source code repository Em Proceedings of the2010 ACM-IEEE International Symposium on Empirical Software Engineering andMeasurement ESEM rsquo10 paacuteginas 111ndash1110 New York NY USA 2010 ACMISBN 978-1-4503-0039-1 httpdoiacmorg10114518527861852801 1

[11] TIOBE Tiobe httpswwwtiobecomtiobe-index 1 14

48

[12] Gyori Alex Lyle Franklin Danny Dig e Jan Lahoda Crossing the gap from im-perative to functional programming through refactoring Em Proceedings of the 20139th Joint Meeting on Foundations of Software Engineering ESECFSE 2013 paacute-ginas 543ndash553 New York NY USA 2013 ACM ISBN 978-1-4503-2237-9 httpdoiacmorg10114524914112491461 2 11 24 39

[13] OpenJDK State of the lambda httpcropenjdkjavanet~briangoetzlambdalambda-state-4html 2

[14] Han Jiawei Micheline Kamber e Jian Pei Data Mining Concepts and TechniquesMorgan Kaufmann Publishers Inc San Francisco CA USA 3rd ediccedilatildeo 2011ISBN 0123814790 9780123814791 3

[15] Fowler Martin e Kent Beck Refactoring improving the design of existing codeAddison-Wesley Professional 1999 5 7

[16] Lehman M M J F Ramil P D Wernick D E Perry e W M Turski Met-rics and laws of software evolution - the nineties view Em Proceedings of the4th International Symposium on Software Metrics METRICS rsquo97 paacuteginas 20ndashWashington DC USA 1997 IEEE Computer Society ISBN 0-8186-8093-8 httpdlacmorgcitationcfmid=823454823901 6

[17] Hassan Ahmed E e Tao Xie Software intelligence The future of mining softwareengineering data Em Proceedings of the FSESDP Workshop on Future of SoftwareEngineering Research FoSER rsquo10 paacuteginas 161ndash166 New York NY USA 2010ACM ISBN 978-1-4503-0427-6 httpdoiacmorg101145188236218823978 9

[18] Hassan Ahmed E The road ahead for mining software repositories Em Frontiers ofSoftware Maintenance 2008 FoSM 2008 paacuteginas 48ndash57 IEEE 2008 8

[19] Berry Michael J e Gordon Linoff Data Mining Techniques For Marketing Salesand Customer Support John Wiley amp Sons Inc New York NY USA 1997ISBN 0471179809 10

[20] Parnin Chris Christian Bird e Emerson Murphy-Hill Java generics adoption hownew features are introduced championed or ignored Em Proceedings of the 8thWorking Conference on Mining Software Repositories paacuteginas 3ndash12 ACM 2011 12

[21] Oracle The java language specification httpsdocsoraclecomjavasespecsjlsse8jls8pdf 13

[22] Oracle The history of java technology httpwwworaclecomtechnetworkjavajavaseoverviewjavahistory-index-198355html 13

[23] Murphy Kieron So why did they decide to call itjava httpwwwjavaworldcomarticle2077265core-javaso-why-did-they-decide-to-call-it-java-html 13

[24] McGraw Tata Object-oriented Programming with Java Essentials and ApplicationsHill Education 13

49

[25] Oracle Differences between java ee and java se httpdocsoraclecomjavaee6firstcupdocgkhoyhtml 13

[26] Lindsey Clark S The History of Java Cambridge 14

[27] Oracle The java language environment httpwwworaclecomtechnetworkjavaintro-141325html 14

[28] Oracle Jdk 8 httpopenjdkjavanetprojectsjdk8 15 24

[29] Oracle Enhancements in java se 8 httpdocsoraclecomjavase8docstechnotesguideslanguageenhancementshtmljavase8 15 16 17

[30] Oracle Lambda expressions httpdocsoraclecomjavasetutorialjavajavaOOlambdaexpressionshtml 16 18 21

[31] Oracle Method references httpdocsoraclecomjavasetutorialjavajavaOOmethodreferenceshtml 16

[32] Oracle Default methods httpdocsoraclecomjavasetutorialjavaIandIdefaultmethodshtml 17

[33] Oracle Repeating annotations httpdocsoraclecomjavasetutorialjavaannotationsrepeatinghtml 17

[34] Oracle Type annotations httpdocsoraclecomjavasetutorialjavaannotationstype_annotationshtml 17

[35] Oracle Anonymous inner classes httpsdocsoraclecomjavasetutorialjavajavaOOanonymousclasseshtml 19

[36] Kothari CR Research Methodology Methods and Techniques New Age Interna-tional (P) Limited 2004 ISBN 9788122415223 httpsbooksgooglecombrbooksid=8c6gkbKi-F4C 22

[37] Nakakoji Kumiyo Yasuhiro Yamamoto Yoshiyuki Nishinaka Kouichi Kishida eYunwen Ye Evolution patterns of open-source software systems and communitiesEm IWPSE rsquo02 Proceedings of the International Workshop on Principles of SoftwareEvolution paacuteginas 76ndash85 New York NY USA 2002 ACM Press ISBN 1581135459httpdxdoiorg101145512035512055 23

[38] Rahman Foyzur Christian Bird e Premkumar Devanbu Clones What is that smellEmpirical Software Engineering 17(4-5)503ndash530 2012 24

[39] Chacon Scott Pro Git Apress Berkely CA USA 1st ediccedilatildeo 2009ISBN 1430218339 9781430218333 25

[40] Cavalcanti Thiago Gomes e Viniacutecius Correa de Almeida Caracterizaccedilatildeo do uso deconstruccedilotildees da linguagem java em projetos open-source Publicaccedilatildeo online 2016httpbdmunbbrhandle1048315733 27

50

[41] Parr Terence Language Implementation Patterns Create Your Own Domain-Specific and General Programming Languages Pragmatic Bookshelf 1st ediccedilatildeo 2009ISBN 193435645X 9781934356456 27

[42] Janssen Thorben 5 reasons to use jpa hibernate Publicaccedilatildeo online httpswwwsitepointcom5-reasons-to-use-jpa-hibernate 27

[43] Franklin Lyle Alex Gyori Jan Lahoda e Danny Dig Lambdaficator From imperativeto functional programming through automated refactoring Em Proceedings of the2013 International Conference on Software Engineering ICSE rsquo13 paacuteginas 1287ndash1290 Piscataway NJ USA 2013 IEEE Press ISBN 978-1-4673-3076-3 httpdlacmorgcitationcfmid=24867882486986 29

[44] Google Agera httpsgithubcomgoogleagerawiki 34

[45] Eclipse Eclipse vertx httpvertxio 35

[46] Cejas Fernando Android cleanarchitecture httpsgithubcomandroid10Android-CleanArchitecture 36

[47] ReactiveX Rxjava httpsgithubcomReactiveXRxJava 37

[48] Luontola Esko Retrolambda httpsgithubcomorfjackalretrolambda 43

51

Anexo I

Projetos utilizados

fastjson

platform_frameworks_base

netty

material-dialogs

kotlin

okhttp

tinker

AndroidUtilCode

RxJava

spring-boot

java-design-patterns

elasticsearch

ExoPlayer

kafka

vertx

realm-java

guava

zipkin

bazel

stetho

Signal-Android

glide

agera

fresco

plaid

presto

libgdx

spark

52

disruptor

lottie-android

flexbox-layout

PocketHub

zxing

spring-framework

deeplearning4j

dropwizard

interviews

BaseRecyclerViewAdapterHelper

uCrop

DanmakuFlameMaster

lottie-react-native

android-UniversalMusicPlayer

AndroidInterview-Q-A

greenDAO

retrofit

MaterialDrawer

BottomBar

druid

MPAndroidChart

Hystrix

guice

recyclerview-animators

dubbo

androidannotations

RxJava-Android-Samples

PhotoView

clojure

CircleImageView

AndroidSwipeLayout

jedis

MaterialViewPager

butterknife

junit4

RxBinding

leakcanary

SimianArmy

picasso

UltimateRecyclerView

53

AndroidViewAnimations

AppIntro

FizzBuzzEnterpriseEdition

ion

cheesesquare

physical-web

RxAndroid

Android-CleanArchitecture

Calligraphy

Android-Bootstrap

iosched

Android_Data

MaterialDesignLibrary

ListViewAnimations

EventBus

java8-tutorial

AndroidSlidingUpPanel

dagger

okhttputils

logger

HomeMirror

Material-Animations

android-Ultra-Pull-To-Refresh

android-async-http

Android-ObservableScrollView

Android-Universal-Image-Loader

ActionBarSherlock

SlidingMenu

storm

PagerSlidingTabStrip

Android-PullToRefresh

54

  • Dedicatoacuteria
  • Agradecimentos
  • Resumo
  • Abstract
  • Introduccedilatildeo
    • Contexto
    • Objetivos
      • Objetivos Gerais
      • Objetivos Especiacuteficos
        • Metodologia
        • Organizaccedilatildeo do Trabalho
          • Evoluccedilatildeo e Mineraccedilatildeo de Repositoacuterios de Software
            • Evoluccedilatildeo de Software
            • MSR Mineraccedilatildeo de dados e a Engenharia de Software
              • Classificaccedilatildeo
                • Trabalhos Relacionados
                  • Java SE 8 e JDK 8
                    • Histoacuterico
                    • Princiacutepios
                    • Evoluccedilatildeo
                    • Expressotildees Lambda
                      • Sintaxe
                      • Principais formas de uso
                          • Estudo e o Processo de Mineraccedilatildeo
                            • Questotildees de Pesquisa
                            • Fonte de Dados e Objetos de Estudo
                            • Processo de Mineraccedilatildeo
                              • static-analysis
                              • BDAnalisador
                                • Classificaccedilatildeo e Anaacutelise
                                  • Meacutedia de Lambda
                                  • Anaacutelise Temporal
                                  • Refatoraccedilatildeo de Coacutedigo
                                  • Casos de Uso
                                      • Resultados Obtidos e Anaacutelise
                                        • Visatildeo Geral
                                          • Projetos Selecionados
                                          • agera
                                          • vertx
                                          • Android-CleanArchitecture
                                          • RxJava
                                          • guava
                                            • Refatoraccedilatildeo de Coacutedigo
                                            • Estudos de Caso
                                              • Consideraccedilotildees Finais
                                              • Referecircncias
                                              • Anexo
                                              • Projetos utilizados

Dedicatoacuteria

Dedicamos este trabalho agraves nossas famiacutelias que sempre noacutes apoiaram a todos os nossosamigos colegas e professores da universidade que nos ajudaram durante a nossa graduaccedilatildeoe colaboraram de alguma forma para nossa formatura Dedicamos tambeacutem ao nossoorientador professor doutor Rodrigo Bonifaacutecio que nos ajudou durante o desenvolvimentodeste trabalho

iii

Agradecimentos

Agradecemos aos nossos familiares que sempre nos apoiam incondicionalmente durantetoda a nossa vida e especialmente durante o nosso periacuteodo na Universidade diante detodos os desafios enfrentados acreditando sempre no nosso sucesso

Ao nosso orientador professor doutor Rodrigo de Almeida Bonifaacutecio por trabalharconosco no desafio de desenvolver este projeto

E por fim a todos os nossos amigos que ingressaram no curso de ciecircncia de computaccedilatildeona UnB conosco no segundo semestre de 2010

iv

Resumo

Este trabalho apresenta um estudo sobre como as expressotildees lambda introduzidas nalinguagem Java desde 2014 estatildeo sendo utilizadas em projetos Java open-source Atraveacutesde uma amostragem de 99 projetos populares existentes na plataforma Github observou-se como e quando esta caracteriacutestica foi introduzida nestes projetos identificando padrotildeesadotados e meacutetodos de refatoraccedilatildeo de coacutedigo caso estes existam Foi realizado um estudogeral para identificar padrotildees gerais aleacutem de estudos de caso com o objetivo de obter umaanaacutelise mais aprofundada sobre o assunto Foram escolhidos cinco projetos previamenteclassificados de acordo com a abordagem distinta de introduccedilatildeo de expressotildees lambdapara realizar os estudos de caso

Palavras-chave Mineraccedilatildeo em Repositoacuterios de Software git Java Expressotildees LambdaAnonymous Inner Class

v

Abstract

This work presents a study about how lambda expressions are being used in open-soruceJava projects Using a sample of 99 popular projectsrsquo repositories in Github it wasanalyzed how and when this feature was introduced within those projects identifyingpatterns used to implement such feature and possible code refactoring approaches in caseany code was refactored It was conducted a general study to identify similarities amongprojects and the way they use lambda expressions and also case studies that intendedto realize a richer analysis about the subject For the case studies it was chosen fiveprojects previously classified according to the distinct approach used when introducinglambda expressions

Keywords Mining Software Repositories git Java Lambda Expressions AnonymousInner Class

vi

Sumaacuterio

1 Introduccedilatildeo 111 Contexto 112 Objetivos 2

121 Objetivos Gerais 2122 Objetivos Especiacuteficos 2

13 Metodologia 314 Organizaccedilatildeo do Trabalho 3

2 Evoluccedilatildeo e Mineraccedilatildeo de Repositoacuterios de Software 521 Evoluccedilatildeo de Software 622 MSR Mineraccedilatildeo de dados e a Engenharia de Software 8

221 Classificaccedilatildeo 823 Trabalhos Relacionados 11

3 Java SE 8 e JDK 8 1331 Histoacuterico 1332 Princiacutepios 1433 Evoluccedilatildeo 1534 Expressotildees Lambda 18

341 Sintaxe 18342 Principais formas de uso 19

4 Estudo e o Processo de Mineraccedilatildeo 2241 Questotildees de Pesquisa 2342 Fonte de Dados e Objetos de Estudo 2443 Processo de Mineraccedilatildeo 25

431 static-analysis 26432 BDAnalisador 27

44 Classificaccedilatildeo e Anaacutelise 29441 Meacutedia de Lambda 30

vii

442 Anaacutelise Temporal 30443 Refatoraccedilatildeo de Coacutedigo 32444 Casos de Uso 32

5 Resultados Obtidos e Anaacutelise 3351 Visatildeo Geral 33

511 Projetos Selecionados 34512 agera 34513 vertx 35514 Android-CleanArchitecture 36515 RxJava 37516 guava 38

52 Refatoraccedilatildeo de Coacutedigo 3953 Estudos de Caso 41

6 Consideraccedilotildees Finais 46

Referecircncias 48

Anexo 51

I Projetos utilizados 52

viii

Lista de Figuras

21 Taxonomia em camadas adaptada do trabalho de Kagdi et al [1] 9

41 Processo utilizado para realizaccedilatildeo do estudo 2242 Metodologia implementada para coleta e tratamento de dados 2643 Diagrama de classes UML do BDAnalisador 2844 Modelo relacional do banco de dados populado pelo BDAnalisador Imagem

gerada com software DBeaver [2] 2945 Classificaccedilatildeo dos projetos 31

51 Graacuteficos dos projetos separados por ano de introduccedilatildeo de expressotildees lambdae meacutedia de lambda por snapshot 34

52 Graacuteficos de anaacutelise temporal do projeto agera 3553 Graacuteficos de anaacutelise temporal do projeto Vertx 3654 Graacuteficos de anaacutelise temporal do projeto Android-CleanArchitecture 3755 Graacuteficos de anaacutelise temporal do projeto RxJava 3856 Graacuteficos de anaacutelise temporal do projeto Guava 3957 Comparaccedilatildeo entre todos os projetos com expressatildeo lambda sobre refatora-

ccedilatildeo de coacutedigo no mecircs de introduccedilatildeo da caracteriacutestica 4058 Commit de refatoraccedilatildeo de coacutedigo do projeto Vertx [3] 4259 Exemplo de um arquivo do commit de adiccedilatildeo de coacutedigo novo em Java 8 do

projeto Guava [4] 43510 Commit de adiccedilatildeo da biblioteca Retrolambda no projeto Agera [5] 44511 Commit de remoccedilatildeo de Lambdas e volta para o uso de AICs no projeto

RXJava [6] 45

ix

Lista de Tabelas

31 As versotildees anteriores de java e principais caracteriacutesticas 14

41 Informaccedilotildees mensais sobre o projeto agera 30

x

Capiacutetulo 1

Introduccedilatildeo

11 Contexto

A evoluccedilatildeo e manutenccedilatildeo de software eacute uma caracteriacutestica intriacutenseca do desenvolvimentode sistemas considerando que a partir do momento em que um software comeccedila a serdesenvolvido satildeo realizadas constantes manutenccedilotildees [7] Apesar de o conceito de evolu-ccedilatildeo de software representar uma grande aacuterea de pesquisa na engenharia de software nemsempre pesquisadores reconhecem a importacircncia da evoluccedilatildeo das linguagens de progra-maccedilatildeo como um grande fator influenciador na evoluccedilatildeo de software [8] uma vez que umsoftware que natildeo evolui junto com a sua linguagem tem a sua capacidade de evoluccedilatildeolimitada [9]

Surge entatildeo a necessidade de alinhar estudos empiacutericos com o intuito de investigar esteprocesso de evoluccedilatildeo do software juntamente com a evoluccedilatildeo de sua linguagem atraveacutesde investigaccedilatildeo e anaacutelise de seu coacutedigo fonte que pode ser feita por meio de anaacutelise de re-positoacuterios de software em grande escala o que deu origem a abordagem de Mineraccedilatildeo emRepositoacuterio de Software (MSR) O MSR tem como base o estudo sistemaacutetico e empiacutericode repositoacuterios de software com o objetivo de analisaacute-los utilizando informaccedilotildees estatis-ticamente uacuteteis coletadas para observar diversos padrotildees como a evoluccedilatildeo do softwarepadrotildees de projetos dentre outros [10]

A complexidade e dificuldade de realizar tal estudo empiacuterico eacute alta pois atualmenteexistem diversos tipos de plataformas para coleta de dados linguagens e focos variadosAssim para escolher o foco do objeto de estudo eacute necessaacuterio levar em consideraccedilatildeo estasdificuldades e especificaccedilotildees e dessa forma este trabalho tem como foco a anaacutelise desistemas de software na linguagem Java

Ateacute a data deste trabalho de acordo com os dados do TIOBE [11] Java eacute a linguagemde programaccedilatildeo com mais linhas de codigo catalogadas no mundo Isso faz com queseja extremamente interessante o estudo empiacuterico da evoluccedilatildeo da linguagem e software

1

desenvolvidos nela desde sua primeira versatildeo antes de se tornar uma linguagem populare ainda com poucos pacotes ateacute a sua atual versatildeo estaacutevel com uma grande quantidadede novas caracteriacutesticas

A versatildeo mais recente do Java a JDK 8 possui diversas adiccedilotildees interessantes para aorganizaccedilatildeo do coacutedigo e facilidade do programador Dessas novas implementaccedilotildees con-ceitos de linguagem funcional como expressotildees lambda e iteradores externos que recebemuma expressatildeo lambda como argumento como o map() filter() e forEach() tornarama escrita de coacutedigo paralelo mais simples e permitiram ganhos de performance [12]

Diversas linguagens de programaccedilatildeo tambeacutem populares como Javascript e Ruby jaacutepossuiacuteam expressotildees lambda desde suas versotildees iniciais sendo o Java 8 em 2014 maisuma linguagem a introduzir esse novo conceito Podemos descrever as expressotildees comopequenas funccedilotildees normalmente feitas em apenas uma linha sem um nome identificadorElas podem ser retornadas de outras funccedilotildees ou passadas como paracircmetro Um exemplode expressatildeo lambda pode ser visualizado pela funccedilatildeo de soma de dois inteiros escrita daforma (int x int y)rarr x + y [13]

Antes da inclusatildeo de expressotildees lambda em Java o mesmo comportamento era possiacutevelutilizando classes anocircnimas ou AICs (Anonymous inner classes) Contudo eacute necessaacute-rio a criaccedilatildeo de uma interface com apenas um meacutetodo e instanciaacute-la como uma AIC Autilizaccedilatildeo de AICs gera inuacutemeras linhas de coacutedigo adicionais que poderiam ser encapsu-ladas em apenas uma linha com a utilizaccedilatildeo de expressotildees lambda Como eacute interessantepara o programador ter um coacutedigo sempre mais legiacutevel e sucinto torna-se interessante arefatoraccedilatildeo de coacutedigo que utiliza uma tecnologia mais antiga para a nova

Assim este trabalho visa conduzir um estudo de mineraccedilatildeo em repositoacuterios de softwareopen-source desenvolvidos na linguagem Java para entender como desenvolvedores estatildeose adaptando agraves novas mudanccedilas introduzidas no Java 8

12 Objetivos

121 Objetivos Gerais

Este trabalho tem como objetivo geral caracterizar o uso de expressotildees lambda entre osprojetos Java mais populares desenvolvidos pela comunidade do GitHub

122 Objetivos Especiacuteficos

Sabendo do benefiacutecio da refatoraccedilatildeo de coacutedigo para o uso de expressotildees lambda e dapouca quantidade de estudos acadecircmicos sobre o assunto surge entatildeo uma oportunidadede pesquisa para melhor entender a forma como essa caracteriacutestica estaacute sendo adotada por

2

projetos com foco em refatoraccedilatildeo de coacutedigo o que originou a necessidade deste estudoAssim para alcanccedilar o objetivo deste trabalho foram traccedilados em forma de questotildees depesquisa os objetivos especiacuteficos a serem alcanccedilados por este trabalho

bull Quando os projetos Java de coacutedigo aberto comeccedilaram a introduzir o uso de expres-sotildees lambda em seus coacutedigos e quatildeo significativo eacute esse uso

bull Como as equipes de desenvolvimento estatildeo utilizando expressotildees lambda atraveacutesde refatoraccedilatildeo de coacutedigo ou introduzindo apenas em coacutedigo novo

bull Quais satildeo os padrotildees tipicamente adotados para o uso de expressotildees lambda

13 Metodologia

Este trabalho foi desenvolvido utilizando uma abordagem de MSR que dentro da clas-sificaccedilatildeo de Kagdi et al [1] pode ser divido em quatro grandes etapas Primeiramentedefiniu-se a fonte de dados a ser utilizada e dentre as possibilidades encontradas na lite-ratura [14] optou-se por utilizar repositoacuterios de controle de versatildeo mais especificamenteo Github tendo como criteacuterio de seleccedilatildeo os 99 repositoacuterios Java mais populares na plata-forma Em seguida definiu-se o propoacutesito do estudo no caso os objetivos em forma deperguntas de pesquisa a serem respondidas

A terceira grande etapa foi a definiccedilatildeo do meacutetodo em si a forma como seria realizadoo estudo e este por sua vez constitui-se de download de todos os 99 repositoacuterios maispopulares realizaccedilatildeo de uma anaacutelise estaacutetica para coletar informaccedilotildees necessaacuterias de cadaprojeto por versatildeo e armazenamento de informaccedilotildees pertinentes em uma base de dados

A etapa final foi a realizaccedilatildeo da avaliaccedilatildeo dos dados obtidos atraveacutes de meacutetricas eanaacutelises quantitativas para melhor responder as questotildees de pesquisa aleacutem de estudos decaso feitos com cinco projetos escolhos de acordo com a maneira distinta em que estesfazem o uso de expressotildees lambda

14 Organizaccedilatildeo do Trabalho

Este trabalho se divide em seis capiacutetulos

bull Capiacutetulo 2 Apresenta um referencial teoacuterico sobre evoluccedilatildeo de software demons-trando as estrateacutegias utilizadas e a importacircncia da evoluccedilatildeo em um projeto de coacutedigoaberto aleacutem de enunciar as leis de evoluccedilatildeo de software de Lehman O capiacutetulo tam-beacutem apresenta o processo de mineraccedilatildeo de dados explicando cada uma das camadasda classificaccedilatildeo e demonstra trabalhos relacionados a esse toacutepico que serviram debase para este trabalho

3

bull Capiacutetulo 3 Traz um contexto histoacuterico e teacutecnico da linguagem Java necessaacuteriospara entender a importacircncia que as novas caracteriacutesticas adicionadas na versatildeo8 fornecem para os desenvolvedores de projetos determinados a manter o projetosempre evoluiacutedo Tambeacutem eacute apresentada uma seccedilatildeo para demonstrar os detalhese formas de utilizaccedilatildeo das expressotildees Lambda que satildeo o foco dos objetivos destetrabalho

bull Capiacutetulo 4 Descreve a metodologia e processo utilizados para o desenvolvimentoe obtenccedilatildeo dos resultados deste trabalho O capiacutetulo desenvolve o contexto dasquestotildees de pesquisa e explica os motivos e processos de desenvolvimento das fer-ramentas utilizadas para minerar os dados aleacutem de determinar a classificaccedilatildeo dosresultados obtidos em grupos para facilitar a organizaccedilatildeo dos dados de forma queas perguntas sejam respondidas claramente

bull Capiacutetulo 5 Apresenta os resultados obtidos e de que forma eles ajudaram a respon-der as questotildees de pesquisa Eacute descrita uma anaacutelise de um projeto de cada categoriaespecificada no capiacutetulo anterior a fim de contextualizar cada tipo de resultado paraque o leitor entenda a forma que os projetos Java estatildeo lidando com as expressotildeesLambda

bull Capiacutetulo 6 Descreve as dificuldades e problemas obtidos durante o trabalho e deque forma eles influenciaram nos resultados Tambeacutem eacute apresentada uma seccedilatildeocontendo as ideias surgidas durante o desenvolvimento deste trabalho que ficarampara ser feitas no futuro devido agrave gama de informaccedilotildees que a mineraccedilatildeo dos dadostrouxe

4

Capiacutetulo 2

Evoluccedilatildeo e Mineraccedilatildeo deRepositoacuterios de Software

As linguagens de programaccedilatildeo estatildeo sempre evoluindo aumentando sua complexidade eexpressividade Da mesma forma aleacutem de se preocupar com dificuldades de estabelecercompatibilidade do software em relaccedilatildeo a tecnologias antigas desenvolvedores tambeacutemprecisam acompanhar essa evoluccedilatildeo das linguagens para que suas ferramentes natildeo setornem obsoletas [9] Isso agrega um grande desafio no desenvolvimento e evoluccedilatildeo desoftware

O conceito de evoluccedilatildeo de software amadureceu e se tornou um grande foco de pes-quisa Poreacutem nem sempre estudos de evoluccedilatildeo de software reconhecem a importacircncia daevoluccedilatildeo da linguagem de programaccedilatildeo no contexto do desenvolvimento de software [8]Quando um coacutedigo natildeo evolui junto com a linguagem com o objetivo de manter umacompatibilidade com versotildees anteriores sua capacidade de evoluccedilatildeo se torna limitada [9]

A refatoraccedilatildeo de coacutedigo que consiste em realizar mudanccedilas no coacutedigo fonte sem modi-ficar o comportamento observado do software [15] permite que a evoluccedilatildeo de linguagens eferramentas aconteccedilam mais naturalmente No entanto novos desafios surgem como porexemplo saber quando e como realizar a refatoraccedilatildeo de coacutedigo de forma eficiente e coesaDentre as teacutecnicas de pesquisa em engenharia de software para entender esse problematorna-se interessante explorar as teacutecnicas de mineraccedilatildeo de dados aplicados a repositoacuteriosde software com o objetivo de entender o relacionamento entre evoluccedilatildeo e refatoraccedilatildeo

Assim este capiacutetulo busca esclarecer conceitos e estrateacutegias de evoluccedilatildeo de softwaremineraccedilatildeo de repositoacuterios de software e o estado da arte sobre o assunto

5

21 Evoluccedilatildeo de Software

Durante o processo de produccedilatildeo e manutenccedilatildeo de software haacute a necessidade de diversastomadas de decisotildees sobre seu desenvolvimento como por exemplo decidir como melho-rar a qualidade do software Tais decisotildees precisam ser tomadas levando em consideraccedilatildeoo ambiente em que se estaacute inserido com novas tecnologias surgindo todos os dias fe-edback de usuaacuterios exigentes e concorrentes produzindo um software similar com ideiasinovadoras

Tudo isso acontece em um ritmo de constante mudanccedila e assim como diria Lehmaneacute imprescindiacutevel que software de sistemas sejam capazes de evoluir ou os mesmos correm orisco de sofrer uma morte prematura [16] fazendo assim da evoluccedilatildeo de software um con-ceito importante dentro do seu processo de desenvolvimento Essa evoluccedilatildeo deve ocorrerconsiderando o ambiente em que o software estaacute inserido o qual possui aspectos teacutecnicos esociais sua infraestrutura que pertence ao seu ambiente teacutecnico o qual sempre necessitamanutenccedilatildeo e ao mesmo tempo usuaacuterios que utilizam o software e estatildeo constantementeformando opiniotildees oferecendo feedback e na expectativa por novidades [7] Assim a me-dida que novas caracteriacutesticas satildeo desenvolvidas novas tecnologias de infraestrutura satildeonecessaacuterias novos requisitos satildeo adicionados e o sistema de software deve se adaptar aessas mudanccedilas

Com relaccedilatildeo aos aspectos sociais que envolvem a evoluccedilatildeo do software eacute importanteressaltar os conceitos baacutesicos de como essa evoluccedilatildeo acontece Durante um estudo empiacutericopioneiro na aacuterea de evoluccedilatildeo de software para sistemas de grande escala Lehman e seuscolaboradores formularam um conjunto de observaccedilotildees que hoje satildeo conhecidas como asleis da evoluccedilatildeo de software ou simplesmente Leis de Lehman [16] No geral as leis deevoluccedilatildeo de software podem ser descritas da seguinte forma [16]

1 Mudanccedila contiacutenua um sistema se tornaraacute progressivamente menos satisfatoacuteriopara seus usuaacuterios com o tempo a menos que se adapte continuamente agraves necessi-dades que surgiratildeo

2 Complexidade Crescente um sistema se tornaraacute cada vez mais complexo amenos que se trabalhe para explicitamente reduzir sua complexidade

3 Auto-regulaccedilatildeo o processo de evoluccedilatildeo de software eacute auto-regulatoacuterio no que dizrespeito agraves distribuiccedilotildees dos artefatos e produtos produzidos

4 Conservaccedilatildeo da estabilidade organizacional a taxa meacutedia de atividade globalefetiva em um sistema em evoluccedilatildeo natildeo muda com o tempo ou seja a meacutedia detrabalho e esforccedilo colocado em cada entrega do sistema permanece a mesma

6

5 Conservaccedilatildeo de familiaridade a quantidade de conteuacutedo novo em cada entregado sistema tende a se manter constante com o tempo

6 Crescimento contiacutenuo A quantidade de funcionalidades em um sistema cresceraacutecom o tempo com o objetivo de satisfazer seus usuaacuterios

7 Decliacutenio de qualidade Um sistema seraacute percebido com qualidade inferior como passar do tempo a menos que seu design tenha uma manutenccedilatildeo minuciosa e seadapte a novas restriccedilotildees

8 Sistema de Feedback Evoluir um sistema com sucesso requer reconhecer que oprocesso de desenvolvimento acontece em um sistema de feedback de vaacuterios ciclosagentes e niacuteveis

Os aspectos teacutecnicos que envolvem a evoluccedilatildeo de software levam em consideraccedilatildeo astecnologias utilizadas para o seu desenvolvimento desde a linguagem de programaccedilatildeo agravesmaacutequinas onde o software seraacute hospedado que sofrem atualizaccedilotildees recebem novas versotildeescom novas caracteriacutesticas implementadas

Um estudo realizado por Lavre mostra como a evoluccedilatildeo das linguagens de programa-ccedilatildeo no contexto da evoluccedilatildeo de software muitas vezes satildeo subestimadas uma vez quemuitos podem considerar em seus estudos a linguagem de computaccedilatildeo como um artefatoimutaacutevel [8] Por exemplo coloca-se muita ecircnfase e cuidado para realizar o versionamentode coacutedigo fonte de um software mas este pode ser tornar inutilizaacutevel futuramente se nin-gueacutem souber qual versatildeo de compilador determinada versatildeo de coacutedigo foi desenvolvida

Para natildeo se deixar estagnar linguagens de programaccedilatildeo precisam se adaptar e evoluirQuando uma linguagem de programaccedilatildeo atualiza softwares que eram antes consideradosatualizados podem se tornar rapidamente obsoletos E ao mesmo tempo que novascaracteriacutesticas satildeo adicionadas a linguagem precisa fornecer compatibilidade com versotildeesanteriores aumentando sua complexidade Desenvolvedores entatildeo encontram-se tambeacutemem um empasse buscando um equiliacutebrio entre manter a compatibilidade da ferramentacom versotildees anteriores da linguagem e atualizaacute-la para manter o software atualizado [9]

A estrateacutegia de refatoraccedilatildeo de coacutedigo pode ser uma opccedilatildeo que permite a linguageme o software co-evoluiacuterem com um menor grau de dificuldade [9] Refatoraccedilatildeo (do inglecircsrefactoring) eacute o processo de modificaccedilatildeo de um software com o objetivo de melhorar a es-trutura interna do mesmo sem alterar sua percepccedilatildeo externa Eacute uma maneira disciplinadade melhorar o design do coacutedigo apoacutes ele jaacute ter sido implementado Por exemplo dividiruma funcionalidade grande feita em apenas um bloco de coacutedigo em vaacuterios moacutedulos [15]

A refatoraccedilatildeo de coacutedigo pode ser um meio utilizado para evoluir o software adaptandoo coacutedigo com caracteriacutesticas novas introduzidas pela linguagem modificando o design dosistema sem comprometer sua integridade No entanto novos desafios surgem visto que

7

refatorar o coacutedigo fonte de um sistema de grande porte natildeo eacute uma tarefa faacutecil havendo anecessidade de ferramentas que possam automatizar o processo ou realizar um estudo paraentender como as novas caracteriacutesticas da linguagem podem ser utilizadas para substituirou melhorar funcionalidades obsoletas [9]

22 MSR Mineraccedilatildeo de dados e a Engenharia deSoftware

Com o objetivo de compreender prever e planejar os vaacuterios aspectos do desenvolvimentode um projeto em especial tudo que possa impactar na evoluccedilatildeo de software a teacutecnicade mineraccedilatildeo de dados tem sido bastante utilizada em engenharia de software [17]

O termo Mineraccedilatildeo de Repositoacuterios de Software (MSR) tem sido utilizado para descre-ver vaacuterias maneiras de se examinar repositoacuterios de software Um repositoacuterio de softwarepode ser considerado um artefato que eacute produzido e arquivado durante a evoluccedilatildeo desoftware [1] Estes responsoacuterios armazenam informaccedilotildees que podem fornecer todos osdetalhes de desenvolvimento do software provendo meios necessaacuterios para uma anaacuteliseaprofundada de evoluccedilatildeo de software

Repositoacuterios de software satildeo comumente utilizados para armazenar e acompanhar ohistoacuterico de desenvolvimento do software mas raramente usados para tomada de deci-sotildees em relaccedilatildeo ao projeto Assim pesquisadores de MSR buscam modificar a impressatildeode que tais repositoacuterios satildeo estaacuteticos que servem apenas para manutenccedilatildeo de registrostransformando-os em repositoacuterios ativos que podem auxiliar na tomada de decisatildeo em pro-jetos de software modernos atraveacutes da identificaccedilatildeo de padrotildees para realizar a propagaccedilatildeode mudanccedilas [18]

221 Classificaccedilatildeo

De acordo com Kagdi et al dentre as abordagens de MSR utilizadas atualmente eacute possiacuteveldescrevecirc-las para entatildeo comparaacute-las e possivelmente classificaacute-las levando em considera-ccedilatildeo uma taxonomia de quatro dimensotildees os repositoacuterios de software utilizados (fontes dedados) o propoacutesito do MSR a metodologia e a avaliaccedilatildeo da abordagem [1] como mostraa Figura 21 onde as taxonomias destacadas em amarelo satildeo as que prevaleceram poreacutemnatildeo exclusivamente na metodologia adotada por este trabalho

8

Figura 21 Taxonomia em camadas adaptada do trabalho de Kagdi et al [1]

Fontes de Dados

As fontes de informaccedilatildeo variam de acordo com a abordagem utilizada e dentre as informa-ccedilotildees mineradas em repositoacuterios de software inclui-se as seguintes categorias os artefatosde software e suas versotildees as diferenccedilas entre os artefatos de software e suas versotildees e osmetadados sobre as mudanccedilas no software

As fontes de dados podem ser melhor classificadas de acordo com Hassan et al [17]

bull Repositoacuterios de controle de Versatildeo estes repositoacuterios guardam o histoacuterico de desen-volvimento de um projeto armazenando todas as mudanccedilas no coacutedigo fonte assimcomo os metadados associados com cada mudanccedila Exemplos git SVN

bull Bug repositories Estes repositoacuterios rastreiam o histoacuterico de resoluccedilatildeo de bugs quesatildeo reportados por usuaacuterios e desenvolvedores Exemplos Bugzilla e Jira

9

bull Histoacuterico de Comunicaccedilatildeo (Archived communications) estes repositoacuterios rastreiamdiscussotildees sobre os vaacuterios aspectos de um projeto de software por sua vida uacutetil Porexemplo listas de e-mails

bull Deployment logs logs com informaccedilotildees do software gerados por ferramentas dedesenvolvimento

bull Repositoacuterios de software Repositoacuterios onde o coacutedigo fonte de vaacuterios projetos satildeoarmazenados como por exemplo Sourceforgenet

No contexto deste trabalho estes repositoacuterios consistem em fontes de coacutedigo armaze-nadas em sistemas de controle de versatildeo especificamente coacutedigos na plataforma Github

O propoacutesito

O propoacutesito da mineraccedilatildeo de repositoacuterios de software se resume nas perguntas de pes-quisa que podem ser respondidas utilizando mineraccedilatildeo Assim existem duas classes deperguntas de pesquisa para MSR [1]

A primeira eacute a pergunta de anaacutelise market-basket1 ldquoSe A acontece o que mais podeacontecerrdquo A resposta para este tipo de pergunta eacute um conjunto de regras descrevendotendecircncias de relacionamentos como por exemplo se A acontecer entatildeo B e C acontecemdurante um periacuteodo X

A segunda classe diz respeito agraves perguntas de prevalecircncia (Prevalence Questions -PQ) como por exemplo perguntas do tipo ldquoA funcionalidade Y foi modificadardquo quepossuem uma resposta booleana ou ldquoQuantas vezes esta funcionalidade Y foi modificadardquocontendo uma resposta quantitativa

As perguntas de pesquisa deste trabalho se encaixam majoritariamente na segundaclasse onde o objetivo traccedilado eacute respondido de forma quantitativa com algumas tentativasde classificaccedilatildeo de tipos de repositoacuterios como seraacute descrito nos capiacutetulos seguintes

A metodologia

A metodologia corresponde a maneira como as questotildees de MSR iratildeo ser respondidas evaacuterias abordagens estatildeo disponiacuteveis Poreacutem Kagdi indica duas estrateacutegias baacutesicas quepodem ser utilizadas

Primeiramente pode-se utilizar a mediccedilatildeo indireta e anaacutelise da evoluccedilatildeo do softwareEsta abordagem pode ser realizada da seguinte forma extrair e computar informaccedilotildeesde cada versatildeo de um software separadamente e em seguida individualmente comparar

1Anaacutelise Market-basket eacute uma teacutecnica de modelagem baseada na teoria de que se vocecirc comprar certostipos de produtos vocecirc haacute uma probabilidade maior (ou menor) de comprar outros tipos de produtos [19]

10

propriedades encontradas como por exemplo comparar duas versotildees distintas de umsoftware atraveacutes de um repositoacuterio github realizando uma investigaccedilatildeo de alto niacutevel noque diz respeito a evoluccedilatildeo do software [1]

A segunda perspectiva de metodologia que pode ser utilizada corresponde agrave mediccedilatildeodireta e anaacutelise da evoluccedilatildeo do software Ela diz respeito agraves investigaccedilotildees que estudamos mecanismos que leva um software a ser modificado de uma versatildeo para outra focandonas diferenccedilas especiacuteficas entre estas versotildees como por exemplo examinando mudanccedilasespeciacuteficas das classes arquivos funccedilotildees de cada parte do coacutedigo [1]

Assim eacute possiacutevel descrever explicitamente que este trabalho utiliza em sua maioriauma metodologia com mediccedilotildees diretas atraveacutes da anaacutelise estaacutetica de informaccedilotildees docoacutedigo fonte de diferente versotildees para analisar os diferentes padrotildees de desenvolvimentoem que expressotildees lambda (definidas no capiacutetulo seguinte) satildeo utilizadas

A Avaliaccedilatildeo

Por fim existem diversas formas para se avaliar o estudo realizado sempre levando emconsideraccedilatildeo a validade dos resultados obtidos Pode-se utilizar de meacutetricas para avaliar osdados considerando o quanto das informaccedilotildees obtidas satildeo relevantes Outra forma de seavaliar seria atraveacutes da utilizaccedilatildeo de modelos probabiliacutesticos seguindo uma abordagemde teoria da informaccedilatildeo Assim foram utilizadas determinadas meacutetricas quantitativaspara avaliar os resultados obtidos neste trabalho

23 Trabalhos Relacionados

Como ressaltado na introduccedilatildeo o foco deste trabalho encontra-se em utilizar teacutecnicas deMSR para caracterizar a adoccedilatildeo de expressotildees lambda em repositoacuterios Java Ao reali-zar um estudo sobre o estado da arte encontrou-se diversos trabalhos que utilizam deMSR para obter informaccedilotildees relevantes sobre repositoacuterios de software em diversos focose em especial trabalhos que investiguem repositoacuterios na linguagem Java Jaacute existemtambeacutem alguns trabalhos que apresentam ferramentas de refatoraccedilatildeo de coacutedigo para im-plementaccedilatildeo de expressotildees lambda com foco na evoluccedilatildeo do software Dentre os trabalhosencontrados mencionados destacam-se

bull Em um trabalho sobre utilizaccedilatildeo de refatoraccedilatildeo de coacutedigo para realizar a transiccedilatildeode coacutedigo Java para as novas caracteriacutesticas implementadas no Java 8 Gyori et alapresenta uma ferramenta que automatiza com sucesso o trabalho de conversatildeo decoacutedigo como Annonymous Inner Class para expressotildees lambda [12] O capiacutetulo aseguir descreve em detalhes estes conceitos

11

bull Regrowing a Language de Overbey apresenta um estudo sobre a importacircncia da co-evoluccedilatildeo entre a linguagem de programaccedilatildeo e os projetos de software focando naslinguagens Fortran e Java e provando como ferramentas de refatoraccedilatildeo de coacutedigoauxiliam para que o software consiga evoluir juntamente com sua linguagem deprogramaccedilatildeo [9]

bull O trabalho sobre a adoccedilatildeo de generics em coacutedigo Java feito por Parnin utiliza demineraccedilatildeo de dados para realizar uma investigaccedilatildeo empiacuterica avaliando projetos decoacutedigo aberto com o objetivo de observar como desenvolvedores destes projetos estatildeoutilizando generics em Java [20]

Os estudos mencionados focam em assuntos particulares pertinentes a este trabalhoem que de um lado tem-se trabalhos que mostram a necessidade de refatoraccedilatildeo de coacutedigopara evoluccedilatildeo de software e do outro tem-se trabalhos que mostram que eacute possiacutevel utilizarde MSR para entender melhor como a evoluccedilatildeo da linguagem de programaccedilatildeo Java temafetado projetos reais de coacutedigo aberto e como estes projetos estatildeo se adaptando a estasevoluccedilotildees

12

Capiacutetulo 3

Java SE 8 e JDK 8

Este trabalho tem como objetivo caracterizar a adoccedilatildeo de expressotildees Lambda em siste-mas Java que podem ser considerados legados pois foram concebidos em um momentoanterior a introduccedilatildeo dessa nova caracteriacutestica na linguagem Java Com o intuito de faci-litar o entendimento do leitor sobre tais construccedilotildees esse capiacutetulo apresenta informaccedilotildeeshistoacutericas referentes agrave linguagem Java desde sua criaccedilatildeo ateacute a sua ascensatildeo como umadas linguagens de programaccedilatildeo mais populares Aleacutem disso seratildeo apresentadas as novascaracteriacutesticas presentes na versatildeo Java SE 8 com destaque nas expressotildees Lambda e deque forma vieram para auxiliar no desenvolvimento de sistemas

31 Histoacuterico

Java eacute uma linguagem de programaccedilatildeo orientada a objetos para propoacutesitos gerais [21] Alinguagem nasceu com o nome de Oak no ano de 1991 com o foco em televisotildees digitais acabo mas devido agrave complexidade e poder da linguagem logo expandiu-se para os outrosdomiacutenios principalmente a Internet [22] Posteriormente a linguagem recebeu o nome deGreentalk devido agrave marca Oak jaacute ser registrada por outra empresa e o principal projeto daequipe se chamar Green Por fim o nome Java foi o mais votado pela equipe da Sun emuma reuniatildeo para decidir o mais raacutepido possiacutevel um nome definitivo para a linguagem [23]

Em 1995 em sua primeira versatildeo puacuteblica 10 a linguagem Java jaacute comeccedilava a terum crescimento em sua popularidade como Web Applet nos navegadores mais popularesfornecendo seguranccedila e rapidez nas plataformas mais utilizadas [24] A cada nova versatildeopublicada novas funcionalidades e plataformas eram adicionadas e tornavam a linguagemmais difundida no meio computacional fazendo com que em 2006 a linguagem fosse divi-dida em Java EE (foco em rede e serviccedilos web) Java ME (foco em sistemas embarcados)e Java SE (foco em desktops e servidores) [25]

13

Apoacutes anos de evoluccedilatildeo e aprimoramento atraveacutes de diversas versotildees como visto naTabela 31 hoje o Java se tornou uma das linguagens de programaccedilatildeo mais utilizadas nomundo estando em aproximadamente 15 das linhas de coacutedigo disponiacuteveis pela inter-net [11] A quantidade de plataformas suportadas pela linguagem e com o advento dosistema operacional Android sendo rodado na maior parte dos smartphones do mundoaleacutem da simplicidade em codificar no paradigma orientado a objetos foram os fatoresrelevantes para que a linguagem se popularizasse no mundo digital [26]

Tabela 31 As versotildees anteriores de java e principais caracteriacutesticasVersatildeo Principais caracteriacutesticasJava 10 JVM e JDKJava 2 Event Listeners

Kestrel (Java 3) HotSpot JVMMerlin (Java 4) Diversas novas APIs como Assertion e expressotildees regularesTiger (Java 5) Generics

Mustang (Java 6) Web ServicesDolphin (Java 7) Suporte a linguagens dinamicas

32 Princiacutepios

Com o foco em alcanccedilar a Web e participar mais ativamente do mercado virtual e e-Commerce foram projetados princiacutepios que permitissem com que a linguagem pudessealcanccedilar seus objetivos principais ao mesmo tempo que mantinha a facilidade e fami-liarizaccedilatildeo da linguagem a seus desenvolvedores [27] Dessa forma a equipe da Oracledeterminou cinco princiacutepios que caracterizariam o foco da linguagem Java

bull simples orientada a objeto e familiar projetada para ser orientada a objeto epermitir que seus desenvolvedores comecem a codificar rapidamente sem a necessi-dade de uma curva de aprendizagem acentuada

bull segura e robusta projetada para prover software confiaacutevel por meio de checagensa tempo de compilaccedilatildeo e execuccedilatildeo Haacute uma grande preocupaccedilatildeo com seguranccediladevido agrave larga utilizaccedilatildeo da linguagem em sistemas distribuiacutedos

bull de arquitetura neutra e portaacutevel projetada para ser independente de qualquerarquitetura bastando rodar a JVM dessa forma garantindo a portabilidade paravaacuterios ambientes e dispositivos

14

bull executada em alta performance projetada para fornecer a maior performancepossiacutevel em tempo de execuccedilatildeo com a utilizaccedilatildeo do garbage collector em uma threadde baixa prioridade

bull interpretada dinacircmica e threaded projetada para ser interpretada por qual-quer dispositivo que possua JVM desenvolvida garantindo um desenvolvimento raacute-pido e em ciclos O uso da classe Thread permite que a linguagem acompanhe atendecircncia do paralelismo Aleacutem disso a ligaccedilatildeo de classes eacute feita em tempo real esomente quando necessaacuteria tornando-a dinacircmica

33 Evoluccedilatildeo

A primeira versatildeo do Java 8 foi lanccedilada em 2014 [28] e apresentou diversas atualizaccedilotildeesespalhadas em categorias como linguagem seguranccedila Collections ferramentas deployentre outras Dentre a grande quantidade de mudanccedilas os destaques se encontraram nasnovas melhorias presentes na linguagem que afetaram de forma mais direta a maneiracom que os desenvolvedores passaram a tratar e organizar o coacutedigo fonte As atualizaccedilotildeesreferentes a linguagem descritas oficialmente pela Oracle [29] satildeo

1 Lambda Expressions ou apenas Expressotildees Lambda correspondem a uma novacaracteriacutestica que permite que uma pequena funcionalidade possa ser utilizada comoum argumento de um meacutetodo facilitando a escrita de accedilotildees que seratildeo feitas repetida-mente em uma Collection ou quando um processo se completa ou quando encontraum erro Eacute tambeacutem uma forma compacta de se escrever coacutedigo que previamenteera escrito com anonymous inner classes [29] A Listagem 31 mostra uma classehipoteacutetica Calculator cujo meacutetodo operateBinary() recebe como paracircmetro doisinteiros e um objeto da classe IntegerMath que representa a operaccedilatildeo que deveraacuteser realizada ou seja uma funcionalidade dinacircmica

1 pub l i c c l a s s Ca l cu la to r 2

3 i n t e r f a c e IntegerMath 4 i n t opera t i on ( i n t a i n t b) 5 6

7 pub l i c i n t operateBinary ( i n t a i n t b IntegerMath op ) 8 re turn op opera t i on (a b) 9

10

11 pub l i c s t a t i c void main ( St r ing a rgs ) 12

15

13 Calcu la to r myApp = new Ca lcu la to r ( ) 14 IntegerMath add i t i on = (a b) minusgt a + b 15 IntegerMath subt ra c t i on = (a b) minusgt a minus b 16 System out p r i n t l n ( 40 + 2 = +17 myApp operateBinary (40 2 add i t i on ) ) 18 System out p r i n t l n ( 20 minus 10 = +19 myApp operateBinary (20 10 sub t ra c t i on ) ) 20 21 22

Listagem 31 Exemplo de coacutedigo com o uso de Expressatildeo Lambda [30]

2 Method References Frequentemente expressotildees lambda criam meacutetodos anocircni-mos Algumas vezes poreacutem satildeo utilizadas para chamar um meacutetodo jaacute existentena classe Ao inveacutes de escrever a expressatildeo Lambda para esse caso pode-se optarpor utilizar um Method Reference que facilita a escrita e leitura desse uso de ex-pressatildeo Lambda [29] A Listagem 32 mostra um exemplo de um meacutetodo estaacuteticoque compara duas pessoas pelas suas idades e a Listagem 33 a utilizaccedilatildeo de MethodReference para aplicar a utilizaccedilatildeo desse meacutetodo em um array e reduzir a escrita deuma expressatildeo lambda a uma forma mais legiacutevel

1 pub l i c s t a t i c i n t compareByAge ( Person a Person b) 2 re turn a b i r thday compareTo (b b i r thday ) 3 4

Listagem 32 Exemplo de meacutetodo de uma classe Pessoa [31]

1 Arrays s o r t ( rosterAsArray Person compareByAge ) 2

Listagem 33 Exemplo de uso de Method Reference [31]

3 Default Methods satildeo meacutetodos com a palavra-chave default que servem para adi-cionar implementaccedilotildees de meacutetodos a uma interface de alguma biblioteca mantendoa compatibilidade binaacuteria com versotildees mais antigas dessa interface Tambeacutem pos-sibilita a implementaccedilatildeo de meacutetodos estaacuteticos em interfaces [29] A Listagem 34apresenta a inclusatildeo de um meacutetodo default na interface TimeClient

1 pub l i c i n t e r f a c e TimeClient 2 void setTime ( i n t hour i n t minute i n t second ) 3 void setDate ( i n t day i n t month i n t year ) 4 void setDateAndTime ( i n t day i n t month i n t year 5 i n t hour i n t minute i n t second )

16

6 LocalDateTime getLocalDateTime ( ) 7

8 s t a t i c ZoneId getZoneId ( S t r ing zoneStr ing ) 9 t ry

10 re turn ZoneId o f ( zoneStr ing ) 11 catch ( DateTimeException e ) 12 System e r r p r i n t l n ( I n v a l i d time zone + zoneStr ing

+13 us ing d e f a u l t time zone in s t ead ) 14 re turn ZoneId systemDefault ( ) 15 16 17

18 d e f a u l t ZonedDateTime getZonedDateTime ( St r ing zoneStr ing ) 19 re turn ZonedDateTime o f ( getLocalDateTime ( ) getZoneId (

zoneStr ing ) ) 20 21 22

Listagem 34 Exemplo de interface com um meacutetodo default [32]

4 Repeating Annotations permitem a implementaccedilatildeo e utilizaccedilatildeo de anotaccedilotildees deum mesmo tipo que podem ser utilizadas mais de uma vez para a mesma declara-ccedilatildeo [29] A Listagem 35 apresenta duas anotaccedilotildees iguais com paracircmetros diferentespermitindo uma customizaccedilatildeo maior na aplicaccedilatildeo de um tipo de anotaccedilatildeo

1 Schedule ( dayOfMonth= l a s t )2 Schedule (dayOfWeek= Fr i hour= 23 )3 pub l i c void doPeriodicCleanup ( ) 4

Listagem 35 Exemplo de Repeating Annotations [33]

5 Type Annotations permitem que anotaccedilotildees possam ser utilizadas em tipos aleacutemde declaraccedilotildees dessa forma pode-se garantir que um campo sempre atenda agraves suasexpectativas e evite testes desnecessaacuterios [29] A Listagem 36 mostra um exemplo derestriccedilatildeo a uma String que nunca poderaacute ser nula devido agrave anotaccedilatildeo de NonNull

1 NonNull S t r ing s t r

Listagem 36 Exemplo de Type Annotation garantindo que o campo nunca seja null [34]

17

34 Expressotildees Lambda

Uma das mudanccedilas mais interessantes implementadas no Java 8 foi a adiccedilatildeo de expressotildeeslambda As expressotildees lambda permitem que a linguagem Java possa atuar parcialmentecomo uma linguagem de programaccedilatildeo funcional onde comportamentos satildeo avaliados eaplicados diferentemente da programaccedilatildeo imperativa que foca na mudanccedila de estadosNa praacutetica um comportamento pode ser passado como paracircmetro de um meacutetodo atraveacutesde uma escrita mais reduzida e legiacutevel Os benefiacutecios de utilizar expressotildees lambda incluemuma melhora na legibilidade e organizaccedilatildeo de coacutedigo que antes era escrito com AnonymousInner Class aleacutem de permitir uma forma simples de utilizar comportamento paralelo como uso de Streams

341 Sintaxe

A sintaxe de uma expressatildeo lambda eacute dividida nas seguintes partes [30]

bull Uma lista de paracircmetros separados por viacutergulas

bull Um token representado por uma seta -gt

bull Um corpo que pode ser representado por uma expressatildeo uacutenica ou um bloco de coacutedigodentro de chaves

As Listagens 37 e 38 mostram duas formas diferentes de se aplicar expressotildees Lambdacom uma sintaxe similar A primeira aplica a expressatildeo diretamente apoacutes a seta utilizadanormalmente para trechos de coacutedigo pequenos e simples e a segunda utiliza-se de chavespara incorporar o coacutedigo e da palavra-chave return para especificar o retorno forma maisutilizada para uma quantidade maior de coacutedigo

1 p minusgt p getGender ( ) == Person Sex MALE2 ampamp p getAge ( ) gt= 183 ampamp p getAge ( ) lt= 25

Listagem 37 Exemplo de expressatildeo lambda com uma expressatildeo [30]

1 p minusgt 2 re turn p getGender ( ) == Person Sex MALE3 ampamp p getAge ( ) gt= 184 ampamp p getAge ( ) lt= 25 5

Listagem 38 Exemplo de expressatildeo lambda com um bloco de coacutedigo [30]

18

342 Principais formas de uso

Anonymous Inner Class

Antes do Java 8 a necessidade de passar funccedilotildees ou expressotildees como paracircmetro de algummeacutetodo era suprida atraveacutes de Anonymous Inner Classes A utilizaccedilatildeo desse tipo dedeclaraccedilatildeo junto com a anotaccedilatildeo de Override permite sobrescrever um meacutetodo de umainterface funcional e ao mesmo tempo passa-la como argumento para um meacutetodo Umaexpressatildeo lambda se comporta da mesma forma poreacutem a quantidade de coacutedigo escritopela Anonymous Inner Class eacute maior e pode dificultar a leitura de coacutedigo pois conteacutemmuita informaccedilatildeo natildeo utilizada para efetivo entendimento do que estaacute sendo feito naqueletrecho

A Listagem 39 apresenta a instanciaccedilatildeo da classe EventHandler internamente ao meacute-todo setOnAction() de forma que o desenvolvedor possa escrever o comportamento quedeseja passar como paracircmetro do meacutetodo atraveacutes da substituiccedilatildeo do meacutetodo handle()que jaacute existe pelo meacutetodo handle() criado e escrito pelo desenvolvedor

1 btn setOnAction (new EventHandlerltActionEvent gt() 2 Override3 pub l i c void handle ( ActionEvent event ) 4 System out p r i n t l n ( He l lo World ) 5 6 )

Listagem 39 Exemplo de uso de Anonymous Inner Class [35]

Interface funcional

Ao projetar um coacutedigo novo o desenvolvedor que optar por utilizar expressotildees lambdadeve iniciar com a criaccedilatildeo de uma interface funcional Esse tipo de interface possui umuacutenico meacutetodo abstrato permitindo que expressotildees lambda sejam usadas para sobrescrevero comportamento do meacutetodo abstrato Uma interface funcional pode possuir outros meacuteto-dos desde que sejam default Uma nova anotaccedilatildeo FunctionalInterface foi adicionadacom a atualizaccedilatildeo do Java 8 para conferir em tempo de compilaccedilatildeo se a interface satisfazos requisitos desse modelo de interface

A Listagem 310 apresenta um exemplo de interface funcional com o objetivo de permi-tir o uso de expressotildees lambda que utilizaratildeo de dois Double como paracircmetro e jaacute utilizada nova anotaccedilatildeo FunctionalInterface introduzida no Java 8

1 Funct iona l Inte r face2 pub l i c i n t e r f a c e DoubleOp 3 pub l i c Double apply ( Double a Double b)

19

4

Listagem 310 Exemplo de interface funcional

Dessa forma conforme as Listagens 311 e 312 o meacutetodo apply() pode tomar formade qualquer operaccedilatildeo entre dois Double que seraacute especificada quando a expressatildeo lambdafor montada dando o aspecto de linguagem funcional agrave linguagem e mais facilidade eliberdade ao desenvolvedor

1 pub l i c c l a s s Ca l cu la to r 2 pub l i c s t a t i c Double c a l c ( Double op1 Double op2 DoubleOp operator ) 3 re turn operator apply ( op1 op2 ) 4 5

Listagem 311 Exemplo de aplicaccedilatildeo da interface funcional

1 Double r e s u l t 1 = Ca lcu la to r c a l c (10d 50d ( a b ) minusgt a + b)

Listagem 312 Uso de expressatildeo lambda para o exemplo anterior

Collections

Dentre as atualizaccedilotildees de pacotes do Java 8 foi adicionado um meacutetodo stream() nainterface Collection Esse meacutetodo trata as Collection como streams o que significa queapesar de natildeo ser possiacutevel acessar elementos diretamente algumas novas manipulaccedilotildeessatildeo possiacuteveis Essas manipulaccedilotildees satildeo na verdade meacutetodos da interface Stream quepodem receber como paracircmetro uma expressatildeo lambda ou seja um comportamento a seraplicado agrave Collection Dentre os meacutetodos temos

bull filter() O meacutetodo filter() recebe uma expressatildeo lambda contendo uma condiccedilatildeopara filtragem da collection

bull map() O meacutetodo map() mapeia os elementos de uma Collection em outro objetocomo uma String A expressatildeo lambda passada por paracircmetro deve retornar o tipode objeto ao qual seraacute mapeado

bull forEach() O meacutetodo forEach() aplica uma operaccedilatildeo especiacutefica para cada ele-mento da Collection A expressatildeo lambda a ser passada deve conter a operaccedilatildeo aser realizada

bull min() e max() Os meacutetodos min() e max() retornam o elemento menor ou maiorda Collection dependendo da expressatildeo lambda passada como paracircmetro

20

A Listagem 313 demonstra como vaacuterias operaccedilotildees com uma Collection podem seraplicadas de uma vez de forma que lendo a expressatildeo lambda jaacute eacute possiacutevel saber oresultado da aplicaccedilatildeo do meacutetodo agrave Collection

1 r o s t e r2 stream ( )3 f i l t e r (4 p minusgt p getGender ( ) == Person Sex MALE5 ampamp p getAge ( ) gt= 186 ampamp p getAge ( ) lt= 25)7 map(p minusgt p getEmailAddress ( ) )8 forEach ( emai l minusgt System out p r i n t l n ( emai l ) )

Listagem 313 Exemplo de utilizaccedilatildeo de meacutetodos de stream com expressotildees lambda [30]

21

Capiacutetulo 4

Estudo e o Processo de Mineraccedilatildeo

A definiccedilatildeo da metodologia utilizada para realizaccedilatildeo deste trabalho eacute importante para queexista uma padronizaccedilatildeo e melhor entendimento de como os resultados foram obtidos paraque a replicaccedilatildeo do mesmo possa ser realizada em trabalhos futuros [36]

Figura 41 Processo utilizado para realizaccedilatildeo do estudo

O esquema representado na Figura 41 descreve o processo seguido para a realizaccedilatildeodeste trabalho que foi divido em trecircs grandes etapas a de planejamento definindo osobjetivos questotildees de pesquisa e meios de investigaccedilatildeo deste projeto a etapa de execuccedilatildeorealizando todo o procedimento metodoloacutegico definido para a coleta e refinamento de

22

dados e a etapa de avaliaccedilatildeo onde foram classificados e avaliados os dados coletadospara responder agraves questotildees de pesquisa

A seguir na primeira seccedilatildeo seratildeo apresentadas em detalhes as questotildees de pesquisa aserem respondidas Em seguida seraacute feito uma breve descriccedilatildeo da fonte de dados utilizada- especificamente os projetos utilizados como objetos de estudo deste trabalho e por fimtodo o restante da metodologia que foi de fato desenvolvida para obter os resultadosnecessaacuterios

41 Questotildees de Pesquisa

Com o objetivo de entender e caracterizar melhor o uso de expressotildees lambda foramdefinidas as seguintes questotildees de pesquisa a serem respondidas

bull PQ-1 Quando os projetos comeccedilaram a introduzir o uso de expressotildees lambda emseus coacutedigos e qual a meacutedia de expressotildees lambda por snapshots caso existam

bull PQ-2 Como as equipes de desenvolvimento estatildeo utilizando expressotildees lambdaatraveacutes de refatoraccedilatildeo de coacutedigo ou introduzindo apenas em coacutedigo novo

bull PQ-3 Quais satildeo os padrotildees tipicamente adotados para o uso de expressotildees lambda

A primeira pergunta de pesquisa gira em torno de como projetos populares open-sourceestatildeo se adaptando agrave introduccedilatildeo de expressotildees lambda em Java muitos projetos jaacute estatildeoutilizando as expressotildees lambda Se sim a partir de quando comeccedilaram a utilizaacute-lasdesde o iniacutecio da introduccedilatildeo das mesmas no Java 8 ou em um periacuteodo mais tardio Aleacutemdisso eacute interessante descobrir se a utilizaccedilatildeo dessa nova caracteriacutestica tem acontecido deforma expressiva ou natildeo

Em seguida para melhor entender a forma como as expressotildees lambda estatildeo sendointroduzidas em projetos eacute interessante investigar se as equipes de desenvolvimento estatildeose preocupando em refatorar coacutedigo com o objetivo de evoluir o software ou se estatildeoexperimentando utilizar expressotildees lambda apenas em coacutedigo novo introduzido

Como a introduccedilatildeo de novas funcionalidades em projetos open-source de grande escaladepende do objetivo do projeto e os padrotildees de projeto utilizados [37] espera-se obser-var diversas abordagens quanto a utilizaccedilatildeo de expressotildees lambda para entatildeo poderclassificar estes softwares quanto a abordagem utilizada

Eacute de grande importacircncia para este estudo conseguir identificar na praacutetica comoexpressotildees lambda estatildeo sendo tipicamente adotadas nestes projetos Assim a terceirapergunta de pesquisa busca identificar alguns exemplos de utilizaccedilatildeo atraveacutes da realizaccedilatildeode alguns estudos de caso

23

Eacute importante ressaltar que apesar de as expressotildees lambda serem uma alternativa aouso de AIC elas natildeo os substituem completamente Existem precondiccedilotildees para que umaAIC possa ser substituiacuteda por expressotildees lambda [12] descritas a seguir

bull AIC deve instanciar-se de uma interface

bull AIC natildeo deve possuir nenhum campo e declarar apenas um meacutetodo

bull AIC natildeo deve possuir uma referecircncia para this ou super

bull AIC natildeo deve declarar um meacutetodo recursivo

Para responder agrave primeira pergunta apenas dados gerais sobre todos os projetos seratildeonecessaacuterios ao passo que pelas perguntas 2 e 3 possuiacuterem uma natureza mais complexaseraacute necessaacuterio aleacutem de uma anaacutelise geral estatiacutestica a realizaccedilatildeo de alguns estudos decaso para obter resultados mais completos

42 Fonte de Dados e Objetos de Estudo

Para responder agraves perguntas de pesquisa estabelecidas foram selecionados os 99 projetosmais populares na linguagem Java dentro da plataforma github ateacute a data da coleta dosdados feita em Abril de 2017 Satildeo considerados populares os repositoacuterios que possuema maior quantidade possiacutevel de estrelas (stars) A decisatildeo de escolher os 99 projetos maispopulares foi por sua natureza imparcial e ao mesmo tempo para que se possa analisarprojetos que satildeo de familiaridade e conhecimento da comunidade do github e de domiacuteniopuacuteblico Os 99 projetos estatildeo listados no Anexo I

Para entender a transiccedilatildeo feita por esses projetos entre as versotildees anteriores do Java eo Java 8 com as expressotildees lambda eacute necessaacuterio analisar o coacutedigo de vaacuterias versotildees a fimde observar alguma mudanccedila para cada projeto Como satildeo 99 projetos e vaacuterios dessesprojetos possuem milhares de linhas de coacutedigo e commits seria impossiacutevel avaliar todosos commits Optou-se entatildeo por coletar snapshots mensais de cada projeto conformeprocedimento tambeacutem seguido anteriormente [38] Cada snapshots representa o estadodo projeto em um determinado mecircs e como criteacuterio de escolha padratildeo todos os snapshotsequivalem ao uacuteltimo commit realizado no determinado mecircs que este representa

O proacuteximo passo eacute determinar o periacuteodo de tempo em que esses snapshots seriamcoletados Como Java 8 (e consequentemente as expressotildees lambda) foi introduzidoapenas em meados de 2014 [28] coletar dados de projetos a partir de um periacuteodo muitoantes deste ano natildeo agregaria valor ao estudo em questatildeo Definiu-se entatildeo um periacuteodopara a coleta mensal desses snapshots atraveacutes dos anos Janeiro de 2013 um ano antesda introduccedilatildeo do Java 8 para que se pudesse identificar para todos os projetos o mecircs

24

exato em que expressotildees lambda foram introduzidas ateacute o mecircs da coleta de dados Abrilde 2017

Eacute importante ressaltar que a definiccedilatildeo dos meses foi definida do dia primeiro de ummecircs ao dia primeiro do proacuteximo mecircs e por consequecircncia alguns snapshots que deveriamrepresentar o final de determinado mecircs correspondem na verdade a commits realizadosno dia primeiro do mecircs seguinte Por exemplo pode existir casos em que o commit querepresente o mecircs de Marccedilo de 2016 seja na verdade o commit realizado no dia primeirode Abril de 2016 Isso se deve a natureza da forma como os resultados de log de commitssatildeo obtidos pelo git [39] Poreacutem isso natildeo interfere nas anaacutelises ou no propoacutesito destetrabalho uma vez que foram realizadas verificaccedilotildees e validaccedilotildees para que natildeo existamdatas repetidas (e consequentemente commits repetidos) por repositoacuterio

Neste trabalho o termo projeto e repositoacuterio foram utilizados de forma intercaladapara representar a mesma coisa o software desenvolvido que possui um repositoacuterio naplataforma github Os termos commit snapshops e versotildees tambeacutem representam a mesmacoisa uma vez que foi definido que seriam utilizados apenas um commit por mecircs pararepresentar um determinado snapshot ou versatildeo do repositoacuterio em questatildeo

Todos os 99 projetos seratildeo utilizados para a realizaccedilatildeo de uma anaacutelise geral de ca-racterizaccedilatildeo do uso de expressotildees lambda Para as anaacutelises aprofundadas foi feito umcriteacuterio de classificaccedilatildeo para que apenas alguns projetos possam ser analisados em niacutevelde coacutedigo como estudos de caso

Resumindo foram escolhidos os 99 projetos mais populares de Java no github cole-tando dados mensais de seus commits a partir do ano de 2013 ateacute a data da coleta dosdados lembrando que nem todos os projetos existem desde 2013 (projetos mais recentes)

43 Processo de Mineraccedilatildeo

A abordagem utilizada para coletar e analisar os 99 projetos escolhidos como mostra aFigura 42 foi realizada de forma automatizada utilizando scripts python e dois projetosdesenvolvidos em Java para a coleta e tratamento de dados como descrito a seguir

Primeiramente foi realizado uma coacutepia dos repositoacuterios atuais de todos os 99 projetosmais populares do github em Java Para automatizar o processo foi desenvolvido umscript em python que lista todos os projetos escolhidos clona todos os repositoacuterios emuma pasta na maacutequina local e cria um arquivo temporaacuterio com as informaccedilotildees do nomede cada repositoacuterio e seu caminho absoluto na maacutequina local

25

Figura 42 Metodologia implementada para coleta e tratamento de dados

Em seguida foi necessaacuterio realizar o checkout de todas as versotildees entre Janeiro de2013 a Abril de 2017 de cada projeto Por motivos de otimizaccedilatildeo de espaccedilo da maacutequinalocal e automatizaccedilatildeo no processo de checkout utilizou-se de um segundo script pythonque realizava as seguintes tarefas para cada mecircs em cada projeto verificar se dentreo mecircs estipulado houve algum commit para aquele projeto se sim pega-se o hash douacuteltimo commit do mecircs realiza o checkout conta-se a quantidade de linhas de coacutedigo emJava que o projeto tem utilizando a biblioteca cloc e armazena todas as informaccedilotildeespertinentes referentes a todos os projetos que naquele mecircs tiveram commits para que oprojeto static-analysis possa entatildeo ser executado sobre esses projetos naquele determinadomomento As informaccedilotildees coletadas que satildeo utilizadas pelo static-analysis correspondemao nome do projeto o hash do commit para aquela versatildeo a pasta onde o projeto estaacutearmazenado na maacutequina local a quantidade de linhas de coacutedigo Java do projeto e datareferente ao commit Essas informaccedilotildees satildeo pertinentes para que o projeto static-analysisconsiga funcionar de forma correta projeto este descrito em detalhes a seguir

431 static-analysis

O static-analysis foi um projeto desenvolvido anteriormente a este trabalho pelos alunosThiago Cavalcanti e Vinicius de Almeida cujo objetivo eacute realizar a anaacutelise estaacutetica de

26

coacutedigos-fonte Java e gerar arquivos de saiacuteda contendo informaccedilotildees de classes e meacutetodoscom suas devidas ocorrecircncias de caracteriacutesticas da linguagem [40]

A anaacutelise estaacutetica de coacutedigo consiste em analisar um coacutedigo-fonte sem a necessidadede executaacute-lo Esse tipo de anaacutelise eacute de extrema importacircncia para manter um coacutedigo dequalidade evitar futuras refatoraccedilotildees e obter informaccedilotildees estatiacutesticas de forma raacutepida epraacutetica [41]

Seguindo esse princiacutepio o static-analysis foi projetado para receber um arquivo deentrada csv seguindo o padratildeo

Tipo da Aplicaccedilatildeo Inicio do projeto Antes ou Apoacutes Java 5 Nome do ProjetoVersatildeo Caminho absolutoQuantidade de linhas de coacutedigo

Atraveacutes da informaccedilatildeo do caminho absoluto do projeto o static-analysis varre osdiretoacuterios em busca dos arquivos fonte java realiza o parse desses arquivos e utilizade Visitors para extrair as informaccedilotildees desejadas e exporta-las em arquivos csv Ouso de Visitors permite que sejam escolhidas as informaccedilotildees desejadas para a consultacomo expressotildees Lambda e AIC s aleacutem de possibilitar que sejam implementados novosVisitors conforme a linguagem evolua ou as necessidades mudem

Para este trabalho foram utilizados os Visitors de expressotildees Lambda map() filter()AICs e declaraccedilotildees de meacutetodos

432 BDAnalisador

Apoacutes obter todas as informaccedilotildees necessaacuterias geradas pelo static-analysis era preciso ma-nipular os dados de forma que facilitasse a coleta de dados para o estudo proposto Comovaacuterios arquivos em formato csv satildeo de difiacutecil manipulaccedilatildeo foi desenvolvido entatildeo umaferramenta chamada BDAnalisador Esta ferramenta eacute responsaacutevel por processar os arqui-vos em csv gerados pelo static-analysis e popular uma base de dados relacional MySQLcom as informaccedilotildees pertinentes a este estudo

O BDAnalisador foi desenvolvido com a intenccedilatildeo de tornar mais simples o trabalhocom os dados resultantes do static-analysis de forma que consultas em SQL pudessemser feitas a ponto de permitir a obtenccedilatildeo de resultados mais complexos Seguindo esseobjetivo o framework Hibernate foi escolhido como ferramenta para persistecircncia devidoa ser um framework jaacute consolidado no mercado e que de forma simples relaciona osobjetos Java ao banco de dados MySQL [42] A divisatildeo de classes foi projetada em quatroentidades Projeto Versao Classe e Metodo cada uma com seus respectivos camposcontendo as informaccedilotildees necessaacuterias para a pesquisa como pode ser visto na Figura 44Eacute importante ressaltar que a tabela de Versao guarda hashs de commits devido agrave escolhade utilizar commits para obter mais informaccedilatildeo de evoluccedilatildeo de coacutedigo em um menor

27

espaccedilo de tempo Aleacutem disso para este trabalho optou-se por persistir todos os meacutetodose classes de cada versatildeo sem se importar com a repeticcedilatildeo desses dados pois a hipoacutetesede haver grandes refatoraccedilotildees entre versotildees poderia comprometer a confiabilidade dasinformaccedilotildees

Figura 43 Diagrama de classes UML do BDAnalisador

Como visto na Figura 43 seguindo parcialmente a arquitetura MVC cada entidadepossui sua respectiva classe DAO(Data Access Object) para persistecircncia dos dados eapenas uma classe Controlador no projeto responsaacutevel pela manipulaccedilatildeo e parse dosdados dos arquivos csv gerados pelo static analysis para serem enviados agraves classes DAOO sistema inicia chamando o meacutetodo inicializar() da classe Controlador Esse meacutetodoeacute responsaacutevel por ler um arquivo de entrada csv que segue o mesmo modelo do arquivo dostatic-analysis citado na seccedilatildeo anterior O arquivo conteacutem os dados de todos os projetose suas respectivas versotildees dessa forma o meacutetodo instancia um objeto da classe Projetoe persiste o projeto no banco de dados Para cada versatildeo encontrada no arquivo deentrada o inicializar() aciona os meacutetodos responsaacuteveis por instanciar e preencher aslistas da classe Classe e Metodo Os meacutetodos responsaacuteveis por preencher as listas varremos arquivos csv gerados pelo static-analysis e fazem o parse das informaccedilotildees relevantescomo nomes dos meacutetodos e quantidades de lambdas para construir os objetos que seratildeogravados Ao final dos preenchimentos o objeto Versatildeo eacute instanciado e gravado no bancode dados atraveacutes de sua classe DAO ao mesmo tempo que grava suas respectivas Classese Metodos

28

Apoacutes vaacuterios testes e correccedilotildees de bugs o banco de dados se encontrava finalmente comas informaccedilotildees de 99 projetos Java open-source separados por um commit por mecircs desde2013 cada um com suas respectivas informaccedilotildees de classes meacutetodos e a quantidade deexpressotildees lambda filters e maps em cada meacutetodo Filter ou Filter pattern eacute o padratildeode projeto que tem como objetivo filtrar objetos de uma coleccedilatildeo (Collection) de acordocom algum criteacuterio Jaacute o map ou map pattern eacute um padratildeo que ldquomapeia os elementosde uma coleccedilatildeo aplicando uma funccedilatildeo a eles para uma nova coleccedilatildeo [43] A coleta deinformaccedilotildees sobre esses padrotildees podem ser uacuteteis para possiacuteveis anaacutelises de oportunidadesde uso de expressotildees lambda para refatoraccedilatildeo de coacutedigo

A Figura 44 mostra o esquema de como o banco de dados resultante foi gerado

Figura 44 Modelo relacional do banco de dados populado pelo BDAnalisador Imagemgerada com software DBeaver [2]

44 Classificaccedilatildeo e Anaacutelise

Com o banco de dados populado restam apenas as etapas de classificaccedilatildeo e anaacutelise pararesponder as questotildees de pesquisa propostas Para isso inicialmente houve uma tentativade se utilizar apenas queries SQL para analisar os dados de acordo com as informaccedilotildeesrelevantes Poreacutem devido ao fato de o banco de dados conter todas as informaccedilotildees detodos os projetos e todas as suas versotildees queries que possuem uma alta complexidadedemoravam muito tempo para retornar os dados

Assim com o objetivo de facilitar o trabalho alguns scripts python foram desenvolvi-dos para rodar as queries separadamente e individualmente para cada projeto de formaautomatizada a fim de melhorar o tempo de resposta para obtenccedilatildeo dos resultados

29

441 Meacutedia de Lambda

O primeiro script retorna a quantidade de expressotildees lambda (ou AICs) por n snapshotsque contenha expressotildees lambda O objetivo eacute ter uma visatildeo geral da meacutedia de expressotildeeslambda e AICs utilizadas por cada projeto e como nem todos os snapshots coletados decada projeto possuem expressotildees lambda e AICs apenas aqueles com alguma expressatildeolambda ou AIC satildeo incluiacutedos no caacutelculo da meacutedia

Mmedia =sumn qtdLambdai

n

442 Anaacutelise Temporal

O segundo script retorna para cada projeto a soma total da quantidade de expressotildeeslambda AIC map() e filter() no projeto inteiro para cada versatildeo Ou seja tem-seo total de cada uma das quatro propriedades selecionadas para cada mecircs do projetoobtendo assim uma visatildeo temporal de evoluccedilatildeo do uso das caracteriacutesticas descritas ATabela 41 ilustra parcialmente o resultado obtido para o projeto agera onde idVersaoeacute o identificador no banco de dados referente ao hash do commit mensal coletado qtd eacutea quantidade de cada uma das caracteriacutesticas escolhidas e a data do commit encontra-seno formato americano

Tabela 41 Informaccedilotildees mensais sobre o projeto ageraidVersao Data do Commit qtd lambda qtd AIC qtd maps qtd filter

823 512016 0 29 4 0755 612016 13 28 4 0686 6152016 13 29 4 0621 812016 13 29 4 0555 8162016 13 30 4 0485 922016 13 30 4 0422 10132016 14 30 4 0356 11282016 14 30 4 0295 12212016 21 30 5 0232 212017 21 30 5 0175 312017 21 30 5 0112 3312017 21 36 5 048 4242017 21 48 5 0

Os resultados obtidos com esta anaacutelise temporal permitiu a identificaccedilatildeo de padrotildees nautilizaccedilatildeo de expressotildees lambda em relaccedilatildeo a utilizaccedilatildeo de AIC por todos os projetos Foi

30

possiacutevel classificar todos os projetos em 6 grupos ilustrado na Figura 45 Primeiramenteseparou-se os projetos entre os que possuem expressotildees lambda e os que natildeo possuemDentre os que possuem identificou-se cinco categorias

1 Grupo 1 Quantidade de AICs e expressotildees lambda aumentam com o tempo pro-porcionalmente

2 Grupo 2 Quantidade de AICs diminui agrave medida que a quantidade de expressotildeeslambda aumentam e a quantidade de expressotildees lambda ultrapassa a quantidade deAIC em um determinado momento

3 Grupo 3 Quantidade de AICs diminui agrave medida que a quantidade de expressotildeeslambda aumentam mas a quantidade de AIC permanece superior agrave quantidade delambda

4 Grupo 4 Expressotildees lambda satildeo introduzidas e existem por um pequeno periacuteodode tempo mas satildeo completamente removidas posteriormente

5 Grupo 5 Quantidade de expressotildees lambda eacute constante e muito inferior compa-rado com a quantidade de AICs no projeto Foi determinado que para pertencera esta classificaccedilatildeo o projeto precisa ter uma razatildeo de meacutedia de expressotildees lamb-dasnapshot por meacutedia de AICsnapshot inferior a 020 Esse paracircmetro foi esta-belecido com o objetivo de definir um padratildeo para o que pode ser considerado umprojeto com poucas expressotildees lambda

Figura 45 Classificaccedilatildeo dos projetos

31

443 Refatoraccedilatildeo de Coacutedigo

O uacuteltimo script teve como objetivo realizar uma tentativa inicial de identificar refatoraccedilatildeode coacutedigo da seguinte maneira para todos os projetos que possuem expressotildees lambdaforam identificados o mecircs imediatamente antes da introduccedilatildeo de expressotildees lambda e omecircs seguinte onde houve a primeira ocorrecircncia de lambda no projeto Assim realizou-se uma anaacutelise do tamanho em quantidade de linhas de coacutedigo de todos os meacutetodosdo projeto que no mecircs seguinte tiveram introduccedilatildeo de lambda Em seguida fez-se umacomparaccedilatildeo com os mesmos meacutetodos em relaccedilatildeo ao mecircs anterior e assim foi possiacuteveldetectar quais meacutetodos tiveram a quantidade de linhas de coacutedigo reduzidas o que seriaum indicativo natildeo necessariamente exclusivo de que uma refatoraccedilatildeo de coacutedigo possa terocorrido

Sabe-se que este meacutetodo de detecccedilatildeo de refatoraccedilatildeo de coacutedigo possui suas limitaccedilotildeesuma vez que as comparaccedilotildees para saber se um meacutetodo existe em ambas versotildees eacute feitopuramente por comparaccedilatildeo de String (nome do meacutetodo) e a classe que este pertence

444 Casos de Uso

Os meacutetodos descritos acima ajudaram a identificar alguns padrotildees e facilitar a anaacutelise dosdados Poreacutem natildeo satildeo suficientes para que se possa responder agraves questotildees de pesquisaDessa forma apoacutes a identificaccedilatildeo dos grupos de classificaccedilatildeo para os projetos foramescolhidos um projeto de cada grupo (com exceccedilatildeo do grupo dos projetos sem expressotildeeslambda) para realizar um breve estudo de caso com o objetivo de identificar e caracterizarmelhor a adoccedilatildeo de expressotildees lambda Os projetos escolhidos foram agera vertxAndroid-CleanArchitecture RxJava e guava

32

Capiacutetulo 5

Resultados Obtidos e Anaacutelise

Neste capiacutetulo seratildeo apresentados os dados obtidos e anaacutelise com o objetivo de responderagraves questotildees de pesquisa propostas Como mencionado anteriormente as perguntas seratildeorespondidas de duas maneiras algumas com informaccedilotildees gerais sobre todos os projetose outras com breve estudos de caso envolvendo cinco projetos

51 Visatildeo Geral

Dentre os repositoacuterios coletados para a anaacutelise 74 (7474) natildeo utilizaram nenhumaexpressatildeo lambda no projeto durante todo o periacuteodo analisado (Janeiro de 2013 a Abrilde 2017) restando apenas 25 repositoacuterios (2525) com expressotildees lambda Eacute interessantedestacar que apesar de a quantidade de repositoacuterios que natildeo possuem expressotildees lambdaser relativamente expressiva muitos destes repositoacuterios satildeo de projetos em Java que umdia foram populares e atualmente natildeo estatildeo sendo mais desenvolvidos (por exemplo umaplicativo que soacute funciona para Android 23 atualmente descontinuado)

Levando em consideraccedilatildeo apenas os projetos que possuem expressotildees lambda exis-tem dois tipos de dados que podem ser analisados para responder agrave primeira questatildeo depesquisa atraveacutes dos dados obtidos pelo meacutetodo anteriormente mencionado como anaacutelisetemporal e a meacutedia de lambda por snapshot mencionados no capiacutetulo anterior

Com relaccedilatildeo ao ano em que a primeira ocorrecircncia foi encontrada 6 projetos introduzi-ram expressotildees lambda jaacute em 2014 8 comeccedilaram a utilizar em 2015 7 em 2016 e apenas4 tiveram a primeira ocorrecircncia de expressotildees lambda em 2017 Dessa forma percebe-seque os projetos estatildeo relativamente bem distribuiacutedos em grupos quanto ao ano em que seintroduziu expressotildees lambda

Pela meacutedia de lambda por snapshot (lambdasnapshot) a maioria (11 projetos) possuiuma quantidade expressiva acima de 100 lambdasnapshot (com 6 projetos entre 20 e 100lambdasnapshot e 8 projetos com menos de 20 lambdasnapshot) como apresentados no

33

graacutefico da Figura 51 Isso mostra que essa nova caracteriacutestica jaacute estaacute sendo bem utilizadanos projetos que comeccedilaram a migrar para a nova versatildeo do Java

Figura 51 Graacuteficos dos projetos separados por ano de introduccedilatildeo de expressotildees lambdae meacutedia de lambda por snapshot

Com isso pode-se observar que apesar de a quantidade de projetos que possuemexpressotildees lambda natildeo ser tatildeo alta eacute possiacutevel obter resultados expressivos uma vez quea quantidade dos projetos com lambda estatildeo bem dispersos quanto ao periacuteodo em quecomeccedilaram a adotar essa caracteriacutestica e a quantidade de expressotildees lambda por snapshot

511 Projetos Selecionados

Atraveacutes dos grupos de classificaccedilatildeo identificados pela anaacutelise temporal descritos na Figura45 cinco projetos foram selecionados para uma anaacutelise detalhada levando em consideraccedilatildeoo grupo em que eles pertencem Estes projetos seratildeo apresentados a seguir

512 agera

Agera eacute uma biblioteca Android que ajuda a introduzir programaccedilatildeo funcional reativa(functional reactive programming) em projetos Android Eacute um projeto recente lanccediladoem 2016 pela Google [44] e encontra-se no grupo dos projetos que introduziram expressotildeeslambda em 2016 no mesmo ano de seu lanccedilamento contendo uma meacutedia de expressotildeeslambda de 16 lambdasnapshot

Na classificaccedilatildeo estabelecida agera pertence ao Grupo 1 onde a quantidade de ex-pressotildees lambda no projeto com o tempo aumentam juntamente com a quantidade deAICs como mostra o graacutefico de anaacutelise temporal na Figura 52

34

Figura 52 Graacuteficos de anaacutelise temporal do projeto agera

513 vertx

Eclipse Vertx eacute um conjunto de ferramentas para criaccedilatildeo de reactive applications namaacutequina virtual Java (JVM) em grande escala [45] Seu primeiro lanccedilamento aconteceuem 2011 e a primeira ocorrecircncia de expressotildees lambda no projeto aconteceu em 2014 Esteprojeto possui uma meacutedia de 2867 lambdasnapshot e dentre os projetos consideradosneste trabalho eacute o que possui a maior quantidade de expressotildees lambda

Este projeto pertence ao Grupo 2 onde a quantidade de expressotildees lambda aumen-tou consideravelmente pelos meses ultrapassando a quantidade de AICs que diminuiudrasticamente como mostra a Figura 53

35

Figura 53 Graacuteficos de anaacutelise temporal do projeto Vertx

514 Android-CleanArchitecture

Apesar de ser uma amostra de projeto Android-CleanArchitecture que tem como objetivoconstruir aplicaccedilotildees Android utilizando clean architecture foi lanccedilado em 2014 mas semanteacutem sempre atualizado [46]

A introduccedilatildeo de expressotildees lambda que aconteceu no ano de 2015 se deu de formatiacutemida com uma meacutedia de 35 lambdasnapshot De qualquer forma este projeto conseguerepresentar com seu graacutefico de anaacutelise temporal o grupo 3 composto por projetos em quea quantidade de expressotildees lambda aumentou mas sem ultrapassar AICs que diminuiacuteramdemonstrado no graacutefico da Figura 54

36

Figura 54 Graacuteficos de anaacutelise temporal do projeto Android-CleanArchitecture

515 RxJava

Dentre os repositoacuterios estudados RxJava eacute considerado o mais popular Como umaimplementaccedilatildeo de Reactive Extensions para a JVM RxJava teve seu lanccedilamento dadoem 2013 [47] Expressotildees lambda apareceram pela primeira vez no ano de 2015 comuma meacutedia de 766 lambdasnapshot

Apesar de uma meacutedia relativamente alta o tempo de vida das expressotildees lambda nesteprojeto foi bem curto caracterizando assim projetos do grupo 4 houve a introduccedilatildeo dasexpressotildees lambda no projeto poreacutem houve a remoccedilatildeo completa de todas as expressotildeeslambda previamente introduzidas desaparecendo completamente do projeto ateacute a datada coleta de dados (Figura 55)

37

Figura 55 Graacuteficos de anaacutelise temporal do projeto RxJava

516 guava

Guava eacute um conjunto de bibliotecas para Java da Google lanccedilado em 2011 A atualizaccedilatildeodo coacutedigo do projeto para Java 8 aconteceu somente em 2016 e apesar do projeto conteruma meacutedia de 281 lambdasnapshot ele foi escolhido como representante dos projetosdo Grupo 5 (Figura 56) que possuem expressotildees lambda mas de forma natildeo expressiva osuficiente quando comparado com a quantidade de AIC pelo fato de sua razatildeo de meacutedia delambdasnapshot por meacutedia de AICsnapshot ser 004 Ou seja embora o projeto tenhaexpressotildees lambda estas satildeo consideradas muito poucas quando inseridas no contextogeral deste projeto que eacute considerado um projeto grande

38

Figura 56 Graacuteficos de anaacutelise temporal do projeto Guava

52 Refatoraccedilatildeo de Coacutedigo

Com o objetivo de caracterizar melhor como as expressotildees lambda estatildeo sendo utilizadaseacute interessante identificar se estas estatildeo sendo introduzidas atraveacutes de refatoraccedilatildeo de coacutedigoou em coacutedigo novo

Os projetos classificados como pertencentes ao Grupo 2 possuem em comum o fatode expressotildees lambda aumentarem a medida que AICs diminuem ultrapassando-as eessa caracteriacutestica em comum pode indicar que nestes projetos possivelmente houve re-fatoraccedilatildeo de coacutedigo visto que AIC sendo substituiacutedo por expressotildees lambda dentro dascondiccedilotildees determinadas eacute a maneira mais comum de se identificar refatoraccedilatildeo de coacute-digo para introduccedilatildeo de expressotildees lambda [12] Os projetos que compotildeem o grupo 2representam 44 de todos os projetos estudados que possuem expressotildees lambda o quepode ser um indicativo caso a hipoacutetese de refatoraccedilatildeo de coacutedigo seja positiva de quemuitos projetos que estatildeo adotando o Java 8 estatildeo se preocupando de alguma formacom refatoraccedilatildeo se coacutedigo Fazem parte desse grupo os seguintes projetos elasticsearchjava-design-patterns PocketHub presto RxJava-Android-Samples spark vertx zipkinjava8-tutorial dropwizard e material-dialogs

39

Outra maneira de verificar possiacuteveis indicadores de refatoraccedilatildeo de coacutedigo foi atraveacutesda anaacutelise dos tamanhos (em quantidade de linhas de coacutedigo) dos meacutetodos com expressotildeeslambda no mecircs em que se introduziu expressotildees lambda e um mecircs imediatamente antesdeste Essa anaacutelise mostra que dos 25 projetos com expressotildees lambda 12 (48) projetostiveram ao menos um meacutetodo em que houve uma diminuiccedilatildeo no tamanho o que podeser considerado um indicativo de refatoraccedilatildeo de coacutedigo A Figura 57 mostra todos osprojetos em relaccedilatildeo agrave quantidade total de meacutetodos que possuem lambda no primeiro mecircsde introduccedilatildeo do mesmo em vermelho comparado com a quantidade desses meacutetodos quetiveram uma diminuiccedilatildeo no tamanho quando comparados com o coacutedigo do mecircs anteriorem azul

Figura 57 Comparaccedilatildeo entre todos os projetos com expressatildeo lambda sobre refatoraccedilatildeode coacutedigo no mecircs de introduccedilatildeo da caracteriacutestica

Ainda observando a figura 57 com relaccedilatildeo aos projetos que natildeo tiveram nenhummeacutetodo com diminuiccedilatildeo de tamanho (barra azul) percebe-se que todos os 13 projetossequer tiveram uma quantidade significativa de meacutetodos que possuem expressotildees lambda(com o maior tendo apenas 5 meacutetodos) no mecircs de introduccedilatildeo da caracteriacutestica no projetoe ao mesmo tempo jaacute existiam no mecircs em que natildeo existia lambda no projeto Essa eacuteuma observaccedilatildeo importante porque projetos como vertx sendo este o que possui a maiormeacutedia de lambdasnapshot de todos os projetos e ao mesmo tempo tendo apenas trecircsmeacutetodos que continham expressotildees lambda no mecircs da introduccedilatildeo e que existiam no mecircs

40

anterior permitem inferir que todas as outras expressotildees lambda existentes no projetopara este determinado mecircs de introduccedilatildeo encontram-se em coacutedigo novo introduzido

Eacute importante ressaltar que somente essa anaacutelise natildeo eacute exclusivamente suficiente paradeterminar se estes projetos estatildeo realmente introduzindo lambda em coacutedigo novo ourealizando refatoraccedilatildeo uma vez que como a comparaccedilatildeo aconteceu apenas no mecircs deintroduccedilatildeo com o mecircs imediatamente anterior natildeo reflete todo o ciclo de vida do pro-jeto Por exemplo algumas equipes podem escolher refatorar o coacutedigo depois de umtempo de adaptaccedilatildeo apoacutes a transiccedilatildeo para a nova versatildeo da linguagem Assim paraobter uma melhor anaacutelise sobre refatoraccedilatildeo de coacutedigo ou natildeo feita nestes projetos aleacutemde outras anaacutelises referentes aos padrotildees tipicamente adotados para implementaccedilatildeo delambda nestes projetos seratildeo apresentados a seguir os estudos de caso dos cinco projetospreviamente selecionados

Outro ponto importante eacute o fato de que apesar das informaccedilotildees quanto agraves quantida-des de filter e map terem sido incluiacutedas inicialmente no trabalho para observar possiacuteveispadrotildees de refatoraccedilatildeo de coacutedigo percebeu-se que estas natildeo satildeo utilizadas de forma con-sideraacutevel pelos projetos estudados e para fins de anaacutelises generalizadas natildeo apresentaramtanta influecircncia na utilizaccedilatildeo de expressotildees lambda quanto a quantidade de AICs noprojeto

53 Estudos de Caso

Dentre os projetos analisados verificou-se que os projetos de pequeno e meacutedio porte op-taram por refatorar de uma vez seus coacutedigos para incluir expressotildees lambda em situaccedilotildeesem que se utilizava AICs anteriormente ou em alguns poucos casos de utilizaccedilatildeo deCollection Os projetos de grande porte natildeo apresentaram nenhuma refatoraccedilatildeo de coacute-digo ou uma refatoraccedilatildeo parcial gradativa provavelmente devido agrave grande quantidade dearquivos e coacutedigo que possuem o que pode tornar o trabalho de refatoraccedilatildeo extenso ecansativo

O projeto vertx que pertence ao grupo 2 dos projetos em que a quantidade de ex-pressotildees lambda aumentaram e as de AICs diminuiacuteram com lambda ultrapassando AICsexecutou inicialmente commits em maio de 2014 com adiccedilatildeo de coacutedigo novo utilizandoexpressotildees lambda e apoacutes um mecircs realizou um commit maior com a refatoraccedilatildeo de todasas AICs para expressotildees lambda Apoacutes a refatoraccedilatildeo o projeto se preocupou em mantera utilizaccedilatildeo de expressotildees lambda ao mesmo tempo que o uso de AICs se manteve apenasaos casos de classes com interfaces natildeo funcionais A Figura 58 apresenta uma parte docommit de refatoraccedilatildeo de coacutedigo que mostra em vermelho a parte eliminada do coacutedigo(AIC) e em verde o coacutedigo novo representando a substituiccedilatildeo por uma expressatildeo lambda

41

Figura 58 Commit de refatoraccedilatildeo de coacutedigo do projeto Vertx [3]

Alguns projetos ainda natildeo se preocuparam em refatorar o coacutedigo para o uso de ex-pressotildees lambda ateacute a data deste trabalho que eacute o caso do projeto guava que apresentouum commit em 03112016 com a atualizaccedilatildeo do projeto para Java 8 Mas a partir daatualizaccedilatildeo se preocupou em utilizar as expressotildees lambda apenas na implementaccedilatildeo decoacutedigo novo O cenaacuterio em que a refatoraccedilatildeo natildeo eacute prioridade ainda eacute a realidade de vaacuteriosprojetos de grande porte visto que os dados de projetos sem nenhuma expressatildeo lambdasatildeo o maior nuacutemero neste trabalho Poreacutem projetos que jaacute adotaram a utilizaccedilatildeo do Java8 tendem a mudar isso com o passar do tempo A Figura 59 apresenta em verde umaadiccedilatildeo de coacutedigo novo com expressatildeo lambda sem a eliminaccedilatildeo de algum coacutedigo anteriora esse que estaria em vermelho

42

Figura 59 Exemplo de um arquivo do commit de adiccedilatildeo de coacutedigo novo em Java 8 doprojeto Guava [4]

Na categoria de projetos em que os AICs e expressotildees lambda aumentam proporci-onalmente (grupo 1) o projeto agera realizou um commit em 19052016 com a adiccedilatildeoda biblioteca retrolambda como dependecircncia do projeto Essa biblioteca utilizada prin-cipalmente por projetos Android permite executar coacutedigo Java 8 contendo expressotildeeslambda em Java 5 6 e 7 [48] O commit tambeacutem apresenta refatoraccedilatildeo dos AICs ad-vindos de interfaces funcionais para expressotildees lambda Apesar de o projeto continuar autilizar as expressotildees lambda em seus commits posteriores o nuacutemero de AICs tambeacutemcontinuou a aumentar visualizando os commits posteriores notou-se que esses AICs satildeorelativos a interfaces natildeo funcionais ou seja que possuem mais de um meacutetodo O projetoAndroid-CleanArchitecture eacute similar ao agera pois tambeacutem optou pela instalaccedilatildeo da bi-blioteca retrolambda para uso de expressotildees lambda em seus coacutedigos e como tambeacutem eacuteum projeto de pequeno porte houve uma pequena refatoraccedilatildeo dos AICs A Figura 510mostra a parte do commit de refatoraccedilatildeo de coacutedigo em que o desenvolvedor adiciona abiblioteca retrolambda como dependecircncia

43

Figura 510 Commit de adiccedilatildeo da biblioteca Retrolambda no projeto Agera [5]

Outro caso interessante eacute o do projeto RxJava que em 2015 optou pela refatoraccedilatildeodo coacutedigo para a utilizaccedilatildeo de expressotildees lambda quase eliminando por completo o usode AICs mas que no ano seguinte reverteu os commits de forma que eliminasse comple-tamente o uso de expressotildees lambda para manter a retrocompatibilidade com o Java 6A Figura 511 demonstra uma parte do commit de reversatildeo do coacutedigo para Java 6 emque pode ser visto em vermelho o coacutedigo anterior com expressotildees lambda e o verde como novo coacutedigo utilizando AIC novamente

44

Figura 511 Commit de remoccedilatildeo de Lambdas e volta para o uso de AICs no projetoRXJava [6]

Essa preocupaccedilatildeo com retrocompatibilidade de coacutedigo pode ser um fator crucial nadecisatildeo das equipes de desenvolvimento na hora de decidir como fazer o software co-evoluircom a linguagem sem perder a compatibilidade com versotildees anteriores

45

Capiacutetulo 6

Consideraccedilotildees Finais

Este estudo permitiu entender melhor como projetos estatildeo realizando a migraccedilatildeo para oJava 8 em especial utilizando uma nova caracteriacutestica introduzida expressatildeo lambdaApesar de a maioria dos projetos populares considerados natildeo possuiacuterem nenhuma ocor-recircncia de expressotildees lambda os projetos que tinham expressotildees lambda foram suficientespara realizar um primeiro estudo de caracterizaccedilatildeo no uso desta caracteriacutestica e com osprojetos efetivamente utilizados para estudo foi possiacutevel agrupaacute-los quanto a maneira emque as expressotildees lambda estavam sendo utilizadas quando comparadas com AICs em 5grandes grupos quando AIC e lambda aumentam proporcionalmente quando AIC dimi-nui e lambda aumenta ultrapassando AIC quando AIC diminui mas continua superior aolambda crescente expressotildees lambda que foram introduzidas e retiradas completamentedo coacutedigo e expressotildees lambda que natildeo existem em quantidades expressivas

Foi possiacutevel entatildeo realizar um estudo aprofundado levando em consideraccedilatildeo as di-ferentes maneiras com que as expressotildees lambda foram adotadas nos projetos atraveacutes daescolha de um projeto que representasse cada grupo para anaacutelise Dentre os cinco projetosestudados foi possiacutevel observar alguns padrotildees tipicamente adotados por desenvolvedorespara implementar expressotildees lambda em seus projetos como a utilizaccedilatildeo da bibliotecas(retrolambda) que permitissem uma flexibilizaccedilatildeo na utilizaccedilatildeo de expressotildees lambda oucomo lambda eacute primariamente utilizada para substituir determinados AICs ou operaccedilotildeesem Collection

Aleacutem disso foi possiacutevel observar como a refatoraccedilatildeo de coacutedigo acontece em cada umdesses projetos Observou-se como projetos menores tendem a refatorar coacutedigo maisfacilmente ao passo que projetos maiores e mais complexos fazem menos refatoraccedilatildeo oudemoram mais entre o periacuteodo em que houve a primeira migraccedilatildeo de coacutedigo para a novaversatildeo da linguagem ateacute o periacuteodo em que realmente decidem refatorar coacutedigo Aleacutem dacomplexidade do projeto influenciar na decisatildeo de migrar o projeto para uma versatildeo maisrecente da linguagem a preocupaccedilatildeo com retrocompatibilidade com versotildees anteriores da

46

linguagem tambeacutem podem ser uma barreira para que projetos comecem a evoluir o coacutedigojuntamente com a evoluccedilatildeo da linguagem

Ainda assim foi possiacutevel observar que a preocupaccedilatildeo com a co-evoluccedilatildeo do software-linguagem existe entre os desenvolvedores de projetos mas a realizaccedilatildeo da migraccedilatildeo aindaacontece lentamente devido agrave diversos fatores que precisam ser levados em consideraccedilatildeopara a manutenccedilatildeo do projeto

Para trabalhos e contribuiccedilotildees futuras seria interessante desenvolver uma ferramentaque pudesse analisar diretamente no coacutedigo-fonte as oportunidades de aplicaccedilatildeo de ex-pressotildees lambda dessa forma poderiam ser analisadas as porcentagens de conversatildeo decoacutedigo para Java 8 e obter melhores conclusotildees sobre a importacircncia que os projetos estatildeodando para a evoluccedilatildeo de seus coacutedigos Outro fator interessante seria aplicar mais Visitorsagrave ferramenta static-analysis e fazer este mesmo estudo aplicado agrave outras caracteriacutesticasda linguagem

47

Referecircncias

[1] Kagdi Huzefa Michael L Collard e Jonathan I Maletic A survey and taxonomyof approaches for mining software repositories in the context of software evolution2007 ix 3 8 9 10 11

[2] DBeaver Dbeaver - features httpdbeaverjkissorgdocsfeatures ix 29

[3] Eclipse Vertx commit Java8-ify code httpsgithubcomeclipsevertxcommit93f95e9c77419f442a42fe711b6eeaef88192fd3 ix 42

[4] Google Guava commit Release java 8 changes to guava httpsgithubcomgoogleguavacommit73e382fa877f80994817a136b0adcc4365ccd904 ix 43

[5] Google Agera commit Collapsed testapp with retrolambda httpsgithubcomgoogleageracommit5e518b7b05f9e7a34a314945f68deff7b2c3e334 ix 44

[6] ReactiveX Rxjava commit 2x full jdk 6 compatible backport + includ-ing bugfixes up to today httpsgithubcomReactiveXRxJavacommit000a174d87a901135f9665d3b11f3627fd2dc4ed ix 45

[7] Godfrey M W e D M German The past present and future of software evolutionEm 2008 Frontiers of Maintenance paacuteginas 129ndash138 Sept 2008 1 6

[8] Favre J M Languages evolve too changing the software time scale Em Principles ofSoftware Evolution Eighth International Workshop on paacuteginas 33ndash42 IEEE 20051 5 7

[9] Overbey Jeffrey L e Ralph E Johnson Regrowing a language refactoring tools allowprogramming languages to evolve Em ACM SIGPLAN Notices volume 44 paacuteginas493ndash502 ACM 2009 1 5 7 8 12

[10] Grechanik Mark Collin McMillan Luca DeFerrari Marco Comi Stefano CrespiDenys Poshyvanyk Chen Fu Qing Xie e Carlo Ghezzi An empirical investiga-tion into a large-scale java open source code repository Em Proceedings of the2010 ACM-IEEE International Symposium on Empirical Software Engineering andMeasurement ESEM rsquo10 paacuteginas 111ndash1110 New York NY USA 2010 ACMISBN 978-1-4503-0039-1 httpdoiacmorg10114518527861852801 1

[11] TIOBE Tiobe httpswwwtiobecomtiobe-index 1 14

48

[12] Gyori Alex Lyle Franklin Danny Dig e Jan Lahoda Crossing the gap from im-perative to functional programming through refactoring Em Proceedings of the 20139th Joint Meeting on Foundations of Software Engineering ESECFSE 2013 paacute-ginas 543ndash553 New York NY USA 2013 ACM ISBN 978-1-4503-2237-9 httpdoiacmorg10114524914112491461 2 11 24 39

[13] OpenJDK State of the lambda httpcropenjdkjavanet~briangoetzlambdalambda-state-4html 2

[14] Han Jiawei Micheline Kamber e Jian Pei Data Mining Concepts and TechniquesMorgan Kaufmann Publishers Inc San Francisco CA USA 3rd ediccedilatildeo 2011ISBN 0123814790 9780123814791 3

[15] Fowler Martin e Kent Beck Refactoring improving the design of existing codeAddison-Wesley Professional 1999 5 7

[16] Lehman M M J F Ramil P D Wernick D E Perry e W M Turski Met-rics and laws of software evolution - the nineties view Em Proceedings of the4th International Symposium on Software Metrics METRICS rsquo97 paacuteginas 20ndashWashington DC USA 1997 IEEE Computer Society ISBN 0-8186-8093-8 httpdlacmorgcitationcfmid=823454823901 6

[17] Hassan Ahmed E e Tao Xie Software intelligence The future of mining softwareengineering data Em Proceedings of the FSESDP Workshop on Future of SoftwareEngineering Research FoSER rsquo10 paacuteginas 161ndash166 New York NY USA 2010ACM ISBN 978-1-4503-0427-6 httpdoiacmorg101145188236218823978 9

[18] Hassan Ahmed E The road ahead for mining software repositories Em Frontiers ofSoftware Maintenance 2008 FoSM 2008 paacuteginas 48ndash57 IEEE 2008 8

[19] Berry Michael J e Gordon Linoff Data Mining Techniques For Marketing Salesand Customer Support John Wiley amp Sons Inc New York NY USA 1997ISBN 0471179809 10

[20] Parnin Chris Christian Bird e Emerson Murphy-Hill Java generics adoption hownew features are introduced championed or ignored Em Proceedings of the 8thWorking Conference on Mining Software Repositories paacuteginas 3ndash12 ACM 2011 12

[21] Oracle The java language specification httpsdocsoraclecomjavasespecsjlsse8jls8pdf 13

[22] Oracle The history of java technology httpwwworaclecomtechnetworkjavajavaseoverviewjavahistory-index-198355html 13

[23] Murphy Kieron So why did they decide to call itjava httpwwwjavaworldcomarticle2077265core-javaso-why-did-they-decide-to-call-it-java-html 13

[24] McGraw Tata Object-oriented Programming with Java Essentials and ApplicationsHill Education 13

49

[25] Oracle Differences between java ee and java se httpdocsoraclecomjavaee6firstcupdocgkhoyhtml 13

[26] Lindsey Clark S The History of Java Cambridge 14

[27] Oracle The java language environment httpwwworaclecomtechnetworkjavaintro-141325html 14

[28] Oracle Jdk 8 httpopenjdkjavanetprojectsjdk8 15 24

[29] Oracle Enhancements in java se 8 httpdocsoraclecomjavase8docstechnotesguideslanguageenhancementshtmljavase8 15 16 17

[30] Oracle Lambda expressions httpdocsoraclecomjavasetutorialjavajavaOOlambdaexpressionshtml 16 18 21

[31] Oracle Method references httpdocsoraclecomjavasetutorialjavajavaOOmethodreferenceshtml 16

[32] Oracle Default methods httpdocsoraclecomjavasetutorialjavaIandIdefaultmethodshtml 17

[33] Oracle Repeating annotations httpdocsoraclecomjavasetutorialjavaannotationsrepeatinghtml 17

[34] Oracle Type annotations httpdocsoraclecomjavasetutorialjavaannotationstype_annotationshtml 17

[35] Oracle Anonymous inner classes httpsdocsoraclecomjavasetutorialjavajavaOOanonymousclasseshtml 19

[36] Kothari CR Research Methodology Methods and Techniques New Age Interna-tional (P) Limited 2004 ISBN 9788122415223 httpsbooksgooglecombrbooksid=8c6gkbKi-F4C 22

[37] Nakakoji Kumiyo Yasuhiro Yamamoto Yoshiyuki Nishinaka Kouichi Kishida eYunwen Ye Evolution patterns of open-source software systems and communitiesEm IWPSE rsquo02 Proceedings of the International Workshop on Principles of SoftwareEvolution paacuteginas 76ndash85 New York NY USA 2002 ACM Press ISBN 1581135459httpdxdoiorg101145512035512055 23

[38] Rahman Foyzur Christian Bird e Premkumar Devanbu Clones What is that smellEmpirical Software Engineering 17(4-5)503ndash530 2012 24

[39] Chacon Scott Pro Git Apress Berkely CA USA 1st ediccedilatildeo 2009ISBN 1430218339 9781430218333 25

[40] Cavalcanti Thiago Gomes e Viniacutecius Correa de Almeida Caracterizaccedilatildeo do uso deconstruccedilotildees da linguagem java em projetos open-source Publicaccedilatildeo online 2016httpbdmunbbrhandle1048315733 27

50

[41] Parr Terence Language Implementation Patterns Create Your Own Domain-Specific and General Programming Languages Pragmatic Bookshelf 1st ediccedilatildeo 2009ISBN 193435645X 9781934356456 27

[42] Janssen Thorben 5 reasons to use jpa hibernate Publicaccedilatildeo online httpswwwsitepointcom5-reasons-to-use-jpa-hibernate 27

[43] Franklin Lyle Alex Gyori Jan Lahoda e Danny Dig Lambdaficator From imperativeto functional programming through automated refactoring Em Proceedings of the2013 International Conference on Software Engineering ICSE rsquo13 paacuteginas 1287ndash1290 Piscataway NJ USA 2013 IEEE Press ISBN 978-1-4673-3076-3 httpdlacmorgcitationcfmid=24867882486986 29

[44] Google Agera httpsgithubcomgoogleagerawiki 34

[45] Eclipse Eclipse vertx httpvertxio 35

[46] Cejas Fernando Android cleanarchitecture httpsgithubcomandroid10Android-CleanArchitecture 36

[47] ReactiveX Rxjava httpsgithubcomReactiveXRxJava 37

[48] Luontola Esko Retrolambda httpsgithubcomorfjackalretrolambda 43

51

Anexo I

Projetos utilizados

fastjson

platform_frameworks_base

netty

material-dialogs

kotlin

okhttp

tinker

AndroidUtilCode

RxJava

spring-boot

java-design-patterns

elasticsearch

ExoPlayer

kafka

vertx

realm-java

guava

zipkin

bazel

stetho

Signal-Android

glide

agera

fresco

plaid

presto

libgdx

spark

52

disruptor

lottie-android

flexbox-layout

PocketHub

zxing

spring-framework

deeplearning4j

dropwizard

interviews

BaseRecyclerViewAdapterHelper

uCrop

DanmakuFlameMaster

lottie-react-native

android-UniversalMusicPlayer

AndroidInterview-Q-A

greenDAO

retrofit

MaterialDrawer

BottomBar

druid

MPAndroidChart

Hystrix

guice

recyclerview-animators

dubbo

androidannotations

RxJava-Android-Samples

PhotoView

clojure

CircleImageView

AndroidSwipeLayout

jedis

MaterialViewPager

butterknife

junit4

RxBinding

leakcanary

SimianArmy

picasso

UltimateRecyclerView

53

AndroidViewAnimations

AppIntro

FizzBuzzEnterpriseEdition

ion

cheesesquare

physical-web

RxAndroid

Android-CleanArchitecture

Calligraphy

Android-Bootstrap

iosched

Android_Data

MaterialDesignLibrary

ListViewAnimations

EventBus

java8-tutorial

AndroidSlidingUpPanel

dagger

okhttputils

logger

HomeMirror

Material-Animations

android-Ultra-Pull-To-Refresh

android-async-http

Android-ObservableScrollView

Android-Universal-Image-Loader

ActionBarSherlock

SlidingMenu

storm

PagerSlidingTabStrip

Android-PullToRefresh

54

  • Dedicatoacuteria
  • Agradecimentos
  • Resumo
  • Abstract
  • Introduccedilatildeo
    • Contexto
    • Objetivos
      • Objetivos Gerais
      • Objetivos Especiacuteficos
        • Metodologia
        • Organizaccedilatildeo do Trabalho
          • Evoluccedilatildeo e Mineraccedilatildeo de Repositoacuterios de Software
            • Evoluccedilatildeo de Software
            • MSR Mineraccedilatildeo de dados e a Engenharia de Software
              • Classificaccedilatildeo
                • Trabalhos Relacionados
                  • Java SE 8 e JDK 8
                    • Histoacuterico
                    • Princiacutepios
                    • Evoluccedilatildeo
                    • Expressotildees Lambda
                      • Sintaxe
                      • Principais formas de uso
                          • Estudo e o Processo de Mineraccedilatildeo
                            • Questotildees de Pesquisa
                            • Fonte de Dados e Objetos de Estudo
                            • Processo de Mineraccedilatildeo
                              • static-analysis
                              • BDAnalisador
                                • Classificaccedilatildeo e Anaacutelise
                                  • Meacutedia de Lambda
                                  • Anaacutelise Temporal
                                  • Refatoraccedilatildeo de Coacutedigo
                                  • Casos de Uso
                                      • Resultados Obtidos e Anaacutelise
                                        • Visatildeo Geral
                                          • Projetos Selecionados
                                          • agera
                                          • vertx
                                          • Android-CleanArchitecture
                                          • RxJava
                                          • guava
                                            • Refatoraccedilatildeo de Coacutedigo
                                            • Estudos de Caso
                                              • Consideraccedilotildees Finais
                                              • Referecircncias
                                              • Anexo
                                              • Projetos utilizados

Agradecimentos

Agradecemos aos nossos familiares que sempre nos apoiam incondicionalmente durantetoda a nossa vida e especialmente durante o nosso periacuteodo na Universidade diante detodos os desafios enfrentados acreditando sempre no nosso sucesso

Ao nosso orientador professor doutor Rodrigo de Almeida Bonifaacutecio por trabalharconosco no desafio de desenvolver este projeto

E por fim a todos os nossos amigos que ingressaram no curso de ciecircncia de computaccedilatildeona UnB conosco no segundo semestre de 2010

iv

Resumo

Este trabalho apresenta um estudo sobre como as expressotildees lambda introduzidas nalinguagem Java desde 2014 estatildeo sendo utilizadas em projetos Java open-source Atraveacutesde uma amostragem de 99 projetos populares existentes na plataforma Github observou-se como e quando esta caracteriacutestica foi introduzida nestes projetos identificando padrotildeesadotados e meacutetodos de refatoraccedilatildeo de coacutedigo caso estes existam Foi realizado um estudogeral para identificar padrotildees gerais aleacutem de estudos de caso com o objetivo de obter umaanaacutelise mais aprofundada sobre o assunto Foram escolhidos cinco projetos previamenteclassificados de acordo com a abordagem distinta de introduccedilatildeo de expressotildees lambdapara realizar os estudos de caso

Palavras-chave Mineraccedilatildeo em Repositoacuterios de Software git Java Expressotildees LambdaAnonymous Inner Class

v

Abstract

This work presents a study about how lambda expressions are being used in open-soruceJava projects Using a sample of 99 popular projectsrsquo repositories in Github it wasanalyzed how and when this feature was introduced within those projects identifyingpatterns used to implement such feature and possible code refactoring approaches in caseany code was refactored It was conducted a general study to identify similarities amongprojects and the way they use lambda expressions and also case studies that intendedto realize a richer analysis about the subject For the case studies it was chosen fiveprojects previously classified according to the distinct approach used when introducinglambda expressions

Keywords Mining Software Repositories git Java Lambda Expressions AnonymousInner Class

vi

Sumaacuterio

1 Introduccedilatildeo 111 Contexto 112 Objetivos 2

121 Objetivos Gerais 2122 Objetivos Especiacuteficos 2

13 Metodologia 314 Organizaccedilatildeo do Trabalho 3

2 Evoluccedilatildeo e Mineraccedilatildeo de Repositoacuterios de Software 521 Evoluccedilatildeo de Software 622 MSR Mineraccedilatildeo de dados e a Engenharia de Software 8

221 Classificaccedilatildeo 823 Trabalhos Relacionados 11

3 Java SE 8 e JDK 8 1331 Histoacuterico 1332 Princiacutepios 1433 Evoluccedilatildeo 1534 Expressotildees Lambda 18

341 Sintaxe 18342 Principais formas de uso 19

4 Estudo e o Processo de Mineraccedilatildeo 2241 Questotildees de Pesquisa 2342 Fonte de Dados e Objetos de Estudo 2443 Processo de Mineraccedilatildeo 25

431 static-analysis 26432 BDAnalisador 27

44 Classificaccedilatildeo e Anaacutelise 29441 Meacutedia de Lambda 30

vii

442 Anaacutelise Temporal 30443 Refatoraccedilatildeo de Coacutedigo 32444 Casos de Uso 32

5 Resultados Obtidos e Anaacutelise 3351 Visatildeo Geral 33

511 Projetos Selecionados 34512 agera 34513 vertx 35514 Android-CleanArchitecture 36515 RxJava 37516 guava 38

52 Refatoraccedilatildeo de Coacutedigo 3953 Estudos de Caso 41

6 Consideraccedilotildees Finais 46

Referecircncias 48

Anexo 51

I Projetos utilizados 52

viii

Lista de Figuras

21 Taxonomia em camadas adaptada do trabalho de Kagdi et al [1] 9

41 Processo utilizado para realizaccedilatildeo do estudo 2242 Metodologia implementada para coleta e tratamento de dados 2643 Diagrama de classes UML do BDAnalisador 2844 Modelo relacional do banco de dados populado pelo BDAnalisador Imagem

gerada com software DBeaver [2] 2945 Classificaccedilatildeo dos projetos 31

51 Graacuteficos dos projetos separados por ano de introduccedilatildeo de expressotildees lambdae meacutedia de lambda por snapshot 34

52 Graacuteficos de anaacutelise temporal do projeto agera 3553 Graacuteficos de anaacutelise temporal do projeto Vertx 3654 Graacuteficos de anaacutelise temporal do projeto Android-CleanArchitecture 3755 Graacuteficos de anaacutelise temporal do projeto RxJava 3856 Graacuteficos de anaacutelise temporal do projeto Guava 3957 Comparaccedilatildeo entre todos os projetos com expressatildeo lambda sobre refatora-

ccedilatildeo de coacutedigo no mecircs de introduccedilatildeo da caracteriacutestica 4058 Commit de refatoraccedilatildeo de coacutedigo do projeto Vertx [3] 4259 Exemplo de um arquivo do commit de adiccedilatildeo de coacutedigo novo em Java 8 do

projeto Guava [4] 43510 Commit de adiccedilatildeo da biblioteca Retrolambda no projeto Agera [5] 44511 Commit de remoccedilatildeo de Lambdas e volta para o uso de AICs no projeto

RXJava [6] 45

ix

Lista de Tabelas

31 As versotildees anteriores de java e principais caracteriacutesticas 14

41 Informaccedilotildees mensais sobre o projeto agera 30

x

Capiacutetulo 1

Introduccedilatildeo

11 Contexto

A evoluccedilatildeo e manutenccedilatildeo de software eacute uma caracteriacutestica intriacutenseca do desenvolvimentode sistemas considerando que a partir do momento em que um software comeccedila a serdesenvolvido satildeo realizadas constantes manutenccedilotildees [7] Apesar de o conceito de evolu-ccedilatildeo de software representar uma grande aacuterea de pesquisa na engenharia de software nemsempre pesquisadores reconhecem a importacircncia da evoluccedilatildeo das linguagens de progra-maccedilatildeo como um grande fator influenciador na evoluccedilatildeo de software [8] uma vez que umsoftware que natildeo evolui junto com a sua linguagem tem a sua capacidade de evoluccedilatildeolimitada [9]

Surge entatildeo a necessidade de alinhar estudos empiacutericos com o intuito de investigar esteprocesso de evoluccedilatildeo do software juntamente com a evoluccedilatildeo de sua linguagem atraveacutesde investigaccedilatildeo e anaacutelise de seu coacutedigo fonte que pode ser feita por meio de anaacutelise de re-positoacuterios de software em grande escala o que deu origem a abordagem de Mineraccedilatildeo emRepositoacuterio de Software (MSR) O MSR tem como base o estudo sistemaacutetico e empiacutericode repositoacuterios de software com o objetivo de analisaacute-los utilizando informaccedilotildees estatis-ticamente uacuteteis coletadas para observar diversos padrotildees como a evoluccedilatildeo do softwarepadrotildees de projetos dentre outros [10]

A complexidade e dificuldade de realizar tal estudo empiacuterico eacute alta pois atualmenteexistem diversos tipos de plataformas para coleta de dados linguagens e focos variadosAssim para escolher o foco do objeto de estudo eacute necessaacuterio levar em consideraccedilatildeo estasdificuldades e especificaccedilotildees e dessa forma este trabalho tem como foco a anaacutelise desistemas de software na linguagem Java

Ateacute a data deste trabalho de acordo com os dados do TIOBE [11] Java eacute a linguagemde programaccedilatildeo com mais linhas de codigo catalogadas no mundo Isso faz com queseja extremamente interessante o estudo empiacuterico da evoluccedilatildeo da linguagem e software

1

desenvolvidos nela desde sua primeira versatildeo antes de se tornar uma linguagem populare ainda com poucos pacotes ateacute a sua atual versatildeo estaacutevel com uma grande quantidadede novas caracteriacutesticas

A versatildeo mais recente do Java a JDK 8 possui diversas adiccedilotildees interessantes para aorganizaccedilatildeo do coacutedigo e facilidade do programador Dessas novas implementaccedilotildees con-ceitos de linguagem funcional como expressotildees lambda e iteradores externos que recebemuma expressatildeo lambda como argumento como o map() filter() e forEach() tornarama escrita de coacutedigo paralelo mais simples e permitiram ganhos de performance [12]

Diversas linguagens de programaccedilatildeo tambeacutem populares como Javascript e Ruby jaacutepossuiacuteam expressotildees lambda desde suas versotildees iniciais sendo o Java 8 em 2014 maisuma linguagem a introduzir esse novo conceito Podemos descrever as expressotildees comopequenas funccedilotildees normalmente feitas em apenas uma linha sem um nome identificadorElas podem ser retornadas de outras funccedilotildees ou passadas como paracircmetro Um exemplode expressatildeo lambda pode ser visualizado pela funccedilatildeo de soma de dois inteiros escrita daforma (int x int y)rarr x + y [13]

Antes da inclusatildeo de expressotildees lambda em Java o mesmo comportamento era possiacutevelutilizando classes anocircnimas ou AICs (Anonymous inner classes) Contudo eacute necessaacute-rio a criaccedilatildeo de uma interface com apenas um meacutetodo e instanciaacute-la como uma AIC Autilizaccedilatildeo de AICs gera inuacutemeras linhas de coacutedigo adicionais que poderiam ser encapsu-ladas em apenas uma linha com a utilizaccedilatildeo de expressotildees lambda Como eacute interessantepara o programador ter um coacutedigo sempre mais legiacutevel e sucinto torna-se interessante arefatoraccedilatildeo de coacutedigo que utiliza uma tecnologia mais antiga para a nova

Assim este trabalho visa conduzir um estudo de mineraccedilatildeo em repositoacuterios de softwareopen-source desenvolvidos na linguagem Java para entender como desenvolvedores estatildeose adaptando agraves novas mudanccedilas introduzidas no Java 8

12 Objetivos

121 Objetivos Gerais

Este trabalho tem como objetivo geral caracterizar o uso de expressotildees lambda entre osprojetos Java mais populares desenvolvidos pela comunidade do GitHub

122 Objetivos Especiacuteficos

Sabendo do benefiacutecio da refatoraccedilatildeo de coacutedigo para o uso de expressotildees lambda e dapouca quantidade de estudos acadecircmicos sobre o assunto surge entatildeo uma oportunidadede pesquisa para melhor entender a forma como essa caracteriacutestica estaacute sendo adotada por

2

projetos com foco em refatoraccedilatildeo de coacutedigo o que originou a necessidade deste estudoAssim para alcanccedilar o objetivo deste trabalho foram traccedilados em forma de questotildees depesquisa os objetivos especiacuteficos a serem alcanccedilados por este trabalho

bull Quando os projetos Java de coacutedigo aberto comeccedilaram a introduzir o uso de expres-sotildees lambda em seus coacutedigos e quatildeo significativo eacute esse uso

bull Como as equipes de desenvolvimento estatildeo utilizando expressotildees lambda atraveacutesde refatoraccedilatildeo de coacutedigo ou introduzindo apenas em coacutedigo novo

bull Quais satildeo os padrotildees tipicamente adotados para o uso de expressotildees lambda

13 Metodologia

Este trabalho foi desenvolvido utilizando uma abordagem de MSR que dentro da clas-sificaccedilatildeo de Kagdi et al [1] pode ser divido em quatro grandes etapas Primeiramentedefiniu-se a fonte de dados a ser utilizada e dentre as possibilidades encontradas na lite-ratura [14] optou-se por utilizar repositoacuterios de controle de versatildeo mais especificamenteo Github tendo como criteacuterio de seleccedilatildeo os 99 repositoacuterios Java mais populares na plata-forma Em seguida definiu-se o propoacutesito do estudo no caso os objetivos em forma deperguntas de pesquisa a serem respondidas

A terceira grande etapa foi a definiccedilatildeo do meacutetodo em si a forma como seria realizadoo estudo e este por sua vez constitui-se de download de todos os 99 repositoacuterios maispopulares realizaccedilatildeo de uma anaacutelise estaacutetica para coletar informaccedilotildees necessaacuterias de cadaprojeto por versatildeo e armazenamento de informaccedilotildees pertinentes em uma base de dados

A etapa final foi a realizaccedilatildeo da avaliaccedilatildeo dos dados obtidos atraveacutes de meacutetricas eanaacutelises quantitativas para melhor responder as questotildees de pesquisa aleacutem de estudos decaso feitos com cinco projetos escolhos de acordo com a maneira distinta em que estesfazem o uso de expressotildees lambda

14 Organizaccedilatildeo do Trabalho

Este trabalho se divide em seis capiacutetulos

bull Capiacutetulo 2 Apresenta um referencial teoacuterico sobre evoluccedilatildeo de software demons-trando as estrateacutegias utilizadas e a importacircncia da evoluccedilatildeo em um projeto de coacutedigoaberto aleacutem de enunciar as leis de evoluccedilatildeo de software de Lehman O capiacutetulo tam-beacutem apresenta o processo de mineraccedilatildeo de dados explicando cada uma das camadasda classificaccedilatildeo e demonstra trabalhos relacionados a esse toacutepico que serviram debase para este trabalho

3

bull Capiacutetulo 3 Traz um contexto histoacuterico e teacutecnico da linguagem Java necessaacuteriospara entender a importacircncia que as novas caracteriacutesticas adicionadas na versatildeo8 fornecem para os desenvolvedores de projetos determinados a manter o projetosempre evoluiacutedo Tambeacutem eacute apresentada uma seccedilatildeo para demonstrar os detalhese formas de utilizaccedilatildeo das expressotildees Lambda que satildeo o foco dos objetivos destetrabalho

bull Capiacutetulo 4 Descreve a metodologia e processo utilizados para o desenvolvimentoe obtenccedilatildeo dos resultados deste trabalho O capiacutetulo desenvolve o contexto dasquestotildees de pesquisa e explica os motivos e processos de desenvolvimento das fer-ramentas utilizadas para minerar os dados aleacutem de determinar a classificaccedilatildeo dosresultados obtidos em grupos para facilitar a organizaccedilatildeo dos dados de forma queas perguntas sejam respondidas claramente

bull Capiacutetulo 5 Apresenta os resultados obtidos e de que forma eles ajudaram a respon-der as questotildees de pesquisa Eacute descrita uma anaacutelise de um projeto de cada categoriaespecificada no capiacutetulo anterior a fim de contextualizar cada tipo de resultado paraque o leitor entenda a forma que os projetos Java estatildeo lidando com as expressotildeesLambda

bull Capiacutetulo 6 Descreve as dificuldades e problemas obtidos durante o trabalho e deque forma eles influenciaram nos resultados Tambeacutem eacute apresentada uma seccedilatildeocontendo as ideias surgidas durante o desenvolvimento deste trabalho que ficarampara ser feitas no futuro devido agrave gama de informaccedilotildees que a mineraccedilatildeo dos dadostrouxe

4

Capiacutetulo 2

Evoluccedilatildeo e Mineraccedilatildeo deRepositoacuterios de Software

As linguagens de programaccedilatildeo estatildeo sempre evoluindo aumentando sua complexidade eexpressividade Da mesma forma aleacutem de se preocupar com dificuldades de estabelecercompatibilidade do software em relaccedilatildeo a tecnologias antigas desenvolvedores tambeacutemprecisam acompanhar essa evoluccedilatildeo das linguagens para que suas ferramentes natildeo setornem obsoletas [9] Isso agrega um grande desafio no desenvolvimento e evoluccedilatildeo desoftware

O conceito de evoluccedilatildeo de software amadureceu e se tornou um grande foco de pes-quisa Poreacutem nem sempre estudos de evoluccedilatildeo de software reconhecem a importacircncia daevoluccedilatildeo da linguagem de programaccedilatildeo no contexto do desenvolvimento de software [8]Quando um coacutedigo natildeo evolui junto com a linguagem com o objetivo de manter umacompatibilidade com versotildees anteriores sua capacidade de evoluccedilatildeo se torna limitada [9]

A refatoraccedilatildeo de coacutedigo que consiste em realizar mudanccedilas no coacutedigo fonte sem modi-ficar o comportamento observado do software [15] permite que a evoluccedilatildeo de linguagens eferramentas aconteccedilam mais naturalmente No entanto novos desafios surgem como porexemplo saber quando e como realizar a refatoraccedilatildeo de coacutedigo de forma eficiente e coesaDentre as teacutecnicas de pesquisa em engenharia de software para entender esse problematorna-se interessante explorar as teacutecnicas de mineraccedilatildeo de dados aplicados a repositoacuteriosde software com o objetivo de entender o relacionamento entre evoluccedilatildeo e refatoraccedilatildeo

Assim este capiacutetulo busca esclarecer conceitos e estrateacutegias de evoluccedilatildeo de softwaremineraccedilatildeo de repositoacuterios de software e o estado da arte sobre o assunto

5

21 Evoluccedilatildeo de Software

Durante o processo de produccedilatildeo e manutenccedilatildeo de software haacute a necessidade de diversastomadas de decisotildees sobre seu desenvolvimento como por exemplo decidir como melho-rar a qualidade do software Tais decisotildees precisam ser tomadas levando em consideraccedilatildeoo ambiente em que se estaacute inserido com novas tecnologias surgindo todos os dias fe-edback de usuaacuterios exigentes e concorrentes produzindo um software similar com ideiasinovadoras

Tudo isso acontece em um ritmo de constante mudanccedila e assim como diria Lehmaneacute imprescindiacutevel que software de sistemas sejam capazes de evoluir ou os mesmos correm orisco de sofrer uma morte prematura [16] fazendo assim da evoluccedilatildeo de software um con-ceito importante dentro do seu processo de desenvolvimento Essa evoluccedilatildeo deve ocorrerconsiderando o ambiente em que o software estaacute inserido o qual possui aspectos teacutecnicos esociais sua infraestrutura que pertence ao seu ambiente teacutecnico o qual sempre necessitamanutenccedilatildeo e ao mesmo tempo usuaacuterios que utilizam o software e estatildeo constantementeformando opiniotildees oferecendo feedback e na expectativa por novidades [7] Assim a me-dida que novas caracteriacutesticas satildeo desenvolvidas novas tecnologias de infraestrutura satildeonecessaacuterias novos requisitos satildeo adicionados e o sistema de software deve se adaptar aessas mudanccedilas

Com relaccedilatildeo aos aspectos sociais que envolvem a evoluccedilatildeo do software eacute importanteressaltar os conceitos baacutesicos de como essa evoluccedilatildeo acontece Durante um estudo empiacutericopioneiro na aacuterea de evoluccedilatildeo de software para sistemas de grande escala Lehman e seuscolaboradores formularam um conjunto de observaccedilotildees que hoje satildeo conhecidas como asleis da evoluccedilatildeo de software ou simplesmente Leis de Lehman [16] No geral as leis deevoluccedilatildeo de software podem ser descritas da seguinte forma [16]

1 Mudanccedila contiacutenua um sistema se tornaraacute progressivamente menos satisfatoacuteriopara seus usuaacuterios com o tempo a menos que se adapte continuamente agraves necessi-dades que surgiratildeo

2 Complexidade Crescente um sistema se tornaraacute cada vez mais complexo amenos que se trabalhe para explicitamente reduzir sua complexidade

3 Auto-regulaccedilatildeo o processo de evoluccedilatildeo de software eacute auto-regulatoacuterio no que dizrespeito agraves distribuiccedilotildees dos artefatos e produtos produzidos

4 Conservaccedilatildeo da estabilidade organizacional a taxa meacutedia de atividade globalefetiva em um sistema em evoluccedilatildeo natildeo muda com o tempo ou seja a meacutedia detrabalho e esforccedilo colocado em cada entrega do sistema permanece a mesma

6

5 Conservaccedilatildeo de familiaridade a quantidade de conteuacutedo novo em cada entregado sistema tende a se manter constante com o tempo

6 Crescimento contiacutenuo A quantidade de funcionalidades em um sistema cresceraacutecom o tempo com o objetivo de satisfazer seus usuaacuterios

7 Decliacutenio de qualidade Um sistema seraacute percebido com qualidade inferior como passar do tempo a menos que seu design tenha uma manutenccedilatildeo minuciosa e seadapte a novas restriccedilotildees

8 Sistema de Feedback Evoluir um sistema com sucesso requer reconhecer que oprocesso de desenvolvimento acontece em um sistema de feedback de vaacuterios ciclosagentes e niacuteveis

Os aspectos teacutecnicos que envolvem a evoluccedilatildeo de software levam em consideraccedilatildeo astecnologias utilizadas para o seu desenvolvimento desde a linguagem de programaccedilatildeo agravesmaacutequinas onde o software seraacute hospedado que sofrem atualizaccedilotildees recebem novas versotildeescom novas caracteriacutesticas implementadas

Um estudo realizado por Lavre mostra como a evoluccedilatildeo das linguagens de programa-ccedilatildeo no contexto da evoluccedilatildeo de software muitas vezes satildeo subestimadas uma vez quemuitos podem considerar em seus estudos a linguagem de computaccedilatildeo como um artefatoimutaacutevel [8] Por exemplo coloca-se muita ecircnfase e cuidado para realizar o versionamentode coacutedigo fonte de um software mas este pode ser tornar inutilizaacutevel futuramente se nin-gueacutem souber qual versatildeo de compilador determinada versatildeo de coacutedigo foi desenvolvida

Para natildeo se deixar estagnar linguagens de programaccedilatildeo precisam se adaptar e evoluirQuando uma linguagem de programaccedilatildeo atualiza softwares que eram antes consideradosatualizados podem se tornar rapidamente obsoletos E ao mesmo tempo que novascaracteriacutesticas satildeo adicionadas a linguagem precisa fornecer compatibilidade com versotildeesanteriores aumentando sua complexidade Desenvolvedores entatildeo encontram-se tambeacutemem um empasse buscando um equiliacutebrio entre manter a compatibilidade da ferramentacom versotildees anteriores da linguagem e atualizaacute-la para manter o software atualizado [9]

A estrateacutegia de refatoraccedilatildeo de coacutedigo pode ser uma opccedilatildeo que permite a linguageme o software co-evoluiacuterem com um menor grau de dificuldade [9] Refatoraccedilatildeo (do inglecircsrefactoring) eacute o processo de modificaccedilatildeo de um software com o objetivo de melhorar a es-trutura interna do mesmo sem alterar sua percepccedilatildeo externa Eacute uma maneira disciplinadade melhorar o design do coacutedigo apoacutes ele jaacute ter sido implementado Por exemplo dividiruma funcionalidade grande feita em apenas um bloco de coacutedigo em vaacuterios moacutedulos [15]

A refatoraccedilatildeo de coacutedigo pode ser um meio utilizado para evoluir o software adaptandoo coacutedigo com caracteriacutesticas novas introduzidas pela linguagem modificando o design dosistema sem comprometer sua integridade No entanto novos desafios surgem visto que

7

refatorar o coacutedigo fonte de um sistema de grande porte natildeo eacute uma tarefa faacutecil havendo anecessidade de ferramentas que possam automatizar o processo ou realizar um estudo paraentender como as novas caracteriacutesticas da linguagem podem ser utilizadas para substituirou melhorar funcionalidades obsoletas [9]

22 MSR Mineraccedilatildeo de dados e a Engenharia deSoftware

Com o objetivo de compreender prever e planejar os vaacuterios aspectos do desenvolvimentode um projeto em especial tudo que possa impactar na evoluccedilatildeo de software a teacutecnicade mineraccedilatildeo de dados tem sido bastante utilizada em engenharia de software [17]

O termo Mineraccedilatildeo de Repositoacuterios de Software (MSR) tem sido utilizado para descre-ver vaacuterias maneiras de se examinar repositoacuterios de software Um repositoacuterio de softwarepode ser considerado um artefato que eacute produzido e arquivado durante a evoluccedilatildeo desoftware [1] Estes responsoacuterios armazenam informaccedilotildees que podem fornecer todos osdetalhes de desenvolvimento do software provendo meios necessaacuterios para uma anaacuteliseaprofundada de evoluccedilatildeo de software

Repositoacuterios de software satildeo comumente utilizados para armazenar e acompanhar ohistoacuterico de desenvolvimento do software mas raramente usados para tomada de deci-sotildees em relaccedilatildeo ao projeto Assim pesquisadores de MSR buscam modificar a impressatildeode que tais repositoacuterios satildeo estaacuteticos que servem apenas para manutenccedilatildeo de registrostransformando-os em repositoacuterios ativos que podem auxiliar na tomada de decisatildeo em pro-jetos de software modernos atraveacutes da identificaccedilatildeo de padrotildees para realizar a propagaccedilatildeode mudanccedilas [18]

221 Classificaccedilatildeo

De acordo com Kagdi et al dentre as abordagens de MSR utilizadas atualmente eacute possiacuteveldescrevecirc-las para entatildeo comparaacute-las e possivelmente classificaacute-las levando em considera-ccedilatildeo uma taxonomia de quatro dimensotildees os repositoacuterios de software utilizados (fontes dedados) o propoacutesito do MSR a metodologia e a avaliaccedilatildeo da abordagem [1] como mostraa Figura 21 onde as taxonomias destacadas em amarelo satildeo as que prevaleceram poreacutemnatildeo exclusivamente na metodologia adotada por este trabalho

8

Figura 21 Taxonomia em camadas adaptada do trabalho de Kagdi et al [1]

Fontes de Dados

As fontes de informaccedilatildeo variam de acordo com a abordagem utilizada e dentre as informa-ccedilotildees mineradas em repositoacuterios de software inclui-se as seguintes categorias os artefatosde software e suas versotildees as diferenccedilas entre os artefatos de software e suas versotildees e osmetadados sobre as mudanccedilas no software

As fontes de dados podem ser melhor classificadas de acordo com Hassan et al [17]

bull Repositoacuterios de controle de Versatildeo estes repositoacuterios guardam o histoacuterico de desen-volvimento de um projeto armazenando todas as mudanccedilas no coacutedigo fonte assimcomo os metadados associados com cada mudanccedila Exemplos git SVN

bull Bug repositories Estes repositoacuterios rastreiam o histoacuterico de resoluccedilatildeo de bugs quesatildeo reportados por usuaacuterios e desenvolvedores Exemplos Bugzilla e Jira

9

bull Histoacuterico de Comunicaccedilatildeo (Archived communications) estes repositoacuterios rastreiamdiscussotildees sobre os vaacuterios aspectos de um projeto de software por sua vida uacutetil Porexemplo listas de e-mails

bull Deployment logs logs com informaccedilotildees do software gerados por ferramentas dedesenvolvimento

bull Repositoacuterios de software Repositoacuterios onde o coacutedigo fonte de vaacuterios projetos satildeoarmazenados como por exemplo Sourceforgenet

No contexto deste trabalho estes repositoacuterios consistem em fontes de coacutedigo armaze-nadas em sistemas de controle de versatildeo especificamente coacutedigos na plataforma Github

O propoacutesito

O propoacutesito da mineraccedilatildeo de repositoacuterios de software se resume nas perguntas de pes-quisa que podem ser respondidas utilizando mineraccedilatildeo Assim existem duas classes deperguntas de pesquisa para MSR [1]

A primeira eacute a pergunta de anaacutelise market-basket1 ldquoSe A acontece o que mais podeacontecerrdquo A resposta para este tipo de pergunta eacute um conjunto de regras descrevendotendecircncias de relacionamentos como por exemplo se A acontecer entatildeo B e C acontecemdurante um periacuteodo X

A segunda classe diz respeito agraves perguntas de prevalecircncia (Prevalence Questions -PQ) como por exemplo perguntas do tipo ldquoA funcionalidade Y foi modificadardquo quepossuem uma resposta booleana ou ldquoQuantas vezes esta funcionalidade Y foi modificadardquocontendo uma resposta quantitativa

As perguntas de pesquisa deste trabalho se encaixam majoritariamente na segundaclasse onde o objetivo traccedilado eacute respondido de forma quantitativa com algumas tentativasde classificaccedilatildeo de tipos de repositoacuterios como seraacute descrito nos capiacutetulos seguintes

A metodologia

A metodologia corresponde a maneira como as questotildees de MSR iratildeo ser respondidas evaacuterias abordagens estatildeo disponiacuteveis Poreacutem Kagdi indica duas estrateacutegias baacutesicas quepodem ser utilizadas

Primeiramente pode-se utilizar a mediccedilatildeo indireta e anaacutelise da evoluccedilatildeo do softwareEsta abordagem pode ser realizada da seguinte forma extrair e computar informaccedilotildeesde cada versatildeo de um software separadamente e em seguida individualmente comparar

1Anaacutelise Market-basket eacute uma teacutecnica de modelagem baseada na teoria de que se vocecirc comprar certostipos de produtos vocecirc haacute uma probabilidade maior (ou menor) de comprar outros tipos de produtos [19]

10

propriedades encontradas como por exemplo comparar duas versotildees distintas de umsoftware atraveacutes de um repositoacuterio github realizando uma investigaccedilatildeo de alto niacutevel noque diz respeito a evoluccedilatildeo do software [1]

A segunda perspectiva de metodologia que pode ser utilizada corresponde agrave mediccedilatildeodireta e anaacutelise da evoluccedilatildeo do software Ela diz respeito agraves investigaccedilotildees que estudamos mecanismos que leva um software a ser modificado de uma versatildeo para outra focandonas diferenccedilas especiacuteficas entre estas versotildees como por exemplo examinando mudanccedilasespeciacuteficas das classes arquivos funccedilotildees de cada parte do coacutedigo [1]

Assim eacute possiacutevel descrever explicitamente que este trabalho utiliza em sua maioriauma metodologia com mediccedilotildees diretas atraveacutes da anaacutelise estaacutetica de informaccedilotildees docoacutedigo fonte de diferente versotildees para analisar os diferentes padrotildees de desenvolvimentoem que expressotildees lambda (definidas no capiacutetulo seguinte) satildeo utilizadas

A Avaliaccedilatildeo

Por fim existem diversas formas para se avaliar o estudo realizado sempre levando emconsideraccedilatildeo a validade dos resultados obtidos Pode-se utilizar de meacutetricas para avaliar osdados considerando o quanto das informaccedilotildees obtidas satildeo relevantes Outra forma de seavaliar seria atraveacutes da utilizaccedilatildeo de modelos probabiliacutesticos seguindo uma abordagemde teoria da informaccedilatildeo Assim foram utilizadas determinadas meacutetricas quantitativaspara avaliar os resultados obtidos neste trabalho

23 Trabalhos Relacionados

Como ressaltado na introduccedilatildeo o foco deste trabalho encontra-se em utilizar teacutecnicas deMSR para caracterizar a adoccedilatildeo de expressotildees lambda em repositoacuterios Java Ao reali-zar um estudo sobre o estado da arte encontrou-se diversos trabalhos que utilizam deMSR para obter informaccedilotildees relevantes sobre repositoacuterios de software em diversos focose em especial trabalhos que investiguem repositoacuterios na linguagem Java Jaacute existemtambeacutem alguns trabalhos que apresentam ferramentas de refatoraccedilatildeo de coacutedigo para im-plementaccedilatildeo de expressotildees lambda com foco na evoluccedilatildeo do software Dentre os trabalhosencontrados mencionados destacam-se

bull Em um trabalho sobre utilizaccedilatildeo de refatoraccedilatildeo de coacutedigo para realizar a transiccedilatildeode coacutedigo Java para as novas caracteriacutesticas implementadas no Java 8 Gyori et alapresenta uma ferramenta que automatiza com sucesso o trabalho de conversatildeo decoacutedigo como Annonymous Inner Class para expressotildees lambda [12] O capiacutetulo aseguir descreve em detalhes estes conceitos

11

bull Regrowing a Language de Overbey apresenta um estudo sobre a importacircncia da co-evoluccedilatildeo entre a linguagem de programaccedilatildeo e os projetos de software focando naslinguagens Fortran e Java e provando como ferramentas de refatoraccedilatildeo de coacutedigoauxiliam para que o software consiga evoluir juntamente com sua linguagem deprogramaccedilatildeo [9]

bull O trabalho sobre a adoccedilatildeo de generics em coacutedigo Java feito por Parnin utiliza demineraccedilatildeo de dados para realizar uma investigaccedilatildeo empiacuterica avaliando projetos decoacutedigo aberto com o objetivo de observar como desenvolvedores destes projetos estatildeoutilizando generics em Java [20]

Os estudos mencionados focam em assuntos particulares pertinentes a este trabalhoem que de um lado tem-se trabalhos que mostram a necessidade de refatoraccedilatildeo de coacutedigopara evoluccedilatildeo de software e do outro tem-se trabalhos que mostram que eacute possiacutevel utilizarde MSR para entender melhor como a evoluccedilatildeo da linguagem de programaccedilatildeo Java temafetado projetos reais de coacutedigo aberto e como estes projetos estatildeo se adaptando a estasevoluccedilotildees

12

Capiacutetulo 3

Java SE 8 e JDK 8

Este trabalho tem como objetivo caracterizar a adoccedilatildeo de expressotildees Lambda em siste-mas Java que podem ser considerados legados pois foram concebidos em um momentoanterior a introduccedilatildeo dessa nova caracteriacutestica na linguagem Java Com o intuito de faci-litar o entendimento do leitor sobre tais construccedilotildees esse capiacutetulo apresenta informaccedilotildeeshistoacutericas referentes agrave linguagem Java desde sua criaccedilatildeo ateacute a sua ascensatildeo como umadas linguagens de programaccedilatildeo mais populares Aleacutem disso seratildeo apresentadas as novascaracteriacutesticas presentes na versatildeo Java SE 8 com destaque nas expressotildees Lambda e deque forma vieram para auxiliar no desenvolvimento de sistemas

31 Histoacuterico

Java eacute uma linguagem de programaccedilatildeo orientada a objetos para propoacutesitos gerais [21] Alinguagem nasceu com o nome de Oak no ano de 1991 com o foco em televisotildees digitais acabo mas devido agrave complexidade e poder da linguagem logo expandiu-se para os outrosdomiacutenios principalmente a Internet [22] Posteriormente a linguagem recebeu o nome deGreentalk devido agrave marca Oak jaacute ser registrada por outra empresa e o principal projeto daequipe se chamar Green Por fim o nome Java foi o mais votado pela equipe da Sun emuma reuniatildeo para decidir o mais raacutepido possiacutevel um nome definitivo para a linguagem [23]

Em 1995 em sua primeira versatildeo puacuteblica 10 a linguagem Java jaacute comeccedilava a terum crescimento em sua popularidade como Web Applet nos navegadores mais popularesfornecendo seguranccedila e rapidez nas plataformas mais utilizadas [24] A cada nova versatildeopublicada novas funcionalidades e plataformas eram adicionadas e tornavam a linguagemmais difundida no meio computacional fazendo com que em 2006 a linguagem fosse divi-dida em Java EE (foco em rede e serviccedilos web) Java ME (foco em sistemas embarcados)e Java SE (foco em desktops e servidores) [25]

13

Apoacutes anos de evoluccedilatildeo e aprimoramento atraveacutes de diversas versotildees como visto naTabela 31 hoje o Java se tornou uma das linguagens de programaccedilatildeo mais utilizadas nomundo estando em aproximadamente 15 das linhas de coacutedigo disponiacuteveis pela inter-net [11] A quantidade de plataformas suportadas pela linguagem e com o advento dosistema operacional Android sendo rodado na maior parte dos smartphones do mundoaleacutem da simplicidade em codificar no paradigma orientado a objetos foram os fatoresrelevantes para que a linguagem se popularizasse no mundo digital [26]

Tabela 31 As versotildees anteriores de java e principais caracteriacutesticasVersatildeo Principais caracteriacutesticasJava 10 JVM e JDKJava 2 Event Listeners

Kestrel (Java 3) HotSpot JVMMerlin (Java 4) Diversas novas APIs como Assertion e expressotildees regularesTiger (Java 5) Generics

Mustang (Java 6) Web ServicesDolphin (Java 7) Suporte a linguagens dinamicas

32 Princiacutepios

Com o foco em alcanccedilar a Web e participar mais ativamente do mercado virtual e e-Commerce foram projetados princiacutepios que permitissem com que a linguagem pudessealcanccedilar seus objetivos principais ao mesmo tempo que mantinha a facilidade e fami-liarizaccedilatildeo da linguagem a seus desenvolvedores [27] Dessa forma a equipe da Oracledeterminou cinco princiacutepios que caracterizariam o foco da linguagem Java

bull simples orientada a objeto e familiar projetada para ser orientada a objeto epermitir que seus desenvolvedores comecem a codificar rapidamente sem a necessi-dade de uma curva de aprendizagem acentuada

bull segura e robusta projetada para prover software confiaacutevel por meio de checagensa tempo de compilaccedilatildeo e execuccedilatildeo Haacute uma grande preocupaccedilatildeo com seguranccediladevido agrave larga utilizaccedilatildeo da linguagem em sistemas distribuiacutedos

bull de arquitetura neutra e portaacutevel projetada para ser independente de qualquerarquitetura bastando rodar a JVM dessa forma garantindo a portabilidade paravaacuterios ambientes e dispositivos

14

bull executada em alta performance projetada para fornecer a maior performancepossiacutevel em tempo de execuccedilatildeo com a utilizaccedilatildeo do garbage collector em uma threadde baixa prioridade

bull interpretada dinacircmica e threaded projetada para ser interpretada por qual-quer dispositivo que possua JVM desenvolvida garantindo um desenvolvimento raacute-pido e em ciclos O uso da classe Thread permite que a linguagem acompanhe atendecircncia do paralelismo Aleacutem disso a ligaccedilatildeo de classes eacute feita em tempo real esomente quando necessaacuteria tornando-a dinacircmica

33 Evoluccedilatildeo

A primeira versatildeo do Java 8 foi lanccedilada em 2014 [28] e apresentou diversas atualizaccedilotildeesespalhadas em categorias como linguagem seguranccedila Collections ferramentas deployentre outras Dentre a grande quantidade de mudanccedilas os destaques se encontraram nasnovas melhorias presentes na linguagem que afetaram de forma mais direta a maneiracom que os desenvolvedores passaram a tratar e organizar o coacutedigo fonte As atualizaccedilotildeesreferentes a linguagem descritas oficialmente pela Oracle [29] satildeo

1 Lambda Expressions ou apenas Expressotildees Lambda correspondem a uma novacaracteriacutestica que permite que uma pequena funcionalidade possa ser utilizada comoum argumento de um meacutetodo facilitando a escrita de accedilotildees que seratildeo feitas repetida-mente em uma Collection ou quando um processo se completa ou quando encontraum erro Eacute tambeacutem uma forma compacta de se escrever coacutedigo que previamenteera escrito com anonymous inner classes [29] A Listagem 31 mostra uma classehipoteacutetica Calculator cujo meacutetodo operateBinary() recebe como paracircmetro doisinteiros e um objeto da classe IntegerMath que representa a operaccedilatildeo que deveraacuteser realizada ou seja uma funcionalidade dinacircmica

1 pub l i c c l a s s Ca l cu la to r 2

3 i n t e r f a c e IntegerMath 4 i n t opera t i on ( i n t a i n t b) 5 6

7 pub l i c i n t operateBinary ( i n t a i n t b IntegerMath op ) 8 re turn op opera t i on (a b) 9

10

11 pub l i c s t a t i c void main ( St r ing a rgs ) 12

15

13 Calcu la to r myApp = new Ca lcu la to r ( ) 14 IntegerMath add i t i on = (a b) minusgt a + b 15 IntegerMath subt ra c t i on = (a b) minusgt a minus b 16 System out p r i n t l n ( 40 + 2 = +17 myApp operateBinary (40 2 add i t i on ) ) 18 System out p r i n t l n ( 20 minus 10 = +19 myApp operateBinary (20 10 sub t ra c t i on ) ) 20 21 22

Listagem 31 Exemplo de coacutedigo com o uso de Expressatildeo Lambda [30]

2 Method References Frequentemente expressotildees lambda criam meacutetodos anocircni-mos Algumas vezes poreacutem satildeo utilizadas para chamar um meacutetodo jaacute existentena classe Ao inveacutes de escrever a expressatildeo Lambda para esse caso pode-se optarpor utilizar um Method Reference que facilita a escrita e leitura desse uso de ex-pressatildeo Lambda [29] A Listagem 32 mostra um exemplo de um meacutetodo estaacuteticoque compara duas pessoas pelas suas idades e a Listagem 33 a utilizaccedilatildeo de MethodReference para aplicar a utilizaccedilatildeo desse meacutetodo em um array e reduzir a escrita deuma expressatildeo lambda a uma forma mais legiacutevel

1 pub l i c s t a t i c i n t compareByAge ( Person a Person b) 2 re turn a b i r thday compareTo (b b i r thday ) 3 4

Listagem 32 Exemplo de meacutetodo de uma classe Pessoa [31]

1 Arrays s o r t ( rosterAsArray Person compareByAge ) 2

Listagem 33 Exemplo de uso de Method Reference [31]

3 Default Methods satildeo meacutetodos com a palavra-chave default que servem para adi-cionar implementaccedilotildees de meacutetodos a uma interface de alguma biblioteca mantendoa compatibilidade binaacuteria com versotildees mais antigas dessa interface Tambeacutem pos-sibilita a implementaccedilatildeo de meacutetodos estaacuteticos em interfaces [29] A Listagem 34apresenta a inclusatildeo de um meacutetodo default na interface TimeClient

1 pub l i c i n t e r f a c e TimeClient 2 void setTime ( i n t hour i n t minute i n t second ) 3 void setDate ( i n t day i n t month i n t year ) 4 void setDateAndTime ( i n t day i n t month i n t year 5 i n t hour i n t minute i n t second )

16

6 LocalDateTime getLocalDateTime ( ) 7

8 s t a t i c ZoneId getZoneId ( S t r ing zoneStr ing ) 9 t ry

10 re turn ZoneId o f ( zoneStr ing ) 11 catch ( DateTimeException e ) 12 System e r r p r i n t l n ( I n v a l i d time zone + zoneStr ing

+13 us ing d e f a u l t time zone in s t ead ) 14 re turn ZoneId systemDefault ( ) 15 16 17

18 d e f a u l t ZonedDateTime getZonedDateTime ( St r ing zoneStr ing ) 19 re turn ZonedDateTime o f ( getLocalDateTime ( ) getZoneId (

zoneStr ing ) ) 20 21 22

Listagem 34 Exemplo de interface com um meacutetodo default [32]

4 Repeating Annotations permitem a implementaccedilatildeo e utilizaccedilatildeo de anotaccedilotildees deum mesmo tipo que podem ser utilizadas mais de uma vez para a mesma declara-ccedilatildeo [29] A Listagem 35 apresenta duas anotaccedilotildees iguais com paracircmetros diferentespermitindo uma customizaccedilatildeo maior na aplicaccedilatildeo de um tipo de anotaccedilatildeo

1 Schedule ( dayOfMonth= l a s t )2 Schedule (dayOfWeek= Fr i hour= 23 )3 pub l i c void doPeriodicCleanup ( ) 4

Listagem 35 Exemplo de Repeating Annotations [33]

5 Type Annotations permitem que anotaccedilotildees possam ser utilizadas em tipos aleacutemde declaraccedilotildees dessa forma pode-se garantir que um campo sempre atenda agraves suasexpectativas e evite testes desnecessaacuterios [29] A Listagem 36 mostra um exemplo derestriccedilatildeo a uma String que nunca poderaacute ser nula devido agrave anotaccedilatildeo de NonNull

1 NonNull S t r ing s t r

Listagem 36 Exemplo de Type Annotation garantindo que o campo nunca seja null [34]

17

34 Expressotildees Lambda

Uma das mudanccedilas mais interessantes implementadas no Java 8 foi a adiccedilatildeo de expressotildeeslambda As expressotildees lambda permitem que a linguagem Java possa atuar parcialmentecomo uma linguagem de programaccedilatildeo funcional onde comportamentos satildeo avaliados eaplicados diferentemente da programaccedilatildeo imperativa que foca na mudanccedila de estadosNa praacutetica um comportamento pode ser passado como paracircmetro de um meacutetodo atraveacutesde uma escrita mais reduzida e legiacutevel Os benefiacutecios de utilizar expressotildees lambda incluemuma melhora na legibilidade e organizaccedilatildeo de coacutedigo que antes era escrito com AnonymousInner Class aleacutem de permitir uma forma simples de utilizar comportamento paralelo como uso de Streams

341 Sintaxe

A sintaxe de uma expressatildeo lambda eacute dividida nas seguintes partes [30]

bull Uma lista de paracircmetros separados por viacutergulas

bull Um token representado por uma seta -gt

bull Um corpo que pode ser representado por uma expressatildeo uacutenica ou um bloco de coacutedigodentro de chaves

As Listagens 37 e 38 mostram duas formas diferentes de se aplicar expressotildees Lambdacom uma sintaxe similar A primeira aplica a expressatildeo diretamente apoacutes a seta utilizadanormalmente para trechos de coacutedigo pequenos e simples e a segunda utiliza-se de chavespara incorporar o coacutedigo e da palavra-chave return para especificar o retorno forma maisutilizada para uma quantidade maior de coacutedigo

1 p minusgt p getGender ( ) == Person Sex MALE2 ampamp p getAge ( ) gt= 183 ampamp p getAge ( ) lt= 25

Listagem 37 Exemplo de expressatildeo lambda com uma expressatildeo [30]

1 p minusgt 2 re turn p getGender ( ) == Person Sex MALE3 ampamp p getAge ( ) gt= 184 ampamp p getAge ( ) lt= 25 5

Listagem 38 Exemplo de expressatildeo lambda com um bloco de coacutedigo [30]

18

342 Principais formas de uso

Anonymous Inner Class

Antes do Java 8 a necessidade de passar funccedilotildees ou expressotildees como paracircmetro de algummeacutetodo era suprida atraveacutes de Anonymous Inner Classes A utilizaccedilatildeo desse tipo dedeclaraccedilatildeo junto com a anotaccedilatildeo de Override permite sobrescrever um meacutetodo de umainterface funcional e ao mesmo tempo passa-la como argumento para um meacutetodo Umaexpressatildeo lambda se comporta da mesma forma poreacutem a quantidade de coacutedigo escritopela Anonymous Inner Class eacute maior e pode dificultar a leitura de coacutedigo pois conteacutemmuita informaccedilatildeo natildeo utilizada para efetivo entendimento do que estaacute sendo feito naqueletrecho

A Listagem 39 apresenta a instanciaccedilatildeo da classe EventHandler internamente ao meacute-todo setOnAction() de forma que o desenvolvedor possa escrever o comportamento quedeseja passar como paracircmetro do meacutetodo atraveacutes da substituiccedilatildeo do meacutetodo handle()que jaacute existe pelo meacutetodo handle() criado e escrito pelo desenvolvedor

1 btn setOnAction (new EventHandlerltActionEvent gt() 2 Override3 pub l i c void handle ( ActionEvent event ) 4 System out p r i n t l n ( He l lo World ) 5 6 )

Listagem 39 Exemplo de uso de Anonymous Inner Class [35]

Interface funcional

Ao projetar um coacutedigo novo o desenvolvedor que optar por utilizar expressotildees lambdadeve iniciar com a criaccedilatildeo de uma interface funcional Esse tipo de interface possui umuacutenico meacutetodo abstrato permitindo que expressotildees lambda sejam usadas para sobrescrevero comportamento do meacutetodo abstrato Uma interface funcional pode possuir outros meacuteto-dos desde que sejam default Uma nova anotaccedilatildeo FunctionalInterface foi adicionadacom a atualizaccedilatildeo do Java 8 para conferir em tempo de compilaccedilatildeo se a interface satisfazos requisitos desse modelo de interface

A Listagem 310 apresenta um exemplo de interface funcional com o objetivo de permi-tir o uso de expressotildees lambda que utilizaratildeo de dois Double como paracircmetro e jaacute utilizada nova anotaccedilatildeo FunctionalInterface introduzida no Java 8

1 Funct iona l Inte r face2 pub l i c i n t e r f a c e DoubleOp 3 pub l i c Double apply ( Double a Double b)

19

4

Listagem 310 Exemplo de interface funcional

Dessa forma conforme as Listagens 311 e 312 o meacutetodo apply() pode tomar formade qualquer operaccedilatildeo entre dois Double que seraacute especificada quando a expressatildeo lambdafor montada dando o aspecto de linguagem funcional agrave linguagem e mais facilidade eliberdade ao desenvolvedor

1 pub l i c c l a s s Ca l cu la to r 2 pub l i c s t a t i c Double c a l c ( Double op1 Double op2 DoubleOp operator ) 3 re turn operator apply ( op1 op2 ) 4 5

Listagem 311 Exemplo de aplicaccedilatildeo da interface funcional

1 Double r e s u l t 1 = Ca lcu la to r c a l c (10d 50d ( a b ) minusgt a + b)

Listagem 312 Uso de expressatildeo lambda para o exemplo anterior

Collections

Dentre as atualizaccedilotildees de pacotes do Java 8 foi adicionado um meacutetodo stream() nainterface Collection Esse meacutetodo trata as Collection como streams o que significa queapesar de natildeo ser possiacutevel acessar elementos diretamente algumas novas manipulaccedilotildeessatildeo possiacuteveis Essas manipulaccedilotildees satildeo na verdade meacutetodos da interface Stream quepodem receber como paracircmetro uma expressatildeo lambda ou seja um comportamento a seraplicado agrave Collection Dentre os meacutetodos temos

bull filter() O meacutetodo filter() recebe uma expressatildeo lambda contendo uma condiccedilatildeopara filtragem da collection

bull map() O meacutetodo map() mapeia os elementos de uma Collection em outro objetocomo uma String A expressatildeo lambda passada por paracircmetro deve retornar o tipode objeto ao qual seraacute mapeado

bull forEach() O meacutetodo forEach() aplica uma operaccedilatildeo especiacutefica para cada ele-mento da Collection A expressatildeo lambda a ser passada deve conter a operaccedilatildeo aser realizada

bull min() e max() Os meacutetodos min() e max() retornam o elemento menor ou maiorda Collection dependendo da expressatildeo lambda passada como paracircmetro

20

A Listagem 313 demonstra como vaacuterias operaccedilotildees com uma Collection podem seraplicadas de uma vez de forma que lendo a expressatildeo lambda jaacute eacute possiacutevel saber oresultado da aplicaccedilatildeo do meacutetodo agrave Collection

1 r o s t e r2 stream ( )3 f i l t e r (4 p minusgt p getGender ( ) == Person Sex MALE5 ampamp p getAge ( ) gt= 186 ampamp p getAge ( ) lt= 25)7 map(p minusgt p getEmailAddress ( ) )8 forEach ( emai l minusgt System out p r i n t l n ( emai l ) )

Listagem 313 Exemplo de utilizaccedilatildeo de meacutetodos de stream com expressotildees lambda [30]

21

Capiacutetulo 4

Estudo e o Processo de Mineraccedilatildeo

A definiccedilatildeo da metodologia utilizada para realizaccedilatildeo deste trabalho eacute importante para queexista uma padronizaccedilatildeo e melhor entendimento de como os resultados foram obtidos paraque a replicaccedilatildeo do mesmo possa ser realizada em trabalhos futuros [36]

Figura 41 Processo utilizado para realizaccedilatildeo do estudo

O esquema representado na Figura 41 descreve o processo seguido para a realizaccedilatildeodeste trabalho que foi divido em trecircs grandes etapas a de planejamento definindo osobjetivos questotildees de pesquisa e meios de investigaccedilatildeo deste projeto a etapa de execuccedilatildeorealizando todo o procedimento metodoloacutegico definido para a coleta e refinamento de

22

dados e a etapa de avaliaccedilatildeo onde foram classificados e avaliados os dados coletadospara responder agraves questotildees de pesquisa

A seguir na primeira seccedilatildeo seratildeo apresentadas em detalhes as questotildees de pesquisa aserem respondidas Em seguida seraacute feito uma breve descriccedilatildeo da fonte de dados utilizada- especificamente os projetos utilizados como objetos de estudo deste trabalho e por fimtodo o restante da metodologia que foi de fato desenvolvida para obter os resultadosnecessaacuterios

41 Questotildees de Pesquisa

Com o objetivo de entender e caracterizar melhor o uso de expressotildees lambda foramdefinidas as seguintes questotildees de pesquisa a serem respondidas

bull PQ-1 Quando os projetos comeccedilaram a introduzir o uso de expressotildees lambda emseus coacutedigos e qual a meacutedia de expressotildees lambda por snapshots caso existam

bull PQ-2 Como as equipes de desenvolvimento estatildeo utilizando expressotildees lambdaatraveacutes de refatoraccedilatildeo de coacutedigo ou introduzindo apenas em coacutedigo novo

bull PQ-3 Quais satildeo os padrotildees tipicamente adotados para o uso de expressotildees lambda

A primeira pergunta de pesquisa gira em torno de como projetos populares open-sourceestatildeo se adaptando agrave introduccedilatildeo de expressotildees lambda em Java muitos projetos jaacute estatildeoutilizando as expressotildees lambda Se sim a partir de quando comeccedilaram a utilizaacute-lasdesde o iniacutecio da introduccedilatildeo das mesmas no Java 8 ou em um periacuteodo mais tardio Aleacutemdisso eacute interessante descobrir se a utilizaccedilatildeo dessa nova caracteriacutestica tem acontecido deforma expressiva ou natildeo

Em seguida para melhor entender a forma como as expressotildees lambda estatildeo sendointroduzidas em projetos eacute interessante investigar se as equipes de desenvolvimento estatildeose preocupando em refatorar coacutedigo com o objetivo de evoluir o software ou se estatildeoexperimentando utilizar expressotildees lambda apenas em coacutedigo novo introduzido

Como a introduccedilatildeo de novas funcionalidades em projetos open-source de grande escaladepende do objetivo do projeto e os padrotildees de projeto utilizados [37] espera-se obser-var diversas abordagens quanto a utilizaccedilatildeo de expressotildees lambda para entatildeo poderclassificar estes softwares quanto a abordagem utilizada

Eacute de grande importacircncia para este estudo conseguir identificar na praacutetica comoexpressotildees lambda estatildeo sendo tipicamente adotadas nestes projetos Assim a terceirapergunta de pesquisa busca identificar alguns exemplos de utilizaccedilatildeo atraveacutes da realizaccedilatildeode alguns estudos de caso

23

Eacute importante ressaltar que apesar de as expressotildees lambda serem uma alternativa aouso de AIC elas natildeo os substituem completamente Existem precondiccedilotildees para que umaAIC possa ser substituiacuteda por expressotildees lambda [12] descritas a seguir

bull AIC deve instanciar-se de uma interface

bull AIC natildeo deve possuir nenhum campo e declarar apenas um meacutetodo

bull AIC natildeo deve possuir uma referecircncia para this ou super

bull AIC natildeo deve declarar um meacutetodo recursivo

Para responder agrave primeira pergunta apenas dados gerais sobre todos os projetos seratildeonecessaacuterios ao passo que pelas perguntas 2 e 3 possuiacuterem uma natureza mais complexaseraacute necessaacuterio aleacutem de uma anaacutelise geral estatiacutestica a realizaccedilatildeo de alguns estudos decaso para obter resultados mais completos

42 Fonte de Dados e Objetos de Estudo

Para responder agraves perguntas de pesquisa estabelecidas foram selecionados os 99 projetosmais populares na linguagem Java dentro da plataforma github ateacute a data da coleta dosdados feita em Abril de 2017 Satildeo considerados populares os repositoacuterios que possuema maior quantidade possiacutevel de estrelas (stars) A decisatildeo de escolher os 99 projetos maispopulares foi por sua natureza imparcial e ao mesmo tempo para que se possa analisarprojetos que satildeo de familiaridade e conhecimento da comunidade do github e de domiacuteniopuacuteblico Os 99 projetos estatildeo listados no Anexo I

Para entender a transiccedilatildeo feita por esses projetos entre as versotildees anteriores do Java eo Java 8 com as expressotildees lambda eacute necessaacuterio analisar o coacutedigo de vaacuterias versotildees a fimde observar alguma mudanccedila para cada projeto Como satildeo 99 projetos e vaacuterios dessesprojetos possuem milhares de linhas de coacutedigo e commits seria impossiacutevel avaliar todosos commits Optou-se entatildeo por coletar snapshots mensais de cada projeto conformeprocedimento tambeacutem seguido anteriormente [38] Cada snapshots representa o estadodo projeto em um determinado mecircs e como criteacuterio de escolha padratildeo todos os snapshotsequivalem ao uacuteltimo commit realizado no determinado mecircs que este representa

O proacuteximo passo eacute determinar o periacuteodo de tempo em que esses snapshots seriamcoletados Como Java 8 (e consequentemente as expressotildees lambda) foi introduzidoapenas em meados de 2014 [28] coletar dados de projetos a partir de um periacuteodo muitoantes deste ano natildeo agregaria valor ao estudo em questatildeo Definiu-se entatildeo um periacuteodopara a coleta mensal desses snapshots atraveacutes dos anos Janeiro de 2013 um ano antesda introduccedilatildeo do Java 8 para que se pudesse identificar para todos os projetos o mecircs

24

exato em que expressotildees lambda foram introduzidas ateacute o mecircs da coleta de dados Abrilde 2017

Eacute importante ressaltar que a definiccedilatildeo dos meses foi definida do dia primeiro de ummecircs ao dia primeiro do proacuteximo mecircs e por consequecircncia alguns snapshots que deveriamrepresentar o final de determinado mecircs correspondem na verdade a commits realizadosno dia primeiro do mecircs seguinte Por exemplo pode existir casos em que o commit querepresente o mecircs de Marccedilo de 2016 seja na verdade o commit realizado no dia primeirode Abril de 2016 Isso se deve a natureza da forma como os resultados de log de commitssatildeo obtidos pelo git [39] Poreacutem isso natildeo interfere nas anaacutelises ou no propoacutesito destetrabalho uma vez que foram realizadas verificaccedilotildees e validaccedilotildees para que natildeo existamdatas repetidas (e consequentemente commits repetidos) por repositoacuterio

Neste trabalho o termo projeto e repositoacuterio foram utilizados de forma intercaladapara representar a mesma coisa o software desenvolvido que possui um repositoacuterio naplataforma github Os termos commit snapshops e versotildees tambeacutem representam a mesmacoisa uma vez que foi definido que seriam utilizados apenas um commit por mecircs pararepresentar um determinado snapshot ou versatildeo do repositoacuterio em questatildeo

Todos os 99 projetos seratildeo utilizados para a realizaccedilatildeo de uma anaacutelise geral de ca-racterizaccedilatildeo do uso de expressotildees lambda Para as anaacutelises aprofundadas foi feito umcriteacuterio de classificaccedilatildeo para que apenas alguns projetos possam ser analisados em niacutevelde coacutedigo como estudos de caso

Resumindo foram escolhidos os 99 projetos mais populares de Java no github cole-tando dados mensais de seus commits a partir do ano de 2013 ateacute a data da coleta dosdados lembrando que nem todos os projetos existem desde 2013 (projetos mais recentes)

43 Processo de Mineraccedilatildeo

A abordagem utilizada para coletar e analisar os 99 projetos escolhidos como mostra aFigura 42 foi realizada de forma automatizada utilizando scripts python e dois projetosdesenvolvidos em Java para a coleta e tratamento de dados como descrito a seguir

Primeiramente foi realizado uma coacutepia dos repositoacuterios atuais de todos os 99 projetosmais populares do github em Java Para automatizar o processo foi desenvolvido umscript em python que lista todos os projetos escolhidos clona todos os repositoacuterios emuma pasta na maacutequina local e cria um arquivo temporaacuterio com as informaccedilotildees do nomede cada repositoacuterio e seu caminho absoluto na maacutequina local

25

Figura 42 Metodologia implementada para coleta e tratamento de dados

Em seguida foi necessaacuterio realizar o checkout de todas as versotildees entre Janeiro de2013 a Abril de 2017 de cada projeto Por motivos de otimizaccedilatildeo de espaccedilo da maacutequinalocal e automatizaccedilatildeo no processo de checkout utilizou-se de um segundo script pythonque realizava as seguintes tarefas para cada mecircs em cada projeto verificar se dentreo mecircs estipulado houve algum commit para aquele projeto se sim pega-se o hash douacuteltimo commit do mecircs realiza o checkout conta-se a quantidade de linhas de coacutedigo emJava que o projeto tem utilizando a biblioteca cloc e armazena todas as informaccedilotildeespertinentes referentes a todos os projetos que naquele mecircs tiveram commits para que oprojeto static-analysis possa entatildeo ser executado sobre esses projetos naquele determinadomomento As informaccedilotildees coletadas que satildeo utilizadas pelo static-analysis correspondemao nome do projeto o hash do commit para aquela versatildeo a pasta onde o projeto estaacutearmazenado na maacutequina local a quantidade de linhas de coacutedigo Java do projeto e datareferente ao commit Essas informaccedilotildees satildeo pertinentes para que o projeto static-analysisconsiga funcionar de forma correta projeto este descrito em detalhes a seguir

431 static-analysis

O static-analysis foi um projeto desenvolvido anteriormente a este trabalho pelos alunosThiago Cavalcanti e Vinicius de Almeida cujo objetivo eacute realizar a anaacutelise estaacutetica de

26

coacutedigos-fonte Java e gerar arquivos de saiacuteda contendo informaccedilotildees de classes e meacutetodoscom suas devidas ocorrecircncias de caracteriacutesticas da linguagem [40]

A anaacutelise estaacutetica de coacutedigo consiste em analisar um coacutedigo-fonte sem a necessidadede executaacute-lo Esse tipo de anaacutelise eacute de extrema importacircncia para manter um coacutedigo dequalidade evitar futuras refatoraccedilotildees e obter informaccedilotildees estatiacutesticas de forma raacutepida epraacutetica [41]

Seguindo esse princiacutepio o static-analysis foi projetado para receber um arquivo deentrada csv seguindo o padratildeo

Tipo da Aplicaccedilatildeo Inicio do projeto Antes ou Apoacutes Java 5 Nome do ProjetoVersatildeo Caminho absolutoQuantidade de linhas de coacutedigo

Atraveacutes da informaccedilatildeo do caminho absoluto do projeto o static-analysis varre osdiretoacuterios em busca dos arquivos fonte java realiza o parse desses arquivos e utilizade Visitors para extrair as informaccedilotildees desejadas e exporta-las em arquivos csv Ouso de Visitors permite que sejam escolhidas as informaccedilotildees desejadas para a consultacomo expressotildees Lambda e AIC s aleacutem de possibilitar que sejam implementados novosVisitors conforme a linguagem evolua ou as necessidades mudem

Para este trabalho foram utilizados os Visitors de expressotildees Lambda map() filter()AICs e declaraccedilotildees de meacutetodos

432 BDAnalisador

Apoacutes obter todas as informaccedilotildees necessaacuterias geradas pelo static-analysis era preciso ma-nipular os dados de forma que facilitasse a coleta de dados para o estudo proposto Comovaacuterios arquivos em formato csv satildeo de difiacutecil manipulaccedilatildeo foi desenvolvido entatildeo umaferramenta chamada BDAnalisador Esta ferramenta eacute responsaacutevel por processar os arqui-vos em csv gerados pelo static-analysis e popular uma base de dados relacional MySQLcom as informaccedilotildees pertinentes a este estudo

O BDAnalisador foi desenvolvido com a intenccedilatildeo de tornar mais simples o trabalhocom os dados resultantes do static-analysis de forma que consultas em SQL pudessemser feitas a ponto de permitir a obtenccedilatildeo de resultados mais complexos Seguindo esseobjetivo o framework Hibernate foi escolhido como ferramenta para persistecircncia devidoa ser um framework jaacute consolidado no mercado e que de forma simples relaciona osobjetos Java ao banco de dados MySQL [42] A divisatildeo de classes foi projetada em quatroentidades Projeto Versao Classe e Metodo cada uma com seus respectivos camposcontendo as informaccedilotildees necessaacuterias para a pesquisa como pode ser visto na Figura 44Eacute importante ressaltar que a tabela de Versao guarda hashs de commits devido agrave escolhade utilizar commits para obter mais informaccedilatildeo de evoluccedilatildeo de coacutedigo em um menor

27

espaccedilo de tempo Aleacutem disso para este trabalho optou-se por persistir todos os meacutetodose classes de cada versatildeo sem se importar com a repeticcedilatildeo desses dados pois a hipoacutetesede haver grandes refatoraccedilotildees entre versotildees poderia comprometer a confiabilidade dasinformaccedilotildees

Figura 43 Diagrama de classes UML do BDAnalisador

Como visto na Figura 43 seguindo parcialmente a arquitetura MVC cada entidadepossui sua respectiva classe DAO(Data Access Object) para persistecircncia dos dados eapenas uma classe Controlador no projeto responsaacutevel pela manipulaccedilatildeo e parse dosdados dos arquivos csv gerados pelo static analysis para serem enviados agraves classes DAOO sistema inicia chamando o meacutetodo inicializar() da classe Controlador Esse meacutetodoeacute responsaacutevel por ler um arquivo de entrada csv que segue o mesmo modelo do arquivo dostatic-analysis citado na seccedilatildeo anterior O arquivo conteacutem os dados de todos os projetose suas respectivas versotildees dessa forma o meacutetodo instancia um objeto da classe Projetoe persiste o projeto no banco de dados Para cada versatildeo encontrada no arquivo deentrada o inicializar() aciona os meacutetodos responsaacuteveis por instanciar e preencher aslistas da classe Classe e Metodo Os meacutetodos responsaacuteveis por preencher as listas varremos arquivos csv gerados pelo static-analysis e fazem o parse das informaccedilotildees relevantescomo nomes dos meacutetodos e quantidades de lambdas para construir os objetos que seratildeogravados Ao final dos preenchimentos o objeto Versatildeo eacute instanciado e gravado no bancode dados atraveacutes de sua classe DAO ao mesmo tempo que grava suas respectivas Classese Metodos

28

Apoacutes vaacuterios testes e correccedilotildees de bugs o banco de dados se encontrava finalmente comas informaccedilotildees de 99 projetos Java open-source separados por um commit por mecircs desde2013 cada um com suas respectivas informaccedilotildees de classes meacutetodos e a quantidade deexpressotildees lambda filters e maps em cada meacutetodo Filter ou Filter pattern eacute o padratildeode projeto que tem como objetivo filtrar objetos de uma coleccedilatildeo (Collection) de acordocom algum criteacuterio Jaacute o map ou map pattern eacute um padratildeo que ldquomapeia os elementosde uma coleccedilatildeo aplicando uma funccedilatildeo a eles para uma nova coleccedilatildeo [43] A coleta deinformaccedilotildees sobre esses padrotildees podem ser uacuteteis para possiacuteveis anaacutelises de oportunidadesde uso de expressotildees lambda para refatoraccedilatildeo de coacutedigo

A Figura 44 mostra o esquema de como o banco de dados resultante foi gerado

Figura 44 Modelo relacional do banco de dados populado pelo BDAnalisador Imagemgerada com software DBeaver [2]

44 Classificaccedilatildeo e Anaacutelise

Com o banco de dados populado restam apenas as etapas de classificaccedilatildeo e anaacutelise pararesponder as questotildees de pesquisa propostas Para isso inicialmente houve uma tentativade se utilizar apenas queries SQL para analisar os dados de acordo com as informaccedilotildeesrelevantes Poreacutem devido ao fato de o banco de dados conter todas as informaccedilotildees detodos os projetos e todas as suas versotildees queries que possuem uma alta complexidadedemoravam muito tempo para retornar os dados

Assim com o objetivo de facilitar o trabalho alguns scripts python foram desenvolvi-dos para rodar as queries separadamente e individualmente para cada projeto de formaautomatizada a fim de melhorar o tempo de resposta para obtenccedilatildeo dos resultados

29

441 Meacutedia de Lambda

O primeiro script retorna a quantidade de expressotildees lambda (ou AICs) por n snapshotsque contenha expressotildees lambda O objetivo eacute ter uma visatildeo geral da meacutedia de expressotildeeslambda e AICs utilizadas por cada projeto e como nem todos os snapshots coletados decada projeto possuem expressotildees lambda e AICs apenas aqueles com alguma expressatildeolambda ou AIC satildeo incluiacutedos no caacutelculo da meacutedia

Mmedia =sumn qtdLambdai

n

442 Anaacutelise Temporal

O segundo script retorna para cada projeto a soma total da quantidade de expressotildeeslambda AIC map() e filter() no projeto inteiro para cada versatildeo Ou seja tem-seo total de cada uma das quatro propriedades selecionadas para cada mecircs do projetoobtendo assim uma visatildeo temporal de evoluccedilatildeo do uso das caracteriacutesticas descritas ATabela 41 ilustra parcialmente o resultado obtido para o projeto agera onde idVersaoeacute o identificador no banco de dados referente ao hash do commit mensal coletado qtd eacutea quantidade de cada uma das caracteriacutesticas escolhidas e a data do commit encontra-seno formato americano

Tabela 41 Informaccedilotildees mensais sobre o projeto ageraidVersao Data do Commit qtd lambda qtd AIC qtd maps qtd filter

823 512016 0 29 4 0755 612016 13 28 4 0686 6152016 13 29 4 0621 812016 13 29 4 0555 8162016 13 30 4 0485 922016 13 30 4 0422 10132016 14 30 4 0356 11282016 14 30 4 0295 12212016 21 30 5 0232 212017 21 30 5 0175 312017 21 30 5 0112 3312017 21 36 5 048 4242017 21 48 5 0

Os resultados obtidos com esta anaacutelise temporal permitiu a identificaccedilatildeo de padrotildees nautilizaccedilatildeo de expressotildees lambda em relaccedilatildeo a utilizaccedilatildeo de AIC por todos os projetos Foi

30

possiacutevel classificar todos os projetos em 6 grupos ilustrado na Figura 45 Primeiramenteseparou-se os projetos entre os que possuem expressotildees lambda e os que natildeo possuemDentre os que possuem identificou-se cinco categorias

1 Grupo 1 Quantidade de AICs e expressotildees lambda aumentam com o tempo pro-porcionalmente

2 Grupo 2 Quantidade de AICs diminui agrave medida que a quantidade de expressotildeeslambda aumentam e a quantidade de expressotildees lambda ultrapassa a quantidade deAIC em um determinado momento

3 Grupo 3 Quantidade de AICs diminui agrave medida que a quantidade de expressotildeeslambda aumentam mas a quantidade de AIC permanece superior agrave quantidade delambda

4 Grupo 4 Expressotildees lambda satildeo introduzidas e existem por um pequeno periacuteodode tempo mas satildeo completamente removidas posteriormente

5 Grupo 5 Quantidade de expressotildees lambda eacute constante e muito inferior compa-rado com a quantidade de AICs no projeto Foi determinado que para pertencera esta classificaccedilatildeo o projeto precisa ter uma razatildeo de meacutedia de expressotildees lamb-dasnapshot por meacutedia de AICsnapshot inferior a 020 Esse paracircmetro foi esta-belecido com o objetivo de definir um padratildeo para o que pode ser considerado umprojeto com poucas expressotildees lambda

Figura 45 Classificaccedilatildeo dos projetos

31

443 Refatoraccedilatildeo de Coacutedigo

O uacuteltimo script teve como objetivo realizar uma tentativa inicial de identificar refatoraccedilatildeode coacutedigo da seguinte maneira para todos os projetos que possuem expressotildees lambdaforam identificados o mecircs imediatamente antes da introduccedilatildeo de expressotildees lambda e omecircs seguinte onde houve a primeira ocorrecircncia de lambda no projeto Assim realizou-se uma anaacutelise do tamanho em quantidade de linhas de coacutedigo de todos os meacutetodosdo projeto que no mecircs seguinte tiveram introduccedilatildeo de lambda Em seguida fez-se umacomparaccedilatildeo com os mesmos meacutetodos em relaccedilatildeo ao mecircs anterior e assim foi possiacuteveldetectar quais meacutetodos tiveram a quantidade de linhas de coacutedigo reduzidas o que seriaum indicativo natildeo necessariamente exclusivo de que uma refatoraccedilatildeo de coacutedigo possa terocorrido

Sabe-se que este meacutetodo de detecccedilatildeo de refatoraccedilatildeo de coacutedigo possui suas limitaccedilotildeesuma vez que as comparaccedilotildees para saber se um meacutetodo existe em ambas versotildees eacute feitopuramente por comparaccedilatildeo de String (nome do meacutetodo) e a classe que este pertence

444 Casos de Uso

Os meacutetodos descritos acima ajudaram a identificar alguns padrotildees e facilitar a anaacutelise dosdados Poreacutem natildeo satildeo suficientes para que se possa responder agraves questotildees de pesquisaDessa forma apoacutes a identificaccedilatildeo dos grupos de classificaccedilatildeo para os projetos foramescolhidos um projeto de cada grupo (com exceccedilatildeo do grupo dos projetos sem expressotildeeslambda) para realizar um breve estudo de caso com o objetivo de identificar e caracterizarmelhor a adoccedilatildeo de expressotildees lambda Os projetos escolhidos foram agera vertxAndroid-CleanArchitecture RxJava e guava

32

Capiacutetulo 5

Resultados Obtidos e Anaacutelise

Neste capiacutetulo seratildeo apresentados os dados obtidos e anaacutelise com o objetivo de responderagraves questotildees de pesquisa propostas Como mencionado anteriormente as perguntas seratildeorespondidas de duas maneiras algumas com informaccedilotildees gerais sobre todos os projetose outras com breve estudos de caso envolvendo cinco projetos

51 Visatildeo Geral

Dentre os repositoacuterios coletados para a anaacutelise 74 (7474) natildeo utilizaram nenhumaexpressatildeo lambda no projeto durante todo o periacuteodo analisado (Janeiro de 2013 a Abrilde 2017) restando apenas 25 repositoacuterios (2525) com expressotildees lambda Eacute interessantedestacar que apesar de a quantidade de repositoacuterios que natildeo possuem expressotildees lambdaser relativamente expressiva muitos destes repositoacuterios satildeo de projetos em Java que umdia foram populares e atualmente natildeo estatildeo sendo mais desenvolvidos (por exemplo umaplicativo que soacute funciona para Android 23 atualmente descontinuado)

Levando em consideraccedilatildeo apenas os projetos que possuem expressotildees lambda exis-tem dois tipos de dados que podem ser analisados para responder agrave primeira questatildeo depesquisa atraveacutes dos dados obtidos pelo meacutetodo anteriormente mencionado como anaacutelisetemporal e a meacutedia de lambda por snapshot mencionados no capiacutetulo anterior

Com relaccedilatildeo ao ano em que a primeira ocorrecircncia foi encontrada 6 projetos introduzi-ram expressotildees lambda jaacute em 2014 8 comeccedilaram a utilizar em 2015 7 em 2016 e apenas4 tiveram a primeira ocorrecircncia de expressotildees lambda em 2017 Dessa forma percebe-seque os projetos estatildeo relativamente bem distribuiacutedos em grupos quanto ao ano em que seintroduziu expressotildees lambda

Pela meacutedia de lambda por snapshot (lambdasnapshot) a maioria (11 projetos) possuiuma quantidade expressiva acima de 100 lambdasnapshot (com 6 projetos entre 20 e 100lambdasnapshot e 8 projetos com menos de 20 lambdasnapshot) como apresentados no

33

graacutefico da Figura 51 Isso mostra que essa nova caracteriacutestica jaacute estaacute sendo bem utilizadanos projetos que comeccedilaram a migrar para a nova versatildeo do Java

Figura 51 Graacuteficos dos projetos separados por ano de introduccedilatildeo de expressotildees lambdae meacutedia de lambda por snapshot

Com isso pode-se observar que apesar de a quantidade de projetos que possuemexpressotildees lambda natildeo ser tatildeo alta eacute possiacutevel obter resultados expressivos uma vez quea quantidade dos projetos com lambda estatildeo bem dispersos quanto ao periacuteodo em quecomeccedilaram a adotar essa caracteriacutestica e a quantidade de expressotildees lambda por snapshot

511 Projetos Selecionados

Atraveacutes dos grupos de classificaccedilatildeo identificados pela anaacutelise temporal descritos na Figura45 cinco projetos foram selecionados para uma anaacutelise detalhada levando em consideraccedilatildeoo grupo em que eles pertencem Estes projetos seratildeo apresentados a seguir

512 agera

Agera eacute uma biblioteca Android que ajuda a introduzir programaccedilatildeo funcional reativa(functional reactive programming) em projetos Android Eacute um projeto recente lanccediladoem 2016 pela Google [44] e encontra-se no grupo dos projetos que introduziram expressotildeeslambda em 2016 no mesmo ano de seu lanccedilamento contendo uma meacutedia de expressotildeeslambda de 16 lambdasnapshot

Na classificaccedilatildeo estabelecida agera pertence ao Grupo 1 onde a quantidade de ex-pressotildees lambda no projeto com o tempo aumentam juntamente com a quantidade deAICs como mostra o graacutefico de anaacutelise temporal na Figura 52

34

Figura 52 Graacuteficos de anaacutelise temporal do projeto agera

513 vertx

Eclipse Vertx eacute um conjunto de ferramentas para criaccedilatildeo de reactive applications namaacutequina virtual Java (JVM) em grande escala [45] Seu primeiro lanccedilamento aconteceuem 2011 e a primeira ocorrecircncia de expressotildees lambda no projeto aconteceu em 2014 Esteprojeto possui uma meacutedia de 2867 lambdasnapshot e dentre os projetos consideradosneste trabalho eacute o que possui a maior quantidade de expressotildees lambda

Este projeto pertence ao Grupo 2 onde a quantidade de expressotildees lambda aumen-tou consideravelmente pelos meses ultrapassando a quantidade de AICs que diminuiudrasticamente como mostra a Figura 53

35

Figura 53 Graacuteficos de anaacutelise temporal do projeto Vertx

514 Android-CleanArchitecture

Apesar de ser uma amostra de projeto Android-CleanArchitecture que tem como objetivoconstruir aplicaccedilotildees Android utilizando clean architecture foi lanccedilado em 2014 mas semanteacutem sempre atualizado [46]

A introduccedilatildeo de expressotildees lambda que aconteceu no ano de 2015 se deu de formatiacutemida com uma meacutedia de 35 lambdasnapshot De qualquer forma este projeto conseguerepresentar com seu graacutefico de anaacutelise temporal o grupo 3 composto por projetos em quea quantidade de expressotildees lambda aumentou mas sem ultrapassar AICs que diminuiacuteramdemonstrado no graacutefico da Figura 54

36

Figura 54 Graacuteficos de anaacutelise temporal do projeto Android-CleanArchitecture

515 RxJava

Dentre os repositoacuterios estudados RxJava eacute considerado o mais popular Como umaimplementaccedilatildeo de Reactive Extensions para a JVM RxJava teve seu lanccedilamento dadoem 2013 [47] Expressotildees lambda apareceram pela primeira vez no ano de 2015 comuma meacutedia de 766 lambdasnapshot

Apesar de uma meacutedia relativamente alta o tempo de vida das expressotildees lambda nesteprojeto foi bem curto caracterizando assim projetos do grupo 4 houve a introduccedilatildeo dasexpressotildees lambda no projeto poreacutem houve a remoccedilatildeo completa de todas as expressotildeeslambda previamente introduzidas desaparecendo completamente do projeto ateacute a datada coleta de dados (Figura 55)

37

Figura 55 Graacuteficos de anaacutelise temporal do projeto RxJava

516 guava

Guava eacute um conjunto de bibliotecas para Java da Google lanccedilado em 2011 A atualizaccedilatildeodo coacutedigo do projeto para Java 8 aconteceu somente em 2016 e apesar do projeto conteruma meacutedia de 281 lambdasnapshot ele foi escolhido como representante dos projetosdo Grupo 5 (Figura 56) que possuem expressotildees lambda mas de forma natildeo expressiva osuficiente quando comparado com a quantidade de AIC pelo fato de sua razatildeo de meacutedia delambdasnapshot por meacutedia de AICsnapshot ser 004 Ou seja embora o projeto tenhaexpressotildees lambda estas satildeo consideradas muito poucas quando inseridas no contextogeral deste projeto que eacute considerado um projeto grande

38

Figura 56 Graacuteficos de anaacutelise temporal do projeto Guava

52 Refatoraccedilatildeo de Coacutedigo

Com o objetivo de caracterizar melhor como as expressotildees lambda estatildeo sendo utilizadaseacute interessante identificar se estas estatildeo sendo introduzidas atraveacutes de refatoraccedilatildeo de coacutedigoou em coacutedigo novo

Os projetos classificados como pertencentes ao Grupo 2 possuem em comum o fatode expressotildees lambda aumentarem a medida que AICs diminuem ultrapassando-as eessa caracteriacutestica em comum pode indicar que nestes projetos possivelmente houve re-fatoraccedilatildeo de coacutedigo visto que AIC sendo substituiacutedo por expressotildees lambda dentro dascondiccedilotildees determinadas eacute a maneira mais comum de se identificar refatoraccedilatildeo de coacute-digo para introduccedilatildeo de expressotildees lambda [12] Os projetos que compotildeem o grupo 2representam 44 de todos os projetos estudados que possuem expressotildees lambda o quepode ser um indicativo caso a hipoacutetese de refatoraccedilatildeo de coacutedigo seja positiva de quemuitos projetos que estatildeo adotando o Java 8 estatildeo se preocupando de alguma formacom refatoraccedilatildeo se coacutedigo Fazem parte desse grupo os seguintes projetos elasticsearchjava-design-patterns PocketHub presto RxJava-Android-Samples spark vertx zipkinjava8-tutorial dropwizard e material-dialogs

39

Outra maneira de verificar possiacuteveis indicadores de refatoraccedilatildeo de coacutedigo foi atraveacutesda anaacutelise dos tamanhos (em quantidade de linhas de coacutedigo) dos meacutetodos com expressotildeeslambda no mecircs em que se introduziu expressotildees lambda e um mecircs imediatamente antesdeste Essa anaacutelise mostra que dos 25 projetos com expressotildees lambda 12 (48) projetostiveram ao menos um meacutetodo em que houve uma diminuiccedilatildeo no tamanho o que podeser considerado um indicativo de refatoraccedilatildeo de coacutedigo A Figura 57 mostra todos osprojetos em relaccedilatildeo agrave quantidade total de meacutetodos que possuem lambda no primeiro mecircsde introduccedilatildeo do mesmo em vermelho comparado com a quantidade desses meacutetodos quetiveram uma diminuiccedilatildeo no tamanho quando comparados com o coacutedigo do mecircs anteriorem azul

Figura 57 Comparaccedilatildeo entre todos os projetos com expressatildeo lambda sobre refatoraccedilatildeode coacutedigo no mecircs de introduccedilatildeo da caracteriacutestica

Ainda observando a figura 57 com relaccedilatildeo aos projetos que natildeo tiveram nenhummeacutetodo com diminuiccedilatildeo de tamanho (barra azul) percebe-se que todos os 13 projetossequer tiveram uma quantidade significativa de meacutetodos que possuem expressotildees lambda(com o maior tendo apenas 5 meacutetodos) no mecircs de introduccedilatildeo da caracteriacutestica no projetoe ao mesmo tempo jaacute existiam no mecircs em que natildeo existia lambda no projeto Essa eacuteuma observaccedilatildeo importante porque projetos como vertx sendo este o que possui a maiormeacutedia de lambdasnapshot de todos os projetos e ao mesmo tempo tendo apenas trecircsmeacutetodos que continham expressotildees lambda no mecircs da introduccedilatildeo e que existiam no mecircs

40

anterior permitem inferir que todas as outras expressotildees lambda existentes no projetopara este determinado mecircs de introduccedilatildeo encontram-se em coacutedigo novo introduzido

Eacute importante ressaltar que somente essa anaacutelise natildeo eacute exclusivamente suficiente paradeterminar se estes projetos estatildeo realmente introduzindo lambda em coacutedigo novo ourealizando refatoraccedilatildeo uma vez que como a comparaccedilatildeo aconteceu apenas no mecircs deintroduccedilatildeo com o mecircs imediatamente anterior natildeo reflete todo o ciclo de vida do pro-jeto Por exemplo algumas equipes podem escolher refatorar o coacutedigo depois de umtempo de adaptaccedilatildeo apoacutes a transiccedilatildeo para a nova versatildeo da linguagem Assim paraobter uma melhor anaacutelise sobre refatoraccedilatildeo de coacutedigo ou natildeo feita nestes projetos aleacutemde outras anaacutelises referentes aos padrotildees tipicamente adotados para implementaccedilatildeo delambda nestes projetos seratildeo apresentados a seguir os estudos de caso dos cinco projetospreviamente selecionados

Outro ponto importante eacute o fato de que apesar das informaccedilotildees quanto agraves quantida-des de filter e map terem sido incluiacutedas inicialmente no trabalho para observar possiacuteveispadrotildees de refatoraccedilatildeo de coacutedigo percebeu-se que estas natildeo satildeo utilizadas de forma con-sideraacutevel pelos projetos estudados e para fins de anaacutelises generalizadas natildeo apresentaramtanta influecircncia na utilizaccedilatildeo de expressotildees lambda quanto a quantidade de AICs noprojeto

53 Estudos de Caso

Dentre os projetos analisados verificou-se que os projetos de pequeno e meacutedio porte op-taram por refatorar de uma vez seus coacutedigos para incluir expressotildees lambda em situaccedilotildeesem que se utilizava AICs anteriormente ou em alguns poucos casos de utilizaccedilatildeo deCollection Os projetos de grande porte natildeo apresentaram nenhuma refatoraccedilatildeo de coacute-digo ou uma refatoraccedilatildeo parcial gradativa provavelmente devido agrave grande quantidade dearquivos e coacutedigo que possuem o que pode tornar o trabalho de refatoraccedilatildeo extenso ecansativo

O projeto vertx que pertence ao grupo 2 dos projetos em que a quantidade de ex-pressotildees lambda aumentaram e as de AICs diminuiacuteram com lambda ultrapassando AICsexecutou inicialmente commits em maio de 2014 com adiccedilatildeo de coacutedigo novo utilizandoexpressotildees lambda e apoacutes um mecircs realizou um commit maior com a refatoraccedilatildeo de todasas AICs para expressotildees lambda Apoacutes a refatoraccedilatildeo o projeto se preocupou em mantera utilizaccedilatildeo de expressotildees lambda ao mesmo tempo que o uso de AICs se manteve apenasaos casos de classes com interfaces natildeo funcionais A Figura 58 apresenta uma parte docommit de refatoraccedilatildeo de coacutedigo que mostra em vermelho a parte eliminada do coacutedigo(AIC) e em verde o coacutedigo novo representando a substituiccedilatildeo por uma expressatildeo lambda

41

Figura 58 Commit de refatoraccedilatildeo de coacutedigo do projeto Vertx [3]

Alguns projetos ainda natildeo se preocuparam em refatorar o coacutedigo para o uso de ex-pressotildees lambda ateacute a data deste trabalho que eacute o caso do projeto guava que apresentouum commit em 03112016 com a atualizaccedilatildeo do projeto para Java 8 Mas a partir daatualizaccedilatildeo se preocupou em utilizar as expressotildees lambda apenas na implementaccedilatildeo decoacutedigo novo O cenaacuterio em que a refatoraccedilatildeo natildeo eacute prioridade ainda eacute a realidade de vaacuteriosprojetos de grande porte visto que os dados de projetos sem nenhuma expressatildeo lambdasatildeo o maior nuacutemero neste trabalho Poreacutem projetos que jaacute adotaram a utilizaccedilatildeo do Java8 tendem a mudar isso com o passar do tempo A Figura 59 apresenta em verde umaadiccedilatildeo de coacutedigo novo com expressatildeo lambda sem a eliminaccedilatildeo de algum coacutedigo anteriora esse que estaria em vermelho

42

Figura 59 Exemplo de um arquivo do commit de adiccedilatildeo de coacutedigo novo em Java 8 doprojeto Guava [4]

Na categoria de projetos em que os AICs e expressotildees lambda aumentam proporci-onalmente (grupo 1) o projeto agera realizou um commit em 19052016 com a adiccedilatildeoda biblioteca retrolambda como dependecircncia do projeto Essa biblioteca utilizada prin-cipalmente por projetos Android permite executar coacutedigo Java 8 contendo expressotildeeslambda em Java 5 6 e 7 [48] O commit tambeacutem apresenta refatoraccedilatildeo dos AICs ad-vindos de interfaces funcionais para expressotildees lambda Apesar de o projeto continuar autilizar as expressotildees lambda em seus commits posteriores o nuacutemero de AICs tambeacutemcontinuou a aumentar visualizando os commits posteriores notou-se que esses AICs satildeorelativos a interfaces natildeo funcionais ou seja que possuem mais de um meacutetodo O projetoAndroid-CleanArchitecture eacute similar ao agera pois tambeacutem optou pela instalaccedilatildeo da bi-blioteca retrolambda para uso de expressotildees lambda em seus coacutedigos e como tambeacutem eacuteum projeto de pequeno porte houve uma pequena refatoraccedilatildeo dos AICs A Figura 510mostra a parte do commit de refatoraccedilatildeo de coacutedigo em que o desenvolvedor adiciona abiblioteca retrolambda como dependecircncia

43

Figura 510 Commit de adiccedilatildeo da biblioteca Retrolambda no projeto Agera [5]

Outro caso interessante eacute o do projeto RxJava que em 2015 optou pela refatoraccedilatildeodo coacutedigo para a utilizaccedilatildeo de expressotildees lambda quase eliminando por completo o usode AICs mas que no ano seguinte reverteu os commits de forma que eliminasse comple-tamente o uso de expressotildees lambda para manter a retrocompatibilidade com o Java 6A Figura 511 demonstra uma parte do commit de reversatildeo do coacutedigo para Java 6 emque pode ser visto em vermelho o coacutedigo anterior com expressotildees lambda e o verde como novo coacutedigo utilizando AIC novamente

44

Figura 511 Commit de remoccedilatildeo de Lambdas e volta para o uso de AICs no projetoRXJava [6]

Essa preocupaccedilatildeo com retrocompatibilidade de coacutedigo pode ser um fator crucial nadecisatildeo das equipes de desenvolvimento na hora de decidir como fazer o software co-evoluircom a linguagem sem perder a compatibilidade com versotildees anteriores

45

Capiacutetulo 6

Consideraccedilotildees Finais

Este estudo permitiu entender melhor como projetos estatildeo realizando a migraccedilatildeo para oJava 8 em especial utilizando uma nova caracteriacutestica introduzida expressatildeo lambdaApesar de a maioria dos projetos populares considerados natildeo possuiacuterem nenhuma ocor-recircncia de expressotildees lambda os projetos que tinham expressotildees lambda foram suficientespara realizar um primeiro estudo de caracterizaccedilatildeo no uso desta caracteriacutestica e com osprojetos efetivamente utilizados para estudo foi possiacutevel agrupaacute-los quanto a maneira emque as expressotildees lambda estavam sendo utilizadas quando comparadas com AICs em 5grandes grupos quando AIC e lambda aumentam proporcionalmente quando AIC dimi-nui e lambda aumenta ultrapassando AIC quando AIC diminui mas continua superior aolambda crescente expressotildees lambda que foram introduzidas e retiradas completamentedo coacutedigo e expressotildees lambda que natildeo existem em quantidades expressivas

Foi possiacutevel entatildeo realizar um estudo aprofundado levando em consideraccedilatildeo as di-ferentes maneiras com que as expressotildees lambda foram adotadas nos projetos atraveacutes daescolha de um projeto que representasse cada grupo para anaacutelise Dentre os cinco projetosestudados foi possiacutevel observar alguns padrotildees tipicamente adotados por desenvolvedorespara implementar expressotildees lambda em seus projetos como a utilizaccedilatildeo da bibliotecas(retrolambda) que permitissem uma flexibilizaccedilatildeo na utilizaccedilatildeo de expressotildees lambda oucomo lambda eacute primariamente utilizada para substituir determinados AICs ou operaccedilotildeesem Collection

Aleacutem disso foi possiacutevel observar como a refatoraccedilatildeo de coacutedigo acontece em cada umdesses projetos Observou-se como projetos menores tendem a refatorar coacutedigo maisfacilmente ao passo que projetos maiores e mais complexos fazem menos refatoraccedilatildeo oudemoram mais entre o periacuteodo em que houve a primeira migraccedilatildeo de coacutedigo para a novaversatildeo da linguagem ateacute o periacuteodo em que realmente decidem refatorar coacutedigo Aleacutem dacomplexidade do projeto influenciar na decisatildeo de migrar o projeto para uma versatildeo maisrecente da linguagem a preocupaccedilatildeo com retrocompatibilidade com versotildees anteriores da

46

linguagem tambeacutem podem ser uma barreira para que projetos comecem a evoluir o coacutedigojuntamente com a evoluccedilatildeo da linguagem

Ainda assim foi possiacutevel observar que a preocupaccedilatildeo com a co-evoluccedilatildeo do software-linguagem existe entre os desenvolvedores de projetos mas a realizaccedilatildeo da migraccedilatildeo aindaacontece lentamente devido agrave diversos fatores que precisam ser levados em consideraccedilatildeopara a manutenccedilatildeo do projeto

Para trabalhos e contribuiccedilotildees futuras seria interessante desenvolver uma ferramentaque pudesse analisar diretamente no coacutedigo-fonte as oportunidades de aplicaccedilatildeo de ex-pressotildees lambda dessa forma poderiam ser analisadas as porcentagens de conversatildeo decoacutedigo para Java 8 e obter melhores conclusotildees sobre a importacircncia que os projetos estatildeodando para a evoluccedilatildeo de seus coacutedigos Outro fator interessante seria aplicar mais Visitorsagrave ferramenta static-analysis e fazer este mesmo estudo aplicado agrave outras caracteriacutesticasda linguagem

47

Referecircncias

[1] Kagdi Huzefa Michael L Collard e Jonathan I Maletic A survey and taxonomyof approaches for mining software repositories in the context of software evolution2007 ix 3 8 9 10 11

[2] DBeaver Dbeaver - features httpdbeaverjkissorgdocsfeatures ix 29

[3] Eclipse Vertx commit Java8-ify code httpsgithubcomeclipsevertxcommit93f95e9c77419f442a42fe711b6eeaef88192fd3 ix 42

[4] Google Guava commit Release java 8 changes to guava httpsgithubcomgoogleguavacommit73e382fa877f80994817a136b0adcc4365ccd904 ix 43

[5] Google Agera commit Collapsed testapp with retrolambda httpsgithubcomgoogleageracommit5e518b7b05f9e7a34a314945f68deff7b2c3e334 ix 44

[6] ReactiveX Rxjava commit 2x full jdk 6 compatible backport + includ-ing bugfixes up to today httpsgithubcomReactiveXRxJavacommit000a174d87a901135f9665d3b11f3627fd2dc4ed ix 45

[7] Godfrey M W e D M German The past present and future of software evolutionEm 2008 Frontiers of Maintenance paacuteginas 129ndash138 Sept 2008 1 6

[8] Favre J M Languages evolve too changing the software time scale Em Principles ofSoftware Evolution Eighth International Workshop on paacuteginas 33ndash42 IEEE 20051 5 7

[9] Overbey Jeffrey L e Ralph E Johnson Regrowing a language refactoring tools allowprogramming languages to evolve Em ACM SIGPLAN Notices volume 44 paacuteginas493ndash502 ACM 2009 1 5 7 8 12

[10] Grechanik Mark Collin McMillan Luca DeFerrari Marco Comi Stefano CrespiDenys Poshyvanyk Chen Fu Qing Xie e Carlo Ghezzi An empirical investiga-tion into a large-scale java open source code repository Em Proceedings of the2010 ACM-IEEE International Symposium on Empirical Software Engineering andMeasurement ESEM rsquo10 paacuteginas 111ndash1110 New York NY USA 2010 ACMISBN 978-1-4503-0039-1 httpdoiacmorg10114518527861852801 1

[11] TIOBE Tiobe httpswwwtiobecomtiobe-index 1 14

48

[12] Gyori Alex Lyle Franklin Danny Dig e Jan Lahoda Crossing the gap from im-perative to functional programming through refactoring Em Proceedings of the 20139th Joint Meeting on Foundations of Software Engineering ESECFSE 2013 paacute-ginas 543ndash553 New York NY USA 2013 ACM ISBN 978-1-4503-2237-9 httpdoiacmorg10114524914112491461 2 11 24 39

[13] OpenJDK State of the lambda httpcropenjdkjavanet~briangoetzlambdalambda-state-4html 2

[14] Han Jiawei Micheline Kamber e Jian Pei Data Mining Concepts and TechniquesMorgan Kaufmann Publishers Inc San Francisco CA USA 3rd ediccedilatildeo 2011ISBN 0123814790 9780123814791 3

[15] Fowler Martin e Kent Beck Refactoring improving the design of existing codeAddison-Wesley Professional 1999 5 7

[16] Lehman M M J F Ramil P D Wernick D E Perry e W M Turski Met-rics and laws of software evolution - the nineties view Em Proceedings of the4th International Symposium on Software Metrics METRICS rsquo97 paacuteginas 20ndashWashington DC USA 1997 IEEE Computer Society ISBN 0-8186-8093-8 httpdlacmorgcitationcfmid=823454823901 6

[17] Hassan Ahmed E e Tao Xie Software intelligence The future of mining softwareengineering data Em Proceedings of the FSESDP Workshop on Future of SoftwareEngineering Research FoSER rsquo10 paacuteginas 161ndash166 New York NY USA 2010ACM ISBN 978-1-4503-0427-6 httpdoiacmorg101145188236218823978 9

[18] Hassan Ahmed E The road ahead for mining software repositories Em Frontiers ofSoftware Maintenance 2008 FoSM 2008 paacuteginas 48ndash57 IEEE 2008 8

[19] Berry Michael J e Gordon Linoff Data Mining Techniques For Marketing Salesand Customer Support John Wiley amp Sons Inc New York NY USA 1997ISBN 0471179809 10

[20] Parnin Chris Christian Bird e Emerson Murphy-Hill Java generics adoption hownew features are introduced championed or ignored Em Proceedings of the 8thWorking Conference on Mining Software Repositories paacuteginas 3ndash12 ACM 2011 12

[21] Oracle The java language specification httpsdocsoraclecomjavasespecsjlsse8jls8pdf 13

[22] Oracle The history of java technology httpwwworaclecomtechnetworkjavajavaseoverviewjavahistory-index-198355html 13

[23] Murphy Kieron So why did they decide to call itjava httpwwwjavaworldcomarticle2077265core-javaso-why-did-they-decide-to-call-it-java-html 13

[24] McGraw Tata Object-oriented Programming with Java Essentials and ApplicationsHill Education 13

49

[25] Oracle Differences between java ee and java se httpdocsoraclecomjavaee6firstcupdocgkhoyhtml 13

[26] Lindsey Clark S The History of Java Cambridge 14

[27] Oracle The java language environment httpwwworaclecomtechnetworkjavaintro-141325html 14

[28] Oracle Jdk 8 httpopenjdkjavanetprojectsjdk8 15 24

[29] Oracle Enhancements in java se 8 httpdocsoraclecomjavase8docstechnotesguideslanguageenhancementshtmljavase8 15 16 17

[30] Oracle Lambda expressions httpdocsoraclecomjavasetutorialjavajavaOOlambdaexpressionshtml 16 18 21

[31] Oracle Method references httpdocsoraclecomjavasetutorialjavajavaOOmethodreferenceshtml 16

[32] Oracle Default methods httpdocsoraclecomjavasetutorialjavaIandIdefaultmethodshtml 17

[33] Oracle Repeating annotations httpdocsoraclecomjavasetutorialjavaannotationsrepeatinghtml 17

[34] Oracle Type annotations httpdocsoraclecomjavasetutorialjavaannotationstype_annotationshtml 17

[35] Oracle Anonymous inner classes httpsdocsoraclecomjavasetutorialjavajavaOOanonymousclasseshtml 19

[36] Kothari CR Research Methodology Methods and Techniques New Age Interna-tional (P) Limited 2004 ISBN 9788122415223 httpsbooksgooglecombrbooksid=8c6gkbKi-F4C 22

[37] Nakakoji Kumiyo Yasuhiro Yamamoto Yoshiyuki Nishinaka Kouichi Kishida eYunwen Ye Evolution patterns of open-source software systems and communitiesEm IWPSE rsquo02 Proceedings of the International Workshop on Principles of SoftwareEvolution paacuteginas 76ndash85 New York NY USA 2002 ACM Press ISBN 1581135459httpdxdoiorg101145512035512055 23

[38] Rahman Foyzur Christian Bird e Premkumar Devanbu Clones What is that smellEmpirical Software Engineering 17(4-5)503ndash530 2012 24

[39] Chacon Scott Pro Git Apress Berkely CA USA 1st ediccedilatildeo 2009ISBN 1430218339 9781430218333 25

[40] Cavalcanti Thiago Gomes e Viniacutecius Correa de Almeida Caracterizaccedilatildeo do uso deconstruccedilotildees da linguagem java em projetos open-source Publicaccedilatildeo online 2016httpbdmunbbrhandle1048315733 27

50

[41] Parr Terence Language Implementation Patterns Create Your Own Domain-Specific and General Programming Languages Pragmatic Bookshelf 1st ediccedilatildeo 2009ISBN 193435645X 9781934356456 27

[42] Janssen Thorben 5 reasons to use jpa hibernate Publicaccedilatildeo online httpswwwsitepointcom5-reasons-to-use-jpa-hibernate 27

[43] Franklin Lyle Alex Gyori Jan Lahoda e Danny Dig Lambdaficator From imperativeto functional programming through automated refactoring Em Proceedings of the2013 International Conference on Software Engineering ICSE rsquo13 paacuteginas 1287ndash1290 Piscataway NJ USA 2013 IEEE Press ISBN 978-1-4673-3076-3 httpdlacmorgcitationcfmid=24867882486986 29

[44] Google Agera httpsgithubcomgoogleagerawiki 34

[45] Eclipse Eclipse vertx httpvertxio 35

[46] Cejas Fernando Android cleanarchitecture httpsgithubcomandroid10Android-CleanArchitecture 36

[47] ReactiveX Rxjava httpsgithubcomReactiveXRxJava 37

[48] Luontola Esko Retrolambda httpsgithubcomorfjackalretrolambda 43

51

Anexo I

Projetos utilizados

fastjson

platform_frameworks_base

netty

material-dialogs

kotlin

okhttp

tinker

AndroidUtilCode

RxJava

spring-boot

java-design-patterns

elasticsearch

ExoPlayer

kafka

vertx

realm-java

guava

zipkin

bazel

stetho

Signal-Android

glide

agera

fresco

plaid

presto

libgdx

spark

52

disruptor

lottie-android

flexbox-layout

PocketHub

zxing

spring-framework

deeplearning4j

dropwizard

interviews

BaseRecyclerViewAdapterHelper

uCrop

DanmakuFlameMaster

lottie-react-native

android-UniversalMusicPlayer

AndroidInterview-Q-A

greenDAO

retrofit

MaterialDrawer

BottomBar

druid

MPAndroidChart

Hystrix

guice

recyclerview-animators

dubbo

androidannotations

RxJava-Android-Samples

PhotoView

clojure

CircleImageView

AndroidSwipeLayout

jedis

MaterialViewPager

butterknife

junit4

RxBinding

leakcanary

SimianArmy

picasso

UltimateRecyclerView

53

AndroidViewAnimations

AppIntro

FizzBuzzEnterpriseEdition

ion

cheesesquare

physical-web

RxAndroid

Android-CleanArchitecture

Calligraphy

Android-Bootstrap

iosched

Android_Data

MaterialDesignLibrary

ListViewAnimations

EventBus

java8-tutorial

AndroidSlidingUpPanel

dagger

okhttputils

logger

HomeMirror

Material-Animations

android-Ultra-Pull-To-Refresh

android-async-http

Android-ObservableScrollView

Android-Universal-Image-Loader

ActionBarSherlock

SlidingMenu

storm

PagerSlidingTabStrip

Android-PullToRefresh

54

  • Dedicatoacuteria
  • Agradecimentos
  • Resumo
  • Abstract
  • Introduccedilatildeo
    • Contexto
    • Objetivos
      • Objetivos Gerais
      • Objetivos Especiacuteficos
        • Metodologia
        • Organizaccedilatildeo do Trabalho
          • Evoluccedilatildeo e Mineraccedilatildeo de Repositoacuterios de Software
            • Evoluccedilatildeo de Software
            • MSR Mineraccedilatildeo de dados e a Engenharia de Software
              • Classificaccedilatildeo
                • Trabalhos Relacionados
                  • Java SE 8 e JDK 8
                    • Histoacuterico
                    • Princiacutepios
                    • Evoluccedilatildeo
                    • Expressotildees Lambda
                      • Sintaxe
                      • Principais formas de uso
                          • Estudo e o Processo de Mineraccedilatildeo
                            • Questotildees de Pesquisa
                            • Fonte de Dados e Objetos de Estudo
                            • Processo de Mineraccedilatildeo
                              • static-analysis
                              • BDAnalisador
                                • Classificaccedilatildeo e Anaacutelise
                                  • Meacutedia de Lambda
                                  • Anaacutelise Temporal
                                  • Refatoraccedilatildeo de Coacutedigo
                                  • Casos de Uso
                                      • Resultados Obtidos e Anaacutelise
                                        • Visatildeo Geral
                                          • Projetos Selecionados
                                          • agera
                                          • vertx
                                          • Android-CleanArchitecture
                                          • RxJava
                                          • guava
                                            • Refatoraccedilatildeo de Coacutedigo
                                            • Estudos de Caso
                                              • Consideraccedilotildees Finais
                                              • Referecircncias
                                              • Anexo
                                              • Projetos utilizados

Resumo

Este trabalho apresenta um estudo sobre como as expressotildees lambda introduzidas nalinguagem Java desde 2014 estatildeo sendo utilizadas em projetos Java open-source Atraveacutesde uma amostragem de 99 projetos populares existentes na plataforma Github observou-se como e quando esta caracteriacutestica foi introduzida nestes projetos identificando padrotildeesadotados e meacutetodos de refatoraccedilatildeo de coacutedigo caso estes existam Foi realizado um estudogeral para identificar padrotildees gerais aleacutem de estudos de caso com o objetivo de obter umaanaacutelise mais aprofundada sobre o assunto Foram escolhidos cinco projetos previamenteclassificados de acordo com a abordagem distinta de introduccedilatildeo de expressotildees lambdapara realizar os estudos de caso

Palavras-chave Mineraccedilatildeo em Repositoacuterios de Software git Java Expressotildees LambdaAnonymous Inner Class

v

Abstract

This work presents a study about how lambda expressions are being used in open-soruceJava projects Using a sample of 99 popular projectsrsquo repositories in Github it wasanalyzed how and when this feature was introduced within those projects identifyingpatterns used to implement such feature and possible code refactoring approaches in caseany code was refactored It was conducted a general study to identify similarities amongprojects and the way they use lambda expressions and also case studies that intendedto realize a richer analysis about the subject For the case studies it was chosen fiveprojects previously classified according to the distinct approach used when introducinglambda expressions

Keywords Mining Software Repositories git Java Lambda Expressions AnonymousInner Class

vi

Sumaacuterio

1 Introduccedilatildeo 111 Contexto 112 Objetivos 2

121 Objetivos Gerais 2122 Objetivos Especiacuteficos 2

13 Metodologia 314 Organizaccedilatildeo do Trabalho 3

2 Evoluccedilatildeo e Mineraccedilatildeo de Repositoacuterios de Software 521 Evoluccedilatildeo de Software 622 MSR Mineraccedilatildeo de dados e a Engenharia de Software 8

221 Classificaccedilatildeo 823 Trabalhos Relacionados 11

3 Java SE 8 e JDK 8 1331 Histoacuterico 1332 Princiacutepios 1433 Evoluccedilatildeo 1534 Expressotildees Lambda 18

341 Sintaxe 18342 Principais formas de uso 19

4 Estudo e o Processo de Mineraccedilatildeo 2241 Questotildees de Pesquisa 2342 Fonte de Dados e Objetos de Estudo 2443 Processo de Mineraccedilatildeo 25

431 static-analysis 26432 BDAnalisador 27

44 Classificaccedilatildeo e Anaacutelise 29441 Meacutedia de Lambda 30

vii

442 Anaacutelise Temporal 30443 Refatoraccedilatildeo de Coacutedigo 32444 Casos de Uso 32

5 Resultados Obtidos e Anaacutelise 3351 Visatildeo Geral 33

511 Projetos Selecionados 34512 agera 34513 vertx 35514 Android-CleanArchitecture 36515 RxJava 37516 guava 38

52 Refatoraccedilatildeo de Coacutedigo 3953 Estudos de Caso 41

6 Consideraccedilotildees Finais 46

Referecircncias 48

Anexo 51

I Projetos utilizados 52

viii

Lista de Figuras

21 Taxonomia em camadas adaptada do trabalho de Kagdi et al [1] 9

41 Processo utilizado para realizaccedilatildeo do estudo 2242 Metodologia implementada para coleta e tratamento de dados 2643 Diagrama de classes UML do BDAnalisador 2844 Modelo relacional do banco de dados populado pelo BDAnalisador Imagem

gerada com software DBeaver [2] 2945 Classificaccedilatildeo dos projetos 31

51 Graacuteficos dos projetos separados por ano de introduccedilatildeo de expressotildees lambdae meacutedia de lambda por snapshot 34

52 Graacuteficos de anaacutelise temporal do projeto agera 3553 Graacuteficos de anaacutelise temporal do projeto Vertx 3654 Graacuteficos de anaacutelise temporal do projeto Android-CleanArchitecture 3755 Graacuteficos de anaacutelise temporal do projeto RxJava 3856 Graacuteficos de anaacutelise temporal do projeto Guava 3957 Comparaccedilatildeo entre todos os projetos com expressatildeo lambda sobre refatora-

ccedilatildeo de coacutedigo no mecircs de introduccedilatildeo da caracteriacutestica 4058 Commit de refatoraccedilatildeo de coacutedigo do projeto Vertx [3] 4259 Exemplo de um arquivo do commit de adiccedilatildeo de coacutedigo novo em Java 8 do

projeto Guava [4] 43510 Commit de adiccedilatildeo da biblioteca Retrolambda no projeto Agera [5] 44511 Commit de remoccedilatildeo de Lambdas e volta para o uso de AICs no projeto

RXJava [6] 45

ix

Lista de Tabelas

31 As versotildees anteriores de java e principais caracteriacutesticas 14

41 Informaccedilotildees mensais sobre o projeto agera 30

x

Capiacutetulo 1

Introduccedilatildeo

11 Contexto

A evoluccedilatildeo e manutenccedilatildeo de software eacute uma caracteriacutestica intriacutenseca do desenvolvimentode sistemas considerando que a partir do momento em que um software comeccedila a serdesenvolvido satildeo realizadas constantes manutenccedilotildees [7] Apesar de o conceito de evolu-ccedilatildeo de software representar uma grande aacuterea de pesquisa na engenharia de software nemsempre pesquisadores reconhecem a importacircncia da evoluccedilatildeo das linguagens de progra-maccedilatildeo como um grande fator influenciador na evoluccedilatildeo de software [8] uma vez que umsoftware que natildeo evolui junto com a sua linguagem tem a sua capacidade de evoluccedilatildeolimitada [9]

Surge entatildeo a necessidade de alinhar estudos empiacutericos com o intuito de investigar esteprocesso de evoluccedilatildeo do software juntamente com a evoluccedilatildeo de sua linguagem atraveacutesde investigaccedilatildeo e anaacutelise de seu coacutedigo fonte que pode ser feita por meio de anaacutelise de re-positoacuterios de software em grande escala o que deu origem a abordagem de Mineraccedilatildeo emRepositoacuterio de Software (MSR) O MSR tem como base o estudo sistemaacutetico e empiacutericode repositoacuterios de software com o objetivo de analisaacute-los utilizando informaccedilotildees estatis-ticamente uacuteteis coletadas para observar diversos padrotildees como a evoluccedilatildeo do softwarepadrotildees de projetos dentre outros [10]

A complexidade e dificuldade de realizar tal estudo empiacuterico eacute alta pois atualmenteexistem diversos tipos de plataformas para coleta de dados linguagens e focos variadosAssim para escolher o foco do objeto de estudo eacute necessaacuterio levar em consideraccedilatildeo estasdificuldades e especificaccedilotildees e dessa forma este trabalho tem como foco a anaacutelise desistemas de software na linguagem Java

Ateacute a data deste trabalho de acordo com os dados do TIOBE [11] Java eacute a linguagemde programaccedilatildeo com mais linhas de codigo catalogadas no mundo Isso faz com queseja extremamente interessante o estudo empiacuterico da evoluccedilatildeo da linguagem e software

1

desenvolvidos nela desde sua primeira versatildeo antes de se tornar uma linguagem populare ainda com poucos pacotes ateacute a sua atual versatildeo estaacutevel com uma grande quantidadede novas caracteriacutesticas

A versatildeo mais recente do Java a JDK 8 possui diversas adiccedilotildees interessantes para aorganizaccedilatildeo do coacutedigo e facilidade do programador Dessas novas implementaccedilotildees con-ceitos de linguagem funcional como expressotildees lambda e iteradores externos que recebemuma expressatildeo lambda como argumento como o map() filter() e forEach() tornarama escrita de coacutedigo paralelo mais simples e permitiram ganhos de performance [12]

Diversas linguagens de programaccedilatildeo tambeacutem populares como Javascript e Ruby jaacutepossuiacuteam expressotildees lambda desde suas versotildees iniciais sendo o Java 8 em 2014 maisuma linguagem a introduzir esse novo conceito Podemos descrever as expressotildees comopequenas funccedilotildees normalmente feitas em apenas uma linha sem um nome identificadorElas podem ser retornadas de outras funccedilotildees ou passadas como paracircmetro Um exemplode expressatildeo lambda pode ser visualizado pela funccedilatildeo de soma de dois inteiros escrita daforma (int x int y)rarr x + y [13]

Antes da inclusatildeo de expressotildees lambda em Java o mesmo comportamento era possiacutevelutilizando classes anocircnimas ou AICs (Anonymous inner classes) Contudo eacute necessaacute-rio a criaccedilatildeo de uma interface com apenas um meacutetodo e instanciaacute-la como uma AIC Autilizaccedilatildeo de AICs gera inuacutemeras linhas de coacutedigo adicionais que poderiam ser encapsu-ladas em apenas uma linha com a utilizaccedilatildeo de expressotildees lambda Como eacute interessantepara o programador ter um coacutedigo sempre mais legiacutevel e sucinto torna-se interessante arefatoraccedilatildeo de coacutedigo que utiliza uma tecnologia mais antiga para a nova

Assim este trabalho visa conduzir um estudo de mineraccedilatildeo em repositoacuterios de softwareopen-source desenvolvidos na linguagem Java para entender como desenvolvedores estatildeose adaptando agraves novas mudanccedilas introduzidas no Java 8

12 Objetivos

121 Objetivos Gerais

Este trabalho tem como objetivo geral caracterizar o uso de expressotildees lambda entre osprojetos Java mais populares desenvolvidos pela comunidade do GitHub

122 Objetivos Especiacuteficos

Sabendo do benefiacutecio da refatoraccedilatildeo de coacutedigo para o uso de expressotildees lambda e dapouca quantidade de estudos acadecircmicos sobre o assunto surge entatildeo uma oportunidadede pesquisa para melhor entender a forma como essa caracteriacutestica estaacute sendo adotada por

2

projetos com foco em refatoraccedilatildeo de coacutedigo o que originou a necessidade deste estudoAssim para alcanccedilar o objetivo deste trabalho foram traccedilados em forma de questotildees depesquisa os objetivos especiacuteficos a serem alcanccedilados por este trabalho

bull Quando os projetos Java de coacutedigo aberto comeccedilaram a introduzir o uso de expres-sotildees lambda em seus coacutedigos e quatildeo significativo eacute esse uso

bull Como as equipes de desenvolvimento estatildeo utilizando expressotildees lambda atraveacutesde refatoraccedilatildeo de coacutedigo ou introduzindo apenas em coacutedigo novo

bull Quais satildeo os padrotildees tipicamente adotados para o uso de expressotildees lambda

13 Metodologia

Este trabalho foi desenvolvido utilizando uma abordagem de MSR que dentro da clas-sificaccedilatildeo de Kagdi et al [1] pode ser divido em quatro grandes etapas Primeiramentedefiniu-se a fonte de dados a ser utilizada e dentre as possibilidades encontradas na lite-ratura [14] optou-se por utilizar repositoacuterios de controle de versatildeo mais especificamenteo Github tendo como criteacuterio de seleccedilatildeo os 99 repositoacuterios Java mais populares na plata-forma Em seguida definiu-se o propoacutesito do estudo no caso os objetivos em forma deperguntas de pesquisa a serem respondidas

A terceira grande etapa foi a definiccedilatildeo do meacutetodo em si a forma como seria realizadoo estudo e este por sua vez constitui-se de download de todos os 99 repositoacuterios maispopulares realizaccedilatildeo de uma anaacutelise estaacutetica para coletar informaccedilotildees necessaacuterias de cadaprojeto por versatildeo e armazenamento de informaccedilotildees pertinentes em uma base de dados

A etapa final foi a realizaccedilatildeo da avaliaccedilatildeo dos dados obtidos atraveacutes de meacutetricas eanaacutelises quantitativas para melhor responder as questotildees de pesquisa aleacutem de estudos decaso feitos com cinco projetos escolhos de acordo com a maneira distinta em que estesfazem o uso de expressotildees lambda

14 Organizaccedilatildeo do Trabalho

Este trabalho se divide em seis capiacutetulos

bull Capiacutetulo 2 Apresenta um referencial teoacuterico sobre evoluccedilatildeo de software demons-trando as estrateacutegias utilizadas e a importacircncia da evoluccedilatildeo em um projeto de coacutedigoaberto aleacutem de enunciar as leis de evoluccedilatildeo de software de Lehman O capiacutetulo tam-beacutem apresenta o processo de mineraccedilatildeo de dados explicando cada uma das camadasda classificaccedilatildeo e demonstra trabalhos relacionados a esse toacutepico que serviram debase para este trabalho

3

bull Capiacutetulo 3 Traz um contexto histoacuterico e teacutecnico da linguagem Java necessaacuteriospara entender a importacircncia que as novas caracteriacutesticas adicionadas na versatildeo8 fornecem para os desenvolvedores de projetos determinados a manter o projetosempre evoluiacutedo Tambeacutem eacute apresentada uma seccedilatildeo para demonstrar os detalhese formas de utilizaccedilatildeo das expressotildees Lambda que satildeo o foco dos objetivos destetrabalho

bull Capiacutetulo 4 Descreve a metodologia e processo utilizados para o desenvolvimentoe obtenccedilatildeo dos resultados deste trabalho O capiacutetulo desenvolve o contexto dasquestotildees de pesquisa e explica os motivos e processos de desenvolvimento das fer-ramentas utilizadas para minerar os dados aleacutem de determinar a classificaccedilatildeo dosresultados obtidos em grupos para facilitar a organizaccedilatildeo dos dados de forma queas perguntas sejam respondidas claramente

bull Capiacutetulo 5 Apresenta os resultados obtidos e de que forma eles ajudaram a respon-der as questotildees de pesquisa Eacute descrita uma anaacutelise de um projeto de cada categoriaespecificada no capiacutetulo anterior a fim de contextualizar cada tipo de resultado paraque o leitor entenda a forma que os projetos Java estatildeo lidando com as expressotildeesLambda

bull Capiacutetulo 6 Descreve as dificuldades e problemas obtidos durante o trabalho e deque forma eles influenciaram nos resultados Tambeacutem eacute apresentada uma seccedilatildeocontendo as ideias surgidas durante o desenvolvimento deste trabalho que ficarampara ser feitas no futuro devido agrave gama de informaccedilotildees que a mineraccedilatildeo dos dadostrouxe

4

Capiacutetulo 2

Evoluccedilatildeo e Mineraccedilatildeo deRepositoacuterios de Software

As linguagens de programaccedilatildeo estatildeo sempre evoluindo aumentando sua complexidade eexpressividade Da mesma forma aleacutem de se preocupar com dificuldades de estabelecercompatibilidade do software em relaccedilatildeo a tecnologias antigas desenvolvedores tambeacutemprecisam acompanhar essa evoluccedilatildeo das linguagens para que suas ferramentes natildeo setornem obsoletas [9] Isso agrega um grande desafio no desenvolvimento e evoluccedilatildeo desoftware

O conceito de evoluccedilatildeo de software amadureceu e se tornou um grande foco de pes-quisa Poreacutem nem sempre estudos de evoluccedilatildeo de software reconhecem a importacircncia daevoluccedilatildeo da linguagem de programaccedilatildeo no contexto do desenvolvimento de software [8]Quando um coacutedigo natildeo evolui junto com a linguagem com o objetivo de manter umacompatibilidade com versotildees anteriores sua capacidade de evoluccedilatildeo se torna limitada [9]

A refatoraccedilatildeo de coacutedigo que consiste em realizar mudanccedilas no coacutedigo fonte sem modi-ficar o comportamento observado do software [15] permite que a evoluccedilatildeo de linguagens eferramentas aconteccedilam mais naturalmente No entanto novos desafios surgem como porexemplo saber quando e como realizar a refatoraccedilatildeo de coacutedigo de forma eficiente e coesaDentre as teacutecnicas de pesquisa em engenharia de software para entender esse problematorna-se interessante explorar as teacutecnicas de mineraccedilatildeo de dados aplicados a repositoacuteriosde software com o objetivo de entender o relacionamento entre evoluccedilatildeo e refatoraccedilatildeo

Assim este capiacutetulo busca esclarecer conceitos e estrateacutegias de evoluccedilatildeo de softwaremineraccedilatildeo de repositoacuterios de software e o estado da arte sobre o assunto

5

21 Evoluccedilatildeo de Software

Durante o processo de produccedilatildeo e manutenccedilatildeo de software haacute a necessidade de diversastomadas de decisotildees sobre seu desenvolvimento como por exemplo decidir como melho-rar a qualidade do software Tais decisotildees precisam ser tomadas levando em consideraccedilatildeoo ambiente em que se estaacute inserido com novas tecnologias surgindo todos os dias fe-edback de usuaacuterios exigentes e concorrentes produzindo um software similar com ideiasinovadoras

Tudo isso acontece em um ritmo de constante mudanccedila e assim como diria Lehmaneacute imprescindiacutevel que software de sistemas sejam capazes de evoluir ou os mesmos correm orisco de sofrer uma morte prematura [16] fazendo assim da evoluccedilatildeo de software um con-ceito importante dentro do seu processo de desenvolvimento Essa evoluccedilatildeo deve ocorrerconsiderando o ambiente em que o software estaacute inserido o qual possui aspectos teacutecnicos esociais sua infraestrutura que pertence ao seu ambiente teacutecnico o qual sempre necessitamanutenccedilatildeo e ao mesmo tempo usuaacuterios que utilizam o software e estatildeo constantementeformando opiniotildees oferecendo feedback e na expectativa por novidades [7] Assim a me-dida que novas caracteriacutesticas satildeo desenvolvidas novas tecnologias de infraestrutura satildeonecessaacuterias novos requisitos satildeo adicionados e o sistema de software deve se adaptar aessas mudanccedilas

Com relaccedilatildeo aos aspectos sociais que envolvem a evoluccedilatildeo do software eacute importanteressaltar os conceitos baacutesicos de como essa evoluccedilatildeo acontece Durante um estudo empiacutericopioneiro na aacuterea de evoluccedilatildeo de software para sistemas de grande escala Lehman e seuscolaboradores formularam um conjunto de observaccedilotildees que hoje satildeo conhecidas como asleis da evoluccedilatildeo de software ou simplesmente Leis de Lehman [16] No geral as leis deevoluccedilatildeo de software podem ser descritas da seguinte forma [16]

1 Mudanccedila contiacutenua um sistema se tornaraacute progressivamente menos satisfatoacuteriopara seus usuaacuterios com o tempo a menos que se adapte continuamente agraves necessi-dades que surgiratildeo

2 Complexidade Crescente um sistema se tornaraacute cada vez mais complexo amenos que se trabalhe para explicitamente reduzir sua complexidade

3 Auto-regulaccedilatildeo o processo de evoluccedilatildeo de software eacute auto-regulatoacuterio no que dizrespeito agraves distribuiccedilotildees dos artefatos e produtos produzidos

4 Conservaccedilatildeo da estabilidade organizacional a taxa meacutedia de atividade globalefetiva em um sistema em evoluccedilatildeo natildeo muda com o tempo ou seja a meacutedia detrabalho e esforccedilo colocado em cada entrega do sistema permanece a mesma

6

5 Conservaccedilatildeo de familiaridade a quantidade de conteuacutedo novo em cada entregado sistema tende a se manter constante com o tempo

6 Crescimento contiacutenuo A quantidade de funcionalidades em um sistema cresceraacutecom o tempo com o objetivo de satisfazer seus usuaacuterios

7 Decliacutenio de qualidade Um sistema seraacute percebido com qualidade inferior como passar do tempo a menos que seu design tenha uma manutenccedilatildeo minuciosa e seadapte a novas restriccedilotildees

8 Sistema de Feedback Evoluir um sistema com sucesso requer reconhecer que oprocesso de desenvolvimento acontece em um sistema de feedback de vaacuterios ciclosagentes e niacuteveis

Os aspectos teacutecnicos que envolvem a evoluccedilatildeo de software levam em consideraccedilatildeo astecnologias utilizadas para o seu desenvolvimento desde a linguagem de programaccedilatildeo agravesmaacutequinas onde o software seraacute hospedado que sofrem atualizaccedilotildees recebem novas versotildeescom novas caracteriacutesticas implementadas

Um estudo realizado por Lavre mostra como a evoluccedilatildeo das linguagens de programa-ccedilatildeo no contexto da evoluccedilatildeo de software muitas vezes satildeo subestimadas uma vez quemuitos podem considerar em seus estudos a linguagem de computaccedilatildeo como um artefatoimutaacutevel [8] Por exemplo coloca-se muita ecircnfase e cuidado para realizar o versionamentode coacutedigo fonte de um software mas este pode ser tornar inutilizaacutevel futuramente se nin-gueacutem souber qual versatildeo de compilador determinada versatildeo de coacutedigo foi desenvolvida

Para natildeo se deixar estagnar linguagens de programaccedilatildeo precisam se adaptar e evoluirQuando uma linguagem de programaccedilatildeo atualiza softwares que eram antes consideradosatualizados podem se tornar rapidamente obsoletos E ao mesmo tempo que novascaracteriacutesticas satildeo adicionadas a linguagem precisa fornecer compatibilidade com versotildeesanteriores aumentando sua complexidade Desenvolvedores entatildeo encontram-se tambeacutemem um empasse buscando um equiliacutebrio entre manter a compatibilidade da ferramentacom versotildees anteriores da linguagem e atualizaacute-la para manter o software atualizado [9]

A estrateacutegia de refatoraccedilatildeo de coacutedigo pode ser uma opccedilatildeo que permite a linguageme o software co-evoluiacuterem com um menor grau de dificuldade [9] Refatoraccedilatildeo (do inglecircsrefactoring) eacute o processo de modificaccedilatildeo de um software com o objetivo de melhorar a es-trutura interna do mesmo sem alterar sua percepccedilatildeo externa Eacute uma maneira disciplinadade melhorar o design do coacutedigo apoacutes ele jaacute ter sido implementado Por exemplo dividiruma funcionalidade grande feita em apenas um bloco de coacutedigo em vaacuterios moacutedulos [15]

A refatoraccedilatildeo de coacutedigo pode ser um meio utilizado para evoluir o software adaptandoo coacutedigo com caracteriacutesticas novas introduzidas pela linguagem modificando o design dosistema sem comprometer sua integridade No entanto novos desafios surgem visto que

7

refatorar o coacutedigo fonte de um sistema de grande porte natildeo eacute uma tarefa faacutecil havendo anecessidade de ferramentas que possam automatizar o processo ou realizar um estudo paraentender como as novas caracteriacutesticas da linguagem podem ser utilizadas para substituirou melhorar funcionalidades obsoletas [9]

22 MSR Mineraccedilatildeo de dados e a Engenharia deSoftware

Com o objetivo de compreender prever e planejar os vaacuterios aspectos do desenvolvimentode um projeto em especial tudo que possa impactar na evoluccedilatildeo de software a teacutecnicade mineraccedilatildeo de dados tem sido bastante utilizada em engenharia de software [17]

O termo Mineraccedilatildeo de Repositoacuterios de Software (MSR) tem sido utilizado para descre-ver vaacuterias maneiras de se examinar repositoacuterios de software Um repositoacuterio de softwarepode ser considerado um artefato que eacute produzido e arquivado durante a evoluccedilatildeo desoftware [1] Estes responsoacuterios armazenam informaccedilotildees que podem fornecer todos osdetalhes de desenvolvimento do software provendo meios necessaacuterios para uma anaacuteliseaprofundada de evoluccedilatildeo de software

Repositoacuterios de software satildeo comumente utilizados para armazenar e acompanhar ohistoacuterico de desenvolvimento do software mas raramente usados para tomada de deci-sotildees em relaccedilatildeo ao projeto Assim pesquisadores de MSR buscam modificar a impressatildeode que tais repositoacuterios satildeo estaacuteticos que servem apenas para manutenccedilatildeo de registrostransformando-os em repositoacuterios ativos que podem auxiliar na tomada de decisatildeo em pro-jetos de software modernos atraveacutes da identificaccedilatildeo de padrotildees para realizar a propagaccedilatildeode mudanccedilas [18]

221 Classificaccedilatildeo

De acordo com Kagdi et al dentre as abordagens de MSR utilizadas atualmente eacute possiacuteveldescrevecirc-las para entatildeo comparaacute-las e possivelmente classificaacute-las levando em considera-ccedilatildeo uma taxonomia de quatro dimensotildees os repositoacuterios de software utilizados (fontes dedados) o propoacutesito do MSR a metodologia e a avaliaccedilatildeo da abordagem [1] como mostraa Figura 21 onde as taxonomias destacadas em amarelo satildeo as que prevaleceram poreacutemnatildeo exclusivamente na metodologia adotada por este trabalho

8

Figura 21 Taxonomia em camadas adaptada do trabalho de Kagdi et al [1]

Fontes de Dados

As fontes de informaccedilatildeo variam de acordo com a abordagem utilizada e dentre as informa-ccedilotildees mineradas em repositoacuterios de software inclui-se as seguintes categorias os artefatosde software e suas versotildees as diferenccedilas entre os artefatos de software e suas versotildees e osmetadados sobre as mudanccedilas no software

As fontes de dados podem ser melhor classificadas de acordo com Hassan et al [17]

bull Repositoacuterios de controle de Versatildeo estes repositoacuterios guardam o histoacuterico de desen-volvimento de um projeto armazenando todas as mudanccedilas no coacutedigo fonte assimcomo os metadados associados com cada mudanccedila Exemplos git SVN

bull Bug repositories Estes repositoacuterios rastreiam o histoacuterico de resoluccedilatildeo de bugs quesatildeo reportados por usuaacuterios e desenvolvedores Exemplos Bugzilla e Jira

9

bull Histoacuterico de Comunicaccedilatildeo (Archived communications) estes repositoacuterios rastreiamdiscussotildees sobre os vaacuterios aspectos de um projeto de software por sua vida uacutetil Porexemplo listas de e-mails

bull Deployment logs logs com informaccedilotildees do software gerados por ferramentas dedesenvolvimento

bull Repositoacuterios de software Repositoacuterios onde o coacutedigo fonte de vaacuterios projetos satildeoarmazenados como por exemplo Sourceforgenet

No contexto deste trabalho estes repositoacuterios consistem em fontes de coacutedigo armaze-nadas em sistemas de controle de versatildeo especificamente coacutedigos na plataforma Github

O propoacutesito

O propoacutesito da mineraccedilatildeo de repositoacuterios de software se resume nas perguntas de pes-quisa que podem ser respondidas utilizando mineraccedilatildeo Assim existem duas classes deperguntas de pesquisa para MSR [1]

A primeira eacute a pergunta de anaacutelise market-basket1 ldquoSe A acontece o que mais podeacontecerrdquo A resposta para este tipo de pergunta eacute um conjunto de regras descrevendotendecircncias de relacionamentos como por exemplo se A acontecer entatildeo B e C acontecemdurante um periacuteodo X

A segunda classe diz respeito agraves perguntas de prevalecircncia (Prevalence Questions -PQ) como por exemplo perguntas do tipo ldquoA funcionalidade Y foi modificadardquo quepossuem uma resposta booleana ou ldquoQuantas vezes esta funcionalidade Y foi modificadardquocontendo uma resposta quantitativa

As perguntas de pesquisa deste trabalho se encaixam majoritariamente na segundaclasse onde o objetivo traccedilado eacute respondido de forma quantitativa com algumas tentativasde classificaccedilatildeo de tipos de repositoacuterios como seraacute descrito nos capiacutetulos seguintes

A metodologia

A metodologia corresponde a maneira como as questotildees de MSR iratildeo ser respondidas evaacuterias abordagens estatildeo disponiacuteveis Poreacutem Kagdi indica duas estrateacutegias baacutesicas quepodem ser utilizadas

Primeiramente pode-se utilizar a mediccedilatildeo indireta e anaacutelise da evoluccedilatildeo do softwareEsta abordagem pode ser realizada da seguinte forma extrair e computar informaccedilotildeesde cada versatildeo de um software separadamente e em seguida individualmente comparar

1Anaacutelise Market-basket eacute uma teacutecnica de modelagem baseada na teoria de que se vocecirc comprar certostipos de produtos vocecirc haacute uma probabilidade maior (ou menor) de comprar outros tipos de produtos [19]

10

propriedades encontradas como por exemplo comparar duas versotildees distintas de umsoftware atraveacutes de um repositoacuterio github realizando uma investigaccedilatildeo de alto niacutevel noque diz respeito a evoluccedilatildeo do software [1]

A segunda perspectiva de metodologia que pode ser utilizada corresponde agrave mediccedilatildeodireta e anaacutelise da evoluccedilatildeo do software Ela diz respeito agraves investigaccedilotildees que estudamos mecanismos que leva um software a ser modificado de uma versatildeo para outra focandonas diferenccedilas especiacuteficas entre estas versotildees como por exemplo examinando mudanccedilasespeciacuteficas das classes arquivos funccedilotildees de cada parte do coacutedigo [1]

Assim eacute possiacutevel descrever explicitamente que este trabalho utiliza em sua maioriauma metodologia com mediccedilotildees diretas atraveacutes da anaacutelise estaacutetica de informaccedilotildees docoacutedigo fonte de diferente versotildees para analisar os diferentes padrotildees de desenvolvimentoem que expressotildees lambda (definidas no capiacutetulo seguinte) satildeo utilizadas

A Avaliaccedilatildeo

Por fim existem diversas formas para se avaliar o estudo realizado sempre levando emconsideraccedilatildeo a validade dos resultados obtidos Pode-se utilizar de meacutetricas para avaliar osdados considerando o quanto das informaccedilotildees obtidas satildeo relevantes Outra forma de seavaliar seria atraveacutes da utilizaccedilatildeo de modelos probabiliacutesticos seguindo uma abordagemde teoria da informaccedilatildeo Assim foram utilizadas determinadas meacutetricas quantitativaspara avaliar os resultados obtidos neste trabalho

23 Trabalhos Relacionados

Como ressaltado na introduccedilatildeo o foco deste trabalho encontra-se em utilizar teacutecnicas deMSR para caracterizar a adoccedilatildeo de expressotildees lambda em repositoacuterios Java Ao reali-zar um estudo sobre o estado da arte encontrou-se diversos trabalhos que utilizam deMSR para obter informaccedilotildees relevantes sobre repositoacuterios de software em diversos focose em especial trabalhos que investiguem repositoacuterios na linguagem Java Jaacute existemtambeacutem alguns trabalhos que apresentam ferramentas de refatoraccedilatildeo de coacutedigo para im-plementaccedilatildeo de expressotildees lambda com foco na evoluccedilatildeo do software Dentre os trabalhosencontrados mencionados destacam-se

bull Em um trabalho sobre utilizaccedilatildeo de refatoraccedilatildeo de coacutedigo para realizar a transiccedilatildeode coacutedigo Java para as novas caracteriacutesticas implementadas no Java 8 Gyori et alapresenta uma ferramenta que automatiza com sucesso o trabalho de conversatildeo decoacutedigo como Annonymous Inner Class para expressotildees lambda [12] O capiacutetulo aseguir descreve em detalhes estes conceitos

11

bull Regrowing a Language de Overbey apresenta um estudo sobre a importacircncia da co-evoluccedilatildeo entre a linguagem de programaccedilatildeo e os projetos de software focando naslinguagens Fortran e Java e provando como ferramentas de refatoraccedilatildeo de coacutedigoauxiliam para que o software consiga evoluir juntamente com sua linguagem deprogramaccedilatildeo [9]

bull O trabalho sobre a adoccedilatildeo de generics em coacutedigo Java feito por Parnin utiliza demineraccedilatildeo de dados para realizar uma investigaccedilatildeo empiacuterica avaliando projetos decoacutedigo aberto com o objetivo de observar como desenvolvedores destes projetos estatildeoutilizando generics em Java [20]

Os estudos mencionados focam em assuntos particulares pertinentes a este trabalhoem que de um lado tem-se trabalhos que mostram a necessidade de refatoraccedilatildeo de coacutedigopara evoluccedilatildeo de software e do outro tem-se trabalhos que mostram que eacute possiacutevel utilizarde MSR para entender melhor como a evoluccedilatildeo da linguagem de programaccedilatildeo Java temafetado projetos reais de coacutedigo aberto e como estes projetos estatildeo se adaptando a estasevoluccedilotildees

12

Capiacutetulo 3

Java SE 8 e JDK 8

Este trabalho tem como objetivo caracterizar a adoccedilatildeo de expressotildees Lambda em siste-mas Java que podem ser considerados legados pois foram concebidos em um momentoanterior a introduccedilatildeo dessa nova caracteriacutestica na linguagem Java Com o intuito de faci-litar o entendimento do leitor sobre tais construccedilotildees esse capiacutetulo apresenta informaccedilotildeeshistoacutericas referentes agrave linguagem Java desde sua criaccedilatildeo ateacute a sua ascensatildeo como umadas linguagens de programaccedilatildeo mais populares Aleacutem disso seratildeo apresentadas as novascaracteriacutesticas presentes na versatildeo Java SE 8 com destaque nas expressotildees Lambda e deque forma vieram para auxiliar no desenvolvimento de sistemas

31 Histoacuterico

Java eacute uma linguagem de programaccedilatildeo orientada a objetos para propoacutesitos gerais [21] Alinguagem nasceu com o nome de Oak no ano de 1991 com o foco em televisotildees digitais acabo mas devido agrave complexidade e poder da linguagem logo expandiu-se para os outrosdomiacutenios principalmente a Internet [22] Posteriormente a linguagem recebeu o nome deGreentalk devido agrave marca Oak jaacute ser registrada por outra empresa e o principal projeto daequipe se chamar Green Por fim o nome Java foi o mais votado pela equipe da Sun emuma reuniatildeo para decidir o mais raacutepido possiacutevel um nome definitivo para a linguagem [23]

Em 1995 em sua primeira versatildeo puacuteblica 10 a linguagem Java jaacute comeccedilava a terum crescimento em sua popularidade como Web Applet nos navegadores mais popularesfornecendo seguranccedila e rapidez nas plataformas mais utilizadas [24] A cada nova versatildeopublicada novas funcionalidades e plataformas eram adicionadas e tornavam a linguagemmais difundida no meio computacional fazendo com que em 2006 a linguagem fosse divi-dida em Java EE (foco em rede e serviccedilos web) Java ME (foco em sistemas embarcados)e Java SE (foco em desktops e servidores) [25]

13

Apoacutes anos de evoluccedilatildeo e aprimoramento atraveacutes de diversas versotildees como visto naTabela 31 hoje o Java se tornou uma das linguagens de programaccedilatildeo mais utilizadas nomundo estando em aproximadamente 15 das linhas de coacutedigo disponiacuteveis pela inter-net [11] A quantidade de plataformas suportadas pela linguagem e com o advento dosistema operacional Android sendo rodado na maior parte dos smartphones do mundoaleacutem da simplicidade em codificar no paradigma orientado a objetos foram os fatoresrelevantes para que a linguagem se popularizasse no mundo digital [26]

Tabela 31 As versotildees anteriores de java e principais caracteriacutesticasVersatildeo Principais caracteriacutesticasJava 10 JVM e JDKJava 2 Event Listeners

Kestrel (Java 3) HotSpot JVMMerlin (Java 4) Diversas novas APIs como Assertion e expressotildees regularesTiger (Java 5) Generics

Mustang (Java 6) Web ServicesDolphin (Java 7) Suporte a linguagens dinamicas

32 Princiacutepios

Com o foco em alcanccedilar a Web e participar mais ativamente do mercado virtual e e-Commerce foram projetados princiacutepios que permitissem com que a linguagem pudessealcanccedilar seus objetivos principais ao mesmo tempo que mantinha a facilidade e fami-liarizaccedilatildeo da linguagem a seus desenvolvedores [27] Dessa forma a equipe da Oracledeterminou cinco princiacutepios que caracterizariam o foco da linguagem Java

bull simples orientada a objeto e familiar projetada para ser orientada a objeto epermitir que seus desenvolvedores comecem a codificar rapidamente sem a necessi-dade de uma curva de aprendizagem acentuada

bull segura e robusta projetada para prover software confiaacutevel por meio de checagensa tempo de compilaccedilatildeo e execuccedilatildeo Haacute uma grande preocupaccedilatildeo com seguranccediladevido agrave larga utilizaccedilatildeo da linguagem em sistemas distribuiacutedos

bull de arquitetura neutra e portaacutevel projetada para ser independente de qualquerarquitetura bastando rodar a JVM dessa forma garantindo a portabilidade paravaacuterios ambientes e dispositivos

14

bull executada em alta performance projetada para fornecer a maior performancepossiacutevel em tempo de execuccedilatildeo com a utilizaccedilatildeo do garbage collector em uma threadde baixa prioridade

bull interpretada dinacircmica e threaded projetada para ser interpretada por qual-quer dispositivo que possua JVM desenvolvida garantindo um desenvolvimento raacute-pido e em ciclos O uso da classe Thread permite que a linguagem acompanhe atendecircncia do paralelismo Aleacutem disso a ligaccedilatildeo de classes eacute feita em tempo real esomente quando necessaacuteria tornando-a dinacircmica

33 Evoluccedilatildeo

A primeira versatildeo do Java 8 foi lanccedilada em 2014 [28] e apresentou diversas atualizaccedilotildeesespalhadas em categorias como linguagem seguranccedila Collections ferramentas deployentre outras Dentre a grande quantidade de mudanccedilas os destaques se encontraram nasnovas melhorias presentes na linguagem que afetaram de forma mais direta a maneiracom que os desenvolvedores passaram a tratar e organizar o coacutedigo fonte As atualizaccedilotildeesreferentes a linguagem descritas oficialmente pela Oracle [29] satildeo

1 Lambda Expressions ou apenas Expressotildees Lambda correspondem a uma novacaracteriacutestica que permite que uma pequena funcionalidade possa ser utilizada comoum argumento de um meacutetodo facilitando a escrita de accedilotildees que seratildeo feitas repetida-mente em uma Collection ou quando um processo se completa ou quando encontraum erro Eacute tambeacutem uma forma compacta de se escrever coacutedigo que previamenteera escrito com anonymous inner classes [29] A Listagem 31 mostra uma classehipoteacutetica Calculator cujo meacutetodo operateBinary() recebe como paracircmetro doisinteiros e um objeto da classe IntegerMath que representa a operaccedilatildeo que deveraacuteser realizada ou seja uma funcionalidade dinacircmica

1 pub l i c c l a s s Ca l cu la to r 2

3 i n t e r f a c e IntegerMath 4 i n t opera t i on ( i n t a i n t b) 5 6

7 pub l i c i n t operateBinary ( i n t a i n t b IntegerMath op ) 8 re turn op opera t i on (a b) 9

10

11 pub l i c s t a t i c void main ( St r ing a rgs ) 12

15

13 Calcu la to r myApp = new Ca lcu la to r ( ) 14 IntegerMath add i t i on = (a b) minusgt a + b 15 IntegerMath subt ra c t i on = (a b) minusgt a minus b 16 System out p r i n t l n ( 40 + 2 = +17 myApp operateBinary (40 2 add i t i on ) ) 18 System out p r i n t l n ( 20 minus 10 = +19 myApp operateBinary (20 10 sub t ra c t i on ) ) 20 21 22

Listagem 31 Exemplo de coacutedigo com o uso de Expressatildeo Lambda [30]

2 Method References Frequentemente expressotildees lambda criam meacutetodos anocircni-mos Algumas vezes poreacutem satildeo utilizadas para chamar um meacutetodo jaacute existentena classe Ao inveacutes de escrever a expressatildeo Lambda para esse caso pode-se optarpor utilizar um Method Reference que facilita a escrita e leitura desse uso de ex-pressatildeo Lambda [29] A Listagem 32 mostra um exemplo de um meacutetodo estaacuteticoque compara duas pessoas pelas suas idades e a Listagem 33 a utilizaccedilatildeo de MethodReference para aplicar a utilizaccedilatildeo desse meacutetodo em um array e reduzir a escrita deuma expressatildeo lambda a uma forma mais legiacutevel

1 pub l i c s t a t i c i n t compareByAge ( Person a Person b) 2 re turn a b i r thday compareTo (b b i r thday ) 3 4

Listagem 32 Exemplo de meacutetodo de uma classe Pessoa [31]

1 Arrays s o r t ( rosterAsArray Person compareByAge ) 2

Listagem 33 Exemplo de uso de Method Reference [31]

3 Default Methods satildeo meacutetodos com a palavra-chave default que servem para adi-cionar implementaccedilotildees de meacutetodos a uma interface de alguma biblioteca mantendoa compatibilidade binaacuteria com versotildees mais antigas dessa interface Tambeacutem pos-sibilita a implementaccedilatildeo de meacutetodos estaacuteticos em interfaces [29] A Listagem 34apresenta a inclusatildeo de um meacutetodo default na interface TimeClient

1 pub l i c i n t e r f a c e TimeClient 2 void setTime ( i n t hour i n t minute i n t second ) 3 void setDate ( i n t day i n t month i n t year ) 4 void setDateAndTime ( i n t day i n t month i n t year 5 i n t hour i n t minute i n t second )

16

6 LocalDateTime getLocalDateTime ( ) 7

8 s t a t i c ZoneId getZoneId ( S t r ing zoneStr ing ) 9 t ry

10 re turn ZoneId o f ( zoneStr ing ) 11 catch ( DateTimeException e ) 12 System e r r p r i n t l n ( I n v a l i d time zone + zoneStr ing

+13 us ing d e f a u l t time zone in s t ead ) 14 re turn ZoneId systemDefault ( ) 15 16 17

18 d e f a u l t ZonedDateTime getZonedDateTime ( St r ing zoneStr ing ) 19 re turn ZonedDateTime o f ( getLocalDateTime ( ) getZoneId (

zoneStr ing ) ) 20 21 22

Listagem 34 Exemplo de interface com um meacutetodo default [32]

4 Repeating Annotations permitem a implementaccedilatildeo e utilizaccedilatildeo de anotaccedilotildees deum mesmo tipo que podem ser utilizadas mais de uma vez para a mesma declara-ccedilatildeo [29] A Listagem 35 apresenta duas anotaccedilotildees iguais com paracircmetros diferentespermitindo uma customizaccedilatildeo maior na aplicaccedilatildeo de um tipo de anotaccedilatildeo

1 Schedule ( dayOfMonth= l a s t )2 Schedule (dayOfWeek= Fr i hour= 23 )3 pub l i c void doPeriodicCleanup ( ) 4

Listagem 35 Exemplo de Repeating Annotations [33]

5 Type Annotations permitem que anotaccedilotildees possam ser utilizadas em tipos aleacutemde declaraccedilotildees dessa forma pode-se garantir que um campo sempre atenda agraves suasexpectativas e evite testes desnecessaacuterios [29] A Listagem 36 mostra um exemplo derestriccedilatildeo a uma String que nunca poderaacute ser nula devido agrave anotaccedilatildeo de NonNull

1 NonNull S t r ing s t r

Listagem 36 Exemplo de Type Annotation garantindo que o campo nunca seja null [34]

17

34 Expressotildees Lambda

Uma das mudanccedilas mais interessantes implementadas no Java 8 foi a adiccedilatildeo de expressotildeeslambda As expressotildees lambda permitem que a linguagem Java possa atuar parcialmentecomo uma linguagem de programaccedilatildeo funcional onde comportamentos satildeo avaliados eaplicados diferentemente da programaccedilatildeo imperativa que foca na mudanccedila de estadosNa praacutetica um comportamento pode ser passado como paracircmetro de um meacutetodo atraveacutesde uma escrita mais reduzida e legiacutevel Os benefiacutecios de utilizar expressotildees lambda incluemuma melhora na legibilidade e organizaccedilatildeo de coacutedigo que antes era escrito com AnonymousInner Class aleacutem de permitir uma forma simples de utilizar comportamento paralelo como uso de Streams

341 Sintaxe

A sintaxe de uma expressatildeo lambda eacute dividida nas seguintes partes [30]

bull Uma lista de paracircmetros separados por viacutergulas

bull Um token representado por uma seta -gt

bull Um corpo que pode ser representado por uma expressatildeo uacutenica ou um bloco de coacutedigodentro de chaves

As Listagens 37 e 38 mostram duas formas diferentes de se aplicar expressotildees Lambdacom uma sintaxe similar A primeira aplica a expressatildeo diretamente apoacutes a seta utilizadanormalmente para trechos de coacutedigo pequenos e simples e a segunda utiliza-se de chavespara incorporar o coacutedigo e da palavra-chave return para especificar o retorno forma maisutilizada para uma quantidade maior de coacutedigo

1 p minusgt p getGender ( ) == Person Sex MALE2 ampamp p getAge ( ) gt= 183 ampamp p getAge ( ) lt= 25

Listagem 37 Exemplo de expressatildeo lambda com uma expressatildeo [30]

1 p minusgt 2 re turn p getGender ( ) == Person Sex MALE3 ampamp p getAge ( ) gt= 184 ampamp p getAge ( ) lt= 25 5

Listagem 38 Exemplo de expressatildeo lambda com um bloco de coacutedigo [30]

18

342 Principais formas de uso

Anonymous Inner Class

Antes do Java 8 a necessidade de passar funccedilotildees ou expressotildees como paracircmetro de algummeacutetodo era suprida atraveacutes de Anonymous Inner Classes A utilizaccedilatildeo desse tipo dedeclaraccedilatildeo junto com a anotaccedilatildeo de Override permite sobrescrever um meacutetodo de umainterface funcional e ao mesmo tempo passa-la como argumento para um meacutetodo Umaexpressatildeo lambda se comporta da mesma forma poreacutem a quantidade de coacutedigo escritopela Anonymous Inner Class eacute maior e pode dificultar a leitura de coacutedigo pois conteacutemmuita informaccedilatildeo natildeo utilizada para efetivo entendimento do que estaacute sendo feito naqueletrecho

A Listagem 39 apresenta a instanciaccedilatildeo da classe EventHandler internamente ao meacute-todo setOnAction() de forma que o desenvolvedor possa escrever o comportamento quedeseja passar como paracircmetro do meacutetodo atraveacutes da substituiccedilatildeo do meacutetodo handle()que jaacute existe pelo meacutetodo handle() criado e escrito pelo desenvolvedor

1 btn setOnAction (new EventHandlerltActionEvent gt() 2 Override3 pub l i c void handle ( ActionEvent event ) 4 System out p r i n t l n ( He l lo World ) 5 6 )

Listagem 39 Exemplo de uso de Anonymous Inner Class [35]

Interface funcional

Ao projetar um coacutedigo novo o desenvolvedor que optar por utilizar expressotildees lambdadeve iniciar com a criaccedilatildeo de uma interface funcional Esse tipo de interface possui umuacutenico meacutetodo abstrato permitindo que expressotildees lambda sejam usadas para sobrescrevero comportamento do meacutetodo abstrato Uma interface funcional pode possuir outros meacuteto-dos desde que sejam default Uma nova anotaccedilatildeo FunctionalInterface foi adicionadacom a atualizaccedilatildeo do Java 8 para conferir em tempo de compilaccedilatildeo se a interface satisfazos requisitos desse modelo de interface

A Listagem 310 apresenta um exemplo de interface funcional com o objetivo de permi-tir o uso de expressotildees lambda que utilizaratildeo de dois Double como paracircmetro e jaacute utilizada nova anotaccedilatildeo FunctionalInterface introduzida no Java 8

1 Funct iona l Inte r face2 pub l i c i n t e r f a c e DoubleOp 3 pub l i c Double apply ( Double a Double b)

19

4

Listagem 310 Exemplo de interface funcional

Dessa forma conforme as Listagens 311 e 312 o meacutetodo apply() pode tomar formade qualquer operaccedilatildeo entre dois Double que seraacute especificada quando a expressatildeo lambdafor montada dando o aspecto de linguagem funcional agrave linguagem e mais facilidade eliberdade ao desenvolvedor

1 pub l i c c l a s s Ca l cu la to r 2 pub l i c s t a t i c Double c a l c ( Double op1 Double op2 DoubleOp operator ) 3 re turn operator apply ( op1 op2 ) 4 5

Listagem 311 Exemplo de aplicaccedilatildeo da interface funcional

1 Double r e s u l t 1 = Ca lcu la to r c a l c (10d 50d ( a b ) minusgt a + b)

Listagem 312 Uso de expressatildeo lambda para o exemplo anterior

Collections

Dentre as atualizaccedilotildees de pacotes do Java 8 foi adicionado um meacutetodo stream() nainterface Collection Esse meacutetodo trata as Collection como streams o que significa queapesar de natildeo ser possiacutevel acessar elementos diretamente algumas novas manipulaccedilotildeessatildeo possiacuteveis Essas manipulaccedilotildees satildeo na verdade meacutetodos da interface Stream quepodem receber como paracircmetro uma expressatildeo lambda ou seja um comportamento a seraplicado agrave Collection Dentre os meacutetodos temos

bull filter() O meacutetodo filter() recebe uma expressatildeo lambda contendo uma condiccedilatildeopara filtragem da collection

bull map() O meacutetodo map() mapeia os elementos de uma Collection em outro objetocomo uma String A expressatildeo lambda passada por paracircmetro deve retornar o tipode objeto ao qual seraacute mapeado

bull forEach() O meacutetodo forEach() aplica uma operaccedilatildeo especiacutefica para cada ele-mento da Collection A expressatildeo lambda a ser passada deve conter a operaccedilatildeo aser realizada

bull min() e max() Os meacutetodos min() e max() retornam o elemento menor ou maiorda Collection dependendo da expressatildeo lambda passada como paracircmetro

20

A Listagem 313 demonstra como vaacuterias operaccedilotildees com uma Collection podem seraplicadas de uma vez de forma que lendo a expressatildeo lambda jaacute eacute possiacutevel saber oresultado da aplicaccedilatildeo do meacutetodo agrave Collection

1 r o s t e r2 stream ( )3 f i l t e r (4 p minusgt p getGender ( ) == Person Sex MALE5 ampamp p getAge ( ) gt= 186 ampamp p getAge ( ) lt= 25)7 map(p minusgt p getEmailAddress ( ) )8 forEach ( emai l minusgt System out p r i n t l n ( emai l ) )

Listagem 313 Exemplo de utilizaccedilatildeo de meacutetodos de stream com expressotildees lambda [30]

21

Capiacutetulo 4

Estudo e o Processo de Mineraccedilatildeo

A definiccedilatildeo da metodologia utilizada para realizaccedilatildeo deste trabalho eacute importante para queexista uma padronizaccedilatildeo e melhor entendimento de como os resultados foram obtidos paraque a replicaccedilatildeo do mesmo possa ser realizada em trabalhos futuros [36]

Figura 41 Processo utilizado para realizaccedilatildeo do estudo

O esquema representado na Figura 41 descreve o processo seguido para a realizaccedilatildeodeste trabalho que foi divido em trecircs grandes etapas a de planejamento definindo osobjetivos questotildees de pesquisa e meios de investigaccedilatildeo deste projeto a etapa de execuccedilatildeorealizando todo o procedimento metodoloacutegico definido para a coleta e refinamento de

22

dados e a etapa de avaliaccedilatildeo onde foram classificados e avaliados os dados coletadospara responder agraves questotildees de pesquisa

A seguir na primeira seccedilatildeo seratildeo apresentadas em detalhes as questotildees de pesquisa aserem respondidas Em seguida seraacute feito uma breve descriccedilatildeo da fonte de dados utilizada- especificamente os projetos utilizados como objetos de estudo deste trabalho e por fimtodo o restante da metodologia que foi de fato desenvolvida para obter os resultadosnecessaacuterios

41 Questotildees de Pesquisa

Com o objetivo de entender e caracterizar melhor o uso de expressotildees lambda foramdefinidas as seguintes questotildees de pesquisa a serem respondidas

bull PQ-1 Quando os projetos comeccedilaram a introduzir o uso de expressotildees lambda emseus coacutedigos e qual a meacutedia de expressotildees lambda por snapshots caso existam

bull PQ-2 Como as equipes de desenvolvimento estatildeo utilizando expressotildees lambdaatraveacutes de refatoraccedilatildeo de coacutedigo ou introduzindo apenas em coacutedigo novo

bull PQ-3 Quais satildeo os padrotildees tipicamente adotados para o uso de expressotildees lambda

A primeira pergunta de pesquisa gira em torno de como projetos populares open-sourceestatildeo se adaptando agrave introduccedilatildeo de expressotildees lambda em Java muitos projetos jaacute estatildeoutilizando as expressotildees lambda Se sim a partir de quando comeccedilaram a utilizaacute-lasdesde o iniacutecio da introduccedilatildeo das mesmas no Java 8 ou em um periacuteodo mais tardio Aleacutemdisso eacute interessante descobrir se a utilizaccedilatildeo dessa nova caracteriacutestica tem acontecido deforma expressiva ou natildeo

Em seguida para melhor entender a forma como as expressotildees lambda estatildeo sendointroduzidas em projetos eacute interessante investigar se as equipes de desenvolvimento estatildeose preocupando em refatorar coacutedigo com o objetivo de evoluir o software ou se estatildeoexperimentando utilizar expressotildees lambda apenas em coacutedigo novo introduzido

Como a introduccedilatildeo de novas funcionalidades em projetos open-source de grande escaladepende do objetivo do projeto e os padrotildees de projeto utilizados [37] espera-se obser-var diversas abordagens quanto a utilizaccedilatildeo de expressotildees lambda para entatildeo poderclassificar estes softwares quanto a abordagem utilizada

Eacute de grande importacircncia para este estudo conseguir identificar na praacutetica comoexpressotildees lambda estatildeo sendo tipicamente adotadas nestes projetos Assim a terceirapergunta de pesquisa busca identificar alguns exemplos de utilizaccedilatildeo atraveacutes da realizaccedilatildeode alguns estudos de caso

23

Eacute importante ressaltar que apesar de as expressotildees lambda serem uma alternativa aouso de AIC elas natildeo os substituem completamente Existem precondiccedilotildees para que umaAIC possa ser substituiacuteda por expressotildees lambda [12] descritas a seguir

bull AIC deve instanciar-se de uma interface

bull AIC natildeo deve possuir nenhum campo e declarar apenas um meacutetodo

bull AIC natildeo deve possuir uma referecircncia para this ou super

bull AIC natildeo deve declarar um meacutetodo recursivo

Para responder agrave primeira pergunta apenas dados gerais sobre todos os projetos seratildeonecessaacuterios ao passo que pelas perguntas 2 e 3 possuiacuterem uma natureza mais complexaseraacute necessaacuterio aleacutem de uma anaacutelise geral estatiacutestica a realizaccedilatildeo de alguns estudos decaso para obter resultados mais completos

42 Fonte de Dados e Objetos de Estudo

Para responder agraves perguntas de pesquisa estabelecidas foram selecionados os 99 projetosmais populares na linguagem Java dentro da plataforma github ateacute a data da coleta dosdados feita em Abril de 2017 Satildeo considerados populares os repositoacuterios que possuema maior quantidade possiacutevel de estrelas (stars) A decisatildeo de escolher os 99 projetos maispopulares foi por sua natureza imparcial e ao mesmo tempo para que se possa analisarprojetos que satildeo de familiaridade e conhecimento da comunidade do github e de domiacuteniopuacuteblico Os 99 projetos estatildeo listados no Anexo I

Para entender a transiccedilatildeo feita por esses projetos entre as versotildees anteriores do Java eo Java 8 com as expressotildees lambda eacute necessaacuterio analisar o coacutedigo de vaacuterias versotildees a fimde observar alguma mudanccedila para cada projeto Como satildeo 99 projetos e vaacuterios dessesprojetos possuem milhares de linhas de coacutedigo e commits seria impossiacutevel avaliar todosos commits Optou-se entatildeo por coletar snapshots mensais de cada projeto conformeprocedimento tambeacutem seguido anteriormente [38] Cada snapshots representa o estadodo projeto em um determinado mecircs e como criteacuterio de escolha padratildeo todos os snapshotsequivalem ao uacuteltimo commit realizado no determinado mecircs que este representa

O proacuteximo passo eacute determinar o periacuteodo de tempo em que esses snapshots seriamcoletados Como Java 8 (e consequentemente as expressotildees lambda) foi introduzidoapenas em meados de 2014 [28] coletar dados de projetos a partir de um periacuteodo muitoantes deste ano natildeo agregaria valor ao estudo em questatildeo Definiu-se entatildeo um periacuteodopara a coleta mensal desses snapshots atraveacutes dos anos Janeiro de 2013 um ano antesda introduccedilatildeo do Java 8 para que se pudesse identificar para todos os projetos o mecircs

24

exato em que expressotildees lambda foram introduzidas ateacute o mecircs da coleta de dados Abrilde 2017

Eacute importante ressaltar que a definiccedilatildeo dos meses foi definida do dia primeiro de ummecircs ao dia primeiro do proacuteximo mecircs e por consequecircncia alguns snapshots que deveriamrepresentar o final de determinado mecircs correspondem na verdade a commits realizadosno dia primeiro do mecircs seguinte Por exemplo pode existir casos em que o commit querepresente o mecircs de Marccedilo de 2016 seja na verdade o commit realizado no dia primeirode Abril de 2016 Isso se deve a natureza da forma como os resultados de log de commitssatildeo obtidos pelo git [39] Poreacutem isso natildeo interfere nas anaacutelises ou no propoacutesito destetrabalho uma vez que foram realizadas verificaccedilotildees e validaccedilotildees para que natildeo existamdatas repetidas (e consequentemente commits repetidos) por repositoacuterio

Neste trabalho o termo projeto e repositoacuterio foram utilizados de forma intercaladapara representar a mesma coisa o software desenvolvido que possui um repositoacuterio naplataforma github Os termos commit snapshops e versotildees tambeacutem representam a mesmacoisa uma vez que foi definido que seriam utilizados apenas um commit por mecircs pararepresentar um determinado snapshot ou versatildeo do repositoacuterio em questatildeo

Todos os 99 projetos seratildeo utilizados para a realizaccedilatildeo de uma anaacutelise geral de ca-racterizaccedilatildeo do uso de expressotildees lambda Para as anaacutelises aprofundadas foi feito umcriteacuterio de classificaccedilatildeo para que apenas alguns projetos possam ser analisados em niacutevelde coacutedigo como estudos de caso

Resumindo foram escolhidos os 99 projetos mais populares de Java no github cole-tando dados mensais de seus commits a partir do ano de 2013 ateacute a data da coleta dosdados lembrando que nem todos os projetos existem desde 2013 (projetos mais recentes)

43 Processo de Mineraccedilatildeo

A abordagem utilizada para coletar e analisar os 99 projetos escolhidos como mostra aFigura 42 foi realizada de forma automatizada utilizando scripts python e dois projetosdesenvolvidos em Java para a coleta e tratamento de dados como descrito a seguir

Primeiramente foi realizado uma coacutepia dos repositoacuterios atuais de todos os 99 projetosmais populares do github em Java Para automatizar o processo foi desenvolvido umscript em python que lista todos os projetos escolhidos clona todos os repositoacuterios emuma pasta na maacutequina local e cria um arquivo temporaacuterio com as informaccedilotildees do nomede cada repositoacuterio e seu caminho absoluto na maacutequina local

25

Figura 42 Metodologia implementada para coleta e tratamento de dados

Em seguida foi necessaacuterio realizar o checkout de todas as versotildees entre Janeiro de2013 a Abril de 2017 de cada projeto Por motivos de otimizaccedilatildeo de espaccedilo da maacutequinalocal e automatizaccedilatildeo no processo de checkout utilizou-se de um segundo script pythonque realizava as seguintes tarefas para cada mecircs em cada projeto verificar se dentreo mecircs estipulado houve algum commit para aquele projeto se sim pega-se o hash douacuteltimo commit do mecircs realiza o checkout conta-se a quantidade de linhas de coacutedigo emJava que o projeto tem utilizando a biblioteca cloc e armazena todas as informaccedilotildeespertinentes referentes a todos os projetos que naquele mecircs tiveram commits para que oprojeto static-analysis possa entatildeo ser executado sobre esses projetos naquele determinadomomento As informaccedilotildees coletadas que satildeo utilizadas pelo static-analysis correspondemao nome do projeto o hash do commit para aquela versatildeo a pasta onde o projeto estaacutearmazenado na maacutequina local a quantidade de linhas de coacutedigo Java do projeto e datareferente ao commit Essas informaccedilotildees satildeo pertinentes para que o projeto static-analysisconsiga funcionar de forma correta projeto este descrito em detalhes a seguir

431 static-analysis

O static-analysis foi um projeto desenvolvido anteriormente a este trabalho pelos alunosThiago Cavalcanti e Vinicius de Almeida cujo objetivo eacute realizar a anaacutelise estaacutetica de

26

coacutedigos-fonte Java e gerar arquivos de saiacuteda contendo informaccedilotildees de classes e meacutetodoscom suas devidas ocorrecircncias de caracteriacutesticas da linguagem [40]

A anaacutelise estaacutetica de coacutedigo consiste em analisar um coacutedigo-fonte sem a necessidadede executaacute-lo Esse tipo de anaacutelise eacute de extrema importacircncia para manter um coacutedigo dequalidade evitar futuras refatoraccedilotildees e obter informaccedilotildees estatiacutesticas de forma raacutepida epraacutetica [41]

Seguindo esse princiacutepio o static-analysis foi projetado para receber um arquivo deentrada csv seguindo o padratildeo

Tipo da Aplicaccedilatildeo Inicio do projeto Antes ou Apoacutes Java 5 Nome do ProjetoVersatildeo Caminho absolutoQuantidade de linhas de coacutedigo

Atraveacutes da informaccedilatildeo do caminho absoluto do projeto o static-analysis varre osdiretoacuterios em busca dos arquivos fonte java realiza o parse desses arquivos e utilizade Visitors para extrair as informaccedilotildees desejadas e exporta-las em arquivos csv Ouso de Visitors permite que sejam escolhidas as informaccedilotildees desejadas para a consultacomo expressotildees Lambda e AIC s aleacutem de possibilitar que sejam implementados novosVisitors conforme a linguagem evolua ou as necessidades mudem

Para este trabalho foram utilizados os Visitors de expressotildees Lambda map() filter()AICs e declaraccedilotildees de meacutetodos

432 BDAnalisador

Apoacutes obter todas as informaccedilotildees necessaacuterias geradas pelo static-analysis era preciso ma-nipular os dados de forma que facilitasse a coleta de dados para o estudo proposto Comovaacuterios arquivos em formato csv satildeo de difiacutecil manipulaccedilatildeo foi desenvolvido entatildeo umaferramenta chamada BDAnalisador Esta ferramenta eacute responsaacutevel por processar os arqui-vos em csv gerados pelo static-analysis e popular uma base de dados relacional MySQLcom as informaccedilotildees pertinentes a este estudo

O BDAnalisador foi desenvolvido com a intenccedilatildeo de tornar mais simples o trabalhocom os dados resultantes do static-analysis de forma que consultas em SQL pudessemser feitas a ponto de permitir a obtenccedilatildeo de resultados mais complexos Seguindo esseobjetivo o framework Hibernate foi escolhido como ferramenta para persistecircncia devidoa ser um framework jaacute consolidado no mercado e que de forma simples relaciona osobjetos Java ao banco de dados MySQL [42] A divisatildeo de classes foi projetada em quatroentidades Projeto Versao Classe e Metodo cada uma com seus respectivos camposcontendo as informaccedilotildees necessaacuterias para a pesquisa como pode ser visto na Figura 44Eacute importante ressaltar que a tabela de Versao guarda hashs de commits devido agrave escolhade utilizar commits para obter mais informaccedilatildeo de evoluccedilatildeo de coacutedigo em um menor

27

espaccedilo de tempo Aleacutem disso para este trabalho optou-se por persistir todos os meacutetodose classes de cada versatildeo sem se importar com a repeticcedilatildeo desses dados pois a hipoacutetesede haver grandes refatoraccedilotildees entre versotildees poderia comprometer a confiabilidade dasinformaccedilotildees

Figura 43 Diagrama de classes UML do BDAnalisador

Como visto na Figura 43 seguindo parcialmente a arquitetura MVC cada entidadepossui sua respectiva classe DAO(Data Access Object) para persistecircncia dos dados eapenas uma classe Controlador no projeto responsaacutevel pela manipulaccedilatildeo e parse dosdados dos arquivos csv gerados pelo static analysis para serem enviados agraves classes DAOO sistema inicia chamando o meacutetodo inicializar() da classe Controlador Esse meacutetodoeacute responsaacutevel por ler um arquivo de entrada csv que segue o mesmo modelo do arquivo dostatic-analysis citado na seccedilatildeo anterior O arquivo conteacutem os dados de todos os projetose suas respectivas versotildees dessa forma o meacutetodo instancia um objeto da classe Projetoe persiste o projeto no banco de dados Para cada versatildeo encontrada no arquivo deentrada o inicializar() aciona os meacutetodos responsaacuteveis por instanciar e preencher aslistas da classe Classe e Metodo Os meacutetodos responsaacuteveis por preencher as listas varremos arquivos csv gerados pelo static-analysis e fazem o parse das informaccedilotildees relevantescomo nomes dos meacutetodos e quantidades de lambdas para construir os objetos que seratildeogravados Ao final dos preenchimentos o objeto Versatildeo eacute instanciado e gravado no bancode dados atraveacutes de sua classe DAO ao mesmo tempo que grava suas respectivas Classese Metodos

28

Apoacutes vaacuterios testes e correccedilotildees de bugs o banco de dados se encontrava finalmente comas informaccedilotildees de 99 projetos Java open-source separados por um commit por mecircs desde2013 cada um com suas respectivas informaccedilotildees de classes meacutetodos e a quantidade deexpressotildees lambda filters e maps em cada meacutetodo Filter ou Filter pattern eacute o padratildeode projeto que tem como objetivo filtrar objetos de uma coleccedilatildeo (Collection) de acordocom algum criteacuterio Jaacute o map ou map pattern eacute um padratildeo que ldquomapeia os elementosde uma coleccedilatildeo aplicando uma funccedilatildeo a eles para uma nova coleccedilatildeo [43] A coleta deinformaccedilotildees sobre esses padrotildees podem ser uacuteteis para possiacuteveis anaacutelises de oportunidadesde uso de expressotildees lambda para refatoraccedilatildeo de coacutedigo

A Figura 44 mostra o esquema de como o banco de dados resultante foi gerado

Figura 44 Modelo relacional do banco de dados populado pelo BDAnalisador Imagemgerada com software DBeaver [2]

44 Classificaccedilatildeo e Anaacutelise

Com o banco de dados populado restam apenas as etapas de classificaccedilatildeo e anaacutelise pararesponder as questotildees de pesquisa propostas Para isso inicialmente houve uma tentativade se utilizar apenas queries SQL para analisar os dados de acordo com as informaccedilotildeesrelevantes Poreacutem devido ao fato de o banco de dados conter todas as informaccedilotildees detodos os projetos e todas as suas versotildees queries que possuem uma alta complexidadedemoravam muito tempo para retornar os dados

Assim com o objetivo de facilitar o trabalho alguns scripts python foram desenvolvi-dos para rodar as queries separadamente e individualmente para cada projeto de formaautomatizada a fim de melhorar o tempo de resposta para obtenccedilatildeo dos resultados

29

441 Meacutedia de Lambda

O primeiro script retorna a quantidade de expressotildees lambda (ou AICs) por n snapshotsque contenha expressotildees lambda O objetivo eacute ter uma visatildeo geral da meacutedia de expressotildeeslambda e AICs utilizadas por cada projeto e como nem todos os snapshots coletados decada projeto possuem expressotildees lambda e AICs apenas aqueles com alguma expressatildeolambda ou AIC satildeo incluiacutedos no caacutelculo da meacutedia

Mmedia =sumn qtdLambdai

n

442 Anaacutelise Temporal

O segundo script retorna para cada projeto a soma total da quantidade de expressotildeeslambda AIC map() e filter() no projeto inteiro para cada versatildeo Ou seja tem-seo total de cada uma das quatro propriedades selecionadas para cada mecircs do projetoobtendo assim uma visatildeo temporal de evoluccedilatildeo do uso das caracteriacutesticas descritas ATabela 41 ilustra parcialmente o resultado obtido para o projeto agera onde idVersaoeacute o identificador no banco de dados referente ao hash do commit mensal coletado qtd eacutea quantidade de cada uma das caracteriacutesticas escolhidas e a data do commit encontra-seno formato americano

Tabela 41 Informaccedilotildees mensais sobre o projeto ageraidVersao Data do Commit qtd lambda qtd AIC qtd maps qtd filter

823 512016 0 29 4 0755 612016 13 28 4 0686 6152016 13 29 4 0621 812016 13 29 4 0555 8162016 13 30 4 0485 922016 13 30 4 0422 10132016 14 30 4 0356 11282016 14 30 4 0295 12212016 21 30 5 0232 212017 21 30 5 0175 312017 21 30 5 0112 3312017 21 36 5 048 4242017 21 48 5 0

Os resultados obtidos com esta anaacutelise temporal permitiu a identificaccedilatildeo de padrotildees nautilizaccedilatildeo de expressotildees lambda em relaccedilatildeo a utilizaccedilatildeo de AIC por todos os projetos Foi

30

possiacutevel classificar todos os projetos em 6 grupos ilustrado na Figura 45 Primeiramenteseparou-se os projetos entre os que possuem expressotildees lambda e os que natildeo possuemDentre os que possuem identificou-se cinco categorias

1 Grupo 1 Quantidade de AICs e expressotildees lambda aumentam com o tempo pro-porcionalmente

2 Grupo 2 Quantidade de AICs diminui agrave medida que a quantidade de expressotildeeslambda aumentam e a quantidade de expressotildees lambda ultrapassa a quantidade deAIC em um determinado momento

3 Grupo 3 Quantidade de AICs diminui agrave medida que a quantidade de expressotildeeslambda aumentam mas a quantidade de AIC permanece superior agrave quantidade delambda

4 Grupo 4 Expressotildees lambda satildeo introduzidas e existem por um pequeno periacuteodode tempo mas satildeo completamente removidas posteriormente

5 Grupo 5 Quantidade de expressotildees lambda eacute constante e muito inferior compa-rado com a quantidade de AICs no projeto Foi determinado que para pertencera esta classificaccedilatildeo o projeto precisa ter uma razatildeo de meacutedia de expressotildees lamb-dasnapshot por meacutedia de AICsnapshot inferior a 020 Esse paracircmetro foi esta-belecido com o objetivo de definir um padratildeo para o que pode ser considerado umprojeto com poucas expressotildees lambda

Figura 45 Classificaccedilatildeo dos projetos

31

443 Refatoraccedilatildeo de Coacutedigo

O uacuteltimo script teve como objetivo realizar uma tentativa inicial de identificar refatoraccedilatildeode coacutedigo da seguinte maneira para todos os projetos que possuem expressotildees lambdaforam identificados o mecircs imediatamente antes da introduccedilatildeo de expressotildees lambda e omecircs seguinte onde houve a primeira ocorrecircncia de lambda no projeto Assim realizou-se uma anaacutelise do tamanho em quantidade de linhas de coacutedigo de todos os meacutetodosdo projeto que no mecircs seguinte tiveram introduccedilatildeo de lambda Em seguida fez-se umacomparaccedilatildeo com os mesmos meacutetodos em relaccedilatildeo ao mecircs anterior e assim foi possiacuteveldetectar quais meacutetodos tiveram a quantidade de linhas de coacutedigo reduzidas o que seriaum indicativo natildeo necessariamente exclusivo de que uma refatoraccedilatildeo de coacutedigo possa terocorrido

Sabe-se que este meacutetodo de detecccedilatildeo de refatoraccedilatildeo de coacutedigo possui suas limitaccedilotildeesuma vez que as comparaccedilotildees para saber se um meacutetodo existe em ambas versotildees eacute feitopuramente por comparaccedilatildeo de String (nome do meacutetodo) e a classe que este pertence

444 Casos de Uso

Os meacutetodos descritos acima ajudaram a identificar alguns padrotildees e facilitar a anaacutelise dosdados Poreacutem natildeo satildeo suficientes para que se possa responder agraves questotildees de pesquisaDessa forma apoacutes a identificaccedilatildeo dos grupos de classificaccedilatildeo para os projetos foramescolhidos um projeto de cada grupo (com exceccedilatildeo do grupo dos projetos sem expressotildeeslambda) para realizar um breve estudo de caso com o objetivo de identificar e caracterizarmelhor a adoccedilatildeo de expressotildees lambda Os projetos escolhidos foram agera vertxAndroid-CleanArchitecture RxJava e guava

32

Capiacutetulo 5

Resultados Obtidos e Anaacutelise

Neste capiacutetulo seratildeo apresentados os dados obtidos e anaacutelise com o objetivo de responderagraves questotildees de pesquisa propostas Como mencionado anteriormente as perguntas seratildeorespondidas de duas maneiras algumas com informaccedilotildees gerais sobre todos os projetose outras com breve estudos de caso envolvendo cinco projetos

51 Visatildeo Geral

Dentre os repositoacuterios coletados para a anaacutelise 74 (7474) natildeo utilizaram nenhumaexpressatildeo lambda no projeto durante todo o periacuteodo analisado (Janeiro de 2013 a Abrilde 2017) restando apenas 25 repositoacuterios (2525) com expressotildees lambda Eacute interessantedestacar que apesar de a quantidade de repositoacuterios que natildeo possuem expressotildees lambdaser relativamente expressiva muitos destes repositoacuterios satildeo de projetos em Java que umdia foram populares e atualmente natildeo estatildeo sendo mais desenvolvidos (por exemplo umaplicativo que soacute funciona para Android 23 atualmente descontinuado)

Levando em consideraccedilatildeo apenas os projetos que possuem expressotildees lambda exis-tem dois tipos de dados que podem ser analisados para responder agrave primeira questatildeo depesquisa atraveacutes dos dados obtidos pelo meacutetodo anteriormente mencionado como anaacutelisetemporal e a meacutedia de lambda por snapshot mencionados no capiacutetulo anterior

Com relaccedilatildeo ao ano em que a primeira ocorrecircncia foi encontrada 6 projetos introduzi-ram expressotildees lambda jaacute em 2014 8 comeccedilaram a utilizar em 2015 7 em 2016 e apenas4 tiveram a primeira ocorrecircncia de expressotildees lambda em 2017 Dessa forma percebe-seque os projetos estatildeo relativamente bem distribuiacutedos em grupos quanto ao ano em que seintroduziu expressotildees lambda

Pela meacutedia de lambda por snapshot (lambdasnapshot) a maioria (11 projetos) possuiuma quantidade expressiva acima de 100 lambdasnapshot (com 6 projetos entre 20 e 100lambdasnapshot e 8 projetos com menos de 20 lambdasnapshot) como apresentados no

33

graacutefico da Figura 51 Isso mostra que essa nova caracteriacutestica jaacute estaacute sendo bem utilizadanos projetos que comeccedilaram a migrar para a nova versatildeo do Java

Figura 51 Graacuteficos dos projetos separados por ano de introduccedilatildeo de expressotildees lambdae meacutedia de lambda por snapshot

Com isso pode-se observar que apesar de a quantidade de projetos que possuemexpressotildees lambda natildeo ser tatildeo alta eacute possiacutevel obter resultados expressivos uma vez quea quantidade dos projetos com lambda estatildeo bem dispersos quanto ao periacuteodo em quecomeccedilaram a adotar essa caracteriacutestica e a quantidade de expressotildees lambda por snapshot

511 Projetos Selecionados

Atraveacutes dos grupos de classificaccedilatildeo identificados pela anaacutelise temporal descritos na Figura45 cinco projetos foram selecionados para uma anaacutelise detalhada levando em consideraccedilatildeoo grupo em que eles pertencem Estes projetos seratildeo apresentados a seguir

512 agera

Agera eacute uma biblioteca Android que ajuda a introduzir programaccedilatildeo funcional reativa(functional reactive programming) em projetos Android Eacute um projeto recente lanccediladoem 2016 pela Google [44] e encontra-se no grupo dos projetos que introduziram expressotildeeslambda em 2016 no mesmo ano de seu lanccedilamento contendo uma meacutedia de expressotildeeslambda de 16 lambdasnapshot

Na classificaccedilatildeo estabelecida agera pertence ao Grupo 1 onde a quantidade de ex-pressotildees lambda no projeto com o tempo aumentam juntamente com a quantidade deAICs como mostra o graacutefico de anaacutelise temporal na Figura 52

34

Figura 52 Graacuteficos de anaacutelise temporal do projeto agera

513 vertx

Eclipse Vertx eacute um conjunto de ferramentas para criaccedilatildeo de reactive applications namaacutequina virtual Java (JVM) em grande escala [45] Seu primeiro lanccedilamento aconteceuem 2011 e a primeira ocorrecircncia de expressotildees lambda no projeto aconteceu em 2014 Esteprojeto possui uma meacutedia de 2867 lambdasnapshot e dentre os projetos consideradosneste trabalho eacute o que possui a maior quantidade de expressotildees lambda

Este projeto pertence ao Grupo 2 onde a quantidade de expressotildees lambda aumen-tou consideravelmente pelos meses ultrapassando a quantidade de AICs que diminuiudrasticamente como mostra a Figura 53

35

Figura 53 Graacuteficos de anaacutelise temporal do projeto Vertx

514 Android-CleanArchitecture

Apesar de ser uma amostra de projeto Android-CleanArchitecture que tem como objetivoconstruir aplicaccedilotildees Android utilizando clean architecture foi lanccedilado em 2014 mas semanteacutem sempre atualizado [46]

A introduccedilatildeo de expressotildees lambda que aconteceu no ano de 2015 se deu de formatiacutemida com uma meacutedia de 35 lambdasnapshot De qualquer forma este projeto conseguerepresentar com seu graacutefico de anaacutelise temporal o grupo 3 composto por projetos em quea quantidade de expressotildees lambda aumentou mas sem ultrapassar AICs que diminuiacuteramdemonstrado no graacutefico da Figura 54

36

Figura 54 Graacuteficos de anaacutelise temporal do projeto Android-CleanArchitecture

515 RxJava

Dentre os repositoacuterios estudados RxJava eacute considerado o mais popular Como umaimplementaccedilatildeo de Reactive Extensions para a JVM RxJava teve seu lanccedilamento dadoem 2013 [47] Expressotildees lambda apareceram pela primeira vez no ano de 2015 comuma meacutedia de 766 lambdasnapshot

Apesar de uma meacutedia relativamente alta o tempo de vida das expressotildees lambda nesteprojeto foi bem curto caracterizando assim projetos do grupo 4 houve a introduccedilatildeo dasexpressotildees lambda no projeto poreacutem houve a remoccedilatildeo completa de todas as expressotildeeslambda previamente introduzidas desaparecendo completamente do projeto ateacute a datada coleta de dados (Figura 55)

37

Figura 55 Graacuteficos de anaacutelise temporal do projeto RxJava

516 guava

Guava eacute um conjunto de bibliotecas para Java da Google lanccedilado em 2011 A atualizaccedilatildeodo coacutedigo do projeto para Java 8 aconteceu somente em 2016 e apesar do projeto conteruma meacutedia de 281 lambdasnapshot ele foi escolhido como representante dos projetosdo Grupo 5 (Figura 56) que possuem expressotildees lambda mas de forma natildeo expressiva osuficiente quando comparado com a quantidade de AIC pelo fato de sua razatildeo de meacutedia delambdasnapshot por meacutedia de AICsnapshot ser 004 Ou seja embora o projeto tenhaexpressotildees lambda estas satildeo consideradas muito poucas quando inseridas no contextogeral deste projeto que eacute considerado um projeto grande

38

Figura 56 Graacuteficos de anaacutelise temporal do projeto Guava

52 Refatoraccedilatildeo de Coacutedigo

Com o objetivo de caracterizar melhor como as expressotildees lambda estatildeo sendo utilizadaseacute interessante identificar se estas estatildeo sendo introduzidas atraveacutes de refatoraccedilatildeo de coacutedigoou em coacutedigo novo

Os projetos classificados como pertencentes ao Grupo 2 possuem em comum o fatode expressotildees lambda aumentarem a medida que AICs diminuem ultrapassando-as eessa caracteriacutestica em comum pode indicar que nestes projetos possivelmente houve re-fatoraccedilatildeo de coacutedigo visto que AIC sendo substituiacutedo por expressotildees lambda dentro dascondiccedilotildees determinadas eacute a maneira mais comum de se identificar refatoraccedilatildeo de coacute-digo para introduccedilatildeo de expressotildees lambda [12] Os projetos que compotildeem o grupo 2representam 44 de todos os projetos estudados que possuem expressotildees lambda o quepode ser um indicativo caso a hipoacutetese de refatoraccedilatildeo de coacutedigo seja positiva de quemuitos projetos que estatildeo adotando o Java 8 estatildeo se preocupando de alguma formacom refatoraccedilatildeo se coacutedigo Fazem parte desse grupo os seguintes projetos elasticsearchjava-design-patterns PocketHub presto RxJava-Android-Samples spark vertx zipkinjava8-tutorial dropwizard e material-dialogs

39

Outra maneira de verificar possiacuteveis indicadores de refatoraccedilatildeo de coacutedigo foi atraveacutesda anaacutelise dos tamanhos (em quantidade de linhas de coacutedigo) dos meacutetodos com expressotildeeslambda no mecircs em que se introduziu expressotildees lambda e um mecircs imediatamente antesdeste Essa anaacutelise mostra que dos 25 projetos com expressotildees lambda 12 (48) projetostiveram ao menos um meacutetodo em que houve uma diminuiccedilatildeo no tamanho o que podeser considerado um indicativo de refatoraccedilatildeo de coacutedigo A Figura 57 mostra todos osprojetos em relaccedilatildeo agrave quantidade total de meacutetodos que possuem lambda no primeiro mecircsde introduccedilatildeo do mesmo em vermelho comparado com a quantidade desses meacutetodos quetiveram uma diminuiccedilatildeo no tamanho quando comparados com o coacutedigo do mecircs anteriorem azul

Figura 57 Comparaccedilatildeo entre todos os projetos com expressatildeo lambda sobre refatoraccedilatildeode coacutedigo no mecircs de introduccedilatildeo da caracteriacutestica

Ainda observando a figura 57 com relaccedilatildeo aos projetos que natildeo tiveram nenhummeacutetodo com diminuiccedilatildeo de tamanho (barra azul) percebe-se que todos os 13 projetossequer tiveram uma quantidade significativa de meacutetodos que possuem expressotildees lambda(com o maior tendo apenas 5 meacutetodos) no mecircs de introduccedilatildeo da caracteriacutestica no projetoe ao mesmo tempo jaacute existiam no mecircs em que natildeo existia lambda no projeto Essa eacuteuma observaccedilatildeo importante porque projetos como vertx sendo este o que possui a maiormeacutedia de lambdasnapshot de todos os projetos e ao mesmo tempo tendo apenas trecircsmeacutetodos que continham expressotildees lambda no mecircs da introduccedilatildeo e que existiam no mecircs

40

anterior permitem inferir que todas as outras expressotildees lambda existentes no projetopara este determinado mecircs de introduccedilatildeo encontram-se em coacutedigo novo introduzido

Eacute importante ressaltar que somente essa anaacutelise natildeo eacute exclusivamente suficiente paradeterminar se estes projetos estatildeo realmente introduzindo lambda em coacutedigo novo ourealizando refatoraccedilatildeo uma vez que como a comparaccedilatildeo aconteceu apenas no mecircs deintroduccedilatildeo com o mecircs imediatamente anterior natildeo reflete todo o ciclo de vida do pro-jeto Por exemplo algumas equipes podem escolher refatorar o coacutedigo depois de umtempo de adaptaccedilatildeo apoacutes a transiccedilatildeo para a nova versatildeo da linguagem Assim paraobter uma melhor anaacutelise sobre refatoraccedilatildeo de coacutedigo ou natildeo feita nestes projetos aleacutemde outras anaacutelises referentes aos padrotildees tipicamente adotados para implementaccedilatildeo delambda nestes projetos seratildeo apresentados a seguir os estudos de caso dos cinco projetospreviamente selecionados

Outro ponto importante eacute o fato de que apesar das informaccedilotildees quanto agraves quantida-des de filter e map terem sido incluiacutedas inicialmente no trabalho para observar possiacuteveispadrotildees de refatoraccedilatildeo de coacutedigo percebeu-se que estas natildeo satildeo utilizadas de forma con-sideraacutevel pelos projetos estudados e para fins de anaacutelises generalizadas natildeo apresentaramtanta influecircncia na utilizaccedilatildeo de expressotildees lambda quanto a quantidade de AICs noprojeto

53 Estudos de Caso

Dentre os projetos analisados verificou-se que os projetos de pequeno e meacutedio porte op-taram por refatorar de uma vez seus coacutedigos para incluir expressotildees lambda em situaccedilotildeesem que se utilizava AICs anteriormente ou em alguns poucos casos de utilizaccedilatildeo deCollection Os projetos de grande porte natildeo apresentaram nenhuma refatoraccedilatildeo de coacute-digo ou uma refatoraccedilatildeo parcial gradativa provavelmente devido agrave grande quantidade dearquivos e coacutedigo que possuem o que pode tornar o trabalho de refatoraccedilatildeo extenso ecansativo

O projeto vertx que pertence ao grupo 2 dos projetos em que a quantidade de ex-pressotildees lambda aumentaram e as de AICs diminuiacuteram com lambda ultrapassando AICsexecutou inicialmente commits em maio de 2014 com adiccedilatildeo de coacutedigo novo utilizandoexpressotildees lambda e apoacutes um mecircs realizou um commit maior com a refatoraccedilatildeo de todasas AICs para expressotildees lambda Apoacutes a refatoraccedilatildeo o projeto se preocupou em mantera utilizaccedilatildeo de expressotildees lambda ao mesmo tempo que o uso de AICs se manteve apenasaos casos de classes com interfaces natildeo funcionais A Figura 58 apresenta uma parte docommit de refatoraccedilatildeo de coacutedigo que mostra em vermelho a parte eliminada do coacutedigo(AIC) e em verde o coacutedigo novo representando a substituiccedilatildeo por uma expressatildeo lambda

41

Figura 58 Commit de refatoraccedilatildeo de coacutedigo do projeto Vertx [3]

Alguns projetos ainda natildeo se preocuparam em refatorar o coacutedigo para o uso de ex-pressotildees lambda ateacute a data deste trabalho que eacute o caso do projeto guava que apresentouum commit em 03112016 com a atualizaccedilatildeo do projeto para Java 8 Mas a partir daatualizaccedilatildeo se preocupou em utilizar as expressotildees lambda apenas na implementaccedilatildeo decoacutedigo novo O cenaacuterio em que a refatoraccedilatildeo natildeo eacute prioridade ainda eacute a realidade de vaacuteriosprojetos de grande porte visto que os dados de projetos sem nenhuma expressatildeo lambdasatildeo o maior nuacutemero neste trabalho Poreacutem projetos que jaacute adotaram a utilizaccedilatildeo do Java8 tendem a mudar isso com o passar do tempo A Figura 59 apresenta em verde umaadiccedilatildeo de coacutedigo novo com expressatildeo lambda sem a eliminaccedilatildeo de algum coacutedigo anteriora esse que estaria em vermelho

42

Figura 59 Exemplo de um arquivo do commit de adiccedilatildeo de coacutedigo novo em Java 8 doprojeto Guava [4]

Na categoria de projetos em que os AICs e expressotildees lambda aumentam proporci-onalmente (grupo 1) o projeto agera realizou um commit em 19052016 com a adiccedilatildeoda biblioteca retrolambda como dependecircncia do projeto Essa biblioteca utilizada prin-cipalmente por projetos Android permite executar coacutedigo Java 8 contendo expressotildeeslambda em Java 5 6 e 7 [48] O commit tambeacutem apresenta refatoraccedilatildeo dos AICs ad-vindos de interfaces funcionais para expressotildees lambda Apesar de o projeto continuar autilizar as expressotildees lambda em seus commits posteriores o nuacutemero de AICs tambeacutemcontinuou a aumentar visualizando os commits posteriores notou-se que esses AICs satildeorelativos a interfaces natildeo funcionais ou seja que possuem mais de um meacutetodo O projetoAndroid-CleanArchitecture eacute similar ao agera pois tambeacutem optou pela instalaccedilatildeo da bi-blioteca retrolambda para uso de expressotildees lambda em seus coacutedigos e como tambeacutem eacuteum projeto de pequeno porte houve uma pequena refatoraccedilatildeo dos AICs A Figura 510mostra a parte do commit de refatoraccedilatildeo de coacutedigo em que o desenvolvedor adiciona abiblioteca retrolambda como dependecircncia

43

Figura 510 Commit de adiccedilatildeo da biblioteca Retrolambda no projeto Agera [5]

Outro caso interessante eacute o do projeto RxJava que em 2015 optou pela refatoraccedilatildeodo coacutedigo para a utilizaccedilatildeo de expressotildees lambda quase eliminando por completo o usode AICs mas que no ano seguinte reverteu os commits de forma que eliminasse comple-tamente o uso de expressotildees lambda para manter a retrocompatibilidade com o Java 6A Figura 511 demonstra uma parte do commit de reversatildeo do coacutedigo para Java 6 emque pode ser visto em vermelho o coacutedigo anterior com expressotildees lambda e o verde como novo coacutedigo utilizando AIC novamente

44

Figura 511 Commit de remoccedilatildeo de Lambdas e volta para o uso de AICs no projetoRXJava [6]

Essa preocupaccedilatildeo com retrocompatibilidade de coacutedigo pode ser um fator crucial nadecisatildeo das equipes de desenvolvimento na hora de decidir como fazer o software co-evoluircom a linguagem sem perder a compatibilidade com versotildees anteriores

45

Capiacutetulo 6

Consideraccedilotildees Finais

Este estudo permitiu entender melhor como projetos estatildeo realizando a migraccedilatildeo para oJava 8 em especial utilizando uma nova caracteriacutestica introduzida expressatildeo lambdaApesar de a maioria dos projetos populares considerados natildeo possuiacuterem nenhuma ocor-recircncia de expressotildees lambda os projetos que tinham expressotildees lambda foram suficientespara realizar um primeiro estudo de caracterizaccedilatildeo no uso desta caracteriacutestica e com osprojetos efetivamente utilizados para estudo foi possiacutevel agrupaacute-los quanto a maneira emque as expressotildees lambda estavam sendo utilizadas quando comparadas com AICs em 5grandes grupos quando AIC e lambda aumentam proporcionalmente quando AIC dimi-nui e lambda aumenta ultrapassando AIC quando AIC diminui mas continua superior aolambda crescente expressotildees lambda que foram introduzidas e retiradas completamentedo coacutedigo e expressotildees lambda que natildeo existem em quantidades expressivas

Foi possiacutevel entatildeo realizar um estudo aprofundado levando em consideraccedilatildeo as di-ferentes maneiras com que as expressotildees lambda foram adotadas nos projetos atraveacutes daescolha de um projeto que representasse cada grupo para anaacutelise Dentre os cinco projetosestudados foi possiacutevel observar alguns padrotildees tipicamente adotados por desenvolvedorespara implementar expressotildees lambda em seus projetos como a utilizaccedilatildeo da bibliotecas(retrolambda) que permitissem uma flexibilizaccedilatildeo na utilizaccedilatildeo de expressotildees lambda oucomo lambda eacute primariamente utilizada para substituir determinados AICs ou operaccedilotildeesem Collection

Aleacutem disso foi possiacutevel observar como a refatoraccedilatildeo de coacutedigo acontece em cada umdesses projetos Observou-se como projetos menores tendem a refatorar coacutedigo maisfacilmente ao passo que projetos maiores e mais complexos fazem menos refatoraccedilatildeo oudemoram mais entre o periacuteodo em que houve a primeira migraccedilatildeo de coacutedigo para a novaversatildeo da linguagem ateacute o periacuteodo em que realmente decidem refatorar coacutedigo Aleacutem dacomplexidade do projeto influenciar na decisatildeo de migrar o projeto para uma versatildeo maisrecente da linguagem a preocupaccedilatildeo com retrocompatibilidade com versotildees anteriores da

46

linguagem tambeacutem podem ser uma barreira para que projetos comecem a evoluir o coacutedigojuntamente com a evoluccedilatildeo da linguagem

Ainda assim foi possiacutevel observar que a preocupaccedilatildeo com a co-evoluccedilatildeo do software-linguagem existe entre os desenvolvedores de projetos mas a realizaccedilatildeo da migraccedilatildeo aindaacontece lentamente devido agrave diversos fatores que precisam ser levados em consideraccedilatildeopara a manutenccedilatildeo do projeto

Para trabalhos e contribuiccedilotildees futuras seria interessante desenvolver uma ferramentaque pudesse analisar diretamente no coacutedigo-fonte as oportunidades de aplicaccedilatildeo de ex-pressotildees lambda dessa forma poderiam ser analisadas as porcentagens de conversatildeo decoacutedigo para Java 8 e obter melhores conclusotildees sobre a importacircncia que os projetos estatildeodando para a evoluccedilatildeo de seus coacutedigos Outro fator interessante seria aplicar mais Visitorsagrave ferramenta static-analysis e fazer este mesmo estudo aplicado agrave outras caracteriacutesticasda linguagem

47

Referecircncias

[1] Kagdi Huzefa Michael L Collard e Jonathan I Maletic A survey and taxonomyof approaches for mining software repositories in the context of software evolution2007 ix 3 8 9 10 11

[2] DBeaver Dbeaver - features httpdbeaverjkissorgdocsfeatures ix 29

[3] Eclipse Vertx commit Java8-ify code httpsgithubcomeclipsevertxcommit93f95e9c77419f442a42fe711b6eeaef88192fd3 ix 42

[4] Google Guava commit Release java 8 changes to guava httpsgithubcomgoogleguavacommit73e382fa877f80994817a136b0adcc4365ccd904 ix 43

[5] Google Agera commit Collapsed testapp with retrolambda httpsgithubcomgoogleageracommit5e518b7b05f9e7a34a314945f68deff7b2c3e334 ix 44

[6] ReactiveX Rxjava commit 2x full jdk 6 compatible backport + includ-ing bugfixes up to today httpsgithubcomReactiveXRxJavacommit000a174d87a901135f9665d3b11f3627fd2dc4ed ix 45

[7] Godfrey M W e D M German The past present and future of software evolutionEm 2008 Frontiers of Maintenance paacuteginas 129ndash138 Sept 2008 1 6

[8] Favre J M Languages evolve too changing the software time scale Em Principles ofSoftware Evolution Eighth International Workshop on paacuteginas 33ndash42 IEEE 20051 5 7

[9] Overbey Jeffrey L e Ralph E Johnson Regrowing a language refactoring tools allowprogramming languages to evolve Em ACM SIGPLAN Notices volume 44 paacuteginas493ndash502 ACM 2009 1 5 7 8 12

[10] Grechanik Mark Collin McMillan Luca DeFerrari Marco Comi Stefano CrespiDenys Poshyvanyk Chen Fu Qing Xie e Carlo Ghezzi An empirical investiga-tion into a large-scale java open source code repository Em Proceedings of the2010 ACM-IEEE International Symposium on Empirical Software Engineering andMeasurement ESEM rsquo10 paacuteginas 111ndash1110 New York NY USA 2010 ACMISBN 978-1-4503-0039-1 httpdoiacmorg10114518527861852801 1

[11] TIOBE Tiobe httpswwwtiobecomtiobe-index 1 14

48

[12] Gyori Alex Lyle Franklin Danny Dig e Jan Lahoda Crossing the gap from im-perative to functional programming through refactoring Em Proceedings of the 20139th Joint Meeting on Foundations of Software Engineering ESECFSE 2013 paacute-ginas 543ndash553 New York NY USA 2013 ACM ISBN 978-1-4503-2237-9 httpdoiacmorg10114524914112491461 2 11 24 39

[13] OpenJDK State of the lambda httpcropenjdkjavanet~briangoetzlambdalambda-state-4html 2

[14] Han Jiawei Micheline Kamber e Jian Pei Data Mining Concepts and TechniquesMorgan Kaufmann Publishers Inc San Francisco CA USA 3rd ediccedilatildeo 2011ISBN 0123814790 9780123814791 3

[15] Fowler Martin e Kent Beck Refactoring improving the design of existing codeAddison-Wesley Professional 1999 5 7

[16] Lehman M M J F Ramil P D Wernick D E Perry e W M Turski Met-rics and laws of software evolution - the nineties view Em Proceedings of the4th International Symposium on Software Metrics METRICS rsquo97 paacuteginas 20ndashWashington DC USA 1997 IEEE Computer Society ISBN 0-8186-8093-8 httpdlacmorgcitationcfmid=823454823901 6

[17] Hassan Ahmed E e Tao Xie Software intelligence The future of mining softwareengineering data Em Proceedings of the FSESDP Workshop on Future of SoftwareEngineering Research FoSER rsquo10 paacuteginas 161ndash166 New York NY USA 2010ACM ISBN 978-1-4503-0427-6 httpdoiacmorg101145188236218823978 9

[18] Hassan Ahmed E The road ahead for mining software repositories Em Frontiers ofSoftware Maintenance 2008 FoSM 2008 paacuteginas 48ndash57 IEEE 2008 8

[19] Berry Michael J e Gordon Linoff Data Mining Techniques For Marketing Salesand Customer Support John Wiley amp Sons Inc New York NY USA 1997ISBN 0471179809 10

[20] Parnin Chris Christian Bird e Emerson Murphy-Hill Java generics adoption hownew features are introduced championed or ignored Em Proceedings of the 8thWorking Conference on Mining Software Repositories paacuteginas 3ndash12 ACM 2011 12

[21] Oracle The java language specification httpsdocsoraclecomjavasespecsjlsse8jls8pdf 13

[22] Oracle The history of java technology httpwwworaclecomtechnetworkjavajavaseoverviewjavahistory-index-198355html 13

[23] Murphy Kieron So why did they decide to call itjava httpwwwjavaworldcomarticle2077265core-javaso-why-did-they-decide-to-call-it-java-html 13

[24] McGraw Tata Object-oriented Programming with Java Essentials and ApplicationsHill Education 13

49

[25] Oracle Differences between java ee and java se httpdocsoraclecomjavaee6firstcupdocgkhoyhtml 13

[26] Lindsey Clark S The History of Java Cambridge 14

[27] Oracle The java language environment httpwwworaclecomtechnetworkjavaintro-141325html 14

[28] Oracle Jdk 8 httpopenjdkjavanetprojectsjdk8 15 24

[29] Oracle Enhancements in java se 8 httpdocsoraclecomjavase8docstechnotesguideslanguageenhancementshtmljavase8 15 16 17

[30] Oracle Lambda expressions httpdocsoraclecomjavasetutorialjavajavaOOlambdaexpressionshtml 16 18 21

[31] Oracle Method references httpdocsoraclecomjavasetutorialjavajavaOOmethodreferenceshtml 16

[32] Oracle Default methods httpdocsoraclecomjavasetutorialjavaIandIdefaultmethodshtml 17

[33] Oracle Repeating annotations httpdocsoraclecomjavasetutorialjavaannotationsrepeatinghtml 17

[34] Oracle Type annotations httpdocsoraclecomjavasetutorialjavaannotationstype_annotationshtml 17

[35] Oracle Anonymous inner classes httpsdocsoraclecomjavasetutorialjavajavaOOanonymousclasseshtml 19

[36] Kothari CR Research Methodology Methods and Techniques New Age Interna-tional (P) Limited 2004 ISBN 9788122415223 httpsbooksgooglecombrbooksid=8c6gkbKi-F4C 22

[37] Nakakoji Kumiyo Yasuhiro Yamamoto Yoshiyuki Nishinaka Kouichi Kishida eYunwen Ye Evolution patterns of open-source software systems and communitiesEm IWPSE rsquo02 Proceedings of the International Workshop on Principles of SoftwareEvolution paacuteginas 76ndash85 New York NY USA 2002 ACM Press ISBN 1581135459httpdxdoiorg101145512035512055 23

[38] Rahman Foyzur Christian Bird e Premkumar Devanbu Clones What is that smellEmpirical Software Engineering 17(4-5)503ndash530 2012 24

[39] Chacon Scott Pro Git Apress Berkely CA USA 1st ediccedilatildeo 2009ISBN 1430218339 9781430218333 25

[40] Cavalcanti Thiago Gomes e Viniacutecius Correa de Almeida Caracterizaccedilatildeo do uso deconstruccedilotildees da linguagem java em projetos open-source Publicaccedilatildeo online 2016httpbdmunbbrhandle1048315733 27

50

[41] Parr Terence Language Implementation Patterns Create Your Own Domain-Specific and General Programming Languages Pragmatic Bookshelf 1st ediccedilatildeo 2009ISBN 193435645X 9781934356456 27

[42] Janssen Thorben 5 reasons to use jpa hibernate Publicaccedilatildeo online httpswwwsitepointcom5-reasons-to-use-jpa-hibernate 27

[43] Franklin Lyle Alex Gyori Jan Lahoda e Danny Dig Lambdaficator From imperativeto functional programming through automated refactoring Em Proceedings of the2013 International Conference on Software Engineering ICSE rsquo13 paacuteginas 1287ndash1290 Piscataway NJ USA 2013 IEEE Press ISBN 978-1-4673-3076-3 httpdlacmorgcitationcfmid=24867882486986 29

[44] Google Agera httpsgithubcomgoogleagerawiki 34

[45] Eclipse Eclipse vertx httpvertxio 35

[46] Cejas Fernando Android cleanarchitecture httpsgithubcomandroid10Android-CleanArchitecture 36

[47] ReactiveX Rxjava httpsgithubcomReactiveXRxJava 37

[48] Luontola Esko Retrolambda httpsgithubcomorfjackalretrolambda 43

51

Anexo I

Projetos utilizados

fastjson

platform_frameworks_base

netty

material-dialogs

kotlin

okhttp

tinker

AndroidUtilCode

RxJava

spring-boot

java-design-patterns

elasticsearch

ExoPlayer

kafka

vertx

realm-java

guava

zipkin

bazel

stetho

Signal-Android

glide

agera

fresco

plaid

presto

libgdx

spark

52

disruptor

lottie-android

flexbox-layout

PocketHub

zxing

spring-framework

deeplearning4j

dropwizard

interviews

BaseRecyclerViewAdapterHelper

uCrop

DanmakuFlameMaster

lottie-react-native

android-UniversalMusicPlayer

AndroidInterview-Q-A

greenDAO

retrofit

MaterialDrawer

BottomBar

druid

MPAndroidChart

Hystrix

guice

recyclerview-animators

dubbo

androidannotations

RxJava-Android-Samples

PhotoView

clojure

CircleImageView

AndroidSwipeLayout

jedis

MaterialViewPager

butterknife

junit4

RxBinding

leakcanary

SimianArmy

picasso

UltimateRecyclerView

53

AndroidViewAnimations

AppIntro

FizzBuzzEnterpriseEdition

ion

cheesesquare

physical-web

RxAndroid

Android-CleanArchitecture

Calligraphy

Android-Bootstrap

iosched

Android_Data

MaterialDesignLibrary

ListViewAnimations

EventBus

java8-tutorial

AndroidSlidingUpPanel

dagger

okhttputils

logger

HomeMirror

Material-Animations

android-Ultra-Pull-To-Refresh

android-async-http

Android-ObservableScrollView

Android-Universal-Image-Loader

ActionBarSherlock

SlidingMenu

storm

PagerSlidingTabStrip

Android-PullToRefresh

54

  • Dedicatoacuteria
  • Agradecimentos
  • Resumo
  • Abstract
  • Introduccedilatildeo
    • Contexto
    • Objetivos
      • Objetivos Gerais
      • Objetivos Especiacuteficos
        • Metodologia
        • Organizaccedilatildeo do Trabalho
          • Evoluccedilatildeo e Mineraccedilatildeo de Repositoacuterios de Software
            • Evoluccedilatildeo de Software
            • MSR Mineraccedilatildeo de dados e a Engenharia de Software
              • Classificaccedilatildeo
                • Trabalhos Relacionados
                  • Java SE 8 e JDK 8
                    • Histoacuterico
                    • Princiacutepios
                    • Evoluccedilatildeo
                    • Expressotildees Lambda
                      • Sintaxe
                      • Principais formas de uso
                          • Estudo e o Processo de Mineraccedilatildeo
                            • Questotildees de Pesquisa
                            • Fonte de Dados e Objetos de Estudo
                            • Processo de Mineraccedilatildeo
                              • static-analysis
                              • BDAnalisador
                                • Classificaccedilatildeo e Anaacutelise
                                  • Meacutedia de Lambda
                                  • Anaacutelise Temporal
                                  • Refatoraccedilatildeo de Coacutedigo
                                  • Casos de Uso
                                      • Resultados Obtidos e Anaacutelise
                                        • Visatildeo Geral
                                          • Projetos Selecionados
                                          • agera
                                          • vertx
                                          • Android-CleanArchitecture
                                          • RxJava
                                          • guava
                                            • Refatoraccedilatildeo de Coacutedigo
                                            • Estudos de Caso
                                              • Consideraccedilotildees Finais
                                              • Referecircncias
                                              • Anexo
                                              • Projetos utilizados

Abstract

This work presents a study about how lambda expressions are being used in open-soruceJava projects Using a sample of 99 popular projectsrsquo repositories in Github it wasanalyzed how and when this feature was introduced within those projects identifyingpatterns used to implement such feature and possible code refactoring approaches in caseany code was refactored It was conducted a general study to identify similarities amongprojects and the way they use lambda expressions and also case studies that intendedto realize a richer analysis about the subject For the case studies it was chosen fiveprojects previously classified according to the distinct approach used when introducinglambda expressions

Keywords Mining Software Repositories git Java Lambda Expressions AnonymousInner Class

vi

Sumaacuterio

1 Introduccedilatildeo 111 Contexto 112 Objetivos 2

121 Objetivos Gerais 2122 Objetivos Especiacuteficos 2

13 Metodologia 314 Organizaccedilatildeo do Trabalho 3

2 Evoluccedilatildeo e Mineraccedilatildeo de Repositoacuterios de Software 521 Evoluccedilatildeo de Software 622 MSR Mineraccedilatildeo de dados e a Engenharia de Software 8

221 Classificaccedilatildeo 823 Trabalhos Relacionados 11

3 Java SE 8 e JDK 8 1331 Histoacuterico 1332 Princiacutepios 1433 Evoluccedilatildeo 1534 Expressotildees Lambda 18

341 Sintaxe 18342 Principais formas de uso 19

4 Estudo e o Processo de Mineraccedilatildeo 2241 Questotildees de Pesquisa 2342 Fonte de Dados e Objetos de Estudo 2443 Processo de Mineraccedilatildeo 25

431 static-analysis 26432 BDAnalisador 27

44 Classificaccedilatildeo e Anaacutelise 29441 Meacutedia de Lambda 30

vii

442 Anaacutelise Temporal 30443 Refatoraccedilatildeo de Coacutedigo 32444 Casos de Uso 32

5 Resultados Obtidos e Anaacutelise 3351 Visatildeo Geral 33

511 Projetos Selecionados 34512 agera 34513 vertx 35514 Android-CleanArchitecture 36515 RxJava 37516 guava 38

52 Refatoraccedilatildeo de Coacutedigo 3953 Estudos de Caso 41

6 Consideraccedilotildees Finais 46

Referecircncias 48

Anexo 51

I Projetos utilizados 52

viii

Lista de Figuras

21 Taxonomia em camadas adaptada do trabalho de Kagdi et al [1] 9

41 Processo utilizado para realizaccedilatildeo do estudo 2242 Metodologia implementada para coleta e tratamento de dados 2643 Diagrama de classes UML do BDAnalisador 2844 Modelo relacional do banco de dados populado pelo BDAnalisador Imagem

gerada com software DBeaver [2] 2945 Classificaccedilatildeo dos projetos 31

51 Graacuteficos dos projetos separados por ano de introduccedilatildeo de expressotildees lambdae meacutedia de lambda por snapshot 34

52 Graacuteficos de anaacutelise temporal do projeto agera 3553 Graacuteficos de anaacutelise temporal do projeto Vertx 3654 Graacuteficos de anaacutelise temporal do projeto Android-CleanArchitecture 3755 Graacuteficos de anaacutelise temporal do projeto RxJava 3856 Graacuteficos de anaacutelise temporal do projeto Guava 3957 Comparaccedilatildeo entre todos os projetos com expressatildeo lambda sobre refatora-

ccedilatildeo de coacutedigo no mecircs de introduccedilatildeo da caracteriacutestica 4058 Commit de refatoraccedilatildeo de coacutedigo do projeto Vertx [3] 4259 Exemplo de um arquivo do commit de adiccedilatildeo de coacutedigo novo em Java 8 do

projeto Guava [4] 43510 Commit de adiccedilatildeo da biblioteca Retrolambda no projeto Agera [5] 44511 Commit de remoccedilatildeo de Lambdas e volta para o uso de AICs no projeto

RXJava [6] 45

ix

Lista de Tabelas

31 As versotildees anteriores de java e principais caracteriacutesticas 14

41 Informaccedilotildees mensais sobre o projeto agera 30

x

Capiacutetulo 1

Introduccedilatildeo

11 Contexto

A evoluccedilatildeo e manutenccedilatildeo de software eacute uma caracteriacutestica intriacutenseca do desenvolvimentode sistemas considerando que a partir do momento em que um software comeccedila a serdesenvolvido satildeo realizadas constantes manutenccedilotildees [7] Apesar de o conceito de evolu-ccedilatildeo de software representar uma grande aacuterea de pesquisa na engenharia de software nemsempre pesquisadores reconhecem a importacircncia da evoluccedilatildeo das linguagens de progra-maccedilatildeo como um grande fator influenciador na evoluccedilatildeo de software [8] uma vez que umsoftware que natildeo evolui junto com a sua linguagem tem a sua capacidade de evoluccedilatildeolimitada [9]

Surge entatildeo a necessidade de alinhar estudos empiacutericos com o intuito de investigar esteprocesso de evoluccedilatildeo do software juntamente com a evoluccedilatildeo de sua linguagem atraveacutesde investigaccedilatildeo e anaacutelise de seu coacutedigo fonte que pode ser feita por meio de anaacutelise de re-positoacuterios de software em grande escala o que deu origem a abordagem de Mineraccedilatildeo emRepositoacuterio de Software (MSR) O MSR tem como base o estudo sistemaacutetico e empiacutericode repositoacuterios de software com o objetivo de analisaacute-los utilizando informaccedilotildees estatis-ticamente uacuteteis coletadas para observar diversos padrotildees como a evoluccedilatildeo do softwarepadrotildees de projetos dentre outros [10]

A complexidade e dificuldade de realizar tal estudo empiacuterico eacute alta pois atualmenteexistem diversos tipos de plataformas para coleta de dados linguagens e focos variadosAssim para escolher o foco do objeto de estudo eacute necessaacuterio levar em consideraccedilatildeo estasdificuldades e especificaccedilotildees e dessa forma este trabalho tem como foco a anaacutelise desistemas de software na linguagem Java

Ateacute a data deste trabalho de acordo com os dados do TIOBE [11] Java eacute a linguagemde programaccedilatildeo com mais linhas de codigo catalogadas no mundo Isso faz com queseja extremamente interessante o estudo empiacuterico da evoluccedilatildeo da linguagem e software

1

desenvolvidos nela desde sua primeira versatildeo antes de se tornar uma linguagem populare ainda com poucos pacotes ateacute a sua atual versatildeo estaacutevel com uma grande quantidadede novas caracteriacutesticas

A versatildeo mais recente do Java a JDK 8 possui diversas adiccedilotildees interessantes para aorganizaccedilatildeo do coacutedigo e facilidade do programador Dessas novas implementaccedilotildees con-ceitos de linguagem funcional como expressotildees lambda e iteradores externos que recebemuma expressatildeo lambda como argumento como o map() filter() e forEach() tornarama escrita de coacutedigo paralelo mais simples e permitiram ganhos de performance [12]

Diversas linguagens de programaccedilatildeo tambeacutem populares como Javascript e Ruby jaacutepossuiacuteam expressotildees lambda desde suas versotildees iniciais sendo o Java 8 em 2014 maisuma linguagem a introduzir esse novo conceito Podemos descrever as expressotildees comopequenas funccedilotildees normalmente feitas em apenas uma linha sem um nome identificadorElas podem ser retornadas de outras funccedilotildees ou passadas como paracircmetro Um exemplode expressatildeo lambda pode ser visualizado pela funccedilatildeo de soma de dois inteiros escrita daforma (int x int y)rarr x + y [13]

Antes da inclusatildeo de expressotildees lambda em Java o mesmo comportamento era possiacutevelutilizando classes anocircnimas ou AICs (Anonymous inner classes) Contudo eacute necessaacute-rio a criaccedilatildeo de uma interface com apenas um meacutetodo e instanciaacute-la como uma AIC Autilizaccedilatildeo de AICs gera inuacutemeras linhas de coacutedigo adicionais que poderiam ser encapsu-ladas em apenas uma linha com a utilizaccedilatildeo de expressotildees lambda Como eacute interessantepara o programador ter um coacutedigo sempre mais legiacutevel e sucinto torna-se interessante arefatoraccedilatildeo de coacutedigo que utiliza uma tecnologia mais antiga para a nova

Assim este trabalho visa conduzir um estudo de mineraccedilatildeo em repositoacuterios de softwareopen-source desenvolvidos na linguagem Java para entender como desenvolvedores estatildeose adaptando agraves novas mudanccedilas introduzidas no Java 8

12 Objetivos

121 Objetivos Gerais

Este trabalho tem como objetivo geral caracterizar o uso de expressotildees lambda entre osprojetos Java mais populares desenvolvidos pela comunidade do GitHub

122 Objetivos Especiacuteficos

Sabendo do benefiacutecio da refatoraccedilatildeo de coacutedigo para o uso de expressotildees lambda e dapouca quantidade de estudos acadecircmicos sobre o assunto surge entatildeo uma oportunidadede pesquisa para melhor entender a forma como essa caracteriacutestica estaacute sendo adotada por

2

projetos com foco em refatoraccedilatildeo de coacutedigo o que originou a necessidade deste estudoAssim para alcanccedilar o objetivo deste trabalho foram traccedilados em forma de questotildees depesquisa os objetivos especiacuteficos a serem alcanccedilados por este trabalho

bull Quando os projetos Java de coacutedigo aberto comeccedilaram a introduzir o uso de expres-sotildees lambda em seus coacutedigos e quatildeo significativo eacute esse uso

bull Como as equipes de desenvolvimento estatildeo utilizando expressotildees lambda atraveacutesde refatoraccedilatildeo de coacutedigo ou introduzindo apenas em coacutedigo novo

bull Quais satildeo os padrotildees tipicamente adotados para o uso de expressotildees lambda

13 Metodologia

Este trabalho foi desenvolvido utilizando uma abordagem de MSR que dentro da clas-sificaccedilatildeo de Kagdi et al [1] pode ser divido em quatro grandes etapas Primeiramentedefiniu-se a fonte de dados a ser utilizada e dentre as possibilidades encontradas na lite-ratura [14] optou-se por utilizar repositoacuterios de controle de versatildeo mais especificamenteo Github tendo como criteacuterio de seleccedilatildeo os 99 repositoacuterios Java mais populares na plata-forma Em seguida definiu-se o propoacutesito do estudo no caso os objetivos em forma deperguntas de pesquisa a serem respondidas

A terceira grande etapa foi a definiccedilatildeo do meacutetodo em si a forma como seria realizadoo estudo e este por sua vez constitui-se de download de todos os 99 repositoacuterios maispopulares realizaccedilatildeo de uma anaacutelise estaacutetica para coletar informaccedilotildees necessaacuterias de cadaprojeto por versatildeo e armazenamento de informaccedilotildees pertinentes em uma base de dados

A etapa final foi a realizaccedilatildeo da avaliaccedilatildeo dos dados obtidos atraveacutes de meacutetricas eanaacutelises quantitativas para melhor responder as questotildees de pesquisa aleacutem de estudos decaso feitos com cinco projetos escolhos de acordo com a maneira distinta em que estesfazem o uso de expressotildees lambda

14 Organizaccedilatildeo do Trabalho

Este trabalho se divide em seis capiacutetulos

bull Capiacutetulo 2 Apresenta um referencial teoacuterico sobre evoluccedilatildeo de software demons-trando as estrateacutegias utilizadas e a importacircncia da evoluccedilatildeo em um projeto de coacutedigoaberto aleacutem de enunciar as leis de evoluccedilatildeo de software de Lehman O capiacutetulo tam-beacutem apresenta o processo de mineraccedilatildeo de dados explicando cada uma das camadasda classificaccedilatildeo e demonstra trabalhos relacionados a esse toacutepico que serviram debase para este trabalho

3

bull Capiacutetulo 3 Traz um contexto histoacuterico e teacutecnico da linguagem Java necessaacuteriospara entender a importacircncia que as novas caracteriacutesticas adicionadas na versatildeo8 fornecem para os desenvolvedores de projetos determinados a manter o projetosempre evoluiacutedo Tambeacutem eacute apresentada uma seccedilatildeo para demonstrar os detalhese formas de utilizaccedilatildeo das expressotildees Lambda que satildeo o foco dos objetivos destetrabalho

bull Capiacutetulo 4 Descreve a metodologia e processo utilizados para o desenvolvimentoe obtenccedilatildeo dos resultados deste trabalho O capiacutetulo desenvolve o contexto dasquestotildees de pesquisa e explica os motivos e processos de desenvolvimento das fer-ramentas utilizadas para minerar os dados aleacutem de determinar a classificaccedilatildeo dosresultados obtidos em grupos para facilitar a organizaccedilatildeo dos dados de forma queas perguntas sejam respondidas claramente

bull Capiacutetulo 5 Apresenta os resultados obtidos e de que forma eles ajudaram a respon-der as questotildees de pesquisa Eacute descrita uma anaacutelise de um projeto de cada categoriaespecificada no capiacutetulo anterior a fim de contextualizar cada tipo de resultado paraque o leitor entenda a forma que os projetos Java estatildeo lidando com as expressotildeesLambda

bull Capiacutetulo 6 Descreve as dificuldades e problemas obtidos durante o trabalho e deque forma eles influenciaram nos resultados Tambeacutem eacute apresentada uma seccedilatildeocontendo as ideias surgidas durante o desenvolvimento deste trabalho que ficarampara ser feitas no futuro devido agrave gama de informaccedilotildees que a mineraccedilatildeo dos dadostrouxe

4

Capiacutetulo 2

Evoluccedilatildeo e Mineraccedilatildeo deRepositoacuterios de Software

As linguagens de programaccedilatildeo estatildeo sempre evoluindo aumentando sua complexidade eexpressividade Da mesma forma aleacutem de se preocupar com dificuldades de estabelecercompatibilidade do software em relaccedilatildeo a tecnologias antigas desenvolvedores tambeacutemprecisam acompanhar essa evoluccedilatildeo das linguagens para que suas ferramentes natildeo setornem obsoletas [9] Isso agrega um grande desafio no desenvolvimento e evoluccedilatildeo desoftware

O conceito de evoluccedilatildeo de software amadureceu e se tornou um grande foco de pes-quisa Poreacutem nem sempre estudos de evoluccedilatildeo de software reconhecem a importacircncia daevoluccedilatildeo da linguagem de programaccedilatildeo no contexto do desenvolvimento de software [8]Quando um coacutedigo natildeo evolui junto com a linguagem com o objetivo de manter umacompatibilidade com versotildees anteriores sua capacidade de evoluccedilatildeo se torna limitada [9]

A refatoraccedilatildeo de coacutedigo que consiste em realizar mudanccedilas no coacutedigo fonte sem modi-ficar o comportamento observado do software [15] permite que a evoluccedilatildeo de linguagens eferramentas aconteccedilam mais naturalmente No entanto novos desafios surgem como porexemplo saber quando e como realizar a refatoraccedilatildeo de coacutedigo de forma eficiente e coesaDentre as teacutecnicas de pesquisa em engenharia de software para entender esse problematorna-se interessante explorar as teacutecnicas de mineraccedilatildeo de dados aplicados a repositoacuteriosde software com o objetivo de entender o relacionamento entre evoluccedilatildeo e refatoraccedilatildeo

Assim este capiacutetulo busca esclarecer conceitos e estrateacutegias de evoluccedilatildeo de softwaremineraccedilatildeo de repositoacuterios de software e o estado da arte sobre o assunto

5

21 Evoluccedilatildeo de Software

Durante o processo de produccedilatildeo e manutenccedilatildeo de software haacute a necessidade de diversastomadas de decisotildees sobre seu desenvolvimento como por exemplo decidir como melho-rar a qualidade do software Tais decisotildees precisam ser tomadas levando em consideraccedilatildeoo ambiente em que se estaacute inserido com novas tecnologias surgindo todos os dias fe-edback de usuaacuterios exigentes e concorrentes produzindo um software similar com ideiasinovadoras

Tudo isso acontece em um ritmo de constante mudanccedila e assim como diria Lehmaneacute imprescindiacutevel que software de sistemas sejam capazes de evoluir ou os mesmos correm orisco de sofrer uma morte prematura [16] fazendo assim da evoluccedilatildeo de software um con-ceito importante dentro do seu processo de desenvolvimento Essa evoluccedilatildeo deve ocorrerconsiderando o ambiente em que o software estaacute inserido o qual possui aspectos teacutecnicos esociais sua infraestrutura que pertence ao seu ambiente teacutecnico o qual sempre necessitamanutenccedilatildeo e ao mesmo tempo usuaacuterios que utilizam o software e estatildeo constantementeformando opiniotildees oferecendo feedback e na expectativa por novidades [7] Assim a me-dida que novas caracteriacutesticas satildeo desenvolvidas novas tecnologias de infraestrutura satildeonecessaacuterias novos requisitos satildeo adicionados e o sistema de software deve se adaptar aessas mudanccedilas

Com relaccedilatildeo aos aspectos sociais que envolvem a evoluccedilatildeo do software eacute importanteressaltar os conceitos baacutesicos de como essa evoluccedilatildeo acontece Durante um estudo empiacutericopioneiro na aacuterea de evoluccedilatildeo de software para sistemas de grande escala Lehman e seuscolaboradores formularam um conjunto de observaccedilotildees que hoje satildeo conhecidas como asleis da evoluccedilatildeo de software ou simplesmente Leis de Lehman [16] No geral as leis deevoluccedilatildeo de software podem ser descritas da seguinte forma [16]

1 Mudanccedila contiacutenua um sistema se tornaraacute progressivamente menos satisfatoacuteriopara seus usuaacuterios com o tempo a menos que se adapte continuamente agraves necessi-dades que surgiratildeo

2 Complexidade Crescente um sistema se tornaraacute cada vez mais complexo amenos que se trabalhe para explicitamente reduzir sua complexidade

3 Auto-regulaccedilatildeo o processo de evoluccedilatildeo de software eacute auto-regulatoacuterio no que dizrespeito agraves distribuiccedilotildees dos artefatos e produtos produzidos

4 Conservaccedilatildeo da estabilidade organizacional a taxa meacutedia de atividade globalefetiva em um sistema em evoluccedilatildeo natildeo muda com o tempo ou seja a meacutedia detrabalho e esforccedilo colocado em cada entrega do sistema permanece a mesma

6

5 Conservaccedilatildeo de familiaridade a quantidade de conteuacutedo novo em cada entregado sistema tende a se manter constante com o tempo

6 Crescimento contiacutenuo A quantidade de funcionalidades em um sistema cresceraacutecom o tempo com o objetivo de satisfazer seus usuaacuterios

7 Decliacutenio de qualidade Um sistema seraacute percebido com qualidade inferior como passar do tempo a menos que seu design tenha uma manutenccedilatildeo minuciosa e seadapte a novas restriccedilotildees

8 Sistema de Feedback Evoluir um sistema com sucesso requer reconhecer que oprocesso de desenvolvimento acontece em um sistema de feedback de vaacuterios ciclosagentes e niacuteveis

Os aspectos teacutecnicos que envolvem a evoluccedilatildeo de software levam em consideraccedilatildeo astecnologias utilizadas para o seu desenvolvimento desde a linguagem de programaccedilatildeo agravesmaacutequinas onde o software seraacute hospedado que sofrem atualizaccedilotildees recebem novas versotildeescom novas caracteriacutesticas implementadas

Um estudo realizado por Lavre mostra como a evoluccedilatildeo das linguagens de programa-ccedilatildeo no contexto da evoluccedilatildeo de software muitas vezes satildeo subestimadas uma vez quemuitos podem considerar em seus estudos a linguagem de computaccedilatildeo como um artefatoimutaacutevel [8] Por exemplo coloca-se muita ecircnfase e cuidado para realizar o versionamentode coacutedigo fonte de um software mas este pode ser tornar inutilizaacutevel futuramente se nin-gueacutem souber qual versatildeo de compilador determinada versatildeo de coacutedigo foi desenvolvida

Para natildeo se deixar estagnar linguagens de programaccedilatildeo precisam se adaptar e evoluirQuando uma linguagem de programaccedilatildeo atualiza softwares que eram antes consideradosatualizados podem se tornar rapidamente obsoletos E ao mesmo tempo que novascaracteriacutesticas satildeo adicionadas a linguagem precisa fornecer compatibilidade com versotildeesanteriores aumentando sua complexidade Desenvolvedores entatildeo encontram-se tambeacutemem um empasse buscando um equiliacutebrio entre manter a compatibilidade da ferramentacom versotildees anteriores da linguagem e atualizaacute-la para manter o software atualizado [9]

A estrateacutegia de refatoraccedilatildeo de coacutedigo pode ser uma opccedilatildeo que permite a linguageme o software co-evoluiacuterem com um menor grau de dificuldade [9] Refatoraccedilatildeo (do inglecircsrefactoring) eacute o processo de modificaccedilatildeo de um software com o objetivo de melhorar a es-trutura interna do mesmo sem alterar sua percepccedilatildeo externa Eacute uma maneira disciplinadade melhorar o design do coacutedigo apoacutes ele jaacute ter sido implementado Por exemplo dividiruma funcionalidade grande feita em apenas um bloco de coacutedigo em vaacuterios moacutedulos [15]

A refatoraccedilatildeo de coacutedigo pode ser um meio utilizado para evoluir o software adaptandoo coacutedigo com caracteriacutesticas novas introduzidas pela linguagem modificando o design dosistema sem comprometer sua integridade No entanto novos desafios surgem visto que

7

refatorar o coacutedigo fonte de um sistema de grande porte natildeo eacute uma tarefa faacutecil havendo anecessidade de ferramentas que possam automatizar o processo ou realizar um estudo paraentender como as novas caracteriacutesticas da linguagem podem ser utilizadas para substituirou melhorar funcionalidades obsoletas [9]

22 MSR Mineraccedilatildeo de dados e a Engenharia deSoftware

Com o objetivo de compreender prever e planejar os vaacuterios aspectos do desenvolvimentode um projeto em especial tudo que possa impactar na evoluccedilatildeo de software a teacutecnicade mineraccedilatildeo de dados tem sido bastante utilizada em engenharia de software [17]

O termo Mineraccedilatildeo de Repositoacuterios de Software (MSR) tem sido utilizado para descre-ver vaacuterias maneiras de se examinar repositoacuterios de software Um repositoacuterio de softwarepode ser considerado um artefato que eacute produzido e arquivado durante a evoluccedilatildeo desoftware [1] Estes responsoacuterios armazenam informaccedilotildees que podem fornecer todos osdetalhes de desenvolvimento do software provendo meios necessaacuterios para uma anaacuteliseaprofundada de evoluccedilatildeo de software

Repositoacuterios de software satildeo comumente utilizados para armazenar e acompanhar ohistoacuterico de desenvolvimento do software mas raramente usados para tomada de deci-sotildees em relaccedilatildeo ao projeto Assim pesquisadores de MSR buscam modificar a impressatildeode que tais repositoacuterios satildeo estaacuteticos que servem apenas para manutenccedilatildeo de registrostransformando-os em repositoacuterios ativos que podem auxiliar na tomada de decisatildeo em pro-jetos de software modernos atraveacutes da identificaccedilatildeo de padrotildees para realizar a propagaccedilatildeode mudanccedilas [18]

221 Classificaccedilatildeo

De acordo com Kagdi et al dentre as abordagens de MSR utilizadas atualmente eacute possiacuteveldescrevecirc-las para entatildeo comparaacute-las e possivelmente classificaacute-las levando em considera-ccedilatildeo uma taxonomia de quatro dimensotildees os repositoacuterios de software utilizados (fontes dedados) o propoacutesito do MSR a metodologia e a avaliaccedilatildeo da abordagem [1] como mostraa Figura 21 onde as taxonomias destacadas em amarelo satildeo as que prevaleceram poreacutemnatildeo exclusivamente na metodologia adotada por este trabalho

8

Figura 21 Taxonomia em camadas adaptada do trabalho de Kagdi et al [1]

Fontes de Dados

As fontes de informaccedilatildeo variam de acordo com a abordagem utilizada e dentre as informa-ccedilotildees mineradas em repositoacuterios de software inclui-se as seguintes categorias os artefatosde software e suas versotildees as diferenccedilas entre os artefatos de software e suas versotildees e osmetadados sobre as mudanccedilas no software

As fontes de dados podem ser melhor classificadas de acordo com Hassan et al [17]

bull Repositoacuterios de controle de Versatildeo estes repositoacuterios guardam o histoacuterico de desen-volvimento de um projeto armazenando todas as mudanccedilas no coacutedigo fonte assimcomo os metadados associados com cada mudanccedila Exemplos git SVN

bull Bug repositories Estes repositoacuterios rastreiam o histoacuterico de resoluccedilatildeo de bugs quesatildeo reportados por usuaacuterios e desenvolvedores Exemplos Bugzilla e Jira

9

bull Histoacuterico de Comunicaccedilatildeo (Archived communications) estes repositoacuterios rastreiamdiscussotildees sobre os vaacuterios aspectos de um projeto de software por sua vida uacutetil Porexemplo listas de e-mails

bull Deployment logs logs com informaccedilotildees do software gerados por ferramentas dedesenvolvimento

bull Repositoacuterios de software Repositoacuterios onde o coacutedigo fonte de vaacuterios projetos satildeoarmazenados como por exemplo Sourceforgenet

No contexto deste trabalho estes repositoacuterios consistem em fontes de coacutedigo armaze-nadas em sistemas de controle de versatildeo especificamente coacutedigos na plataforma Github

O propoacutesito

O propoacutesito da mineraccedilatildeo de repositoacuterios de software se resume nas perguntas de pes-quisa que podem ser respondidas utilizando mineraccedilatildeo Assim existem duas classes deperguntas de pesquisa para MSR [1]

A primeira eacute a pergunta de anaacutelise market-basket1 ldquoSe A acontece o que mais podeacontecerrdquo A resposta para este tipo de pergunta eacute um conjunto de regras descrevendotendecircncias de relacionamentos como por exemplo se A acontecer entatildeo B e C acontecemdurante um periacuteodo X

A segunda classe diz respeito agraves perguntas de prevalecircncia (Prevalence Questions -PQ) como por exemplo perguntas do tipo ldquoA funcionalidade Y foi modificadardquo quepossuem uma resposta booleana ou ldquoQuantas vezes esta funcionalidade Y foi modificadardquocontendo uma resposta quantitativa

As perguntas de pesquisa deste trabalho se encaixam majoritariamente na segundaclasse onde o objetivo traccedilado eacute respondido de forma quantitativa com algumas tentativasde classificaccedilatildeo de tipos de repositoacuterios como seraacute descrito nos capiacutetulos seguintes

A metodologia

A metodologia corresponde a maneira como as questotildees de MSR iratildeo ser respondidas evaacuterias abordagens estatildeo disponiacuteveis Poreacutem Kagdi indica duas estrateacutegias baacutesicas quepodem ser utilizadas

Primeiramente pode-se utilizar a mediccedilatildeo indireta e anaacutelise da evoluccedilatildeo do softwareEsta abordagem pode ser realizada da seguinte forma extrair e computar informaccedilotildeesde cada versatildeo de um software separadamente e em seguida individualmente comparar

1Anaacutelise Market-basket eacute uma teacutecnica de modelagem baseada na teoria de que se vocecirc comprar certostipos de produtos vocecirc haacute uma probabilidade maior (ou menor) de comprar outros tipos de produtos [19]

10

propriedades encontradas como por exemplo comparar duas versotildees distintas de umsoftware atraveacutes de um repositoacuterio github realizando uma investigaccedilatildeo de alto niacutevel noque diz respeito a evoluccedilatildeo do software [1]

A segunda perspectiva de metodologia que pode ser utilizada corresponde agrave mediccedilatildeodireta e anaacutelise da evoluccedilatildeo do software Ela diz respeito agraves investigaccedilotildees que estudamos mecanismos que leva um software a ser modificado de uma versatildeo para outra focandonas diferenccedilas especiacuteficas entre estas versotildees como por exemplo examinando mudanccedilasespeciacuteficas das classes arquivos funccedilotildees de cada parte do coacutedigo [1]

Assim eacute possiacutevel descrever explicitamente que este trabalho utiliza em sua maioriauma metodologia com mediccedilotildees diretas atraveacutes da anaacutelise estaacutetica de informaccedilotildees docoacutedigo fonte de diferente versotildees para analisar os diferentes padrotildees de desenvolvimentoem que expressotildees lambda (definidas no capiacutetulo seguinte) satildeo utilizadas

A Avaliaccedilatildeo

Por fim existem diversas formas para se avaliar o estudo realizado sempre levando emconsideraccedilatildeo a validade dos resultados obtidos Pode-se utilizar de meacutetricas para avaliar osdados considerando o quanto das informaccedilotildees obtidas satildeo relevantes Outra forma de seavaliar seria atraveacutes da utilizaccedilatildeo de modelos probabiliacutesticos seguindo uma abordagemde teoria da informaccedilatildeo Assim foram utilizadas determinadas meacutetricas quantitativaspara avaliar os resultados obtidos neste trabalho

23 Trabalhos Relacionados

Como ressaltado na introduccedilatildeo o foco deste trabalho encontra-se em utilizar teacutecnicas deMSR para caracterizar a adoccedilatildeo de expressotildees lambda em repositoacuterios Java Ao reali-zar um estudo sobre o estado da arte encontrou-se diversos trabalhos que utilizam deMSR para obter informaccedilotildees relevantes sobre repositoacuterios de software em diversos focose em especial trabalhos que investiguem repositoacuterios na linguagem Java Jaacute existemtambeacutem alguns trabalhos que apresentam ferramentas de refatoraccedilatildeo de coacutedigo para im-plementaccedilatildeo de expressotildees lambda com foco na evoluccedilatildeo do software Dentre os trabalhosencontrados mencionados destacam-se

bull Em um trabalho sobre utilizaccedilatildeo de refatoraccedilatildeo de coacutedigo para realizar a transiccedilatildeode coacutedigo Java para as novas caracteriacutesticas implementadas no Java 8 Gyori et alapresenta uma ferramenta que automatiza com sucesso o trabalho de conversatildeo decoacutedigo como Annonymous Inner Class para expressotildees lambda [12] O capiacutetulo aseguir descreve em detalhes estes conceitos

11

bull Regrowing a Language de Overbey apresenta um estudo sobre a importacircncia da co-evoluccedilatildeo entre a linguagem de programaccedilatildeo e os projetos de software focando naslinguagens Fortran e Java e provando como ferramentas de refatoraccedilatildeo de coacutedigoauxiliam para que o software consiga evoluir juntamente com sua linguagem deprogramaccedilatildeo [9]

bull O trabalho sobre a adoccedilatildeo de generics em coacutedigo Java feito por Parnin utiliza demineraccedilatildeo de dados para realizar uma investigaccedilatildeo empiacuterica avaliando projetos decoacutedigo aberto com o objetivo de observar como desenvolvedores destes projetos estatildeoutilizando generics em Java [20]

Os estudos mencionados focam em assuntos particulares pertinentes a este trabalhoem que de um lado tem-se trabalhos que mostram a necessidade de refatoraccedilatildeo de coacutedigopara evoluccedilatildeo de software e do outro tem-se trabalhos que mostram que eacute possiacutevel utilizarde MSR para entender melhor como a evoluccedilatildeo da linguagem de programaccedilatildeo Java temafetado projetos reais de coacutedigo aberto e como estes projetos estatildeo se adaptando a estasevoluccedilotildees

12

Capiacutetulo 3

Java SE 8 e JDK 8

Este trabalho tem como objetivo caracterizar a adoccedilatildeo de expressotildees Lambda em siste-mas Java que podem ser considerados legados pois foram concebidos em um momentoanterior a introduccedilatildeo dessa nova caracteriacutestica na linguagem Java Com o intuito de faci-litar o entendimento do leitor sobre tais construccedilotildees esse capiacutetulo apresenta informaccedilotildeeshistoacutericas referentes agrave linguagem Java desde sua criaccedilatildeo ateacute a sua ascensatildeo como umadas linguagens de programaccedilatildeo mais populares Aleacutem disso seratildeo apresentadas as novascaracteriacutesticas presentes na versatildeo Java SE 8 com destaque nas expressotildees Lambda e deque forma vieram para auxiliar no desenvolvimento de sistemas

31 Histoacuterico

Java eacute uma linguagem de programaccedilatildeo orientada a objetos para propoacutesitos gerais [21] Alinguagem nasceu com o nome de Oak no ano de 1991 com o foco em televisotildees digitais acabo mas devido agrave complexidade e poder da linguagem logo expandiu-se para os outrosdomiacutenios principalmente a Internet [22] Posteriormente a linguagem recebeu o nome deGreentalk devido agrave marca Oak jaacute ser registrada por outra empresa e o principal projeto daequipe se chamar Green Por fim o nome Java foi o mais votado pela equipe da Sun emuma reuniatildeo para decidir o mais raacutepido possiacutevel um nome definitivo para a linguagem [23]

Em 1995 em sua primeira versatildeo puacuteblica 10 a linguagem Java jaacute comeccedilava a terum crescimento em sua popularidade como Web Applet nos navegadores mais popularesfornecendo seguranccedila e rapidez nas plataformas mais utilizadas [24] A cada nova versatildeopublicada novas funcionalidades e plataformas eram adicionadas e tornavam a linguagemmais difundida no meio computacional fazendo com que em 2006 a linguagem fosse divi-dida em Java EE (foco em rede e serviccedilos web) Java ME (foco em sistemas embarcados)e Java SE (foco em desktops e servidores) [25]

13

Apoacutes anos de evoluccedilatildeo e aprimoramento atraveacutes de diversas versotildees como visto naTabela 31 hoje o Java se tornou uma das linguagens de programaccedilatildeo mais utilizadas nomundo estando em aproximadamente 15 das linhas de coacutedigo disponiacuteveis pela inter-net [11] A quantidade de plataformas suportadas pela linguagem e com o advento dosistema operacional Android sendo rodado na maior parte dos smartphones do mundoaleacutem da simplicidade em codificar no paradigma orientado a objetos foram os fatoresrelevantes para que a linguagem se popularizasse no mundo digital [26]

Tabela 31 As versotildees anteriores de java e principais caracteriacutesticasVersatildeo Principais caracteriacutesticasJava 10 JVM e JDKJava 2 Event Listeners

Kestrel (Java 3) HotSpot JVMMerlin (Java 4) Diversas novas APIs como Assertion e expressotildees regularesTiger (Java 5) Generics

Mustang (Java 6) Web ServicesDolphin (Java 7) Suporte a linguagens dinamicas

32 Princiacutepios

Com o foco em alcanccedilar a Web e participar mais ativamente do mercado virtual e e-Commerce foram projetados princiacutepios que permitissem com que a linguagem pudessealcanccedilar seus objetivos principais ao mesmo tempo que mantinha a facilidade e fami-liarizaccedilatildeo da linguagem a seus desenvolvedores [27] Dessa forma a equipe da Oracledeterminou cinco princiacutepios que caracterizariam o foco da linguagem Java

bull simples orientada a objeto e familiar projetada para ser orientada a objeto epermitir que seus desenvolvedores comecem a codificar rapidamente sem a necessi-dade de uma curva de aprendizagem acentuada

bull segura e robusta projetada para prover software confiaacutevel por meio de checagensa tempo de compilaccedilatildeo e execuccedilatildeo Haacute uma grande preocupaccedilatildeo com seguranccediladevido agrave larga utilizaccedilatildeo da linguagem em sistemas distribuiacutedos

bull de arquitetura neutra e portaacutevel projetada para ser independente de qualquerarquitetura bastando rodar a JVM dessa forma garantindo a portabilidade paravaacuterios ambientes e dispositivos

14

bull executada em alta performance projetada para fornecer a maior performancepossiacutevel em tempo de execuccedilatildeo com a utilizaccedilatildeo do garbage collector em uma threadde baixa prioridade

bull interpretada dinacircmica e threaded projetada para ser interpretada por qual-quer dispositivo que possua JVM desenvolvida garantindo um desenvolvimento raacute-pido e em ciclos O uso da classe Thread permite que a linguagem acompanhe atendecircncia do paralelismo Aleacutem disso a ligaccedilatildeo de classes eacute feita em tempo real esomente quando necessaacuteria tornando-a dinacircmica

33 Evoluccedilatildeo

A primeira versatildeo do Java 8 foi lanccedilada em 2014 [28] e apresentou diversas atualizaccedilotildeesespalhadas em categorias como linguagem seguranccedila Collections ferramentas deployentre outras Dentre a grande quantidade de mudanccedilas os destaques se encontraram nasnovas melhorias presentes na linguagem que afetaram de forma mais direta a maneiracom que os desenvolvedores passaram a tratar e organizar o coacutedigo fonte As atualizaccedilotildeesreferentes a linguagem descritas oficialmente pela Oracle [29] satildeo

1 Lambda Expressions ou apenas Expressotildees Lambda correspondem a uma novacaracteriacutestica que permite que uma pequena funcionalidade possa ser utilizada comoum argumento de um meacutetodo facilitando a escrita de accedilotildees que seratildeo feitas repetida-mente em uma Collection ou quando um processo se completa ou quando encontraum erro Eacute tambeacutem uma forma compacta de se escrever coacutedigo que previamenteera escrito com anonymous inner classes [29] A Listagem 31 mostra uma classehipoteacutetica Calculator cujo meacutetodo operateBinary() recebe como paracircmetro doisinteiros e um objeto da classe IntegerMath que representa a operaccedilatildeo que deveraacuteser realizada ou seja uma funcionalidade dinacircmica

1 pub l i c c l a s s Ca l cu la to r 2

3 i n t e r f a c e IntegerMath 4 i n t opera t i on ( i n t a i n t b) 5 6

7 pub l i c i n t operateBinary ( i n t a i n t b IntegerMath op ) 8 re turn op opera t i on (a b) 9

10

11 pub l i c s t a t i c void main ( St r ing a rgs ) 12

15

13 Calcu la to r myApp = new Ca lcu la to r ( ) 14 IntegerMath add i t i on = (a b) minusgt a + b 15 IntegerMath subt ra c t i on = (a b) minusgt a minus b 16 System out p r i n t l n ( 40 + 2 = +17 myApp operateBinary (40 2 add i t i on ) ) 18 System out p r i n t l n ( 20 minus 10 = +19 myApp operateBinary (20 10 sub t ra c t i on ) ) 20 21 22

Listagem 31 Exemplo de coacutedigo com o uso de Expressatildeo Lambda [30]

2 Method References Frequentemente expressotildees lambda criam meacutetodos anocircni-mos Algumas vezes poreacutem satildeo utilizadas para chamar um meacutetodo jaacute existentena classe Ao inveacutes de escrever a expressatildeo Lambda para esse caso pode-se optarpor utilizar um Method Reference que facilita a escrita e leitura desse uso de ex-pressatildeo Lambda [29] A Listagem 32 mostra um exemplo de um meacutetodo estaacuteticoque compara duas pessoas pelas suas idades e a Listagem 33 a utilizaccedilatildeo de MethodReference para aplicar a utilizaccedilatildeo desse meacutetodo em um array e reduzir a escrita deuma expressatildeo lambda a uma forma mais legiacutevel

1 pub l i c s t a t i c i n t compareByAge ( Person a Person b) 2 re turn a b i r thday compareTo (b b i r thday ) 3 4

Listagem 32 Exemplo de meacutetodo de uma classe Pessoa [31]

1 Arrays s o r t ( rosterAsArray Person compareByAge ) 2

Listagem 33 Exemplo de uso de Method Reference [31]

3 Default Methods satildeo meacutetodos com a palavra-chave default que servem para adi-cionar implementaccedilotildees de meacutetodos a uma interface de alguma biblioteca mantendoa compatibilidade binaacuteria com versotildees mais antigas dessa interface Tambeacutem pos-sibilita a implementaccedilatildeo de meacutetodos estaacuteticos em interfaces [29] A Listagem 34apresenta a inclusatildeo de um meacutetodo default na interface TimeClient

1 pub l i c i n t e r f a c e TimeClient 2 void setTime ( i n t hour i n t minute i n t second ) 3 void setDate ( i n t day i n t month i n t year ) 4 void setDateAndTime ( i n t day i n t month i n t year 5 i n t hour i n t minute i n t second )

16

6 LocalDateTime getLocalDateTime ( ) 7

8 s t a t i c ZoneId getZoneId ( S t r ing zoneStr ing ) 9 t ry

10 re turn ZoneId o f ( zoneStr ing ) 11 catch ( DateTimeException e ) 12 System e r r p r i n t l n ( I n v a l i d time zone + zoneStr ing

+13 us ing d e f a u l t time zone in s t ead ) 14 re turn ZoneId systemDefault ( ) 15 16 17

18 d e f a u l t ZonedDateTime getZonedDateTime ( St r ing zoneStr ing ) 19 re turn ZonedDateTime o f ( getLocalDateTime ( ) getZoneId (

zoneStr ing ) ) 20 21 22

Listagem 34 Exemplo de interface com um meacutetodo default [32]

4 Repeating Annotations permitem a implementaccedilatildeo e utilizaccedilatildeo de anotaccedilotildees deum mesmo tipo que podem ser utilizadas mais de uma vez para a mesma declara-ccedilatildeo [29] A Listagem 35 apresenta duas anotaccedilotildees iguais com paracircmetros diferentespermitindo uma customizaccedilatildeo maior na aplicaccedilatildeo de um tipo de anotaccedilatildeo

1 Schedule ( dayOfMonth= l a s t )2 Schedule (dayOfWeek= Fr i hour= 23 )3 pub l i c void doPeriodicCleanup ( ) 4

Listagem 35 Exemplo de Repeating Annotations [33]

5 Type Annotations permitem que anotaccedilotildees possam ser utilizadas em tipos aleacutemde declaraccedilotildees dessa forma pode-se garantir que um campo sempre atenda agraves suasexpectativas e evite testes desnecessaacuterios [29] A Listagem 36 mostra um exemplo derestriccedilatildeo a uma String que nunca poderaacute ser nula devido agrave anotaccedilatildeo de NonNull

1 NonNull S t r ing s t r

Listagem 36 Exemplo de Type Annotation garantindo que o campo nunca seja null [34]

17

34 Expressotildees Lambda

Uma das mudanccedilas mais interessantes implementadas no Java 8 foi a adiccedilatildeo de expressotildeeslambda As expressotildees lambda permitem que a linguagem Java possa atuar parcialmentecomo uma linguagem de programaccedilatildeo funcional onde comportamentos satildeo avaliados eaplicados diferentemente da programaccedilatildeo imperativa que foca na mudanccedila de estadosNa praacutetica um comportamento pode ser passado como paracircmetro de um meacutetodo atraveacutesde uma escrita mais reduzida e legiacutevel Os benefiacutecios de utilizar expressotildees lambda incluemuma melhora na legibilidade e organizaccedilatildeo de coacutedigo que antes era escrito com AnonymousInner Class aleacutem de permitir uma forma simples de utilizar comportamento paralelo como uso de Streams

341 Sintaxe

A sintaxe de uma expressatildeo lambda eacute dividida nas seguintes partes [30]

bull Uma lista de paracircmetros separados por viacutergulas

bull Um token representado por uma seta -gt

bull Um corpo que pode ser representado por uma expressatildeo uacutenica ou um bloco de coacutedigodentro de chaves

As Listagens 37 e 38 mostram duas formas diferentes de se aplicar expressotildees Lambdacom uma sintaxe similar A primeira aplica a expressatildeo diretamente apoacutes a seta utilizadanormalmente para trechos de coacutedigo pequenos e simples e a segunda utiliza-se de chavespara incorporar o coacutedigo e da palavra-chave return para especificar o retorno forma maisutilizada para uma quantidade maior de coacutedigo

1 p minusgt p getGender ( ) == Person Sex MALE2 ampamp p getAge ( ) gt= 183 ampamp p getAge ( ) lt= 25

Listagem 37 Exemplo de expressatildeo lambda com uma expressatildeo [30]

1 p minusgt 2 re turn p getGender ( ) == Person Sex MALE3 ampamp p getAge ( ) gt= 184 ampamp p getAge ( ) lt= 25 5

Listagem 38 Exemplo de expressatildeo lambda com um bloco de coacutedigo [30]

18

342 Principais formas de uso

Anonymous Inner Class

Antes do Java 8 a necessidade de passar funccedilotildees ou expressotildees como paracircmetro de algummeacutetodo era suprida atraveacutes de Anonymous Inner Classes A utilizaccedilatildeo desse tipo dedeclaraccedilatildeo junto com a anotaccedilatildeo de Override permite sobrescrever um meacutetodo de umainterface funcional e ao mesmo tempo passa-la como argumento para um meacutetodo Umaexpressatildeo lambda se comporta da mesma forma poreacutem a quantidade de coacutedigo escritopela Anonymous Inner Class eacute maior e pode dificultar a leitura de coacutedigo pois conteacutemmuita informaccedilatildeo natildeo utilizada para efetivo entendimento do que estaacute sendo feito naqueletrecho

A Listagem 39 apresenta a instanciaccedilatildeo da classe EventHandler internamente ao meacute-todo setOnAction() de forma que o desenvolvedor possa escrever o comportamento quedeseja passar como paracircmetro do meacutetodo atraveacutes da substituiccedilatildeo do meacutetodo handle()que jaacute existe pelo meacutetodo handle() criado e escrito pelo desenvolvedor

1 btn setOnAction (new EventHandlerltActionEvent gt() 2 Override3 pub l i c void handle ( ActionEvent event ) 4 System out p r i n t l n ( He l lo World ) 5 6 )

Listagem 39 Exemplo de uso de Anonymous Inner Class [35]

Interface funcional

Ao projetar um coacutedigo novo o desenvolvedor que optar por utilizar expressotildees lambdadeve iniciar com a criaccedilatildeo de uma interface funcional Esse tipo de interface possui umuacutenico meacutetodo abstrato permitindo que expressotildees lambda sejam usadas para sobrescrevero comportamento do meacutetodo abstrato Uma interface funcional pode possuir outros meacuteto-dos desde que sejam default Uma nova anotaccedilatildeo FunctionalInterface foi adicionadacom a atualizaccedilatildeo do Java 8 para conferir em tempo de compilaccedilatildeo se a interface satisfazos requisitos desse modelo de interface

A Listagem 310 apresenta um exemplo de interface funcional com o objetivo de permi-tir o uso de expressotildees lambda que utilizaratildeo de dois Double como paracircmetro e jaacute utilizada nova anotaccedilatildeo FunctionalInterface introduzida no Java 8

1 Funct iona l Inte r face2 pub l i c i n t e r f a c e DoubleOp 3 pub l i c Double apply ( Double a Double b)

19

4

Listagem 310 Exemplo de interface funcional

Dessa forma conforme as Listagens 311 e 312 o meacutetodo apply() pode tomar formade qualquer operaccedilatildeo entre dois Double que seraacute especificada quando a expressatildeo lambdafor montada dando o aspecto de linguagem funcional agrave linguagem e mais facilidade eliberdade ao desenvolvedor

1 pub l i c c l a s s Ca l cu la to r 2 pub l i c s t a t i c Double c a l c ( Double op1 Double op2 DoubleOp operator ) 3 re turn operator apply ( op1 op2 ) 4 5

Listagem 311 Exemplo de aplicaccedilatildeo da interface funcional

1 Double r e s u l t 1 = Ca lcu la to r c a l c (10d 50d ( a b ) minusgt a + b)

Listagem 312 Uso de expressatildeo lambda para o exemplo anterior

Collections

Dentre as atualizaccedilotildees de pacotes do Java 8 foi adicionado um meacutetodo stream() nainterface Collection Esse meacutetodo trata as Collection como streams o que significa queapesar de natildeo ser possiacutevel acessar elementos diretamente algumas novas manipulaccedilotildeessatildeo possiacuteveis Essas manipulaccedilotildees satildeo na verdade meacutetodos da interface Stream quepodem receber como paracircmetro uma expressatildeo lambda ou seja um comportamento a seraplicado agrave Collection Dentre os meacutetodos temos

bull filter() O meacutetodo filter() recebe uma expressatildeo lambda contendo uma condiccedilatildeopara filtragem da collection

bull map() O meacutetodo map() mapeia os elementos de uma Collection em outro objetocomo uma String A expressatildeo lambda passada por paracircmetro deve retornar o tipode objeto ao qual seraacute mapeado

bull forEach() O meacutetodo forEach() aplica uma operaccedilatildeo especiacutefica para cada ele-mento da Collection A expressatildeo lambda a ser passada deve conter a operaccedilatildeo aser realizada

bull min() e max() Os meacutetodos min() e max() retornam o elemento menor ou maiorda Collection dependendo da expressatildeo lambda passada como paracircmetro

20

A Listagem 313 demonstra como vaacuterias operaccedilotildees com uma Collection podem seraplicadas de uma vez de forma que lendo a expressatildeo lambda jaacute eacute possiacutevel saber oresultado da aplicaccedilatildeo do meacutetodo agrave Collection

1 r o s t e r2 stream ( )3 f i l t e r (4 p minusgt p getGender ( ) == Person Sex MALE5 ampamp p getAge ( ) gt= 186 ampamp p getAge ( ) lt= 25)7 map(p minusgt p getEmailAddress ( ) )8 forEach ( emai l minusgt System out p r i n t l n ( emai l ) )

Listagem 313 Exemplo de utilizaccedilatildeo de meacutetodos de stream com expressotildees lambda [30]

21

Capiacutetulo 4

Estudo e o Processo de Mineraccedilatildeo

A definiccedilatildeo da metodologia utilizada para realizaccedilatildeo deste trabalho eacute importante para queexista uma padronizaccedilatildeo e melhor entendimento de como os resultados foram obtidos paraque a replicaccedilatildeo do mesmo possa ser realizada em trabalhos futuros [36]

Figura 41 Processo utilizado para realizaccedilatildeo do estudo

O esquema representado na Figura 41 descreve o processo seguido para a realizaccedilatildeodeste trabalho que foi divido em trecircs grandes etapas a de planejamento definindo osobjetivos questotildees de pesquisa e meios de investigaccedilatildeo deste projeto a etapa de execuccedilatildeorealizando todo o procedimento metodoloacutegico definido para a coleta e refinamento de

22

dados e a etapa de avaliaccedilatildeo onde foram classificados e avaliados os dados coletadospara responder agraves questotildees de pesquisa

A seguir na primeira seccedilatildeo seratildeo apresentadas em detalhes as questotildees de pesquisa aserem respondidas Em seguida seraacute feito uma breve descriccedilatildeo da fonte de dados utilizada- especificamente os projetos utilizados como objetos de estudo deste trabalho e por fimtodo o restante da metodologia que foi de fato desenvolvida para obter os resultadosnecessaacuterios

41 Questotildees de Pesquisa

Com o objetivo de entender e caracterizar melhor o uso de expressotildees lambda foramdefinidas as seguintes questotildees de pesquisa a serem respondidas

bull PQ-1 Quando os projetos comeccedilaram a introduzir o uso de expressotildees lambda emseus coacutedigos e qual a meacutedia de expressotildees lambda por snapshots caso existam

bull PQ-2 Como as equipes de desenvolvimento estatildeo utilizando expressotildees lambdaatraveacutes de refatoraccedilatildeo de coacutedigo ou introduzindo apenas em coacutedigo novo

bull PQ-3 Quais satildeo os padrotildees tipicamente adotados para o uso de expressotildees lambda

A primeira pergunta de pesquisa gira em torno de como projetos populares open-sourceestatildeo se adaptando agrave introduccedilatildeo de expressotildees lambda em Java muitos projetos jaacute estatildeoutilizando as expressotildees lambda Se sim a partir de quando comeccedilaram a utilizaacute-lasdesde o iniacutecio da introduccedilatildeo das mesmas no Java 8 ou em um periacuteodo mais tardio Aleacutemdisso eacute interessante descobrir se a utilizaccedilatildeo dessa nova caracteriacutestica tem acontecido deforma expressiva ou natildeo

Em seguida para melhor entender a forma como as expressotildees lambda estatildeo sendointroduzidas em projetos eacute interessante investigar se as equipes de desenvolvimento estatildeose preocupando em refatorar coacutedigo com o objetivo de evoluir o software ou se estatildeoexperimentando utilizar expressotildees lambda apenas em coacutedigo novo introduzido

Como a introduccedilatildeo de novas funcionalidades em projetos open-source de grande escaladepende do objetivo do projeto e os padrotildees de projeto utilizados [37] espera-se obser-var diversas abordagens quanto a utilizaccedilatildeo de expressotildees lambda para entatildeo poderclassificar estes softwares quanto a abordagem utilizada

Eacute de grande importacircncia para este estudo conseguir identificar na praacutetica comoexpressotildees lambda estatildeo sendo tipicamente adotadas nestes projetos Assim a terceirapergunta de pesquisa busca identificar alguns exemplos de utilizaccedilatildeo atraveacutes da realizaccedilatildeode alguns estudos de caso

23

Eacute importante ressaltar que apesar de as expressotildees lambda serem uma alternativa aouso de AIC elas natildeo os substituem completamente Existem precondiccedilotildees para que umaAIC possa ser substituiacuteda por expressotildees lambda [12] descritas a seguir

bull AIC deve instanciar-se de uma interface

bull AIC natildeo deve possuir nenhum campo e declarar apenas um meacutetodo

bull AIC natildeo deve possuir uma referecircncia para this ou super

bull AIC natildeo deve declarar um meacutetodo recursivo

Para responder agrave primeira pergunta apenas dados gerais sobre todos os projetos seratildeonecessaacuterios ao passo que pelas perguntas 2 e 3 possuiacuterem uma natureza mais complexaseraacute necessaacuterio aleacutem de uma anaacutelise geral estatiacutestica a realizaccedilatildeo de alguns estudos decaso para obter resultados mais completos

42 Fonte de Dados e Objetos de Estudo

Para responder agraves perguntas de pesquisa estabelecidas foram selecionados os 99 projetosmais populares na linguagem Java dentro da plataforma github ateacute a data da coleta dosdados feita em Abril de 2017 Satildeo considerados populares os repositoacuterios que possuema maior quantidade possiacutevel de estrelas (stars) A decisatildeo de escolher os 99 projetos maispopulares foi por sua natureza imparcial e ao mesmo tempo para que se possa analisarprojetos que satildeo de familiaridade e conhecimento da comunidade do github e de domiacuteniopuacuteblico Os 99 projetos estatildeo listados no Anexo I

Para entender a transiccedilatildeo feita por esses projetos entre as versotildees anteriores do Java eo Java 8 com as expressotildees lambda eacute necessaacuterio analisar o coacutedigo de vaacuterias versotildees a fimde observar alguma mudanccedila para cada projeto Como satildeo 99 projetos e vaacuterios dessesprojetos possuem milhares de linhas de coacutedigo e commits seria impossiacutevel avaliar todosos commits Optou-se entatildeo por coletar snapshots mensais de cada projeto conformeprocedimento tambeacutem seguido anteriormente [38] Cada snapshots representa o estadodo projeto em um determinado mecircs e como criteacuterio de escolha padratildeo todos os snapshotsequivalem ao uacuteltimo commit realizado no determinado mecircs que este representa

O proacuteximo passo eacute determinar o periacuteodo de tempo em que esses snapshots seriamcoletados Como Java 8 (e consequentemente as expressotildees lambda) foi introduzidoapenas em meados de 2014 [28] coletar dados de projetos a partir de um periacuteodo muitoantes deste ano natildeo agregaria valor ao estudo em questatildeo Definiu-se entatildeo um periacuteodopara a coleta mensal desses snapshots atraveacutes dos anos Janeiro de 2013 um ano antesda introduccedilatildeo do Java 8 para que se pudesse identificar para todos os projetos o mecircs

24

exato em que expressotildees lambda foram introduzidas ateacute o mecircs da coleta de dados Abrilde 2017

Eacute importante ressaltar que a definiccedilatildeo dos meses foi definida do dia primeiro de ummecircs ao dia primeiro do proacuteximo mecircs e por consequecircncia alguns snapshots que deveriamrepresentar o final de determinado mecircs correspondem na verdade a commits realizadosno dia primeiro do mecircs seguinte Por exemplo pode existir casos em que o commit querepresente o mecircs de Marccedilo de 2016 seja na verdade o commit realizado no dia primeirode Abril de 2016 Isso se deve a natureza da forma como os resultados de log de commitssatildeo obtidos pelo git [39] Poreacutem isso natildeo interfere nas anaacutelises ou no propoacutesito destetrabalho uma vez que foram realizadas verificaccedilotildees e validaccedilotildees para que natildeo existamdatas repetidas (e consequentemente commits repetidos) por repositoacuterio

Neste trabalho o termo projeto e repositoacuterio foram utilizados de forma intercaladapara representar a mesma coisa o software desenvolvido que possui um repositoacuterio naplataforma github Os termos commit snapshops e versotildees tambeacutem representam a mesmacoisa uma vez que foi definido que seriam utilizados apenas um commit por mecircs pararepresentar um determinado snapshot ou versatildeo do repositoacuterio em questatildeo

Todos os 99 projetos seratildeo utilizados para a realizaccedilatildeo de uma anaacutelise geral de ca-racterizaccedilatildeo do uso de expressotildees lambda Para as anaacutelises aprofundadas foi feito umcriteacuterio de classificaccedilatildeo para que apenas alguns projetos possam ser analisados em niacutevelde coacutedigo como estudos de caso

Resumindo foram escolhidos os 99 projetos mais populares de Java no github cole-tando dados mensais de seus commits a partir do ano de 2013 ateacute a data da coleta dosdados lembrando que nem todos os projetos existem desde 2013 (projetos mais recentes)

43 Processo de Mineraccedilatildeo

A abordagem utilizada para coletar e analisar os 99 projetos escolhidos como mostra aFigura 42 foi realizada de forma automatizada utilizando scripts python e dois projetosdesenvolvidos em Java para a coleta e tratamento de dados como descrito a seguir

Primeiramente foi realizado uma coacutepia dos repositoacuterios atuais de todos os 99 projetosmais populares do github em Java Para automatizar o processo foi desenvolvido umscript em python que lista todos os projetos escolhidos clona todos os repositoacuterios emuma pasta na maacutequina local e cria um arquivo temporaacuterio com as informaccedilotildees do nomede cada repositoacuterio e seu caminho absoluto na maacutequina local

25

Figura 42 Metodologia implementada para coleta e tratamento de dados

Em seguida foi necessaacuterio realizar o checkout de todas as versotildees entre Janeiro de2013 a Abril de 2017 de cada projeto Por motivos de otimizaccedilatildeo de espaccedilo da maacutequinalocal e automatizaccedilatildeo no processo de checkout utilizou-se de um segundo script pythonque realizava as seguintes tarefas para cada mecircs em cada projeto verificar se dentreo mecircs estipulado houve algum commit para aquele projeto se sim pega-se o hash douacuteltimo commit do mecircs realiza o checkout conta-se a quantidade de linhas de coacutedigo emJava que o projeto tem utilizando a biblioteca cloc e armazena todas as informaccedilotildeespertinentes referentes a todos os projetos que naquele mecircs tiveram commits para que oprojeto static-analysis possa entatildeo ser executado sobre esses projetos naquele determinadomomento As informaccedilotildees coletadas que satildeo utilizadas pelo static-analysis correspondemao nome do projeto o hash do commit para aquela versatildeo a pasta onde o projeto estaacutearmazenado na maacutequina local a quantidade de linhas de coacutedigo Java do projeto e datareferente ao commit Essas informaccedilotildees satildeo pertinentes para que o projeto static-analysisconsiga funcionar de forma correta projeto este descrito em detalhes a seguir

431 static-analysis

O static-analysis foi um projeto desenvolvido anteriormente a este trabalho pelos alunosThiago Cavalcanti e Vinicius de Almeida cujo objetivo eacute realizar a anaacutelise estaacutetica de

26

coacutedigos-fonte Java e gerar arquivos de saiacuteda contendo informaccedilotildees de classes e meacutetodoscom suas devidas ocorrecircncias de caracteriacutesticas da linguagem [40]

A anaacutelise estaacutetica de coacutedigo consiste em analisar um coacutedigo-fonte sem a necessidadede executaacute-lo Esse tipo de anaacutelise eacute de extrema importacircncia para manter um coacutedigo dequalidade evitar futuras refatoraccedilotildees e obter informaccedilotildees estatiacutesticas de forma raacutepida epraacutetica [41]

Seguindo esse princiacutepio o static-analysis foi projetado para receber um arquivo deentrada csv seguindo o padratildeo

Tipo da Aplicaccedilatildeo Inicio do projeto Antes ou Apoacutes Java 5 Nome do ProjetoVersatildeo Caminho absolutoQuantidade de linhas de coacutedigo

Atraveacutes da informaccedilatildeo do caminho absoluto do projeto o static-analysis varre osdiretoacuterios em busca dos arquivos fonte java realiza o parse desses arquivos e utilizade Visitors para extrair as informaccedilotildees desejadas e exporta-las em arquivos csv Ouso de Visitors permite que sejam escolhidas as informaccedilotildees desejadas para a consultacomo expressotildees Lambda e AIC s aleacutem de possibilitar que sejam implementados novosVisitors conforme a linguagem evolua ou as necessidades mudem

Para este trabalho foram utilizados os Visitors de expressotildees Lambda map() filter()AICs e declaraccedilotildees de meacutetodos

432 BDAnalisador

Apoacutes obter todas as informaccedilotildees necessaacuterias geradas pelo static-analysis era preciso ma-nipular os dados de forma que facilitasse a coleta de dados para o estudo proposto Comovaacuterios arquivos em formato csv satildeo de difiacutecil manipulaccedilatildeo foi desenvolvido entatildeo umaferramenta chamada BDAnalisador Esta ferramenta eacute responsaacutevel por processar os arqui-vos em csv gerados pelo static-analysis e popular uma base de dados relacional MySQLcom as informaccedilotildees pertinentes a este estudo

O BDAnalisador foi desenvolvido com a intenccedilatildeo de tornar mais simples o trabalhocom os dados resultantes do static-analysis de forma que consultas em SQL pudessemser feitas a ponto de permitir a obtenccedilatildeo de resultados mais complexos Seguindo esseobjetivo o framework Hibernate foi escolhido como ferramenta para persistecircncia devidoa ser um framework jaacute consolidado no mercado e que de forma simples relaciona osobjetos Java ao banco de dados MySQL [42] A divisatildeo de classes foi projetada em quatroentidades Projeto Versao Classe e Metodo cada uma com seus respectivos camposcontendo as informaccedilotildees necessaacuterias para a pesquisa como pode ser visto na Figura 44Eacute importante ressaltar que a tabela de Versao guarda hashs de commits devido agrave escolhade utilizar commits para obter mais informaccedilatildeo de evoluccedilatildeo de coacutedigo em um menor

27

espaccedilo de tempo Aleacutem disso para este trabalho optou-se por persistir todos os meacutetodose classes de cada versatildeo sem se importar com a repeticcedilatildeo desses dados pois a hipoacutetesede haver grandes refatoraccedilotildees entre versotildees poderia comprometer a confiabilidade dasinformaccedilotildees

Figura 43 Diagrama de classes UML do BDAnalisador

Como visto na Figura 43 seguindo parcialmente a arquitetura MVC cada entidadepossui sua respectiva classe DAO(Data Access Object) para persistecircncia dos dados eapenas uma classe Controlador no projeto responsaacutevel pela manipulaccedilatildeo e parse dosdados dos arquivos csv gerados pelo static analysis para serem enviados agraves classes DAOO sistema inicia chamando o meacutetodo inicializar() da classe Controlador Esse meacutetodoeacute responsaacutevel por ler um arquivo de entrada csv que segue o mesmo modelo do arquivo dostatic-analysis citado na seccedilatildeo anterior O arquivo conteacutem os dados de todos os projetose suas respectivas versotildees dessa forma o meacutetodo instancia um objeto da classe Projetoe persiste o projeto no banco de dados Para cada versatildeo encontrada no arquivo deentrada o inicializar() aciona os meacutetodos responsaacuteveis por instanciar e preencher aslistas da classe Classe e Metodo Os meacutetodos responsaacuteveis por preencher as listas varremos arquivos csv gerados pelo static-analysis e fazem o parse das informaccedilotildees relevantescomo nomes dos meacutetodos e quantidades de lambdas para construir os objetos que seratildeogravados Ao final dos preenchimentos o objeto Versatildeo eacute instanciado e gravado no bancode dados atraveacutes de sua classe DAO ao mesmo tempo que grava suas respectivas Classese Metodos

28

Apoacutes vaacuterios testes e correccedilotildees de bugs o banco de dados se encontrava finalmente comas informaccedilotildees de 99 projetos Java open-source separados por um commit por mecircs desde2013 cada um com suas respectivas informaccedilotildees de classes meacutetodos e a quantidade deexpressotildees lambda filters e maps em cada meacutetodo Filter ou Filter pattern eacute o padratildeode projeto que tem como objetivo filtrar objetos de uma coleccedilatildeo (Collection) de acordocom algum criteacuterio Jaacute o map ou map pattern eacute um padratildeo que ldquomapeia os elementosde uma coleccedilatildeo aplicando uma funccedilatildeo a eles para uma nova coleccedilatildeo [43] A coleta deinformaccedilotildees sobre esses padrotildees podem ser uacuteteis para possiacuteveis anaacutelises de oportunidadesde uso de expressotildees lambda para refatoraccedilatildeo de coacutedigo

A Figura 44 mostra o esquema de como o banco de dados resultante foi gerado

Figura 44 Modelo relacional do banco de dados populado pelo BDAnalisador Imagemgerada com software DBeaver [2]

44 Classificaccedilatildeo e Anaacutelise

Com o banco de dados populado restam apenas as etapas de classificaccedilatildeo e anaacutelise pararesponder as questotildees de pesquisa propostas Para isso inicialmente houve uma tentativade se utilizar apenas queries SQL para analisar os dados de acordo com as informaccedilotildeesrelevantes Poreacutem devido ao fato de o banco de dados conter todas as informaccedilotildees detodos os projetos e todas as suas versotildees queries que possuem uma alta complexidadedemoravam muito tempo para retornar os dados

Assim com o objetivo de facilitar o trabalho alguns scripts python foram desenvolvi-dos para rodar as queries separadamente e individualmente para cada projeto de formaautomatizada a fim de melhorar o tempo de resposta para obtenccedilatildeo dos resultados

29

441 Meacutedia de Lambda

O primeiro script retorna a quantidade de expressotildees lambda (ou AICs) por n snapshotsque contenha expressotildees lambda O objetivo eacute ter uma visatildeo geral da meacutedia de expressotildeeslambda e AICs utilizadas por cada projeto e como nem todos os snapshots coletados decada projeto possuem expressotildees lambda e AICs apenas aqueles com alguma expressatildeolambda ou AIC satildeo incluiacutedos no caacutelculo da meacutedia

Mmedia =sumn qtdLambdai

n

442 Anaacutelise Temporal

O segundo script retorna para cada projeto a soma total da quantidade de expressotildeeslambda AIC map() e filter() no projeto inteiro para cada versatildeo Ou seja tem-seo total de cada uma das quatro propriedades selecionadas para cada mecircs do projetoobtendo assim uma visatildeo temporal de evoluccedilatildeo do uso das caracteriacutesticas descritas ATabela 41 ilustra parcialmente o resultado obtido para o projeto agera onde idVersaoeacute o identificador no banco de dados referente ao hash do commit mensal coletado qtd eacutea quantidade de cada uma das caracteriacutesticas escolhidas e a data do commit encontra-seno formato americano

Tabela 41 Informaccedilotildees mensais sobre o projeto ageraidVersao Data do Commit qtd lambda qtd AIC qtd maps qtd filter

823 512016 0 29 4 0755 612016 13 28 4 0686 6152016 13 29 4 0621 812016 13 29 4 0555 8162016 13 30 4 0485 922016 13 30 4 0422 10132016 14 30 4 0356 11282016 14 30 4 0295 12212016 21 30 5 0232 212017 21 30 5 0175 312017 21 30 5 0112 3312017 21 36 5 048 4242017 21 48 5 0

Os resultados obtidos com esta anaacutelise temporal permitiu a identificaccedilatildeo de padrotildees nautilizaccedilatildeo de expressotildees lambda em relaccedilatildeo a utilizaccedilatildeo de AIC por todos os projetos Foi

30

possiacutevel classificar todos os projetos em 6 grupos ilustrado na Figura 45 Primeiramenteseparou-se os projetos entre os que possuem expressotildees lambda e os que natildeo possuemDentre os que possuem identificou-se cinco categorias

1 Grupo 1 Quantidade de AICs e expressotildees lambda aumentam com o tempo pro-porcionalmente

2 Grupo 2 Quantidade de AICs diminui agrave medida que a quantidade de expressotildeeslambda aumentam e a quantidade de expressotildees lambda ultrapassa a quantidade deAIC em um determinado momento

3 Grupo 3 Quantidade de AICs diminui agrave medida que a quantidade de expressotildeeslambda aumentam mas a quantidade de AIC permanece superior agrave quantidade delambda

4 Grupo 4 Expressotildees lambda satildeo introduzidas e existem por um pequeno periacuteodode tempo mas satildeo completamente removidas posteriormente

5 Grupo 5 Quantidade de expressotildees lambda eacute constante e muito inferior compa-rado com a quantidade de AICs no projeto Foi determinado que para pertencera esta classificaccedilatildeo o projeto precisa ter uma razatildeo de meacutedia de expressotildees lamb-dasnapshot por meacutedia de AICsnapshot inferior a 020 Esse paracircmetro foi esta-belecido com o objetivo de definir um padratildeo para o que pode ser considerado umprojeto com poucas expressotildees lambda

Figura 45 Classificaccedilatildeo dos projetos

31

443 Refatoraccedilatildeo de Coacutedigo

O uacuteltimo script teve como objetivo realizar uma tentativa inicial de identificar refatoraccedilatildeode coacutedigo da seguinte maneira para todos os projetos que possuem expressotildees lambdaforam identificados o mecircs imediatamente antes da introduccedilatildeo de expressotildees lambda e omecircs seguinte onde houve a primeira ocorrecircncia de lambda no projeto Assim realizou-se uma anaacutelise do tamanho em quantidade de linhas de coacutedigo de todos os meacutetodosdo projeto que no mecircs seguinte tiveram introduccedilatildeo de lambda Em seguida fez-se umacomparaccedilatildeo com os mesmos meacutetodos em relaccedilatildeo ao mecircs anterior e assim foi possiacuteveldetectar quais meacutetodos tiveram a quantidade de linhas de coacutedigo reduzidas o que seriaum indicativo natildeo necessariamente exclusivo de que uma refatoraccedilatildeo de coacutedigo possa terocorrido

Sabe-se que este meacutetodo de detecccedilatildeo de refatoraccedilatildeo de coacutedigo possui suas limitaccedilotildeesuma vez que as comparaccedilotildees para saber se um meacutetodo existe em ambas versotildees eacute feitopuramente por comparaccedilatildeo de String (nome do meacutetodo) e a classe que este pertence

444 Casos de Uso

Os meacutetodos descritos acima ajudaram a identificar alguns padrotildees e facilitar a anaacutelise dosdados Poreacutem natildeo satildeo suficientes para que se possa responder agraves questotildees de pesquisaDessa forma apoacutes a identificaccedilatildeo dos grupos de classificaccedilatildeo para os projetos foramescolhidos um projeto de cada grupo (com exceccedilatildeo do grupo dos projetos sem expressotildeeslambda) para realizar um breve estudo de caso com o objetivo de identificar e caracterizarmelhor a adoccedilatildeo de expressotildees lambda Os projetos escolhidos foram agera vertxAndroid-CleanArchitecture RxJava e guava

32

Capiacutetulo 5

Resultados Obtidos e Anaacutelise

Neste capiacutetulo seratildeo apresentados os dados obtidos e anaacutelise com o objetivo de responderagraves questotildees de pesquisa propostas Como mencionado anteriormente as perguntas seratildeorespondidas de duas maneiras algumas com informaccedilotildees gerais sobre todos os projetose outras com breve estudos de caso envolvendo cinco projetos

51 Visatildeo Geral

Dentre os repositoacuterios coletados para a anaacutelise 74 (7474) natildeo utilizaram nenhumaexpressatildeo lambda no projeto durante todo o periacuteodo analisado (Janeiro de 2013 a Abrilde 2017) restando apenas 25 repositoacuterios (2525) com expressotildees lambda Eacute interessantedestacar que apesar de a quantidade de repositoacuterios que natildeo possuem expressotildees lambdaser relativamente expressiva muitos destes repositoacuterios satildeo de projetos em Java que umdia foram populares e atualmente natildeo estatildeo sendo mais desenvolvidos (por exemplo umaplicativo que soacute funciona para Android 23 atualmente descontinuado)

Levando em consideraccedilatildeo apenas os projetos que possuem expressotildees lambda exis-tem dois tipos de dados que podem ser analisados para responder agrave primeira questatildeo depesquisa atraveacutes dos dados obtidos pelo meacutetodo anteriormente mencionado como anaacutelisetemporal e a meacutedia de lambda por snapshot mencionados no capiacutetulo anterior

Com relaccedilatildeo ao ano em que a primeira ocorrecircncia foi encontrada 6 projetos introduzi-ram expressotildees lambda jaacute em 2014 8 comeccedilaram a utilizar em 2015 7 em 2016 e apenas4 tiveram a primeira ocorrecircncia de expressotildees lambda em 2017 Dessa forma percebe-seque os projetos estatildeo relativamente bem distribuiacutedos em grupos quanto ao ano em que seintroduziu expressotildees lambda

Pela meacutedia de lambda por snapshot (lambdasnapshot) a maioria (11 projetos) possuiuma quantidade expressiva acima de 100 lambdasnapshot (com 6 projetos entre 20 e 100lambdasnapshot e 8 projetos com menos de 20 lambdasnapshot) como apresentados no

33

graacutefico da Figura 51 Isso mostra que essa nova caracteriacutestica jaacute estaacute sendo bem utilizadanos projetos que comeccedilaram a migrar para a nova versatildeo do Java

Figura 51 Graacuteficos dos projetos separados por ano de introduccedilatildeo de expressotildees lambdae meacutedia de lambda por snapshot

Com isso pode-se observar que apesar de a quantidade de projetos que possuemexpressotildees lambda natildeo ser tatildeo alta eacute possiacutevel obter resultados expressivos uma vez quea quantidade dos projetos com lambda estatildeo bem dispersos quanto ao periacuteodo em quecomeccedilaram a adotar essa caracteriacutestica e a quantidade de expressotildees lambda por snapshot

511 Projetos Selecionados

Atraveacutes dos grupos de classificaccedilatildeo identificados pela anaacutelise temporal descritos na Figura45 cinco projetos foram selecionados para uma anaacutelise detalhada levando em consideraccedilatildeoo grupo em que eles pertencem Estes projetos seratildeo apresentados a seguir

512 agera

Agera eacute uma biblioteca Android que ajuda a introduzir programaccedilatildeo funcional reativa(functional reactive programming) em projetos Android Eacute um projeto recente lanccediladoem 2016 pela Google [44] e encontra-se no grupo dos projetos que introduziram expressotildeeslambda em 2016 no mesmo ano de seu lanccedilamento contendo uma meacutedia de expressotildeeslambda de 16 lambdasnapshot

Na classificaccedilatildeo estabelecida agera pertence ao Grupo 1 onde a quantidade de ex-pressotildees lambda no projeto com o tempo aumentam juntamente com a quantidade deAICs como mostra o graacutefico de anaacutelise temporal na Figura 52

34

Figura 52 Graacuteficos de anaacutelise temporal do projeto agera

513 vertx

Eclipse Vertx eacute um conjunto de ferramentas para criaccedilatildeo de reactive applications namaacutequina virtual Java (JVM) em grande escala [45] Seu primeiro lanccedilamento aconteceuem 2011 e a primeira ocorrecircncia de expressotildees lambda no projeto aconteceu em 2014 Esteprojeto possui uma meacutedia de 2867 lambdasnapshot e dentre os projetos consideradosneste trabalho eacute o que possui a maior quantidade de expressotildees lambda

Este projeto pertence ao Grupo 2 onde a quantidade de expressotildees lambda aumen-tou consideravelmente pelos meses ultrapassando a quantidade de AICs que diminuiudrasticamente como mostra a Figura 53

35

Figura 53 Graacuteficos de anaacutelise temporal do projeto Vertx

514 Android-CleanArchitecture

Apesar de ser uma amostra de projeto Android-CleanArchitecture que tem como objetivoconstruir aplicaccedilotildees Android utilizando clean architecture foi lanccedilado em 2014 mas semanteacutem sempre atualizado [46]

A introduccedilatildeo de expressotildees lambda que aconteceu no ano de 2015 se deu de formatiacutemida com uma meacutedia de 35 lambdasnapshot De qualquer forma este projeto conseguerepresentar com seu graacutefico de anaacutelise temporal o grupo 3 composto por projetos em quea quantidade de expressotildees lambda aumentou mas sem ultrapassar AICs que diminuiacuteramdemonstrado no graacutefico da Figura 54

36

Figura 54 Graacuteficos de anaacutelise temporal do projeto Android-CleanArchitecture

515 RxJava

Dentre os repositoacuterios estudados RxJava eacute considerado o mais popular Como umaimplementaccedilatildeo de Reactive Extensions para a JVM RxJava teve seu lanccedilamento dadoem 2013 [47] Expressotildees lambda apareceram pela primeira vez no ano de 2015 comuma meacutedia de 766 lambdasnapshot

Apesar de uma meacutedia relativamente alta o tempo de vida das expressotildees lambda nesteprojeto foi bem curto caracterizando assim projetos do grupo 4 houve a introduccedilatildeo dasexpressotildees lambda no projeto poreacutem houve a remoccedilatildeo completa de todas as expressotildeeslambda previamente introduzidas desaparecendo completamente do projeto ateacute a datada coleta de dados (Figura 55)

37

Figura 55 Graacuteficos de anaacutelise temporal do projeto RxJava

516 guava

Guava eacute um conjunto de bibliotecas para Java da Google lanccedilado em 2011 A atualizaccedilatildeodo coacutedigo do projeto para Java 8 aconteceu somente em 2016 e apesar do projeto conteruma meacutedia de 281 lambdasnapshot ele foi escolhido como representante dos projetosdo Grupo 5 (Figura 56) que possuem expressotildees lambda mas de forma natildeo expressiva osuficiente quando comparado com a quantidade de AIC pelo fato de sua razatildeo de meacutedia delambdasnapshot por meacutedia de AICsnapshot ser 004 Ou seja embora o projeto tenhaexpressotildees lambda estas satildeo consideradas muito poucas quando inseridas no contextogeral deste projeto que eacute considerado um projeto grande

38

Figura 56 Graacuteficos de anaacutelise temporal do projeto Guava

52 Refatoraccedilatildeo de Coacutedigo

Com o objetivo de caracterizar melhor como as expressotildees lambda estatildeo sendo utilizadaseacute interessante identificar se estas estatildeo sendo introduzidas atraveacutes de refatoraccedilatildeo de coacutedigoou em coacutedigo novo

Os projetos classificados como pertencentes ao Grupo 2 possuem em comum o fatode expressotildees lambda aumentarem a medida que AICs diminuem ultrapassando-as eessa caracteriacutestica em comum pode indicar que nestes projetos possivelmente houve re-fatoraccedilatildeo de coacutedigo visto que AIC sendo substituiacutedo por expressotildees lambda dentro dascondiccedilotildees determinadas eacute a maneira mais comum de se identificar refatoraccedilatildeo de coacute-digo para introduccedilatildeo de expressotildees lambda [12] Os projetos que compotildeem o grupo 2representam 44 de todos os projetos estudados que possuem expressotildees lambda o quepode ser um indicativo caso a hipoacutetese de refatoraccedilatildeo de coacutedigo seja positiva de quemuitos projetos que estatildeo adotando o Java 8 estatildeo se preocupando de alguma formacom refatoraccedilatildeo se coacutedigo Fazem parte desse grupo os seguintes projetos elasticsearchjava-design-patterns PocketHub presto RxJava-Android-Samples spark vertx zipkinjava8-tutorial dropwizard e material-dialogs

39

Outra maneira de verificar possiacuteveis indicadores de refatoraccedilatildeo de coacutedigo foi atraveacutesda anaacutelise dos tamanhos (em quantidade de linhas de coacutedigo) dos meacutetodos com expressotildeeslambda no mecircs em que se introduziu expressotildees lambda e um mecircs imediatamente antesdeste Essa anaacutelise mostra que dos 25 projetos com expressotildees lambda 12 (48) projetostiveram ao menos um meacutetodo em que houve uma diminuiccedilatildeo no tamanho o que podeser considerado um indicativo de refatoraccedilatildeo de coacutedigo A Figura 57 mostra todos osprojetos em relaccedilatildeo agrave quantidade total de meacutetodos que possuem lambda no primeiro mecircsde introduccedilatildeo do mesmo em vermelho comparado com a quantidade desses meacutetodos quetiveram uma diminuiccedilatildeo no tamanho quando comparados com o coacutedigo do mecircs anteriorem azul

Figura 57 Comparaccedilatildeo entre todos os projetos com expressatildeo lambda sobre refatoraccedilatildeode coacutedigo no mecircs de introduccedilatildeo da caracteriacutestica

Ainda observando a figura 57 com relaccedilatildeo aos projetos que natildeo tiveram nenhummeacutetodo com diminuiccedilatildeo de tamanho (barra azul) percebe-se que todos os 13 projetossequer tiveram uma quantidade significativa de meacutetodos que possuem expressotildees lambda(com o maior tendo apenas 5 meacutetodos) no mecircs de introduccedilatildeo da caracteriacutestica no projetoe ao mesmo tempo jaacute existiam no mecircs em que natildeo existia lambda no projeto Essa eacuteuma observaccedilatildeo importante porque projetos como vertx sendo este o que possui a maiormeacutedia de lambdasnapshot de todos os projetos e ao mesmo tempo tendo apenas trecircsmeacutetodos que continham expressotildees lambda no mecircs da introduccedilatildeo e que existiam no mecircs

40

anterior permitem inferir que todas as outras expressotildees lambda existentes no projetopara este determinado mecircs de introduccedilatildeo encontram-se em coacutedigo novo introduzido

Eacute importante ressaltar que somente essa anaacutelise natildeo eacute exclusivamente suficiente paradeterminar se estes projetos estatildeo realmente introduzindo lambda em coacutedigo novo ourealizando refatoraccedilatildeo uma vez que como a comparaccedilatildeo aconteceu apenas no mecircs deintroduccedilatildeo com o mecircs imediatamente anterior natildeo reflete todo o ciclo de vida do pro-jeto Por exemplo algumas equipes podem escolher refatorar o coacutedigo depois de umtempo de adaptaccedilatildeo apoacutes a transiccedilatildeo para a nova versatildeo da linguagem Assim paraobter uma melhor anaacutelise sobre refatoraccedilatildeo de coacutedigo ou natildeo feita nestes projetos aleacutemde outras anaacutelises referentes aos padrotildees tipicamente adotados para implementaccedilatildeo delambda nestes projetos seratildeo apresentados a seguir os estudos de caso dos cinco projetospreviamente selecionados

Outro ponto importante eacute o fato de que apesar das informaccedilotildees quanto agraves quantida-des de filter e map terem sido incluiacutedas inicialmente no trabalho para observar possiacuteveispadrotildees de refatoraccedilatildeo de coacutedigo percebeu-se que estas natildeo satildeo utilizadas de forma con-sideraacutevel pelos projetos estudados e para fins de anaacutelises generalizadas natildeo apresentaramtanta influecircncia na utilizaccedilatildeo de expressotildees lambda quanto a quantidade de AICs noprojeto

53 Estudos de Caso

Dentre os projetos analisados verificou-se que os projetos de pequeno e meacutedio porte op-taram por refatorar de uma vez seus coacutedigos para incluir expressotildees lambda em situaccedilotildeesem que se utilizava AICs anteriormente ou em alguns poucos casos de utilizaccedilatildeo deCollection Os projetos de grande porte natildeo apresentaram nenhuma refatoraccedilatildeo de coacute-digo ou uma refatoraccedilatildeo parcial gradativa provavelmente devido agrave grande quantidade dearquivos e coacutedigo que possuem o que pode tornar o trabalho de refatoraccedilatildeo extenso ecansativo

O projeto vertx que pertence ao grupo 2 dos projetos em que a quantidade de ex-pressotildees lambda aumentaram e as de AICs diminuiacuteram com lambda ultrapassando AICsexecutou inicialmente commits em maio de 2014 com adiccedilatildeo de coacutedigo novo utilizandoexpressotildees lambda e apoacutes um mecircs realizou um commit maior com a refatoraccedilatildeo de todasas AICs para expressotildees lambda Apoacutes a refatoraccedilatildeo o projeto se preocupou em mantera utilizaccedilatildeo de expressotildees lambda ao mesmo tempo que o uso de AICs se manteve apenasaos casos de classes com interfaces natildeo funcionais A Figura 58 apresenta uma parte docommit de refatoraccedilatildeo de coacutedigo que mostra em vermelho a parte eliminada do coacutedigo(AIC) e em verde o coacutedigo novo representando a substituiccedilatildeo por uma expressatildeo lambda

41

Figura 58 Commit de refatoraccedilatildeo de coacutedigo do projeto Vertx [3]

Alguns projetos ainda natildeo se preocuparam em refatorar o coacutedigo para o uso de ex-pressotildees lambda ateacute a data deste trabalho que eacute o caso do projeto guava que apresentouum commit em 03112016 com a atualizaccedilatildeo do projeto para Java 8 Mas a partir daatualizaccedilatildeo se preocupou em utilizar as expressotildees lambda apenas na implementaccedilatildeo decoacutedigo novo O cenaacuterio em que a refatoraccedilatildeo natildeo eacute prioridade ainda eacute a realidade de vaacuteriosprojetos de grande porte visto que os dados de projetos sem nenhuma expressatildeo lambdasatildeo o maior nuacutemero neste trabalho Poreacutem projetos que jaacute adotaram a utilizaccedilatildeo do Java8 tendem a mudar isso com o passar do tempo A Figura 59 apresenta em verde umaadiccedilatildeo de coacutedigo novo com expressatildeo lambda sem a eliminaccedilatildeo de algum coacutedigo anteriora esse que estaria em vermelho

42

Figura 59 Exemplo de um arquivo do commit de adiccedilatildeo de coacutedigo novo em Java 8 doprojeto Guava [4]

Na categoria de projetos em que os AICs e expressotildees lambda aumentam proporci-onalmente (grupo 1) o projeto agera realizou um commit em 19052016 com a adiccedilatildeoda biblioteca retrolambda como dependecircncia do projeto Essa biblioteca utilizada prin-cipalmente por projetos Android permite executar coacutedigo Java 8 contendo expressotildeeslambda em Java 5 6 e 7 [48] O commit tambeacutem apresenta refatoraccedilatildeo dos AICs ad-vindos de interfaces funcionais para expressotildees lambda Apesar de o projeto continuar autilizar as expressotildees lambda em seus commits posteriores o nuacutemero de AICs tambeacutemcontinuou a aumentar visualizando os commits posteriores notou-se que esses AICs satildeorelativos a interfaces natildeo funcionais ou seja que possuem mais de um meacutetodo O projetoAndroid-CleanArchitecture eacute similar ao agera pois tambeacutem optou pela instalaccedilatildeo da bi-blioteca retrolambda para uso de expressotildees lambda em seus coacutedigos e como tambeacutem eacuteum projeto de pequeno porte houve uma pequena refatoraccedilatildeo dos AICs A Figura 510mostra a parte do commit de refatoraccedilatildeo de coacutedigo em que o desenvolvedor adiciona abiblioteca retrolambda como dependecircncia

43

Figura 510 Commit de adiccedilatildeo da biblioteca Retrolambda no projeto Agera [5]

Outro caso interessante eacute o do projeto RxJava que em 2015 optou pela refatoraccedilatildeodo coacutedigo para a utilizaccedilatildeo de expressotildees lambda quase eliminando por completo o usode AICs mas que no ano seguinte reverteu os commits de forma que eliminasse comple-tamente o uso de expressotildees lambda para manter a retrocompatibilidade com o Java 6A Figura 511 demonstra uma parte do commit de reversatildeo do coacutedigo para Java 6 emque pode ser visto em vermelho o coacutedigo anterior com expressotildees lambda e o verde como novo coacutedigo utilizando AIC novamente

44

Figura 511 Commit de remoccedilatildeo de Lambdas e volta para o uso de AICs no projetoRXJava [6]

Essa preocupaccedilatildeo com retrocompatibilidade de coacutedigo pode ser um fator crucial nadecisatildeo das equipes de desenvolvimento na hora de decidir como fazer o software co-evoluircom a linguagem sem perder a compatibilidade com versotildees anteriores

45

Capiacutetulo 6

Consideraccedilotildees Finais

Este estudo permitiu entender melhor como projetos estatildeo realizando a migraccedilatildeo para oJava 8 em especial utilizando uma nova caracteriacutestica introduzida expressatildeo lambdaApesar de a maioria dos projetos populares considerados natildeo possuiacuterem nenhuma ocor-recircncia de expressotildees lambda os projetos que tinham expressotildees lambda foram suficientespara realizar um primeiro estudo de caracterizaccedilatildeo no uso desta caracteriacutestica e com osprojetos efetivamente utilizados para estudo foi possiacutevel agrupaacute-los quanto a maneira emque as expressotildees lambda estavam sendo utilizadas quando comparadas com AICs em 5grandes grupos quando AIC e lambda aumentam proporcionalmente quando AIC dimi-nui e lambda aumenta ultrapassando AIC quando AIC diminui mas continua superior aolambda crescente expressotildees lambda que foram introduzidas e retiradas completamentedo coacutedigo e expressotildees lambda que natildeo existem em quantidades expressivas

Foi possiacutevel entatildeo realizar um estudo aprofundado levando em consideraccedilatildeo as di-ferentes maneiras com que as expressotildees lambda foram adotadas nos projetos atraveacutes daescolha de um projeto que representasse cada grupo para anaacutelise Dentre os cinco projetosestudados foi possiacutevel observar alguns padrotildees tipicamente adotados por desenvolvedorespara implementar expressotildees lambda em seus projetos como a utilizaccedilatildeo da bibliotecas(retrolambda) que permitissem uma flexibilizaccedilatildeo na utilizaccedilatildeo de expressotildees lambda oucomo lambda eacute primariamente utilizada para substituir determinados AICs ou operaccedilotildeesem Collection

Aleacutem disso foi possiacutevel observar como a refatoraccedilatildeo de coacutedigo acontece em cada umdesses projetos Observou-se como projetos menores tendem a refatorar coacutedigo maisfacilmente ao passo que projetos maiores e mais complexos fazem menos refatoraccedilatildeo oudemoram mais entre o periacuteodo em que houve a primeira migraccedilatildeo de coacutedigo para a novaversatildeo da linguagem ateacute o periacuteodo em que realmente decidem refatorar coacutedigo Aleacutem dacomplexidade do projeto influenciar na decisatildeo de migrar o projeto para uma versatildeo maisrecente da linguagem a preocupaccedilatildeo com retrocompatibilidade com versotildees anteriores da

46

linguagem tambeacutem podem ser uma barreira para que projetos comecem a evoluir o coacutedigojuntamente com a evoluccedilatildeo da linguagem

Ainda assim foi possiacutevel observar que a preocupaccedilatildeo com a co-evoluccedilatildeo do software-linguagem existe entre os desenvolvedores de projetos mas a realizaccedilatildeo da migraccedilatildeo aindaacontece lentamente devido agrave diversos fatores que precisam ser levados em consideraccedilatildeopara a manutenccedilatildeo do projeto

Para trabalhos e contribuiccedilotildees futuras seria interessante desenvolver uma ferramentaque pudesse analisar diretamente no coacutedigo-fonte as oportunidades de aplicaccedilatildeo de ex-pressotildees lambda dessa forma poderiam ser analisadas as porcentagens de conversatildeo decoacutedigo para Java 8 e obter melhores conclusotildees sobre a importacircncia que os projetos estatildeodando para a evoluccedilatildeo de seus coacutedigos Outro fator interessante seria aplicar mais Visitorsagrave ferramenta static-analysis e fazer este mesmo estudo aplicado agrave outras caracteriacutesticasda linguagem

47

Referecircncias

[1] Kagdi Huzefa Michael L Collard e Jonathan I Maletic A survey and taxonomyof approaches for mining software repositories in the context of software evolution2007 ix 3 8 9 10 11

[2] DBeaver Dbeaver - features httpdbeaverjkissorgdocsfeatures ix 29

[3] Eclipse Vertx commit Java8-ify code httpsgithubcomeclipsevertxcommit93f95e9c77419f442a42fe711b6eeaef88192fd3 ix 42

[4] Google Guava commit Release java 8 changes to guava httpsgithubcomgoogleguavacommit73e382fa877f80994817a136b0adcc4365ccd904 ix 43

[5] Google Agera commit Collapsed testapp with retrolambda httpsgithubcomgoogleageracommit5e518b7b05f9e7a34a314945f68deff7b2c3e334 ix 44

[6] ReactiveX Rxjava commit 2x full jdk 6 compatible backport + includ-ing bugfixes up to today httpsgithubcomReactiveXRxJavacommit000a174d87a901135f9665d3b11f3627fd2dc4ed ix 45

[7] Godfrey M W e D M German The past present and future of software evolutionEm 2008 Frontiers of Maintenance paacuteginas 129ndash138 Sept 2008 1 6

[8] Favre J M Languages evolve too changing the software time scale Em Principles ofSoftware Evolution Eighth International Workshop on paacuteginas 33ndash42 IEEE 20051 5 7

[9] Overbey Jeffrey L e Ralph E Johnson Regrowing a language refactoring tools allowprogramming languages to evolve Em ACM SIGPLAN Notices volume 44 paacuteginas493ndash502 ACM 2009 1 5 7 8 12

[10] Grechanik Mark Collin McMillan Luca DeFerrari Marco Comi Stefano CrespiDenys Poshyvanyk Chen Fu Qing Xie e Carlo Ghezzi An empirical investiga-tion into a large-scale java open source code repository Em Proceedings of the2010 ACM-IEEE International Symposium on Empirical Software Engineering andMeasurement ESEM rsquo10 paacuteginas 111ndash1110 New York NY USA 2010 ACMISBN 978-1-4503-0039-1 httpdoiacmorg10114518527861852801 1

[11] TIOBE Tiobe httpswwwtiobecomtiobe-index 1 14

48

[12] Gyori Alex Lyle Franklin Danny Dig e Jan Lahoda Crossing the gap from im-perative to functional programming through refactoring Em Proceedings of the 20139th Joint Meeting on Foundations of Software Engineering ESECFSE 2013 paacute-ginas 543ndash553 New York NY USA 2013 ACM ISBN 978-1-4503-2237-9 httpdoiacmorg10114524914112491461 2 11 24 39

[13] OpenJDK State of the lambda httpcropenjdkjavanet~briangoetzlambdalambda-state-4html 2

[14] Han Jiawei Micheline Kamber e Jian Pei Data Mining Concepts and TechniquesMorgan Kaufmann Publishers Inc San Francisco CA USA 3rd ediccedilatildeo 2011ISBN 0123814790 9780123814791 3

[15] Fowler Martin e Kent Beck Refactoring improving the design of existing codeAddison-Wesley Professional 1999 5 7

[16] Lehman M M J F Ramil P D Wernick D E Perry e W M Turski Met-rics and laws of software evolution - the nineties view Em Proceedings of the4th International Symposium on Software Metrics METRICS rsquo97 paacuteginas 20ndashWashington DC USA 1997 IEEE Computer Society ISBN 0-8186-8093-8 httpdlacmorgcitationcfmid=823454823901 6

[17] Hassan Ahmed E e Tao Xie Software intelligence The future of mining softwareengineering data Em Proceedings of the FSESDP Workshop on Future of SoftwareEngineering Research FoSER rsquo10 paacuteginas 161ndash166 New York NY USA 2010ACM ISBN 978-1-4503-0427-6 httpdoiacmorg101145188236218823978 9

[18] Hassan Ahmed E The road ahead for mining software repositories Em Frontiers ofSoftware Maintenance 2008 FoSM 2008 paacuteginas 48ndash57 IEEE 2008 8

[19] Berry Michael J e Gordon Linoff Data Mining Techniques For Marketing Salesand Customer Support John Wiley amp Sons Inc New York NY USA 1997ISBN 0471179809 10

[20] Parnin Chris Christian Bird e Emerson Murphy-Hill Java generics adoption hownew features are introduced championed or ignored Em Proceedings of the 8thWorking Conference on Mining Software Repositories paacuteginas 3ndash12 ACM 2011 12

[21] Oracle The java language specification httpsdocsoraclecomjavasespecsjlsse8jls8pdf 13

[22] Oracle The history of java technology httpwwworaclecomtechnetworkjavajavaseoverviewjavahistory-index-198355html 13

[23] Murphy Kieron So why did they decide to call itjava httpwwwjavaworldcomarticle2077265core-javaso-why-did-they-decide-to-call-it-java-html 13

[24] McGraw Tata Object-oriented Programming with Java Essentials and ApplicationsHill Education 13

49

[25] Oracle Differences between java ee and java se httpdocsoraclecomjavaee6firstcupdocgkhoyhtml 13

[26] Lindsey Clark S The History of Java Cambridge 14

[27] Oracle The java language environment httpwwworaclecomtechnetworkjavaintro-141325html 14

[28] Oracle Jdk 8 httpopenjdkjavanetprojectsjdk8 15 24

[29] Oracle Enhancements in java se 8 httpdocsoraclecomjavase8docstechnotesguideslanguageenhancementshtmljavase8 15 16 17

[30] Oracle Lambda expressions httpdocsoraclecomjavasetutorialjavajavaOOlambdaexpressionshtml 16 18 21

[31] Oracle Method references httpdocsoraclecomjavasetutorialjavajavaOOmethodreferenceshtml 16

[32] Oracle Default methods httpdocsoraclecomjavasetutorialjavaIandIdefaultmethodshtml 17

[33] Oracle Repeating annotations httpdocsoraclecomjavasetutorialjavaannotationsrepeatinghtml 17

[34] Oracle Type annotations httpdocsoraclecomjavasetutorialjavaannotationstype_annotationshtml 17

[35] Oracle Anonymous inner classes httpsdocsoraclecomjavasetutorialjavajavaOOanonymousclasseshtml 19

[36] Kothari CR Research Methodology Methods and Techniques New Age Interna-tional (P) Limited 2004 ISBN 9788122415223 httpsbooksgooglecombrbooksid=8c6gkbKi-F4C 22

[37] Nakakoji Kumiyo Yasuhiro Yamamoto Yoshiyuki Nishinaka Kouichi Kishida eYunwen Ye Evolution patterns of open-source software systems and communitiesEm IWPSE rsquo02 Proceedings of the International Workshop on Principles of SoftwareEvolution paacuteginas 76ndash85 New York NY USA 2002 ACM Press ISBN 1581135459httpdxdoiorg101145512035512055 23

[38] Rahman Foyzur Christian Bird e Premkumar Devanbu Clones What is that smellEmpirical Software Engineering 17(4-5)503ndash530 2012 24

[39] Chacon Scott Pro Git Apress Berkely CA USA 1st ediccedilatildeo 2009ISBN 1430218339 9781430218333 25

[40] Cavalcanti Thiago Gomes e Viniacutecius Correa de Almeida Caracterizaccedilatildeo do uso deconstruccedilotildees da linguagem java em projetos open-source Publicaccedilatildeo online 2016httpbdmunbbrhandle1048315733 27

50

[41] Parr Terence Language Implementation Patterns Create Your Own Domain-Specific and General Programming Languages Pragmatic Bookshelf 1st ediccedilatildeo 2009ISBN 193435645X 9781934356456 27

[42] Janssen Thorben 5 reasons to use jpa hibernate Publicaccedilatildeo online httpswwwsitepointcom5-reasons-to-use-jpa-hibernate 27

[43] Franklin Lyle Alex Gyori Jan Lahoda e Danny Dig Lambdaficator From imperativeto functional programming through automated refactoring Em Proceedings of the2013 International Conference on Software Engineering ICSE rsquo13 paacuteginas 1287ndash1290 Piscataway NJ USA 2013 IEEE Press ISBN 978-1-4673-3076-3 httpdlacmorgcitationcfmid=24867882486986 29

[44] Google Agera httpsgithubcomgoogleagerawiki 34

[45] Eclipse Eclipse vertx httpvertxio 35

[46] Cejas Fernando Android cleanarchitecture httpsgithubcomandroid10Android-CleanArchitecture 36

[47] ReactiveX Rxjava httpsgithubcomReactiveXRxJava 37

[48] Luontola Esko Retrolambda httpsgithubcomorfjackalretrolambda 43

51

Anexo I

Projetos utilizados

fastjson

platform_frameworks_base

netty

material-dialogs

kotlin

okhttp

tinker

AndroidUtilCode

RxJava

spring-boot

java-design-patterns

elasticsearch

ExoPlayer

kafka

vertx

realm-java

guava

zipkin

bazel

stetho

Signal-Android

glide

agera

fresco

plaid

presto

libgdx

spark

52

disruptor

lottie-android

flexbox-layout

PocketHub

zxing

spring-framework

deeplearning4j

dropwizard

interviews

BaseRecyclerViewAdapterHelper

uCrop

DanmakuFlameMaster

lottie-react-native

android-UniversalMusicPlayer

AndroidInterview-Q-A

greenDAO

retrofit

MaterialDrawer

BottomBar

druid

MPAndroidChart

Hystrix

guice

recyclerview-animators

dubbo

androidannotations

RxJava-Android-Samples

PhotoView

clojure

CircleImageView

AndroidSwipeLayout

jedis

MaterialViewPager

butterknife

junit4

RxBinding

leakcanary

SimianArmy

picasso

UltimateRecyclerView

53

AndroidViewAnimations

AppIntro

FizzBuzzEnterpriseEdition

ion

cheesesquare

physical-web

RxAndroid

Android-CleanArchitecture

Calligraphy

Android-Bootstrap

iosched

Android_Data

MaterialDesignLibrary

ListViewAnimations

EventBus

java8-tutorial

AndroidSlidingUpPanel

dagger

okhttputils

logger

HomeMirror

Material-Animations

android-Ultra-Pull-To-Refresh

android-async-http

Android-ObservableScrollView

Android-Universal-Image-Loader

ActionBarSherlock

SlidingMenu

storm

PagerSlidingTabStrip

Android-PullToRefresh

54

  • Dedicatoacuteria
  • Agradecimentos
  • Resumo
  • Abstract
  • Introduccedilatildeo
    • Contexto
    • Objetivos
      • Objetivos Gerais
      • Objetivos Especiacuteficos
        • Metodologia
        • Organizaccedilatildeo do Trabalho
          • Evoluccedilatildeo e Mineraccedilatildeo de Repositoacuterios de Software
            • Evoluccedilatildeo de Software
            • MSR Mineraccedilatildeo de dados e a Engenharia de Software
              • Classificaccedilatildeo
                • Trabalhos Relacionados
                  • Java SE 8 e JDK 8
                    • Histoacuterico
                    • Princiacutepios
                    • Evoluccedilatildeo
                    • Expressotildees Lambda
                      • Sintaxe
                      • Principais formas de uso
                          • Estudo e o Processo de Mineraccedilatildeo
                            • Questotildees de Pesquisa
                            • Fonte de Dados e Objetos de Estudo
                            • Processo de Mineraccedilatildeo
                              • static-analysis
                              • BDAnalisador
                                • Classificaccedilatildeo e Anaacutelise
                                  • Meacutedia de Lambda
                                  • Anaacutelise Temporal
                                  • Refatoraccedilatildeo de Coacutedigo
                                  • Casos de Uso
                                      • Resultados Obtidos e Anaacutelise
                                        • Visatildeo Geral
                                          • Projetos Selecionados
                                          • agera
                                          • vertx
                                          • Android-CleanArchitecture
                                          • RxJava
                                          • guava
                                            • Refatoraccedilatildeo de Coacutedigo
                                            • Estudos de Caso
                                              • Consideraccedilotildees Finais
                                              • Referecircncias
                                              • Anexo
                                              • Projetos utilizados

Sumaacuterio

1 Introduccedilatildeo 111 Contexto 112 Objetivos 2

121 Objetivos Gerais 2122 Objetivos Especiacuteficos 2

13 Metodologia 314 Organizaccedilatildeo do Trabalho 3

2 Evoluccedilatildeo e Mineraccedilatildeo de Repositoacuterios de Software 521 Evoluccedilatildeo de Software 622 MSR Mineraccedilatildeo de dados e a Engenharia de Software 8

221 Classificaccedilatildeo 823 Trabalhos Relacionados 11

3 Java SE 8 e JDK 8 1331 Histoacuterico 1332 Princiacutepios 1433 Evoluccedilatildeo 1534 Expressotildees Lambda 18

341 Sintaxe 18342 Principais formas de uso 19

4 Estudo e o Processo de Mineraccedilatildeo 2241 Questotildees de Pesquisa 2342 Fonte de Dados e Objetos de Estudo 2443 Processo de Mineraccedilatildeo 25

431 static-analysis 26432 BDAnalisador 27

44 Classificaccedilatildeo e Anaacutelise 29441 Meacutedia de Lambda 30

vii

442 Anaacutelise Temporal 30443 Refatoraccedilatildeo de Coacutedigo 32444 Casos de Uso 32

5 Resultados Obtidos e Anaacutelise 3351 Visatildeo Geral 33

511 Projetos Selecionados 34512 agera 34513 vertx 35514 Android-CleanArchitecture 36515 RxJava 37516 guava 38

52 Refatoraccedilatildeo de Coacutedigo 3953 Estudos de Caso 41

6 Consideraccedilotildees Finais 46

Referecircncias 48

Anexo 51

I Projetos utilizados 52

viii

Lista de Figuras

21 Taxonomia em camadas adaptada do trabalho de Kagdi et al [1] 9

41 Processo utilizado para realizaccedilatildeo do estudo 2242 Metodologia implementada para coleta e tratamento de dados 2643 Diagrama de classes UML do BDAnalisador 2844 Modelo relacional do banco de dados populado pelo BDAnalisador Imagem

gerada com software DBeaver [2] 2945 Classificaccedilatildeo dos projetos 31

51 Graacuteficos dos projetos separados por ano de introduccedilatildeo de expressotildees lambdae meacutedia de lambda por snapshot 34

52 Graacuteficos de anaacutelise temporal do projeto agera 3553 Graacuteficos de anaacutelise temporal do projeto Vertx 3654 Graacuteficos de anaacutelise temporal do projeto Android-CleanArchitecture 3755 Graacuteficos de anaacutelise temporal do projeto RxJava 3856 Graacuteficos de anaacutelise temporal do projeto Guava 3957 Comparaccedilatildeo entre todos os projetos com expressatildeo lambda sobre refatora-

ccedilatildeo de coacutedigo no mecircs de introduccedilatildeo da caracteriacutestica 4058 Commit de refatoraccedilatildeo de coacutedigo do projeto Vertx [3] 4259 Exemplo de um arquivo do commit de adiccedilatildeo de coacutedigo novo em Java 8 do

projeto Guava [4] 43510 Commit de adiccedilatildeo da biblioteca Retrolambda no projeto Agera [5] 44511 Commit de remoccedilatildeo de Lambdas e volta para o uso de AICs no projeto

RXJava [6] 45

ix

Lista de Tabelas

31 As versotildees anteriores de java e principais caracteriacutesticas 14

41 Informaccedilotildees mensais sobre o projeto agera 30

x

Capiacutetulo 1

Introduccedilatildeo

11 Contexto

A evoluccedilatildeo e manutenccedilatildeo de software eacute uma caracteriacutestica intriacutenseca do desenvolvimentode sistemas considerando que a partir do momento em que um software comeccedila a serdesenvolvido satildeo realizadas constantes manutenccedilotildees [7] Apesar de o conceito de evolu-ccedilatildeo de software representar uma grande aacuterea de pesquisa na engenharia de software nemsempre pesquisadores reconhecem a importacircncia da evoluccedilatildeo das linguagens de progra-maccedilatildeo como um grande fator influenciador na evoluccedilatildeo de software [8] uma vez que umsoftware que natildeo evolui junto com a sua linguagem tem a sua capacidade de evoluccedilatildeolimitada [9]

Surge entatildeo a necessidade de alinhar estudos empiacutericos com o intuito de investigar esteprocesso de evoluccedilatildeo do software juntamente com a evoluccedilatildeo de sua linguagem atraveacutesde investigaccedilatildeo e anaacutelise de seu coacutedigo fonte que pode ser feita por meio de anaacutelise de re-positoacuterios de software em grande escala o que deu origem a abordagem de Mineraccedilatildeo emRepositoacuterio de Software (MSR) O MSR tem como base o estudo sistemaacutetico e empiacutericode repositoacuterios de software com o objetivo de analisaacute-los utilizando informaccedilotildees estatis-ticamente uacuteteis coletadas para observar diversos padrotildees como a evoluccedilatildeo do softwarepadrotildees de projetos dentre outros [10]

A complexidade e dificuldade de realizar tal estudo empiacuterico eacute alta pois atualmenteexistem diversos tipos de plataformas para coleta de dados linguagens e focos variadosAssim para escolher o foco do objeto de estudo eacute necessaacuterio levar em consideraccedilatildeo estasdificuldades e especificaccedilotildees e dessa forma este trabalho tem como foco a anaacutelise desistemas de software na linguagem Java

Ateacute a data deste trabalho de acordo com os dados do TIOBE [11] Java eacute a linguagemde programaccedilatildeo com mais linhas de codigo catalogadas no mundo Isso faz com queseja extremamente interessante o estudo empiacuterico da evoluccedilatildeo da linguagem e software

1

desenvolvidos nela desde sua primeira versatildeo antes de se tornar uma linguagem populare ainda com poucos pacotes ateacute a sua atual versatildeo estaacutevel com uma grande quantidadede novas caracteriacutesticas

A versatildeo mais recente do Java a JDK 8 possui diversas adiccedilotildees interessantes para aorganizaccedilatildeo do coacutedigo e facilidade do programador Dessas novas implementaccedilotildees con-ceitos de linguagem funcional como expressotildees lambda e iteradores externos que recebemuma expressatildeo lambda como argumento como o map() filter() e forEach() tornarama escrita de coacutedigo paralelo mais simples e permitiram ganhos de performance [12]

Diversas linguagens de programaccedilatildeo tambeacutem populares como Javascript e Ruby jaacutepossuiacuteam expressotildees lambda desde suas versotildees iniciais sendo o Java 8 em 2014 maisuma linguagem a introduzir esse novo conceito Podemos descrever as expressotildees comopequenas funccedilotildees normalmente feitas em apenas uma linha sem um nome identificadorElas podem ser retornadas de outras funccedilotildees ou passadas como paracircmetro Um exemplode expressatildeo lambda pode ser visualizado pela funccedilatildeo de soma de dois inteiros escrita daforma (int x int y)rarr x + y [13]

Antes da inclusatildeo de expressotildees lambda em Java o mesmo comportamento era possiacutevelutilizando classes anocircnimas ou AICs (Anonymous inner classes) Contudo eacute necessaacute-rio a criaccedilatildeo de uma interface com apenas um meacutetodo e instanciaacute-la como uma AIC Autilizaccedilatildeo de AICs gera inuacutemeras linhas de coacutedigo adicionais que poderiam ser encapsu-ladas em apenas uma linha com a utilizaccedilatildeo de expressotildees lambda Como eacute interessantepara o programador ter um coacutedigo sempre mais legiacutevel e sucinto torna-se interessante arefatoraccedilatildeo de coacutedigo que utiliza uma tecnologia mais antiga para a nova

Assim este trabalho visa conduzir um estudo de mineraccedilatildeo em repositoacuterios de softwareopen-source desenvolvidos na linguagem Java para entender como desenvolvedores estatildeose adaptando agraves novas mudanccedilas introduzidas no Java 8

12 Objetivos

121 Objetivos Gerais

Este trabalho tem como objetivo geral caracterizar o uso de expressotildees lambda entre osprojetos Java mais populares desenvolvidos pela comunidade do GitHub

122 Objetivos Especiacuteficos

Sabendo do benefiacutecio da refatoraccedilatildeo de coacutedigo para o uso de expressotildees lambda e dapouca quantidade de estudos acadecircmicos sobre o assunto surge entatildeo uma oportunidadede pesquisa para melhor entender a forma como essa caracteriacutestica estaacute sendo adotada por

2

projetos com foco em refatoraccedilatildeo de coacutedigo o que originou a necessidade deste estudoAssim para alcanccedilar o objetivo deste trabalho foram traccedilados em forma de questotildees depesquisa os objetivos especiacuteficos a serem alcanccedilados por este trabalho

bull Quando os projetos Java de coacutedigo aberto comeccedilaram a introduzir o uso de expres-sotildees lambda em seus coacutedigos e quatildeo significativo eacute esse uso

bull Como as equipes de desenvolvimento estatildeo utilizando expressotildees lambda atraveacutesde refatoraccedilatildeo de coacutedigo ou introduzindo apenas em coacutedigo novo

bull Quais satildeo os padrotildees tipicamente adotados para o uso de expressotildees lambda

13 Metodologia

Este trabalho foi desenvolvido utilizando uma abordagem de MSR que dentro da clas-sificaccedilatildeo de Kagdi et al [1] pode ser divido em quatro grandes etapas Primeiramentedefiniu-se a fonte de dados a ser utilizada e dentre as possibilidades encontradas na lite-ratura [14] optou-se por utilizar repositoacuterios de controle de versatildeo mais especificamenteo Github tendo como criteacuterio de seleccedilatildeo os 99 repositoacuterios Java mais populares na plata-forma Em seguida definiu-se o propoacutesito do estudo no caso os objetivos em forma deperguntas de pesquisa a serem respondidas

A terceira grande etapa foi a definiccedilatildeo do meacutetodo em si a forma como seria realizadoo estudo e este por sua vez constitui-se de download de todos os 99 repositoacuterios maispopulares realizaccedilatildeo de uma anaacutelise estaacutetica para coletar informaccedilotildees necessaacuterias de cadaprojeto por versatildeo e armazenamento de informaccedilotildees pertinentes em uma base de dados

A etapa final foi a realizaccedilatildeo da avaliaccedilatildeo dos dados obtidos atraveacutes de meacutetricas eanaacutelises quantitativas para melhor responder as questotildees de pesquisa aleacutem de estudos decaso feitos com cinco projetos escolhos de acordo com a maneira distinta em que estesfazem o uso de expressotildees lambda

14 Organizaccedilatildeo do Trabalho

Este trabalho se divide em seis capiacutetulos

bull Capiacutetulo 2 Apresenta um referencial teoacuterico sobre evoluccedilatildeo de software demons-trando as estrateacutegias utilizadas e a importacircncia da evoluccedilatildeo em um projeto de coacutedigoaberto aleacutem de enunciar as leis de evoluccedilatildeo de software de Lehman O capiacutetulo tam-beacutem apresenta o processo de mineraccedilatildeo de dados explicando cada uma das camadasda classificaccedilatildeo e demonstra trabalhos relacionados a esse toacutepico que serviram debase para este trabalho

3

bull Capiacutetulo 3 Traz um contexto histoacuterico e teacutecnico da linguagem Java necessaacuteriospara entender a importacircncia que as novas caracteriacutesticas adicionadas na versatildeo8 fornecem para os desenvolvedores de projetos determinados a manter o projetosempre evoluiacutedo Tambeacutem eacute apresentada uma seccedilatildeo para demonstrar os detalhese formas de utilizaccedilatildeo das expressotildees Lambda que satildeo o foco dos objetivos destetrabalho

bull Capiacutetulo 4 Descreve a metodologia e processo utilizados para o desenvolvimentoe obtenccedilatildeo dos resultados deste trabalho O capiacutetulo desenvolve o contexto dasquestotildees de pesquisa e explica os motivos e processos de desenvolvimento das fer-ramentas utilizadas para minerar os dados aleacutem de determinar a classificaccedilatildeo dosresultados obtidos em grupos para facilitar a organizaccedilatildeo dos dados de forma queas perguntas sejam respondidas claramente

bull Capiacutetulo 5 Apresenta os resultados obtidos e de que forma eles ajudaram a respon-der as questotildees de pesquisa Eacute descrita uma anaacutelise de um projeto de cada categoriaespecificada no capiacutetulo anterior a fim de contextualizar cada tipo de resultado paraque o leitor entenda a forma que os projetos Java estatildeo lidando com as expressotildeesLambda

bull Capiacutetulo 6 Descreve as dificuldades e problemas obtidos durante o trabalho e deque forma eles influenciaram nos resultados Tambeacutem eacute apresentada uma seccedilatildeocontendo as ideias surgidas durante o desenvolvimento deste trabalho que ficarampara ser feitas no futuro devido agrave gama de informaccedilotildees que a mineraccedilatildeo dos dadostrouxe

4

Capiacutetulo 2

Evoluccedilatildeo e Mineraccedilatildeo deRepositoacuterios de Software

As linguagens de programaccedilatildeo estatildeo sempre evoluindo aumentando sua complexidade eexpressividade Da mesma forma aleacutem de se preocupar com dificuldades de estabelecercompatibilidade do software em relaccedilatildeo a tecnologias antigas desenvolvedores tambeacutemprecisam acompanhar essa evoluccedilatildeo das linguagens para que suas ferramentes natildeo setornem obsoletas [9] Isso agrega um grande desafio no desenvolvimento e evoluccedilatildeo desoftware

O conceito de evoluccedilatildeo de software amadureceu e se tornou um grande foco de pes-quisa Poreacutem nem sempre estudos de evoluccedilatildeo de software reconhecem a importacircncia daevoluccedilatildeo da linguagem de programaccedilatildeo no contexto do desenvolvimento de software [8]Quando um coacutedigo natildeo evolui junto com a linguagem com o objetivo de manter umacompatibilidade com versotildees anteriores sua capacidade de evoluccedilatildeo se torna limitada [9]

A refatoraccedilatildeo de coacutedigo que consiste em realizar mudanccedilas no coacutedigo fonte sem modi-ficar o comportamento observado do software [15] permite que a evoluccedilatildeo de linguagens eferramentas aconteccedilam mais naturalmente No entanto novos desafios surgem como porexemplo saber quando e como realizar a refatoraccedilatildeo de coacutedigo de forma eficiente e coesaDentre as teacutecnicas de pesquisa em engenharia de software para entender esse problematorna-se interessante explorar as teacutecnicas de mineraccedilatildeo de dados aplicados a repositoacuteriosde software com o objetivo de entender o relacionamento entre evoluccedilatildeo e refatoraccedilatildeo

Assim este capiacutetulo busca esclarecer conceitos e estrateacutegias de evoluccedilatildeo de softwaremineraccedilatildeo de repositoacuterios de software e o estado da arte sobre o assunto

5

21 Evoluccedilatildeo de Software

Durante o processo de produccedilatildeo e manutenccedilatildeo de software haacute a necessidade de diversastomadas de decisotildees sobre seu desenvolvimento como por exemplo decidir como melho-rar a qualidade do software Tais decisotildees precisam ser tomadas levando em consideraccedilatildeoo ambiente em que se estaacute inserido com novas tecnologias surgindo todos os dias fe-edback de usuaacuterios exigentes e concorrentes produzindo um software similar com ideiasinovadoras

Tudo isso acontece em um ritmo de constante mudanccedila e assim como diria Lehmaneacute imprescindiacutevel que software de sistemas sejam capazes de evoluir ou os mesmos correm orisco de sofrer uma morte prematura [16] fazendo assim da evoluccedilatildeo de software um con-ceito importante dentro do seu processo de desenvolvimento Essa evoluccedilatildeo deve ocorrerconsiderando o ambiente em que o software estaacute inserido o qual possui aspectos teacutecnicos esociais sua infraestrutura que pertence ao seu ambiente teacutecnico o qual sempre necessitamanutenccedilatildeo e ao mesmo tempo usuaacuterios que utilizam o software e estatildeo constantementeformando opiniotildees oferecendo feedback e na expectativa por novidades [7] Assim a me-dida que novas caracteriacutesticas satildeo desenvolvidas novas tecnologias de infraestrutura satildeonecessaacuterias novos requisitos satildeo adicionados e o sistema de software deve se adaptar aessas mudanccedilas

Com relaccedilatildeo aos aspectos sociais que envolvem a evoluccedilatildeo do software eacute importanteressaltar os conceitos baacutesicos de como essa evoluccedilatildeo acontece Durante um estudo empiacutericopioneiro na aacuterea de evoluccedilatildeo de software para sistemas de grande escala Lehman e seuscolaboradores formularam um conjunto de observaccedilotildees que hoje satildeo conhecidas como asleis da evoluccedilatildeo de software ou simplesmente Leis de Lehman [16] No geral as leis deevoluccedilatildeo de software podem ser descritas da seguinte forma [16]

1 Mudanccedila contiacutenua um sistema se tornaraacute progressivamente menos satisfatoacuteriopara seus usuaacuterios com o tempo a menos que se adapte continuamente agraves necessi-dades que surgiratildeo

2 Complexidade Crescente um sistema se tornaraacute cada vez mais complexo amenos que se trabalhe para explicitamente reduzir sua complexidade

3 Auto-regulaccedilatildeo o processo de evoluccedilatildeo de software eacute auto-regulatoacuterio no que dizrespeito agraves distribuiccedilotildees dos artefatos e produtos produzidos

4 Conservaccedilatildeo da estabilidade organizacional a taxa meacutedia de atividade globalefetiva em um sistema em evoluccedilatildeo natildeo muda com o tempo ou seja a meacutedia detrabalho e esforccedilo colocado em cada entrega do sistema permanece a mesma

6

5 Conservaccedilatildeo de familiaridade a quantidade de conteuacutedo novo em cada entregado sistema tende a se manter constante com o tempo

6 Crescimento contiacutenuo A quantidade de funcionalidades em um sistema cresceraacutecom o tempo com o objetivo de satisfazer seus usuaacuterios

7 Decliacutenio de qualidade Um sistema seraacute percebido com qualidade inferior como passar do tempo a menos que seu design tenha uma manutenccedilatildeo minuciosa e seadapte a novas restriccedilotildees

8 Sistema de Feedback Evoluir um sistema com sucesso requer reconhecer que oprocesso de desenvolvimento acontece em um sistema de feedback de vaacuterios ciclosagentes e niacuteveis

Os aspectos teacutecnicos que envolvem a evoluccedilatildeo de software levam em consideraccedilatildeo astecnologias utilizadas para o seu desenvolvimento desde a linguagem de programaccedilatildeo agravesmaacutequinas onde o software seraacute hospedado que sofrem atualizaccedilotildees recebem novas versotildeescom novas caracteriacutesticas implementadas

Um estudo realizado por Lavre mostra como a evoluccedilatildeo das linguagens de programa-ccedilatildeo no contexto da evoluccedilatildeo de software muitas vezes satildeo subestimadas uma vez quemuitos podem considerar em seus estudos a linguagem de computaccedilatildeo como um artefatoimutaacutevel [8] Por exemplo coloca-se muita ecircnfase e cuidado para realizar o versionamentode coacutedigo fonte de um software mas este pode ser tornar inutilizaacutevel futuramente se nin-gueacutem souber qual versatildeo de compilador determinada versatildeo de coacutedigo foi desenvolvida

Para natildeo se deixar estagnar linguagens de programaccedilatildeo precisam se adaptar e evoluirQuando uma linguagem de programaccedilatildeo atualiza softwares que eram antes consideradosatualizados podem se tornar rapidamente obsoletos E ao mesmo tempo que novascaracteriacutesticas satildeo adicionadas a linguagem precisa fornecer compatibilidade com versotildeesanteriores aumentando sua complexidade Desenvolvedores entatildeo encontram-se tambeacutemem um empasse buscando um equiliacutebrio entre manter a compatibilidade da ferramentacom versotildees anteriores da linguagem e atualizaacute-la para manter o software atualizado [9]

A estrateacutegia de refatoraccedilatildeo de coacutedigo pode ser uma opccedilatildeo que permite a linguageme o software co-evoluiacuterem com um menor grau de dificuldade [9] Refatoraccedilatildeo (do inglecircsrefactoring) eacute o processo de modificaccedilatildeo de um software com o objetivo de melhorar a es-trutura interna do mesmo sem alterar sua percepccedilatildeo externa Eacute uma maneira disciplinadade melhorar o design do coacutedigo apoacutes ele jaacute ter sido implementado Por exemplo dividiruma funcionalidade grande feita em apenas um bloco de coacutedigo em vaacuterios moacutedulos [15]

A refatoraccedilatildeo de coacutedigo pode ser um meio utilizado para evoluir o software adaptandoo coacutedigo com caracteriacutesticas novas introduzidas pela linguagem modificando o design dosistema sem comprometer sua integridade No entanto novos desafios surgem visto que

7

refatorar o coacutedigo fonte de um sistema de grande porte natildeo eacute uma tarefa faacutecil havendo anecessidade de ferramentas que possam automatizar o processo ou realizar um estudo paraentender como as novas caracteriacutesticas da linguagem podem ser utilizadas para substituirou melhorar funcionalidades obsoletas [9]

22 MSR Mineraccedilatildeo de dados e a Engenharia deSoftware

Com o objetivo de compreender prever e planejar os vaacuterios aspectos do desenvolvimentode um projeto em especial tudo que possa impactar na evoluccedilatildeo de software a teacutecnicade mineraccedilatildeo de dados tem sido bastante utilizada em engenharia de software [17]

O termo Mineraccedilatildeo de Repositoacuterios de Software (MSR) tem sido utilizado para descre-ver vaacuterias maneiras de se examinar repositoacuterios de software Um repositoacuterio de softwarepode ser considerado um artefato que eacute produzido e arquivado durante a evoluccedilatildeo desoftware [1] Estes responsoacuterios armazenam informaccedilotildees que podem fornecer todos osdetalhes de desenvolvimento do software provendo meios necessaacuterios para uma anaacuteliseaprofundada de evoluccedilatildeo de software

Repositoacuterios de software satildeo comumente utilizados para armazenar e acompanhar ohistoacuterico de desenvolvimento do software mas raramente usados para tomada de deci-sotildees em relaccedilatildeo ao projeto Assim pesquisadores de MSR buscam modificar a impressatildeode que tais repositoacuterios satildeo estaacuteticos que servem apenas para manutenccedilatildeo de registrostransformando-os em repositoacuterios ativos que podem auxiliar na tomada de decisatildeo em pro-jetos de software modernos atraveacutes da identificaccedilatildeo de padrotildees para realizar a propagaccedilatildeode mudanccedilas [18]

221 Classificaccedilatildeo

De acordo com Kagdi et al dentre as abordagens de MSR utilizadas atualmente eacute possiacuteveldescrevecirc-las para entatildeo comparaacute-las e possivelmente classificaacute-las levando em considera-ccedilatildeo uma taxonomia de quatro dimensotildees os repositoacuterios de software utilizados (fontes dedados) o propoacutesito do MSR a metodologia e a avaliaccedilatildeo da abordagem [1] como mostraa Figura 21 onde as taxonomias destacadas em amarelo satildeo as que prevaleceram poreacutemnatildeo exclusivamente na metodologia adotada por este trabalho

8

Figura 21 Taxonomia em camadas adaptada do trabalho de Kagdi et al [1]

Fontes de Dados

As fontes de informaccedilatildeo variam de acordo com a abordagem utilizada e dentre as informa-ccedilotildees mineradas em repositoacuterios de software inclui-se as seguintes categorias os artefatosde software e suas versotildees as diferenccedilas entre os artefatos de software e suas versotildees e osmetadados sobre as mudanccedilas no software

As fontes de dados podem ser melhor classificadas de acordo com Hassan et al [17]

bull Repositoacuterios de controle de Versatildeo estes repositoacuterios guardam o histoacuterico de desen-volvimento de um projeto armazenando todas as mudanccedilas no coacutedigo fonte assimcomo os metadados associados com cada mudanccedila Exemplos git SVN

bull Bug repositories Estes repositoacuterios rastreiam o histoacuterico de resoluccedilatildeo de bugs quesatildeo reportados por usuaacuterios e desenvolvedores Exemplos Bugzilla e Jira

9

bull Histoacuterico de Comunicaccedilatildeo (Archived communications) estes repositoacuterios rastreiamdiscussotildees sobre os vaacuterios aspectos de um projeto de software por sua vida uacutetil Porexemplo listas de e-mails

bull Deployment logs logs com informaccedilotildees do software gerados por ferramentas dedesenvolvimento

bull Repositoacuterios de software Repositoacuterios onde o coacutedigo fonte de vaacuterios projetos satildeoarmazenados como por exemplo Sourceforgenet

No contexto deste trabalho estes repositoacuterios consistem em fontes de coacutedigo armaze-nadas em sistemas de controle de versatildeo especificamente coacutedigos na plataforma Github

O propoacutesito

O propoacutesito da mineraccedilatildeo de repositoacuterios de software se resume nas perguntas de pes-quisa que podem ser respondidas utilizando mineraccedilatildeo Assim existem duas classes deperguntas de pesquisa para MSR [1]

A primeira eacute a pergunta de anaacutelise market-basket1 ldquoSe A acontece o que mais podeacontecerrdquo A resposta para este tipo de pergunta eacute um conjunto de regras descrevendotendecircncias de relacionamentos como por exemplo se A acontecer entatildeo B e C acontecemdurante um periacuteodo X

A segunda classe diz respeito agraves perguntas de prevalecircncia (Prevalence Questions -PQ) como por exemplo perguntas do tipo ldquoA funcionalidade Y foi modificadardquo quepossuem uma resposta booleana ou ldquoQuantas vezes esta funcionalidade Y foi modificadardquocontendo uma resposta quantitativa

As perguntas de pesquisa deste trabalho se encaixam majoritariamente na segundaclasse onde o objetivo traccedilado eacute respondido de forma quantitativa com algumas tentativasde classificaccedilatildeo de tipos de repositoacuterios como seraacute descrito nos capiacutetulos seguintes

A metodologia

A metodologia corresponde a maneira como as questotildees de MSR iratildeo ser respondidas evaacuterias abordagens estatildeo disponiacuteveis Poreacutem Kagdi indica duas estrateacutegias baacutesicas quepodem ser utilizadas

Primeiramente pode-se utilizar a mediccedilatildeo indireta e anaacutelise da evoluccedilatildeo do softwareEsta abordagem pode ser realizada da seguinte forma extrair e computar informaccedilotildeesde cada versatildeo de um software separadamente e em seguida individualmente comparar

1Anaacutelise Market-basket eacute uma teacutecnica de modelagem baseada na teoria de que se vocecirc comprar certostipos de produtos vocecirc haacute uma probabilidade maior (ou menor) de comprar outros tipos de produtos [19]

10

propriedades encontradas como por exemplo comparar duas versotildees distintas de umsoftware atraveacutes de um repositoacuterio github realizando uma investigaccedilatildeo de alto niacutevel noque diz respeito a evoluccedilatildeo do software [1]

A segunda perspectiva de metodologia que pode ser utilizada corresponde agrave mediccedilatildeodireta e anaacutelise da evoluccedilatildeo do software Ela diz respeito agraves investigaccedilotildees que estudamos mecanismos que leva um software a ser modificado de uma versatildeo para outra focandonas diferenccedilas especiacuteficas entre estas versotildees como por exemplo examinando mudanccedilasespeciacuteficas das classes arquivos funccedilotildees de cada parte do coacutedigo [1]

Assim eacute possiacutevel descrever explicitamente que este trabalho utiliza em sua maioriauma metodologia com mediccedilotildees diretas atraveacutes da anaacutelise estaacutetica de informaccedilotildees docoacutedigo fonte de diferente versotildees para analisar os diferentes padrotildees de desenvolvimentoem que expressotildees lambda (definidas no capiacutetulo seguinte) satildeo utilizadas

A Avaliaccedilatildeo

Por fim existem diversas formas para se avaliar o estudo realizado sempre levando emconsideraccedilatildeo a validade dos resultados obtidos Pode-se utilizar de meacutetricas para avaliar osdados considerando o quanto das informaccedilotildees obtidas satildeo relevantes Outra forma de seavaliar seria atraveacutes da utilizaccedilatildeo de modelos probabiliacutesticos seguindo uma abordagemde teoria da informaccedilatildeo Assim foram utilizadas determinadas meacutetricas quantitativaspara avaliar os resultados obtidos neste trabalho

23 Trabalhos Relacionados

Como ressaltado na introduccedilatildeo o foco deste trabalho encontra-se em utilizar teacutecnicas deMSR para caracterizar a adoccedilatildeo de expressotildees lambda em repositoacuterios Java Ao reali-zar um estudo sobre o estado da arte encontrou-se diversos trabalhos que utilizam deMSR para obter informaccedilotildees relevantes sobre repositoacuterios de software em diversos focose em especial trabalhos que investiguem repositoacuterios na linguagem Java Jaacute existemtambeacutem alguns trabalhos que apresentam ferramentas de refatoraccedilatildeo de coacutedigo para im-plementaccedilatildeo de expressotildees lambda com foco na evoluccedilatildeo do software Dentre os trabalhosencontrados mencionados destacam-se

bull Em um trabalho sobre utilizaccedilatildeo de refatoraccedilatildeo de coacutedigo para realizar a transiccedilatildeode coacutedigo Java para as novas caracteriacutesticas implementadas no Java 8 Gyori et alapresenta uma ferramenta que automatiza com sucesso o trabalho de conversatildeo decoacutedigo como Annonymous Inner Class para expressotildees lambda [12] O capiacutetulo aseguir descreve em detalhes estes conceitos

11

bull Regrowing a Language de Overbey apresenta um estudo sobre a importacircncia da co-evoluccedilatildeo entre a linguagem de programaccedilatildeo e os projetos de software focando naslinguagens Fortran e Java e provando como ferramentas de refatoraccedilatildeo de coacutedigoauxiliam para que o software consiga evoluir juntamente com sua linguagem deprogramaccedilatildeo [9]

bull O trabalho sobre a adoccedilatildeo de generics em coacutedigo Java feito por Parnin utiliza demineraccedilatildeo de dados para realizar uma investigaccedilatildeo empiacuterica avaliando projetos decoacutedigo aberto com o objetivo de observar como desenvolvedores destes projetos estatildeoutilizando generics em Java [20]

Os estudos mencionados focam em assuntos particulares pertinentes a este trabalhoem que de um lado tem-se trabalhos que mostram a necessidade de refatoraccedilatildeo de coacutedigopara evoluccedilatildeo de software e do outro tem-se trabalhos que mostram que eacute possiacutevel utilizarde MSR para entender melhor como a evoluccedilatildeo da linguagem de programaccedilatildeo Java temafetado projetos reais de coacutedigo aberto e como estes projetos estatildeo se adaptando a estasevoluccedilotildees

12

Capiacutetulo 3

Java SE 8 e JDK 8

Este trabalho tem como objetivo caracterizar a adoccedilatildeo de expressotildees Lambda em siste-mas Java que podem ser considerados legados pois foram concebidos em um momentoanterior a introduccedilatildeo dessa nova caracteriacutestica na linguagem Java Com o intuito de faci-litar o entendimento do leitor sobre tais construccedilotildees esse capiacutetulo apresenta informaccedilotildeeshistoacutericas referentes agrave linguagem Java desde sua criaccedilatildeo ateacute a sua ascensatildeo como umadas linguagens de programaccedilatildeo mais populares Aleacutem disso seratildeo apresentadas as novascaracteriacutesticas presentes na versatildeo Java SE 8 com destaque nas expressotildees Lambda e deque forma vieram para auxiliar no desenvolvimento de sistemas

31 Histoacuterico

Java eacute uma linguagem de programaccedilatildeo orientada a objetos para propoacutesitos gerais [21] Alinguagem nasceu com o nome de Oak no ano de 1991 com o foco em televisotildees digitais acabo mas devido agrave complexidade e poder da linguagem logo expandiu-se para os outrosdomiacutenios principalmente a Internet [22] Posteriormente a linguagem recebeu o nome deGreentalk devido agrave marca Oak jaacute ser registrada por outra empresa e o principal projeto daequipe se chamar Green Por fim o nome Java foi o mais votado pela equipe da Sun emuma reuniatildeo para decidir o mais raacutepido possiacutevel um nome definitivo para a linguagem [23]

Em 1995 em sua primeira versatildeo puacuteblica 10 a linguagem Java jaacute comeccedilava a terum crescimento em sua popularidade como Web Applet nos navegadores mais popularesfornecendo seguranccedila e rapidez nas plataformas mais utilizadas [24] A cada nova versatildeopublicada novas funcionalidades e plataformas eram adicionadas e tornavam a linguagemmais difundida no meio computacional fazendo com que em 2006 a linguagem fosse divi-dida em Java EE (foco em rede e serviccedilos web) Java ME (foco em sistemas embarcados)e Java SE (foco em desktops e servidores) [25]

13

Apoacutes anos de evoluccedilatildeo e aprimoramento atraveacutes de diversas versotildees como visto naTabela 31 hoje o Java se tornou uma das linguagens de programaccedilatildeo mais utilizadas nomundo estando em aproximadamente 15 das linhas de coacutedigo disponiacuteveis pela inter-net [11] A quantidade de plataformas suportadas pela linguagem e com o advento dosistema operacional Android sendo rodado na maior parte dos smartphones do mundoaleacutem da simplicidade em codificar no paradigma orientado a objetos foram os fatoresrelevantes para que a linguagem se popularizasse no mundo digital [26]

Tabela 31 As versotildees anteriores de java e principais caracteriacutesticasVersatildeo Principais caracteriacutesticasJava 10 JVM e JDKJava 2 Event Listeners

Kestrel (Java 3) HotSpot JVMMerlin (Java 4) Diversas novas APIs como Assertion e expressotildees regularesTiger (Java 5) Generics

Mustang (Java 6) Web ServicesDolphin (Java 7) Suporte a linguagens dinamicas

32 Princiacutepios

Com o foco em alcanccedilar a Web e participar mais ativamente do mercado virtual e e-Commerce foram projetados princiacutepios que permitissem com que a linguagem pudessealcanccedilar seus objetivos principais ao mesmo tempo que mantinha a facilidade e fami-liarizaccedilatildeo da linguagem a seus desenvolvedores [27] Dessa forma a equipe da Oracledeterminou cinco princiacutepios que caracterizariam o foco da linguagem Java

bull simples orientada a objeto e familiar projetada para ser orientada a objeto epermitir que seus desenvolvedores comecem a codificar rapidamente sem a necessi-dade de uma curva de aprendizagem acentuada

bull segura e robusta projetada para prover software confiaacutevel por meio de checagensa tempo de compilaccedilatildeo e execuccedilatildeo Haacute uma grande preocupaccedilatildeo com seguranccediladevido agrave larga utilizaccedilatildeo da linguagem em sistemas distribuiacutedos

bull de arquitetura neutra e portaacutevel projetada para ser independente de qualquerarquitetura bastando rodar a JVM dessa forma garantindo a portabilidade paravaacuterios ambientes e dispositivos

14

bull executada em alta performance projetada para fornecer a maior performancepossiacutevel em tempo de execuccedilatildeo com a utilizaccedilatildeo do garbage collector em uma threadde baixa prioridade

bull interpretada dinacircmica e threaded projetada para ser interpretada por qual-quer dispositivo que possua JVM desenvolvida garantindo um desenvolvimento raacute-pido e em ciclos O uso da classe Thread permite que a linguagem acompanhe atendecircncia do paralelismo Aleacutem disso a ligaccedilatildeo de classes eacute feita em tempo real esomente quando necessaacuteria tornando-a dinacircmica

33 Evoluccedilatildeo

A primeira versatildeo do Java 8 foi lanccedilada em 2014 [28] e apresentou diversas atualizaccedilotildeesespalhadas em categorias como linguagem seguranccedila Collections ferramentas deployentre outras Dentre a grande quantidade de mudanccedilas os destaques se encontraram nasnovas melhorias presentes na linguagem que afetaram de forma mais direta a maneiracom que os desenvolvedores passaram a tratar e organizar o coacutedigo fonte As atualizaccedilotildeesreferentes a linguagem descritas oficialmente pela Oracle [29] satildeo

1 Lambda Expressions ou apenas Expressotildees Lambda correspondem a uma novacaracteriacutestica que permite que uma pequena funcionalidade possa ser utilizada comoum argumento de um meacutetodo facilitando a escrita de accedilotildees que seratildeo feitas repetida-mente em uma Collection ou quando um processo se completa ou quando encontraum erro Eacute tambeacutem uma forma compacta de se escrever coacutedigo que previamenteera escrito com anonymous inner classes [29] A Listagem 31 mostra uma classehipoteacutetica Calculator cujo meacutetodo operateBinary() recebe como paracircmetro doisinteiros e um objeto da classe IntegerMath que representa a operaccedilatildeo que deveraacuteser realizada ou seja uma funcionalidade dinacircmica

1 pub l i c c l a s s Ca l cu la to r 2

3 i n t e r f a c e IntegerMath 4 i n t opera t i on ( i n t a i n t b) 5 6

7 pub l i c i n t operateBinary ( i n t a i n t b IntegerMath op ) 8 re turn op opera t i on (a b) 9

10

11 pub l i c s t a t i c void main ( St r ing a rgs ) 12

15

13 Calcu la to r myApp = new Ca lcu la to r ( ) 14 IntegerMath add i t i on = (a b) minusgt a + b 15 IntegerMath subt ra c t i on = (a b) minusgt a minus b 16 System out p r i n t l n ( 40 + 2 = +17 myApp operateBinary (40 2 add i t i on ) ) 18 System out p r i n t l n ( 20 minus 10 = +19 myApp operateBinary (20 10 sub t ra c t i on ) ) 20 21 22

Listagem 31 Exemplo de coacutedigo com o uso de Expressatildeo Lambda [30]

2 Method References Frequentemente expressotildees lambda criam meacutetodos anocircni-mos Algumas vezes poreacutem satildeo utilizadas para chamar um meacutetodo jaacute existentena classe Ao inveacutes de escrever a expressatildeo Lambda para esse caso pode-se optarpor utilizar um Method Reference que facilita a escrita e leitura desse uso de ex-pressatildeo Lambda [29] A Listagem 32 mostra um exemplo de um meacutetodo estaacuteticoque compara duas pessoas pelas suas idades e a Listagem 33 a utilizaccedilatildeo de MethodReference para aplicar a utilizaccedilatildeo desse meacutetodo em um array e reduzir a escrita deuma expressatildeo lambda a uma forma mais legiacutevel

1 pub l i c s t a t i c i n t compareByAge ( Person a Person b) 2 re turn a b i r thday compareTo (b b i r thday ) 3 4

Listagem 32 Exemplo de meacutetodo de uma classe Pessoa [31]

1 Arrays s o r t ( rosterAsArray Person compareByAge ) 2

Listagem 33 Exemplo de uso de Method Reference [31]

3 Default Methods satildeo meacutetodos com a palavra-chave default que servem para adi-cionar implementaccedilotildees de meacutetodos a uma interface de alguma biblioteca mantendoa compatibilidade binaacuteria com versotildees mais antigas dessa interface Tambeacutem pos-sibilita a implementaccedilatildeo de meacutetodos estaacuteticos em interfaces [29] A Listagem 34apresenta a inclusatildeo de um meacutetodo default na interface TimeClient

1 pub l i c i n t e r f a c e TimeClient 2 void setTime ( i n t hour i n t minute i n t second ) 3 void setDate ( i n t day i n t month i n t year ) 4 void setDateAndTime ( i n t day i n t month i n t year 5 i n t hour i n t minute i n t second )

16

6 LocalDateTime getLocalDateTime ( ) 7

8 s t a t i c ZoneId getZoneId ( S t r ing zoneStr ing ) 9 t ry

10 re turn ZoneId o f ( zoneStr ing ) 11 catch ( DateTimeException e ) 12 System e r r p r i n t l n ( I n v a l i d time zone + zoneStr ing

+13 us ing d e f a u l t time zone in s t ead ) 14 re turn ZoneId systemDefault ( ) 15 16 17

18 d e f a u l t ZonedDateTime getZonedDateTime ( St r ing zoneStr ing ) 19 re turn ZonedDateTime o f ( getLocalDateTime ( ) getZoneId (

zoneStr ing ) ) 20 21 22

Listagem 34 Exemplo de interface com um meacutetodo default [32]

4 Repeating Annotations permitem a implementaccedilatildeo e utilizaccedilatildeo de anotaccedilotildees deum mesmo tipo que podem ser utilizadas mais de uma vez para a mesma declara-ccedilatildeo [29] A Listagem 35 apresenta duas anotaccedilotildees iguais com paracircmetros diferentespermitindo uma customizaccedilatildeo maior na aplicaccedilatildeo de um tipo de anotaccedilatildeo

1 Schedule ( dayOfMonth= l a s t )2 Schedule (dayOfWeek= Fr i hour= 23 )3 pub l i c void doPeriodicCleanup ( ) 4

Listagem 35 Exemplo de Repeating Annotations [33]

5 Type Annotations permitem que anotaccedilotildees possam ser utilizadas em tipos aleacutemde declaraccedilotildees dessa forma pode-se garantir que um campo sempre atenda agraves suasexpectativas e evite testes desnecessaacuterios [29] A Listagem 36 mostra um exemplo derestriccedilatildeo a uma String que nunca poderaacute ser nula devido agrave anotaccedilatildeo de NonNull

1 NonNull S t r ing s t r

Listagem 36 Exemplo de Type Annotation garantindo que o campo nunca seja null [34]

17

34 Expressotildees Lambda

Uma das mudanccedilas mais interessantes implementadas no Java 8 foi a adiccedilatildeo de expressotildeeslambda As expressotildees lambda permitem que a linguagem Java possa atuar parcialmentecomo uma linguagem de programaccedilatildeo funcional onde comportamentos satildeo avaliados eaplicados diferentemente da programaccedilatildeo imperativa que foca na mudanccedila de estadosNa praacutetica um comportamento pode ser passado como paracircmetro de um meacutetodo atraveacutesde uma escrita mais reduzida e legiacutevel Os benefiacutecios de utilizar expressotildees lambda incluemuma melhora na legibilidade e organizaccedilatildeo de coacutedigo que antes era escrito com AnonymousInner Class aleacutem de permitir uma forma simples de utilizar comportamento paralelo como uso de Streams

341 Sintaxe

A sintaxe de uma expressatildeo lambda eacute dividida nas seguintes partes [30]

bull Uma lista de paracircmetros separados por viacutergulas

bull Um token representado por uma seta -gt

bull Um corpo que pode ser representado por uma expressatildeo uacutenica ou um bloco de coacutedigodentro de chaves

As Listagens 37 e 38 mostram duas formas diferentes de se aplicar expressotildees Lambdacom uma sintaxe similar A primeira aplica a expressatildeo diretamente apoacutes a seta utilizadanormalmente para trechos de coacutedigo pequenos e simples e a segunda utiliza-se de chavespara incorporar o coacutedigo e da palavra-chave return para especificar o retorno forma maisutilizada para uma quantidade maior de coacutedigo

1 p minusgt p getGender ( ) == Person Sex MALE2 ampamp p getAge ( ) gt= 183 ampamp p getAge ( ) lt= 25

Listagem 37 Exemplo de expressatildeo lambda com uma expressatildeo [30]

1 p minusgt 2 re turn p getGender ( ) == Person Sex MALE3 ampamp p getAge ( ) gt= 184 ampamp p getAge ( ) lt= 25 5

Listagem 38 Exemplo de expressatildeo lambda com um bloco de coacutedigo [30]

18

342 Principais formas de uso

Anonymous Inner Class

Antes do Java 8 a necessidade de passar funccedilotildees ou expressotildees como paracircmetro de algummeacutetodo era suprida atraveacutes de Anonymous Inner Classes A utilizaccedilatildeo desse tipo dedeclaraccedilatildeo junto com a anotaccedilatildeo de Override permite sobrescrever um meacutetodo de umainterface funcional e ao mesmo tempo passa-la como argumento para um meacutetodo Umaexpressatildeo lambda se comporta da mesma forma poreacutem a quantidade de coacutedigo escritopela Anonymous Inner Class eacute maior e pode dificultar a leitura de coacutedigo pois conteacutemmuita informaccedilatildeo natildeo utilizada para efetivo entendimento do que estaacute sendo feito naqueletrecho

A Listagem 39 apresenta a instanciaccedilatildeo da classe EventHandler internamente ao meacute-todo setOnAction() de forma que o desenvolvedor possa escrever o comportamento quedeseja passar como paracircmetro do meacutetodo atraveacutes da substituiccedilatildeo do meacutetodo handle()que jaacute existe pelo meacutetodo handle() criado e escrito pelo desenvolvedor

1 btn setOnAction (new EventHandlerltActionEvent gt() 2 Override3 pub l i c void handle ( ActionEvent event ) 4 System out p r i n t l n ( He l lo World ) 5 6 )

Listagem 39 Exemplo de uso de Anonymous Inner Class [35]

Interface funcional

Ao projetar um coacutedigo novo o desenvolvedor que optar por utilizar expressotildees lambdadeve iniciar com a criaccedilatildeo de uma interface funcional Esse tipo de interface possui umuacutenico meacutetodo abstrato permitindo que expressotildees lambda sejam usadas para sobrescrevero comportamento do meacutetodo abstrato Uma interface funcional pode possuir outros meacuteto-dos desde que sejam default Uma nova anotaccedilatildeo FunctionalInterface foi adicionadacom a atualizaccedilatildeo do Java 8 para conferir em tempo de compilaccedilatildeo se a interface satisfazos requisitos desse modelo de interface

A Listagem 310 apresenta um exemplo de interface funcional com o objetivo de permi-tir o uso de expressotildees lambda que utilizaratildeo de dois Double como paracircmetro e jaacute utilizada nova anotaccedilatildeo FunctionalInterface introduzida no Java 8

1 Funct iona l Inte r face2 pub l i c i n t e r f a c e DoubleOp 3 pub l i c Double apply ( Double a Double b)

19

4

Listagem 310 Exemplo de interface funcional

Dessa forma conforme as Listagens 311 e 312 o meacutetodo apply() pode tomar formade qualquer operaccedilatildeo entre dois Double que seraacute especificada quando a expressatildeo lambdafor montada dando o aspecto de linguagem funcional agrave linguagem e mais facilidade eliberdade ao desenvolvedor

1 pub l i c c l a s s Ca l cu la to r 2 pub l i c s t a t i c Double c a l c ( Double op1 Double op2 DoubleOp operator ) 3 re turn operator apply ( op1 op2 ) 4 5

Listagem 311 Exemplo de aplicaccedilatildeo da interface funcional

1 Double r e s u l t 1 = Ca lcu la to r c a l c (10d 50d ( a b ) minusgt a + b)

Listagem 312 Uso de expressatildeo lambda para o exemplo anterior

Collections

Dentre as atualizaccedilotildees de pacotes do Java 8 foi adicionado um meacutetodo stream() nainterface Collection Esse meacutetodo trata as Collection como streams o que significa queapesar de natildeo ser possiacutevel acessar elementos diretamente algumas novas manipulaccedilotildeessatildeo possiacuteveis Essas manipulaccedilotildees satildeo na verdade meacutetodos da interface Stream quepodem receber como paracircmetro uma expressatildeo lambda ou seja um comportamento a seraplicado agrave Collection Dentre os meacutetodos temos

bull filter() O meacutetodo filter() recebe uma expressatildeo lambda contendo uma condiccedilatildeopara filtragem da collection

bull map() O meacutetodo map() mapeia os elementos de uma Collection em outro objetocomo uma String A expressatildeo lambda passada por paracircmetro deve retornar o tipode objeto ao qual seraacute mapeado

bull forEach() O meacutetodo forEach() aplica uma operaccedilatildeo especiacutefica para cada ele-mento da Collection A expressatildeo lambda a ser passada deve conter a operaccedilatildeo aser realizada

bull min() e max() Os meacutetodos min() e max() retornam o elemento menor ou maiorda Collection dependendo da expressatildeo lambda passada como paracircmetro

20

A Listagem 313 demonstra como vaacuterias operaccedilotildees com uma Collection podem seraplicadas de uma vez de forma que lendo a expressatildeo lambda jaacute eacute possiacutevel saber oresultado da aplicaccedilatildeo do meacutetodo agrave Collection

1 r o s t e r2 stream ( )3 f i l t e r (4 p minusgt p getGender ( ) == Person Sex MALE5 ampamp p getAge ( ) gt= 186 ampamp p getAge ( ) lt= 25)7 map(p minusgt p getEmailAddress ( ) )8 forEach ( emai l minusgt System out p r i n t l n ( emai l ) )

Listagem 313 Exemplo de utilizaccedilatildeo de meacutetodos de stream com expressotildees lambda [30]

21

Capiacutetulo 4

Estudo e o Processo de Mineraccedilatildeo

A definiccedilatildeo da metodologia utilizada para realizaccedilatildeo deste trabalho eacute importante para queexista uma padronizaccedilatildeo e melhor entendimento de como os resultados foram obtidos paraque a replicaccedilatildeo do mesmo possa ser realizada em trabalhos futuros [36]

Figura 41 Processo utilizado para realizaccedilatildeo do estudo

O esquema representado na Figura 41 descreve o processo seguido para a realizaccedilatildeodeste trabalho que foi divido em trecircs grandes etapas a de planejamento definindo osobjetivos questotildees de pesquisa e meios de investigaccedilatildeo deste projeto a etapa de execuccedilatildeorealizando todo o procedimento metodoloacutegico definido para a coleta e refinamento de

22

dados e a etapa de avaliaccedilatildeo onde foram classificados e avaliados os dados coletadospara responder agraves questotildees de pesquisa

A seguir na primeira seccedilatildeo seratildeo apresentadas em detalhes as questotildees de pesquisa aserem respondidas Em seguida seraacute feito uma breve descriccedilatildeo da fonte de dados utilizada- especificamente os projetos utilizados como objetos de estudo deste trabalho e por fimtodo o restante da metodologia que foi de fato desenvolvida para obter os resultadosnecessaacuterios

41 Questotildees de Pesquisa

Com o objetivo de entender e caracterizar melhor o uso de expressotildees lambda foramdefinidas as seguintes questotildees de pesquisa a serem respondidas

bull PQ-1 Quando os projetos comeccedilaram a introduzir o uso de expressotildees lambda emseus coacutedigos e qual a meacutedia de expressotildees lambda por snapshots caso existam

bull PQ-2 Como as equipes de desenvolvimento estatildeo utilizando expressotildees lambdaatraveacutes de refatoraccedilatildeo de coacutedigo ou introduzindo apenas em coacutedigo novo

bull PQ-3 Quais satildeo os padrotildees tipicamente adotados para o uso de expressotildees lambda

A primeira pergunta de pesquisa gira em torno de como projetos populares open-sourceestatildeo se adaptando agrave introduccedilatildeo de expressotildees lambda em Java muitos projetos jaacute estatildeoutilizando as expressotildees lambda Se sim a partir de quando comeccedilaram a utilizaacute-lasdesde o iniacutecio da introduccedilatildeo das mesmas no Java 8 ou em um periacuteodo mais tardio Aleacutemdisso eacute interessante descobrir se a utilizaccedilatildeo dessa nova caracteriacutestica tem acontecido deforma expressiva ou natildeo

Em seguida para melhor entender a forma como as expressotildees lambda estatildeo sendointroduzidas em projetos eacute interessante investigar se as equipes de desenvolvimento estatildeose preocupando em refatorar coacutedigo com o objetivo de evoluir o software ou se estatildeoexperimentando utilizar expressotildees lambda apenas em coacutedigo novo introduzido

Como a introduccedilatildeo de novas funcionalidades em projetos open-source de grande escaladepende do objetivo do projeto e os padrotildees de projeto utilizados [37] espera-se obser-var diversas abordagens quanto a utilizaccedilatildeo de expressotildees lambda para entatildeo poderclassificar estes softwares quanto a abordagem utilizada

Eacute de grande importacircncia para este estudo conseguir identificar na praacutetica comoexpressotildees lambda estatildeo sendo tipicamente adotadas nestes projetos Assim a terceirapergunta de pesquisa busca identificar alguns exemplos de utilizaccedilatildeo atraveacutes da realizaccedilatildeode alguns estudos de caso

23

Eacute importante ressaltar que apesar de as expressotildees lambda serem uma alternativa aouso de AIC elas natildeo os substituem completamente Existem precondiccedilotildees para que umaAIC possa ser substituiacuteda por expressotildees lambda [12] descritas a seguir

bull AIC deve instanciar-se de uma interface

bull AIC natildeo deve possuir nenhum campo e declarar apenas um meacutetodo

bull AIC natildeo deve possuir uma referecircncia para this ou super

bull AIC natildeo deve declarar um meacutetodo recursivo

Para responder agrave primeira pergunta apenas dados gerais sobre todos os projetos seratildeonecessaacuterios ao passo que pelas perguntas 2 e 3 possuiacuterem uma natureza mais complexaseraacute necessaacuterio aleacutem de uma anaacutelise geral estatiacutestica a realizaccedilatildeo de alguns estudos decaso para obter resultados mais completos

42 Fonte de Dados e Objetos de Estudo

Para responder agraves perguntas de pesquisa estabelecidas foram selecionados os 99 projetosmais populares na linguagem Java dentro da plataforma github ateacute a data da coleta dosdados feita em Abril de 2017 Satildeo considerados populares os repositoacuterios que possuema maior quantidade possiacutevel de estrelas (stars) A decisatildeo de escolher os 99 projetos maispopulares foi por sua natureza imparcial e ao mesmo tempo para que se possa analisarprojetos que satildeo de familiaridade e conhecimento da comunidade do github e de domiacuteniopuacuteblico Os 99 projetos estatildeo listados no Anexo I

Para entender a transiccedilatildeo feita por esses projetos entre as versotildees anteriores do Java eo Java 8 com as expressotildees lambda eacute necessaacuterio analisar o coacutedigo de vaacuterias versotildees a fimde observar alguma mudanccedila para cada projeto Como satildeo 99 projetos e vaacuterios dessesprojetos possuem milhares de linhas de coacutedigo e commits seria impossiacutevel avaliar todosos commits Optou-se entatildeo por coletar snapshots mensais de cada projeto conformeprocedimento tambeacutem seguido anteriormente [38] Cada snapshots representa o estadodo projeto em um determinado mecircs e como criteacuterio de escolha padratildeo todos os snapshotsequivalem ao uacuteltimo commit realizado no determinado mecircs que este representa

O proacuteximo passo eacute determinar o periacuteodo de tempo em que esses snapshots seriamcoletados Como Java 8 (e consequentemente as expressotildees lambda) foi introduzidoapenas em meados de 2014 [28] coletar dados de projetos a partir de um periacuteodo muitoantes deste ano natildeo agregaria valor ao estudo em questatildeo Definiu-se entatildeo um periacuteodopara a coleta mensal desses snapshots atraveacutes dos anos Janeiro de 2013 um ano antesda introduccedilatildeo do Java 8 para que se pudesse identificar para todos os projetos o mecircs

24

exato em que expressotildees lambda foram introduzidas ateacute o mecircs da coleta de dados Abrilde 2017

Eacute importante ressaltar que a definiccedilatildeo dos meses foi definida do dia primeiro de ummecircs ao dia primeiro do proacuteximo mecircs e por consequecircncia alguns snapshots que deveriamrepresentar o final de determinado mecircs correspondem na verdade a commits realizadosno dia primeiro do mecircs seguinte Por exemplo pode existir casos em que o commit querepresente o mecircs de Marccedilo de 2016 seja na verdade o commit realizado no dia primeirode Abril de 2016 Isso se deve a natureza da forma como os resultados de log de commitssatildeo obtidos pelo git [39] Poreacutem isso natildeo interfere nas anaacutelises ou no propoacutesito destetrabalho uma vez que foram realizadas verificaccedilotildees e validaccedilotildees para que natildeo existamdatas repetidas (e consequentemente commits repetidos) por repositoacuterio

Neste trabalho o termo projeto e repositoacuterio foram utilizados de forma intercaladapara representar a mesma coisa o software desenvolvido que possui um repositoacuterio naplataforma github Os termos commit snapshops e versotildees tambeacutem representam a mesmacoisa uma vez que foi definido que seriam utilizados apenas um commit por mecircs pararepresentar um determinado snapshot ou versatildeo do repositoacuterio em questatildeo

Todos os 99 projetos seratildeo utilizados para a realizaccedilatildeo de uma anaacutelise geral de ca-racterizaccedilatildeo do uso de expressotildees lambda Para as anaacutelises aprofundadas foi feito umcriteacuterio de classificaccedilatildeo para que apenas alguns projetos possam ser analisados em niacutevelde coacutedigo como estudos de caso

Resumindo foram escolhidos os 99 projetos mais populares de Java no github cole-tando dados mensais de seus commits a partir do ano de 2013 ateacute a data da coleta dosdados lembrando que nem todos os projetos existem desde 2013 (projetos mais recentes)

43 Processo de Mineraccedilatildeo

A abordagem utilizada para coletar e analisar os 99 projetos escolhidos como mostra aFigura 42 foi realizada de forma automatizada utilizando scripts python e dois projetosdesenvolvidos em Java para a coleta e tratamento de dados como descrito a seguir

Primeiramente foi realizado uma coacutepia dos repositoacuterios atuais de todos os 99 projetosmais populares do github em Java Para automatizar o processo foi desenvolvido umscript em python que lista todos os projetos escolhidos clona todos os repositoacuterios emuma pasta na maacutequina local e cria um arquivo temporaacuterio com as informaccedilotildees do nomede cada repositoacuterio e seu caminho absoluto na maacutequina local

25

Figura 42 Metodologia implementada para coleta e tratamento de dados

Em seguida foi necessaacuterio realizar o checkout de todas as versotildees entre Janeiro de2013 a Abril de 2017 de cada projeto Por motivos de otimizaccedilatildeo de espaccedilo da maacutequinalocal e automatizaccedilatildeo no processo de checkout utilizou-se de um segundo script pythonque realizava as seguintes tarefas para cada mecircs em cada projeto verificar se dentreo mecircs estipulado houve algum commit para aquele projeto se sim pega-se o hash douacuteltimo commit do mecircs realiza o checkout conta-se a quantidade de linhas de coacutedigo emJava que o projeto tem utilizando a biblioteca cloc e armazena todas as informaccedilotildeespertinentes referentes a todos os projetos que naquele mecircs tiveram commits para que oprojeto static-analysis possa entatildeo ser executado sobre esses projetos naquele determinadomomento As informaccedilotildees coletadas que satildeo utilizadas pelo static-analysis correspondemao nome do projeto o hash do commit para aquela versatildeo a pasta onde o projeto estaacutearmazenado na maacutequina local a quantidade de linhas de coacutedigo Java do projeto e datareferente ao commit Essas informaccedilotildees satildeo pertinentes para que o projeto static-analysisconsiga funcionar de forma correta projeto este descrito em detalhes a seguir

431 static-analysis

O static-analysis foi um projeto desenvolvido anteriormente a este trabalho pelos alunosThiago Cavalcanti e Vinicius de Almeida cujo objetivo eacute realizar a anaacutelise estaacutetica de

26

coacutedigos-fonte Java e gerar arquivos de saiacuteda contendo informaccedilotildees de classes e meacutetodoscom suas devidas ocorrecircncias de caracteriacutesticas da linguagem [40]

A anaacutelise estaacutetica de coacutedigo consiste em analisar um coacutedigo-fonte sem a necessidadede executaacute-lo Esse tipo de anaacutelise eacute de extrema importacircncia para manter um coacutedigo dequalidade evitar futuras refatoraccedilotildees e obter informaccedilotildees estatiacutesticas de forma raacutepida epraacutetica [41]

Seguindo esse princiacutepio o static-analysis foi projetado para receber um arquivo deentrada csv seguindo o padratildeo

Tipo da Aplicaccedilatildeo Inicio do projeto Antes ou Apoacutes Java 5 Nome do ProjetoVersatildeo Caminho absolutoQuantidade de linhas de coacutedigo

Atraveacutes da informaccedilatildeo do caminho absoluto do projeto o static-analysis varre osdiretoacuterios em busca dos arquivos fonte java realiza o parse desses arquivos e utilizade Visitors para extrair as informaccedilotildees desejadas e exporta-las em arquivos csv Ouso de Visitors permite que sejam escolhidas as informaccedilotildees desejadas para a consultacomo expressotildees Lambda e AIC s aleacutem de possibilitar que sejam implementados novosVisitors conforme a linguagem evolua ou as necessidades mudem

Para este trabalho foram utilizados os Visitors de expressotildees Lambda map() filter()AICs e declaraccedilotildees de meacutetodos

432 BDAnalisador

Apoacutes obter todas as informaccedilotildees necessaacuterias geradas pelo static-analysis era preciso ma-nipular os dados de forma que facilitasse a coleta de dados para o estudo proposto Comovaacuterios arquivos em formato csv satildeo de difiacutecil manipulaccedilatildeo foi desenvolvido entatildeo umaferramenta chamada BDAnalisador Esta ferramenta eacute responsaacutevel por processar os arqui-vos em csv gerados pelo static-analysis e popular uma base de dados relacional MySQLcom as informaccedilotildees pertinentes a este estudo

O BDAnalisador foi desenvolvido com a intenccedilatildeo de tornar mais simples o trabalhocom os dados resultantes do static-analysis de forma que consultas em SQL pudessemser feitas a ponto de permitir a obtenccedilatildeo de resultados mais complexos Seguindo esseobjetivo o framework Hibernate foi escolhido como ferramenta para persistecircncia devidoa ser um framework jaacute consolidado no mercado e que de forma simples relaciona osobjetos Java ao banco de dados MySQL [42] A divisatildeo de classes foi projetada em quatroentidades Projeto Versao Classe e Metodo cada uma com seus respectivos camposcontendo as informaccedilotildees necessaacuterias para a pesquisa como pode ser visto na Figura 44Eacute importante ressaltar que a tabela de Versao guarda hashs de commits devido agrave escolhade utilizar commits para obter mais informaccedilatildeo de evoluccedilatildeo de coacutedigo em um menor

27

espaccedilo de tempo Aleacutem disso para este trabalho optou-se por persistir todos os meacutetodose classes de cada versatildeo sem se importar com a repeticcedilatildeo desses dados pois a hipoacutetesede haver grandes refatoraccedilotildees entre versotildees poderia comprometer a confiabilidade dasinformaccedilotildees

Figura 43 Diagrama de classes UML do BDAnalisador

Como visto na Figura 43 seguindo parcialmente a arquitetura MVC cada entidadepossui sua respectiva classe DAO(Data Access Object) para persistecircncia dos dados eapenas uma classe Controlador no projeto responsaacutevel pela manipulaccedilatildeo e parse dosdados dos arquivos csv gerados pelo static analysis para serem enviados agraves classes DAOO sistema inicia chamando o meacutetodo inicializar() da classe Controlador Esse meacutetodoeacute responsaacutevel por ler um arquivo de entrada csv que segue o mesmo modelo do arquivo dostatic-analysis citado na seccedilatildeo anterior O arquivo conteacutem os dados de todos os projetose suas respectivas versotildees dessa forma o meacutetodo instancia um objeto da classe Projetoe persiste o projeto no banco de dados Para cada versatildeo encontrada no arquivo deentrada o inicializar() aciona os meacutetodos responsaacuteveis por instanciar e preencher aslistas da classe Classe e Metodo Os meacutetodos responsaacuteveis por preencher as listas varremos arquivos csv gerados pelo static-analysis e fazem o parse das informaccedilotildees relevantescomo nomes dos meacutetodos e quantidades de lambdas para construir os objetos que seratildeogravados Ao final dos preenchimentos o objeto Versatildeo eacute instanciado e gravado no bancode dados atraveacutes de sua classe DAO ao mesmo tempo que grava suas respectivas Classese Metodos

28

Apoacutes vaacuterios testes e correccedilotildees de bugs o banco de dados se encontrava finalmente comas informaccedilotildees de 99 projetos Java open-source separados por um commit por mecircs desde2013 cada um com suas respectivas informaccedilotildees de classes meacutetodos e a quantidade deexpressotildees lambda filters e maps em cada meacutetodo Filter ou Filter pattern eacute o padratildeode projeto que tem como objetivo filtrar objetos de uma coleccedilatildeo (Collection) de acordocom algum criteacuterio Jaacute o map ou map pattern eacute um padratildeo que ldquomapeia os elementosde uma coleccedilatildeo aplicando uma funccedilatildeo a eles para uma nova coleccedilatildeo [43] A coleta deinformaccedilotildees sobre esses padrotildees podem ser uacuteteis para possiacuteveis anaacutelises de oportunidadesde uso de expressotildees lambda para refatoraccedilatildeo de coacutedigo

A Figura 44 mostra o esquema de como o banco de dados resultante foi gerado

Figura 44 Modelo relacional do banco de dados populado pelo BDAnalisador Imagemgerada com software DBeaver [2]

44 Classificaccedilatildeo e Anaacutelise

Com o banco de dados populado restam apenas as etapas de classificaccedilatildeo e anaacutelise pararesponder as questotildees de pesquisa propostas Para isso inicialmente houve uma tentativade se utilizar apenas queries SQL para analisar os dados de acordo com as informaccedilotildeesrelevantes Poreacutem devido ao fato de o banco de dados conter todas as informaccedilotildees detodos os projetos e todas as suas versotildees queries que possuem uma alta complexidadedemoravam muito tempo para retornar os dados

Assim com o objetivo de facilitar o trabalho alguns scripts python foram desenvolvi-dos para rodar as queries separadamente e individualmente para cada projeto de formaautomatizada a fim de melhorar o tempo de resposta para obtenccedilatildeo dos resultados

29

441 Meacutedia de Lambda

O primeiro script retorna a quantidade de expressotildees lambda (ou AICs) por n snapshotsque contenha expressotildees lambda O objetivo eacute ter uma visatildeo geral da meacutedia de expressotildeeslambda e AICs utilizadas por cada projeto e como nem todos os snapshots coletados decada projeto possuem expressotildees lambda e AICs apenas aqueles com alguma expressatildeolambda ou AIC satildeo incluiacutedos no caacutelculo da meacutedia

Mmedia =sumn qtdLambdai

n

442 Anaacutelise Temporal

O segundo script retorna para cada projeto a soma total da quantidade de expressotildeeslambda AIC map() e filter() no projeto inteiro para cada versatildeo Ou seja tem-seo total de cada uma das quatro propriedades selecionadas para cada mecircs do projetoobtendo assim uma visatildeo temporal de evoluccedilatildeo do uso das caracteriacutesticas descritas ATabela 41 ilustra parcialmente o resultado obtido para o projeto agera onde idVersaoeacute o identificador no banco de dados referente ao hash do commit mensal coletado qtd eacutea quantidade de cada uma das caracteriacutesticas escolhidas e a data do commit encontra-seno formato americano

Tabela 41 Informaccedilotildees mensais sobre o projeto ageraidVersao Data do Commit qtd lambda qtd AIC qtd maps qtd filter

823 512016 0 29 4 0755 612016 13 28 4 0686 6152016 13 29 4 0621 812016 13 29 4 0555 8162016 13 30 4 0485 922016 13 30 4 0422 10132016 14 30 4 0356 11282016 14 30 4 0295 12212016 21 30 5 0232 212017 21 30 5 0175 312017 21 30 5 0112 3312017 21 36 5 048 4242017 21 48 5 0

Os resultados obtidos com esta anaacutelise temporal permitiu a identificaccedilatildeo de padrotildees nautilizaccedilatildeo de expressotildees lambda em relaccedilatildeo a utilizaccedilatildeo de AIC por todos os projetos Foi

30

possiacutevel classificar todos os projetos em 6 grupos ilustrado na Figura 45 Primeiramenteseparou-se os projetos entre os que possuem expressotildees lambda e os que natildeo possuemDentre os que possuem identificou-se cinco categorias

1 Grupo 1 Quantidade de AICs e expressotildees lambda aumentam com o tempo pro-porcionalmente

2 Grupo 2 Quantidade de AICs diminui agrave medida que a quantidade de expressotildeeslambda aumentam e a quantidade de expressotildees lambda ultrapassa a quantidade deAIC em um determinado momento

3 Grupo 3 Quantidade de AICs diminui agrave medida que a quantidade de expressotildeeslambda aumentam mas a quantidade de AIC permanece superior agrave quantidade delambda

4 Grupo 4 Expressotildees lambda satildeo introduzidas e existem por um pequeno periacuteodode tempo mas satildeo completamente removidas posteriormente

5 Grupo 5 Quantidade de expressotildees lambda eacute constante e muito inferior compa-rado com a quantidade de AICs no projeto Foi determinado que para pertencera esta classificaccedilatildeo o projeto precisa ter uma razatildeo de meacutedia de expressotildees lamb-dasnapshot por meacutedia de AICsnapshot inferior a 020 Esse paracircmetro foi esta-belecido com o objetivo de definir um padratildeo para o que pode ser considerado umprojeto com poucas expressotildees lambda

Figura 45 Classificaccedilatildeo dos projetos

31

443 Refatoraccedilatildeo de Coacutedigo

O uacuteltimo script teve como objetivo realizar uma tentativa inicial de identificar refatoraccedilatildeode coacutedigo da seguinte maneira para todos os projetos que possuem expressotildees lambdaforam identificados o mecircs imediatamente antes da introduccedilatildeo de expressotildees lambda e omecircs seguinte onde houve a primeira ocorrecircncia de lambda no projeto Assim realizou-se uma anaacutelise do tamanho em quantidade de linhas de coacutedigo de todos os meacutetodosdo projeto que no mecircs seguinte tiveram introduccedilatildeo de lambda Em seguida fez-se umacomparaccedilatildeo com os mesmos meacutetodos em relaccedilatildeo ao mecircs anterior e assim foi possiacuteveldetectar quais meacutetodos tiveram a quantidade de linhas de coacutedigo reduzidas o que seriaum indicativo natildeo necessariamente exclusivo de que uma refatoraccedilatildeo de coacutedigo possa terocorrido

Sabe-se que este meacutetodo de detecccedilatildeo de refatoraccedilatildeo de coacutedigo possui suas limitaccedilotildeesuma vez que as comparaccedilotildees para saber se um meacutetodo existe em ambas versotildees eacute feitopuramente por comparaccedilatildeo de String (nome do meacutetodo) e a classe que este pertence

444 Casos de Uso

Os meacutetodos descritos acima ajudaram a identificar alguns padrotildees e facilitar a anaacutelise dosdados Poreacutem natildeo satildeo suficientes para que se possa responder agraves questotildees de pesquisaDessa forma apoacutes a identificaccedilatildeo dos grupos de classificaccedilatildeo para os projetos foramescolhidos um projeto de cada grupo (com exceccedilatildeo do grupo dos projetos sem expressotildeeslambda) para realizar um breve estudo de caso com o objetivo de identificar e caracterizarmelhor a adoccedilatildeo de expressotildees lambda Os projetos escolhidos foram agera vertxAndroid-CleanArchitecture RxJava e guava

32

Capiacutetulo 5

Resultados Obtidos e Anaacutelise

Neste capiacutetulo seratildeo apresentados os dados obtidos e anaacutelise com o objetivo de responderagraves questotildees de pesquisa propostas Como mencionado anteriormente as perguntas seratildeorespondidas de duas maneiras algumas com informaccedilotildees gerais sobre todos os projetose outras com breve estudos de caso envolvendo cinco projetos

51 Visatildeo Geral

Dentre os repositoacuterios coletados para a anaacutelise 74 (7474) natildeo utilizaram nenhumaexpressatildeo lambda no projeto durante todo o periacuteodo analisado (Janeiro de 2013 a Abrilde 2017) restando apenas 25 repositoacuterios (2525) com expressotildees lambda Eacute interessantedestacar que apesar de a quantidade de repositoacuterios que natildeo possuem expressotildees lambdaser relativamente expressiva muitos destes repositoacuterios satildeo de projetos em Java que umdia foram populares e atualmente natildeo estatildeo sendo mais desenvolvidos (por exemplo umaplicativo que soacute funciona para Android 23 atualmente descontinuado)

Levando em consideraccedilatildeo apenas os projetos que possuem expressotildees lambda exis-tem dois tipos de dados que podem ser analisados para responder agrave primeira questatildeo depesquisa atraveacutes dos dados obtidos pelo meacutetodo anteriormente mencionado como anaacutelisetemporal e a meacutedia de lambda por snapshot mencionados no capiacutetulo anterior

Com relaccedilatildeo ao ano em que a primeira ocorrecircncia foi encontrada 6 projetos introduzi-ram expressotildees lambda jaacute em 2014 8 comeccedilaram a utilizar em 2015 7 em 2016 e apenas4 tiveram a primeira ocorrecircncia de expressotildees lambda em 2017 Dessa forma percebe-seque os projetos estatildeo relativamente bem distribuiacutedos em grupos quanto ao ano em que seintroduziu expressotildees lambda

Pela meacutedia de lambda por snapshot (lambdasnapshot) a maioria (11 projetos) possuiuma quantidade expressiva acima de 100 lambdasnapshot (com 6 projetos entre 20 e 100lambdasnapshot e 8 projetos com menos de 20 lambdasnapshot) como apresentados no

33

graacutefico da Figura 51 Isso mostra que essa nova caracteriacutestica jaacute estaacute sendo bem utilizadanos projetos que comeccedilaram a migrar para a nova versatildeo do Java

Figura 51 Graacuteficos dos projetos separados por ano de introduccedilatildeo de expressotildees lambdae meacutedia de lambda por snapshot

Com isso pode-se observar que apesar de a quantidade de projetos que possuemexpressotildees lambda natildeo ser tatildeo alta eacute possiacutevel obter resultados expressivos uma vez quea quantidade dos projetos com lambda estatildeo bem dispersos quanto ao periacuteodo em quecomeccedilaram a adotar essa caracteriacutestica e a quantidade de expressotildees lambda por snapshot

511 Projetos Selecionados

Atraveacutes dos grupos de classificaccedilatildeo identificados pela anaacutelise temporal descritos na Figura45 cinco projetos foram selecionados para uma anaacutelise detalhada levando em consideraccedilatildeoo grupo em que eles pertencem Estes projetos seratildeo apresentados a seguir

512 agera

Agera eacute uma biblioteca Android que ajuda a introduzir programaccedilatildeo funcional reativa(functional reactive programming) em projetos Android Eacute um projeto recente lanccediladoem 2016 pela Google [44] e encontra-se no grupo dos projetos que introduziram expressotildeeslambda em 2016 no mesmo ano de seu lanccedilamento contendo uma meacutedia de expressotildeeslambda de 16 lambdasnapshot

Na classificaccedilatildeo estabelecida agera pertence ao Grupo 1 onde a quantidade de ex-pressotildees lambda no projeto com o tempo aumentam juntamente com a quantidade deAICs como mostra o graacutefico de anaacutelise temporal na Figura 52

34

Figura 52 Graacuteficos de anaacutelise temporal do projeto agera

513 vertx

Eclipse Vertx eacute um conjunto de ferramentas para criaccedilatildeo de reactive applications namaacutequina virtual Java (JVM) em grande escala [45] Seu primeiro lanccedilamento aconteceuem 2011 e a primeira ocorrecircncia de expressotildees lambda no projeto aconteceu em 2014 Esteprojeto possui uma meacutedia de 2867 lambdasnapshot e dentre os projetos consideradosneste trabalho eacute o que possui a maior quantidade de expressotildees lambda

Este projeto pertence ao Grupo 2 onde a quantidade de expressotildees lambda aumen-tou consideravelmente pelos meses ultrapassando a quantidade de AICs que diminuiudrasticamente como mostra a Figura 53

35

Figura 53 Graacuteficos de anaacutelise temporal do projeto Vertx

514 Android-CleanArchitecture

Apesar de ser uma amostra de projeto Android-CleanArchitecture que tem como objetivoconstruir aplicaccedilotildees Android utilizando clean architecture foi lanccedilado em 2014 mas semanteacutem sempre atualizado [46]

A introduccedilatildeo de expressotildees lambda que aconteceu no ano de 2015 se deu de formatiacutemida com uma meacutedia de 35 lambdasnapshot De qualquer forma este projeto conseguerepresentar com seu graacutefico de anaacutelise temporal o grupo 3 composto por projetos em quea quantidade de expressotildees lambda aumentou mas sem ultrapassar AICs que diminuiacuteramdemonstrado no graacutefico da Figura 54

36

Figura 54 Graacuteficos de anaacutelise temporal do projeto Android-CleanArchitecture

515 RxJava

Dentre os repositoacuterios estudados RxJava eacute considerado o mais popular Como umaimplementaccedilatildeo de Reactive Extensions para a JVM RxJava teve seu lanccedilamento dadoem 2013 [47] Expressotildees lambda apareceram pela primeira vez no ano de 2015 comuma meacutedia de 766 lambdasnapshot

Apesar de uma meacutedia relativamente alta o tempo de vida das expressotildees lambda nesteprojeto foi bem curto caracterizando assim projetos do grupo 4 houve a introduccedilatildeo dasexpressotildees lambda no projeto poreacutem houve a remoccedilatildeo completa de todas as expressotildeeslambda previamente introduzidas desaparecendo completamente do projeto ateacute a datada coleta de dados (Figura 55)

37

Figura 55 Graacuteficos de anaacutelise temporal do projeto RxJava

516 guava

Guava eacute um conjunto de bibliotecas para Java da Google lanccedilado em 2011 A atualizaccedilatildeodo coacutedigo do projeto para Java 8 aconteceu somente em 2016 e apesar do projeto conteruma meacutedia de 281 lambdasnapshot ele foi escolhido como representante dos projetosdo Grupo 5 (Figura 56) que possuem expressotildees lambda mas de forma natildeo expressiva osuficiente quando comparado com a quantidade de AIC pelo fato de sua razatildeo de meacutedia delambdasnapshot por meacutedia de AICsnapshot ser 004 Ou seja embora o projeto tenhaexpressotildees lambda estas satildeo consideradas muito poucas quando inseridas no contextogeral deste projeto que eacute considerado um projeto grande

38

Figura 56 Graacuteficos de anaacutelise temporal do projeto Guava

52 Refatoraccedilatildeo de Coacutedigo

Com o objetivo de caracterizar melhor como as expressotildees lambda estatildeo sendo utilizadaseacute interessante identificar se estas estatildeo sendo introduzidas atraveacutes de refatoraccedilatildeo de coacutedigoou em coacutedigo novo

Os projetos classificados como pertencentes ao Grupo 2 possuem em comum o fatode expressotildees lambda aumentarem a medida que AICs diminuem ultrapassando-as eessa caracteriacutestica em comum pode indicar que nestes projetos possivelmente houve re-fatoraccedilatildeo de coacutedigo visto que AIC sendo substituiacutedo por expressotildees lambda dentro dascondiccedilotildees determinadas eacute a maneira mais comum de se identificar refatoraccedilatildeo de coacute-digo para introduccedilatildeo de expressotildees lambda [12] Os projetos que compotildeem o grupo 2representam 44 de todos os projetos estudados que possuem expressotildees lambda o quepode ser um indicativo caso a hipoacutetese de refatoraccedilatildeo de coacutedigo seja positiva de quemuitos projetos que estatildeo adotando o Java 8 estatildeo se preocupando de alguma formacom refatoraccedilatildeo se coacutedigo Fazem parte desse grupo os seguintes projetos elasticsearchjava-design-patterns PocketHub presto RxJava-Android-Samples spark vertx zipkinjava8-tutorial dropwizard e material-dialogs

39

Outra maneira de verificar possiacuteveis indicadores de refatoraccedilatildeo de coacutedigo foi atraveacutesda anaacutelise dos tamanhos (em quantidade de linhas de coacutedigo) dos meacutetodos com expressotildeeslambda no mecircs em que se introduziu expressotildees lambda e um mecircs imediatamente antesdeste Essa anaacutelise mostra que dos 25 projetos com expressotildees lambda 12 (48) projetostiveram ao menos um meacutetodo em que houve uma diminuiccedilatildeo no tamanho o que podeser considerado um indicativo de refatoraccedilatildeo de coacutedigo A Figura 57 mostra todos osprojetos em relaccedilatildeo agrave quantidade total de meacutetodos que possuem lambda no primeiro mecircsde introduccedilatildeo do mesmo em vermelho comparado com a quantidade desses meacutetodos quetiveram uma diminuiccedilatildeo no tamanho quando comparados com o coacutedigo do mecircs anteriorem azul

Figura 57 Comparaccedilatildeo entre todos os projetos com expressatildeo lambda sobre refatoraccedilatildeode coacutedigo no mecircs de introduccedilatildeo da caracteriacutestica

Ainda observando a figura 57 com relaccedilatildeo aos projetos que natildeo tiveram nenhummeacutetodo com diminuiccedilatildeo de tamanho (barra azul) percebe-se que todos os 13 projetossequer tiveram uma quantidade significativa de meacutetodos que possuem expressotildees lambda(com o maior tendo apenas 5 meacutetodos) no mecircs de introduccedilatildeo da caracteriacutestica no projetoe ao mesmo tempo jaacute existiam no mecircs em que natildeo existia lambda no projeto Essa eacuteuma observaccedilatildeo importante porque projetos como vertx sendo este o que possui a maiormeacutedia de lambdasnapshot de todos os projetos e ao mesmo tempo tendo apenas trecircsmeacutetodos que continham expressotildees lambda no mecircs da introduccedilatildeo e que existiam no mecircs

40

anterior permitem inferir que todas as outras expressotildees lambda existentes no projetopara este determinado mecircs de introduccedilatildeo encontram-se em coacutedigo novo introduzido

Eacute importante ressaltar que somente essa anaacutelise natildeo eacute exclusivamente suficiente paradeterminar se estes projetos estatildeo realmente introduzindo lambda em coacutedigo novo ourealizando refatoraccedilatildeo uma vez que como a comparaccedilatildeo aconteceu apenas no mecircs deintroduccedilatildeo com o mecircs imediatamente anterior natildeo reflete todo o ciclo de vida do pro-jeto Por exemplo algumas equipes podem escolher refatorar o coacutedigo depois de umtempo de adaptaccedilatildeo apoacutes a transiccedilatildeo para a nova versatildeo da linguagem Assim paraobter uma melhor anaacutelise sobre refatoraccedilatildeo de coacutedigo ou natildeo feita nestes projetos aleacutemde outras anaacutelises referentes aos padrotildees tipicamente adotados para implementaccedilatildeo delambda nestes projetos seratildeo apresentados a seguir os estudos de caso dos cinco projetospreviamente selecionados

Outro ponto importante eacute o fato de que apesar das informaccedilotildees quanto agraves quantida-des de filter e map terem sido incluiacutedas inicialmente no trabalho para observar possiacuteveispadrotildees de refatoraccedilatildeo de coacutedigo percebeu-se que estas natildeo satildeo utilizadas de forma con-sideraacutevel pelos projetos estudados e para fins de anaacutelises generalizadas natildeo apresentaramtanta influecircncia na utilizaccedilatildeo de expressotildees lambda quanto a quantidade de AICs noprojeto

53 Estudos de Caso

Dentre os projetos analisados verificou-se que os projetos de pequeno e meacutedio porte op-taram por refatorar de uma vez seus coacutedigos para incluir expressotildees lambda em situaccedilotildeesem que se utilizava AICs anteriormente ou em alguns poucos casos de utilizaccedilatildeo deCollection Os projetos de grande porte natildeo apresentaram nenhuma refatoraccedilatildeo de coacute-digo ou uma refatoraccedilatildeo parcial gradativa provavelmente devido agrave grande quantidade dearquivos e coacutedigo que possuem o que pode tornar o trabalho de refatoraccedilatildeo extenso ecansativo

O projeto vertx que pertence ao grupo 2 dos projetos em que a quantidade de ex-pressotildees lambda aumentaram e as de AICs diminuiacuteram com lambda ultrapassando AICsexecutou inicialmente commits em maio de 2014 com adiccedilatildeo de coacutedigo novo utilizandoexpressotildees lambda e apoacutes um mecircs realizou um commit maior com a refatoraccedilatildeo de todasas AICs para expressotildees lambda Apoacutes a refatoraccedilatildeo o projeto se preocupou em mantera utilizaccedilatildeo de expressotildees lambda ao mesmo tempo que o uso de AICs se manteve apenasaos casos de classes com interfaces natildeo funcionais A Figura 58 apresenta uma parte docommit de refatoraccedilatildeo de coacutedigo que mostra em vermelho a parte eliminada do coacutedigo(AIC) e em verde o coacutedigo novo representando a substituiccedilatildeo por uma expressatildeo lambda

41

Figura 58 Commit de refatoraccedilatildeo de coacutedigo do projeto Vertx [3]

Alguns projetos ainda natildeo se preocuparam em refatorar o coacutedigo para o uso de ex-pressotildees lambda ateacute a data deste trabalho que eacute o caso do projeto guava que apresentouum commit em 03112016 com a atualizaccedilatildeo do projeto para Java 8 Mas a partir daatualizaccedilatildeo se preocupou em utilizar as expressotildees lambda apenas na implementaccedilatildeo decoacutedigo novo O cenaacuterio em que a refatoraccedilatildeo natildeo eacute prioridade ainda eacute a realidade de vaacuteriosprojetos de grande porte visto que os dados de projetos sem nenhuma expressatildeo lambdasatildeo o maior nuacutemero neste trabalho Poreacutem projetos que jaacute adotaram a utilizaccedilatildeo do Java8 tendem a mudar isso com o passar do tempo A Figura 59 apresenta em verde umaadiccedilatildeo de coacutedigo novo com expressatildeo lambda sem a eliminaccedilatildeo de algum coacutedigo anteriora esse que estaria em vermelho

42

Figura 59 Exemplo de um arquivo do commit de adiccedilatildeo de coacutedigo novo em Java 8 doprojeto Guava [4]

Na categoria de projetos em que os AICs e expressotildees lambda aumentam proporci-onalmente (grupo 1) o projeto agera realizou um commit em 19052016 com a adiccedilatildeoda biblioteca retrolambda como dependecircncia do projeto Essa biblioteca utilizada prin-cipalmente por projetos Android permite executar coacutedigo Java 8 contendo expressotildeeslambda em Java 5 6 e 7 [48] O commit tambeacutem apresenta refatoraccedilatildeo dos AICs ad-vindos de interfaces funcionais para expressotildees lambda Apesar de o projeto continuar autilizar as expressotildees lambda em seus commits posteriores o nuacutemero de AICs tambeacutemcontinuou a aumentar visualizando os commits posteriores notou-se que esses AICs satildeorelativos a interfaces natildeo funcionais ou seja que possuem mais de um meacutetodo O projetoAndroid-CleanArchitecture eacute similar ao agera pois tambeacutem optou pela instalaccedilatildeo da bi-blioteca retrolambda para uso de expressotildees lambda em seus coacutedigos e como tambeacutem eacuteum projeto de pequeno porte houve uma pequena refatoraccedilatildeo dos AICs A Figura 510mostra a parte do commit de refatoraccedilatildeo de coacutedigo em que o desenvolvedor adiciona abiblioteca retrolambda como dependecircncia

43

Figura 510 Commit de adiccedilatildeo da biblioteca Retrolambda no projeto Agera [5]

Outro caso interessante eacute o do projeto RxJava que em 2015 optou pela refatoraccedilatildeodo coacutedigo para a utilizaccedilatildeo de expressotildees lambda quase eliminando por completo o usode AICs mas que no ano seguinte reverteu os commits de forma que eliminasse comple-tamente o uso de expressotildees lambda para manter a retrocompatibilidade com o Java 6A Figura 511 demonstra uma parte do commit de reversatildeo do coacutedigo para Java 6 emque pode ser visto em vermelho o coacutedigo anterior com expressotildees lambda e o verde como novo coacutedigo utilizando AIC novamente

44

Figura 511 Commit de remoccedilatildeo de Lambdas e volta para o uso de AICs no projetoRXJava [6]

Essa preocupaccedilatildeo com retrocompatibilidade de coacutedigo pode ser um fator crucial nadecisatildeo das equipes de desenvolvimento na hora de decidir como fazer o software co-evoluircom a linguagem sem perder a compatibilidade com versotildees anteriores

45

Capiacutetulo 6

Consideraccedilotildees Finais

Este estudo permitiu entender melhor como projetos estatildeo realizando a migraccedilatildeo para oJava 8 em especial utilizando uma nova caracteriacutestica introduzida expressatildeo lambdaApesar de a maioria dos projetos populares considerados natildeo possuiacuterem nenhuma ocor-recircncia de expressotildees lambda os projetos que tinham expressotildees lambda foram suficientespara realizar um primeiro estudo de caracterizaccedilatildeo no uso desta caracteriacutestica e com osprojetos efetivamente utilizados para estudo foi possiacutevel agrupaacute-los quanto a maneira emque as expressotildees lambda estavam sendo utilizadas quando comparadas com AICs em 5grandes grupos quando AIC e lambda aumentam proporcionalmente quando AIC dimi-nui e lambda aumenta ultrapassando AIC quando AIC diminui mas continua superior aolambda crescente expressotildees lambda que foram introduzidas e retiradas completamentedo coacutedigo e expressotildees lambda que natildeo existem em quantidades expressivas

Foi possiacutevel entatildeo realizar um estudo aprofundado levando em consideraccedilatildeo as di-ferentes maneiras com que as expressotildees lambda foram adotadas nos projetos atraveacutes daescolha de um projeto que representasse cada grupo para anaacutelise Dentre os cinco projetosestudados foi possiacutevel observar alguns padrotildees tipicamente adotados por desenvolvedorespara implementar expressotildees lambda em seus projetos como a utilizaccedilatildeo da bibliotecas(retrolambda) que permitissem uma flexibilizaccedilatildeo na utilizaccedilatildeo de expressotildees lambda oucomo lambda eacute primariamente utilizada para substituir determinados AICs ou operaccedilotildeesem Collection

Aleacutem disso foi possiacutevel observar como a refatoraccedilatildeo de coacutedigo acontece em cada umdesses projetos Observou-se como projetos menores tendem a refatorar coacutedigo maisfacilmente ao passo que projetos maiores e mais complexos fazem menos refatoraccedilatildeo oudemoram mais entre o periacuteodo em que houve a primeira migraccedilatildeo de coacutedigo para a novaversatildeo da linguagem ateacute o periacuteodo em que realmente decidem refatorar coacutedigo Aleacutem dacomplexidade do projeto influenciar na decisatildeo de migrar o projeto para uma versatildeo maisrecente da linguagem a preocupaccedilatildeo com retrocompatibilidade com versotildees anteriores da

46

linguagem tambeacutem podem ser uma barreira para que projetos comecem a evoluir o coacutedigojuntamente com a evoluccedilatildeo da linguagem

Ainda assim foi possiacutevel observar que a preocupaccedilatildeo com a co-evoluccedilatildeo do software-linguagem existe entre os desenvolvedores de projetos mas a realizaccedilatildeo da migraccedilatildeo aindaacontece lentamente devido agrave diversos fatores que precisam ser levados em consideraccedilatildeopara a manutenccedilatildeo do projeto

Para trabalhos e contribuiccedilotildees futuras seria interessante desenvolver uma ferramentaque pudesse analisar diretamente no coacutedigo-fonte as oportunidades de aplicaccedilatildeo de ex-pressotildees lambda dessa forma poderiam ser analisadas as porcentagens de conversatildeo decoacutedigo para Java 8 e obter melhores conclusotildees sobre a importacircncia que os projetos estatildeodando para a evoluccedilatildeo de seus coacutedigos Outro fator interessante seria aplicar mais Visitorsagrave ferramenta static-analysis e fazer este mesmo estudo aplicado agrave outras caracteriacutesticasda linguagem

47

Referecircncias

[1] Kagdi Huzefa Michael L Collard e Jonathan I Maletic A survey and taxonomyof approaches for mining software repositories in the context of software evolution2007 ix 3 8 9 10 11

[2] DBeaver Dbeaver - features httpdbeaverjkissorgdocsfeatures ix 29

[3] Eclipse Vertx commit Java8-ify code httpsgithubcomeclipsevertxcommit93f95e9c77419f442a42fe711b6eeaef88192fd3 ix 42

[4] Google Guava commit Release java 8 changes to guava httpsgithubcomgoogleguavacommit73e382fa877f80994817a136b0adcc4365ccd904 ix 43

[5] Google Agera commit Collapsed testapp with retrolambda httpsgithubcomgoogleageracommit5e518b7b05f9e7a34a314945f68deff7b2c3e334 ix 44

[6] ReactiveX Rxjava commit 2x full jdk 6 compatible backport + includ-ing bugfixes up to today httpsgithubcomReactiveXRxJavacommit000a174d87a901135f9665d3b11f3627fd2dc4ed ix 45

[7] Godfrey M W e D M German The past present and future of software evolutionEm 2008 Frontiers of Maintenance paacuteginas 129ndash138 Sept 2008 1 6

[8] Favre J M Languages evolve too changing the software time scale Em Principles ofSoftware Evolution Eighth International Workshop on paacuteginas 33ndash42 IEEE 20051 5 7

[9] Overbey Jeffrey L e Ralph E Johnson Regrowing a language refactoring tools allowprogramming languages to evolve Em ACM SIGPLAN Notices volume 44 paacuteginas493ndash502 ACM 2009 1 5 7 8 12

[10] Grechanik Mark Collin McMillan Luca DeFerrari Marco Comi Stefano CrespiDenys Poshyvanyk Chen Fu Qing Xie e Carlo Ghezzi An empirical investiga-tion into a large-scale java open source code repository Em Proceedings of the2010 ACM-IEEE International Symposium on Empirical Software Engineering andMeasurement ESEM rsquo10 paacuteginas 111ndash1110 New York NY USA 2010 ACMISBN 978-1-4503-0039-1 httpdoiacmorg10114518527861852801 1

[11] TIOBE Tiobe httpswwwtiobecomtiobe-index 1 14

48

[12] Gyori Alex Lyle Franklin Danny Dig e Jan Lahoda Crossing the gap from im-perative to functional programming through refactoring Em Proceedings of the 20139th Joint Meeting on Foundations of Software Engineering ESECFSE 2013 paacute-ginas 543ndash553 New York NY USA 2013 ACM ISBN 978-1-4503-2237-9 httpdoiacmorg10114524914112491461 2 11 24 39

[13] OpenJDK State of the lambda httpcropenjdkjavanet~briangoetzlambdalambda-state-4html 2

[14] Han Jiawei Micheline Kamber e Jian Pei Data Mining Concepts and TechniquesMorgan Kaufmann Publishers Inc San Francisco CA USA 3rd ediccedilatildeo 2011ISBN 0123814790 9780123814791 3

[15] Fowler Martin e Kent Beck Refactoring improving the design of existing codeAddison-Wesley Professional 1999 5 7

[16] Lehman M M J F Ramil P D Wernick D E Perry e W M Turski Met-rics and laws of software evolution - the nineties view Em Proceedings of the4th International Symposium on Software Metrics METRICS rsquo97 paacuteginas 20ndashWashington DC USA 1997 IEEE Computer Society ISBN 0-8186-8093-8 httpdlacmorgcitationcfmid=823454823901 6

[17] Hassan Ahmed E e Tao Xie Software intelligence The future of mining softwareengineering data Em Proceedings of the FSESDP Workshop on Future of SoftwareEngineering Research FoSER rsquo10 paacuteginas 161ndash166 New York NY USA 2010ACM ISBN 978-1-4503-0427-6 httpdoiacmorg101145188236218823978 9

[18] Hassan Ahmed E The road ahead for mining software repositories Em Frontiers ofSoftware Maintenance 2008 FoSM 2008 paacuteginas 48ndash57 IEEE 2008 8

[19] Berry Michael J e Gordon Linoff Data Mining Techniques For Marketing Salesand Customer Support John Wiley amp Sons Inc New York NY USA 1997ISBN 0471179809 10

[20] Parnin Chris Christian Bird e Emerson Murphy-Hill Java generics adoption hownew features are introduced championed or ignored Em Proceedings of the 8thWorking Conference on Mining Software Repositories paacuteginas 3ndash12 ACM 2011 12

[21] Oracle The java language specification httpsdocsoraclecomjavasespecsjlsse8jls8pdf 13

[22] Oracle The history of java technology httpwwworaclecomtechnetworkjavajavaseoverviewjavahistory-index-198355html 13

[23] Murphy Kieron So why did they decide to call itjava httpwwwjavaworldcomarticle2077265core-javaso-why-did-they-decide-to-call-it-java-html 13

[24] McGraw Tata Object-oriented Programming with Java Essentials and ApplicationsHill Education 13

49

[25] Oracle Differences between java ee and java se httpdocsoraclecomjavaee6firstcupdocgkhoyhtml 13

[26] Lindsey Clark S The History of Java Cambridge 14

[27] Oracle The java language environment httpwwworaclecomtechnetworkjavaintro-141325html 14

[28] Oracle Jdk 8 httpopenjdkjavanetprojectsjdk8 15 24

[29] Oracle Enhancements in java se 8 httpdocsoraclecomjavase8docstechnotesguideslanguageenhancementshtmljavase8 15 16 17

[30] Oracle Lambda expressions httpdocsoraclecomjavasetutorialjavajavaOOlambdaexpressionshtml 16 18 21

[31] Oracle Method references httpdocsoraclecomjavasetutorialjavajavaOOmethodreferenceshtml 16

[32] Oracle Default methods httpdocsoraclecomjavasetutorialjavaIandIdefaultmethodshtml 17

[33] Oracle Repeating annotations httpdocsoraclecomjavasetutorialjavaannotationsrepeatinghtml 17

[34] Oracle Type annotations httpdocsoraclecomjavasetutorialjavaannotationstype_annotationshtml 17

[35] Oracle Anonymous inner classes httpsdocsoraclecomjavasetutorialjavajavaOOanonymousclasseshtml 19

[36] Kothari CR Research Methodology Methods and Techniques New Age Interna-tional (P) Limited 2004 ISBN 9788122415223 httpsbooksgooglecombrbooksid=8c6gkbKi-F4C 22

[37] Nakakoji Kumiyo Yasuhiro Yamamoto Yoshiyuki Nishinaka Kouichi Kishida eYunwen Ye Evolution patterns of open-source software systems and communitiesEm IWPSE rsquo02 Proceedings of the International Workshop on Principles of SoftwareEvolution paacuteginas 76ndash85 New York NY USA 2002 ACM Press ISBN 1581135459httpdxdoiorg101145512035512055 23

[38] Rahman Foyzur Christian Bird e Premkumar Devanbu Clones What is that smellEmpirical Software Engineering 17(4-5)503ndash530 2012 24

[39] Chacon Scott Pro Git Apress Berkely CA USA 1st ediccedilatildeo 2009ISBN 1430218339 9781430218333 25

[40] Cavalcanti Thiago Gomes e Viniacutecius Correa de Almeida Caracterizaccedilatildeo do uso deconstruccedilotildees da linguagem java em projetos open-source Publicaccedilatildeo online 2016httpbdmunbbrhandle1048315733 27

50

[41] Parr Terence Language Implementation Patterns Create Your Own Domain-Specific and General Programming Languages Pragmatic Bookshelf 1st ediccedilatildeo 2009ISBN 193435645X 9781934356456 27

[42] Janssen Thorben 5 reasons to use jpa hibernate Publicaccedilatildeo online httpswwwsitepointcom5-reasons-to-use-jpa-hibernate 27

[43] Franklin Lyle Alex Gyori Jan Lahoda e Danny Dig Lambdaficator From imperativeto functional programming through automated refactoring Em Proceedings of the2013 International Conference on Software Engineering ICSE rsquo13 paacuteginas 1287ndash1290 Piscataway NJ USA 2013 IEEE Press ISBN 978-1-4673-3076-3 httpdlacmorgcitationcfmid=24867882486986 29

[44] Google Agera httpsgithubcomgoogleagerawiki 34

[45] Eclipse Eclipse vertx httpvertxio 35

[46] Cejas Fernando Android cleanarchitecture httpsgithubcomandroid10Android-CleanArchitecture 36

[47] ReactiveX Rxjava httpsgithubcomReactiveXRxJava 37

[48] Luontola Esko Retrolambda httpsgithubcomorfjackalretrolambda 43

51

Anexo I

Projetos utilizados

fastjson

platform_frameworks_base

netty

material-dialogs

kotlin

okhttp

tinker

AndroidUtilCode

RxJava

spring-boot

java-design-patterns

elasticsearch

ExoPlayer

kafka

vertx

realm-java

guava

zipkin

bazel

stetho

Signal-Android

glide

agera

fresco

plaid

presto

libgdx

spark

52

disruptor

lottie-android

flexbox-layout

PocketHub

zxing

spring-framework

deeplearning4j

dropwizard

interviews

BaseRecyclerViewAdapterHelper

uCrop

DanmakuFlameMaster

lottie-react-native

android-UniversalMusicPlayer

AndroidInterview-Q-A

greenDAO

retrofit

MaterialDrawer

BottomBar

druid

MPAndroidChart

Hystrix

guice

recyclerview-animators

dubbo

androidannotations

RxJava-Android-Samples

PhotoView

clojure

CircleImageView

AndroidSwipeLayout

jedis

MaterialViewPager

butterknife

junit4

RxBinding

leakcanary

SimianArmy

picasso

UltimateRecyclerView

53

AndroidViewAnimations

AppIntro

FizzBuzzEnterpriseEdition

ion

cheesesquare

physical-web

RxAndroid

Android-CleanArchitecture

Calligraphy

Android-Bootstrap

iosched

Android_Data

MaterialDesignLibrary

ListViewAnimations

EventBus

java8-tutorial

AndroidSlidingUpPanel

dagger

okhttputils

logger

HomeMirror

Material-Animations

android-Ultra-Pull-To-Refresh

android-async-http

Android-ObservableScrollView

Android-Universal-Image-Loader

ActionBarSherlock

SlidingMenu

storm

PagerSlidingTabStrip

Android-PullToRefresh

54

  • Dedicatoacuteria
  • Agradecimentos
  • Resumo
  • Abstract
  • Introduccedilatildeo
    • Contexto
    • Objetivos
      • Objetivos Gerais
      • Objetivos Especiacuteficos
        • Metodologia
        • Organizaccedilatildeo do Trabalho
          • Evoluccedilatildeo e Mineraccedilatildeo de Repositoacuterios de Software
            • Evoluccedilatildeo de Software
            • MSR Mineraccedilatildeo de dados e a Engenharia de Software
              • Classificaccedilatildeo
                • Trabalhos Relacionados
                  • Java SE 8 e JDK 8
                    • Histoacuterico
                    • Princiacutepios
                    • Evoluccedilatildeo
                    • Expressotildees Lambda
                      • Sintaxe
                      • Principais formas de uso
                          • Estudo e o Processo de Mineraccedilatildeo
                            • Questotildees de Pesquisa
                            • Fonte de Dados e Objetos de Estudo
                            • Processo de Mineraccedilatildeo
                              • static-analysis
                              • BDAnalisador
                                • Classificaccedilatildeo e Anaacutelise
                                  • Meacutedia de Lambda
                                  • Anaacutelise Temporal
                                  • Refatoraccedilatildeo de Coacutedigo
                                  • Casos de Uso
                                      • Resultados Obtidos e Anaacutelise
                                        • Visatildeo Geral
                                          • Projetos Selecionados
                                          • agera
                                          • vertx
                                          • Android-CleanArchitecture
                                          • RxJava
                                          • guava
                                            • Refatoraccedilatildeo de Coacutedigo
                                            • Estudos de Caso
                                              • Consideraccedilotildees Finais
                                              • Referecircncias
                                              • Anexo
                                              • Projetos utilizados

442 Anaacutelise Temporal 30443 Refatoraccedilatildeo de Coacutedigo 32444 Casos de Uso 32

5 Resultados Obtidos e Anaacutelise 3351 Visatildeo Geral 33

511 Projetos Selecionados 34512 agera 34513 vertx 35514 Android-CleanArchitecture 36515 RxJava 37516 guava 38

52 Refatoraccedilatildeo de Coacutedigo 3953 Estudos de Caso 41

6 Consideraccedilotildees Finais 46

Referecircncias 48

Anexo 51

I Projetos utilizados 52

viii

Lista de Figuras

21 Taxonomia em camadas adaptada do trabalho de Kagdi et al [1] 9

41 Processo utilizado para realizaccedilatildeo do estudo 2242 Metodologia implementada para coleta e tratamento de dados 2643 Diagrama de classes UML do BDAnalisador 2844 Modelo relacional do banco de dados populado pelo BDAnalisador Imagem

gerada com software DBeaver [2] 2945 Classificaccedilatildeo dos projetos 31

51 Graacuteficos dos projetos separados por ano de introduccedilatildeo de expressotildees lambdae meacutedia de lambda por snapshot 34

52 Graacuteficos de anaacutelise temporal do projeto agera 3553 Graacuteficos de anaacutelise temporal do projeto Vertx 3654 Graacuteficos de anaacutelise temporal do projeto Android-CleanArchitecture 3755 Graacuteficos de anaacutelise temporal do projeto RxJava 3856 Graacuteficos de anaacutelise temporal do projeto Guava 3957 Comparaccedilatildeo entre todos os projetos com expressatildeo lambda sobre refatora-

ccedilatildeo de coacutedigo no mecircs de introduccedilatildeo da caracteriacutestica 4058 Commit de refatoraccedilatildeo de coacutedigo do projeto Vertx [3] 4259 Exemplo de um arquivo do commit de adiccedilatildeo de coacutedigo novo em Java 8 do

projeto Guava [4] 43510 Commit de adiccedilatildeo da biblioteca Retrolambda no projeto Agera [5] 44511 Commit de remoccedilatildeo de Lambdas e volta para o uso de AICs no projeto

RXJava [6] 45

ix

Lista de Tabelas

31 As versotildees anteriores de java e principais caracteriacutesticas 14

41 Informaccedilotildees mensais sobre o projeto agera 30

x

Capiacutetulo 1

Introduccedilatildeo

11 Contexto

A evoluccedilatildeo e manutenccedilatildeo de software eacute uma caracteriacutestica intriacutenseca do desenvolvimentode sistemas considerando que a partir do momento em que um software comeccedila a serdesenvolvido satildeo realizadas constantes manutenccedilotildees [7] Apesar de o conceito de evolu-ccedilatildeo de software representar uma grande aacuterea de pesquisa na engenharia de software nemsempre pesquisadores reconhecem a importacircncia da evoluccedilatildeo das linguagens de progra-maccedilatildeo como um grande fator influenciador na evoluccedilatildeo de software [8] uma vez que umsoftware que natildeo evolui junto com a sua linguagem tem a sua capacidade de evoluccedilatildeolimitada [9]

Surge entatildeo a necessidade de alinhar estudos empiacutericos com o intuito de investigar esteprocesso de evoluccedilatildeo do software juntamente com a evoluccedilatildeo de sua linguagem atraveacutesde investigaccedilatildeo e anaacutelise de seu coacutedigo fonte que pode ser feita por meio de anaacutelise de re-positoacuterios de software em grande escala o que deu origem a abordagem de Mineraccedilatildeo emRepositoacuterio de Software (MSR) O MSR tem como base o estudo sistemaacutetico e empiacutericode repositoacuterios de software com o objetivo de analisaacute-los utilizando informaccedilotildees estatis-ticamente uacuteteis coletadas para observar diversos padrotildees como a evoluccedilatildeo do softwarepadrotildees de projetos dentre outros [10]

A complexidade e dificuldade de realizar tal estudo empiacuterico eacute alta pois atualmenteexistem diversos tipos de plataformas para coleta de dados linguagens e focos variadosAssim para escolher o foco do objeto de estudo eacute necessaacuterio levar em consideraccedilatildeo estasdificuldades e especificaccedilotildees e dessa forma este trabalho tem como foco a anaacutelise desistemas de software na linguagem Java

Ateacute a data deste trabalho de acordo com os dados do TIOBE [11] Java eacute a linguagemde programaccedilatildeo com mais linhas de codigo catalogadas no mundo Isso faz com queseja extremamente interessante o estudo empiacuterico da evoluccedilatildeo da linguagem e software

1

desenvolvidos nela desde sua primeira versatildeo antes de se tornar uma linguagem populare ainda com poucos pacotes ateacute a sua atual versatildeo estaacutevel com uma grande quantidadede novas caracteriacutesticas

A versatildeo mais recente do Java a JDK 8 possui diversas adiccedilotildees interessantes para aorganizaccedilatildeo do coacutedigo e facilidade do programador Dessas novas implementaccedilotildees con-ceitos de linguagem funcional como expressotildees lambda e iteradores externos que recebemuma expressatildeo lambda como argumento como o map() filter() e forEach() tornarama escrita de coacutedigo paralelo mais simples e permitiram ganhos de performance [12]

Diversas linguagens de programaccedilatildeo tambeacutem populares como Javascript e Ruby jaacutepossuiacuteam expressotildees lambda desde suas versotildees iniciais sendo o Java 8 em 2014 maisuma linguagem a introduzir esse novo conceito Podemos descrever as expressotildees comopequenas funccedilotildees normalmente feitas em apenas uma linha sem um nome identificadorElas podem ser retornadas de outras funccedilotildees ou passadas como paracircmetro Um exemplode expressatildeo lambda pode ser visualizado pela funccedilatildeo de soma de dois inteiros escrita daforma (int x int y)rarr x + y [13]

Antes da inclusatildeo de expressotildees lambda em Java o mesmo comportamento era possiacutevelutilizando classes anocircnimas ou AICs (Anonymous inner classes) Contudo eacute necessaacute-rio a criaccedilatildeo de uma interface com apenas um meacutetodo e instanciaacute-la como uma AIC Autilizaccedilatildeo de AICs gera inuacutemeras linhas de coacutedigo adicionais que poderiam ser encapsu-ladas em apenas uma linha com a utilizaccedilatildeo de expressotildees lambda Como eacute interessantepara o programador ter um coacutedigo sempre mais legiacutevel e sucinto torna-se interessante arefatoraccedilatildeo de coacutedigo que utiliza uma tecnologia mais antiga para a nova

Assim este trabalho visa conduzir um estudo de mineraccedilatildeo em repositoacuterios de softwareopen-source desenvolvidos na linguagem Java para entender como desenvolvedores estatildeose adaptando agraves novas mudanccedilas introduzidas no Java 8

12 Objetivos

121 Objetivos Gerais

Este trabalho tem como objetivo geral caracterizar o uso de expressotildees lambda entre osprojetos Java mais populares desenvolvidos pela comunidade do GitHub

122 Objetivos Especiacuteficos

Sabendo do benefiacutecio da refatoraccedilatildeo de coacutedigo para o uso de expressotildees lambda e dapouca quantidade de estudos acadecircmicos sobre o assunto surge entatildeo uma oportunidadede pesquisa para melhor entender a forma como essa caracteriacutestica estaacute sendo adotada por

2

projetos com foco em refatoraccedilatildeo de coacutedigo o que originou a necessidade deste estudoAssim para alcanccedilar o objetivo deste trabalho foram traccedilados em forma de questotildees depesquisa os objetivos especiacuteficos a serem alcanccedilados por este trabalho

bull Quando os projetos Java de coacutedigo aberto comeccedilaram a introduzir o uso de expres-sotildees lambda em seus coacutedigos e quatildeo significativo eacute esse uso

bull Como as equipes de desenvolvimento estatildeo utilizando expressotildees lambda atraveacutesde refatoraccedilatildeo de coacutedigo ou introduzindo apenas em coacutedigo novo

bull Quais satildeo os padrotildees tipicamente adotados para o uso de expressotildees lambda

13 Metodologia

Este trabalho foi desenvolvido utilizando uma abordagem de MSR que dentro da clas-sificaccedilatildeo de Kagdi et al [1] pode ser divido em quatro grandes etapas Primeiramentedefiniu-se a fonte de dados a ser utilizada e dentre as possibilidades encontradas na lite-ratura [14] optou-se por utilizar repositoacuterios de controle de versatildeo mais especificamenteo Github tendo como criteacuterio de seleccedilatildeo os 99 repositoacuterios Java mais populares na plata-forma Em seguida definiu-se o propoacutesito do estudo no caso os objetivos em forma deperguntas de pesquisa a serem respondidas

A terceira grande etapa foi a definiccedilatildeo do meacutetodo em si a forma como seria realizadoo estudo e este por sua vez constitui-se de download de todos os 99 repositoacuterios maispopulares realizaccedilatildeo de uma anaacutelise estaacutetica para coletar informaccedilotildees necessaacuterias de cadaprojeto por versatildeo e armazenamento de informaccedilotildees pertinentes em uma base de dados

A etapa final foi a realizaccedilatildeo da avaliaccedilatildeo dos dados obtidos atraveacutes de meacutetricas eanaacutelises quantitativas para melhor responder as questotildees de pesquisa aleacutem de estudos decaso feitos com cinco projetos escolhos de acordo com a maneira distinta em que estesfazem o uso de expressotildees lambda

14 Organizaccedilatildeo do Trabalho

Este trabalho se divide em seis capiacutetulos

bull Capiacutetulo 2 Apresenta um referencial teoacuterico sobre evoluccedilatildeo de software demons-trando as estrateacutegias utilizadas e a importacircncia da evoluccedilatildeo em um projeto de coacutedigoaberto aleacutem de enunciar as leis de evoluccedilatildeo de software de Lehman O capiacutetulo tam-beacutem apresenta o processo de mineraccedilatildeo de dados explicando cada uma das camadasda classificaccedilatildeo e demonstra trabalhos relacionados a esse toacutepico que serviram debase para este trabalho

3

bull Capiacutetulo 3 Traz um contexto histoacuterico e teacutecnico da linguagem Java necessaacuteriospara entender a importacircncia que as novas caracteriacutesticas adicionadas na versatildeo8 fornecem para os desenvolvedores de projetos determinados a manter o projetosempre evoluiacutedo Tambeacutem eacute apresentada uma seccedilatildeo para demonstrar os detalhese formas de utilizaccedilatildeo das expressotildees Lambda que satildeo o foco dos objetivos destetrabalho

bull Capiacutetulo 4 Descreve a metodologia e processo utilizados para o desenvolvimentoe obtenccedilatildeo dos resultados deste trabalho O capiacutetulo desenvolve o contexto dasquestotildees de pesquisa e explica os motivos e processos de desenvolvimento das fer-ramentas utilizadas para minerar os dados aleacutem de determinar a classificaccedilatildeo dosresultados obtidos em grupos para facilitar a organizaccedilatildeo dos dados de forma queas perguntas sejam respondidas claramente

bull Capiacutetulo 5 Apresenta os resultados obtidos e de que forma eles ajudaram a respon-der as questotildees de pesquisa Eacute descrita uma anaacutelise de um projeto de cada categoriaespecificada no capiacutetulo anterior a fim de contextualizar cada tipo de resultado paraque o leitor entenda a forma que os projetos Java estatildeo lidando com as expressotildeesLambda

bull Capiacutetulo 6 Descreve as dificuldades e problemas obtidos durante o trabalho e deque forma eles influenciaram nos resultados Tambeacutem eacute apresentada uma seccedilatildeocontendo as ideias surgidas durante o desenvolvimento deste trabalho que ficarampara ser feitas no futuro devido agrave gama de informaccedilotildees que a mineraccedilatildeo dos dadostrouxe

4

Capiacutetulo 2

Evoluccedilatildeo e Mineraccedilatildeo deRepositoacuterios de Software

As linguagens de programaccedilatildeo estatildeo sempre evoluindo aumentando sua complexidade eexpressividade Da mesma forma aleacutem de se preocupar com dificuldades de estabelecercompatibilidade do software em relaccedilatildeo a tecnologias antigas desenvolvedores tambeacutemprecisam acompanhar essa evoluccedilatildeo das linguagens para que suas ferramentes natildeo setornem obsoletas [9] Isso agrega um grande desafio no desenvolvimento e evoluccedilatildeo desoftware

O conceito de evoluccedilatildeo de software amadureceu e se tornou um grande foco de pes-quisa Poreacutem nem sempre estudos de evoluccedilatildeo de software reconhecem a importacircncia daevoluccedilatildeo da linguagem de programaccedilatildeo no contexto do desenvolvimento de software [8]Quando um coacutedigo natildeo evolui junto com a linguagem com o objetivo de manter umacompatibilidade com versotildees anteriores sua capacidade de evoluccedilatildeo se torna limitada [9]

A refatoraccedilatildeo de coacutedigo que consiste em realizar mudanccedilas no coacutedigo fonte sem modi-ficar o comportamento observado do software [15] permite que a evoluccedilatildeo de linguagens eferramentas aconteccedilam mais naturalmente No entanto novos desafios surgem como porexemplo saber quando e como realizar a refatoraccedilatildeo de coacutedigo de forma eficiente e coesaDentre as teacutecnicas de pesquisa em engenharia de software para entender esse problematorna-se interessante explorar as teacutecnicas de mineraccedilatildeo de dados aplicados a repositoacuteriosde software com o objetivo de entender o relacionamento entre evoluccedilatildeo e refatoraccedilatildeo

Assim este capiacutetulo busca esclarecer conceitos e estrateacutegias de evoluccedilatildeo de softwaremineraccedilatildeo de repositoacuterios de software e o estado da arte sobre o assunto

5

21 Evoluccedilatildeo de Software

Durante o processo de produccedilatildeo e manutenccedilatildeo de software haacute a necessidade de diversastomadas de decisotildees sobre seu desenvolvimento como por exemplo decidir como melho-rar a qualidade do software Tais decisotildees precisam ser tomadas levando em consideraccedilatildeoo ambiente em que se estaacute inserido com novas tecnologias surgindo todos os dias fe-edback de usuaacuterios exigentes e concorrentes produzindo um software similar com ideiasinovadoras

Tudo isso acontece em um ritmo de constante mudanccedila e assim como diria Lehmaneacute imprescindiacutevel que software de sistemas sejam capazes de evoluir ou os mesmos correm orisco de sofrer uma morte prematura [16] fazendo assim da evoluccedilatildeo de software um con-ceito importante dentro do seu processo de desenvolvimento Essa evoluccedilatildeo deve ocorrerconsiderando o ambiente em que o software estaacute inserido o qual possui aspectos teacutecnicos esociais sua infraestrutura que pertence ao seu ambiente teacutecnico o qual sempre necessitamanutenccedilatildeo e ao mesmo tempo usuaacuterios que utilizam o software e estatildeo constantementeformando opiniotildees oferecendo feedback e na expectativa por novidades [7] Assim a me-dida que novas caracteriacutesticas satildeo desenvolvidas novas tecnologias de infraestrutura satildeonecessaacuterias novos requisitos satildeo adicionados e o sistema de software deve se adaptar aessas mudanccedilas

Com relaccedilatildeo aos aspectos sociais que envolvem a evoluccedilatildeo do software eacute importanteressaltar os conceitos baacutesicos de como essa evoluccedilatildeo acontece Durante um estudo empiacutericopioneiro na aacuterea de evoluccedilatildeo de software para sistemas de grande escala Lehman e seuscolaboradores formularam um conjunto de observaccedilotildees que hoje satildeo conhecidas como asleis da evoluccedilatildeo de software ou simplesmente Leis de Lehman [16] No geral as leis deevoluccedilatildeo de software podem ser descritas da seguinte forma [16]

1 Mudanccedila contiacutenua um sistema se tornaraacute progressivamente menos satisfatoacuteriopara seus usuaacuterios com o tempo a menos que se adapte continuamente agraves necessi-dades que surgiratildeo

2 Complexidade Crescente um sistema se tornaraacute cada vez mais complexo amenos que se trabalhe para explicitamente reduzir sua complexidade

3 Auto-regulaccedilatildeo o processo de evoluccedilatildeo de software eacute auto-regulatoacuterio no que dizrespeito agraves distribuiccedilotildees dos artefatos e produtos produzidos

4 Conservaccedilatildeo da estabilidade organizacional a taxa meacutedia de atividade globalefetiva em um sistema em evoluccedilatildeo natildeo muda com o tempo ou seja a meacutedia detrabalho e esforccedilo colocado em cada entrega do sistema permanece a mesma

6

5 Conservaccedilatildeo de familiaridade a quantidade de conteuacutedo novo em cada entregado sistema tende a se manter constante com o tempo

6 Crescimento contiacutenuo A quantidade de funcionalidades em um sistema cresceraacutecom o tempo com o objetivo de satisfazer seus usuaacuterios

7 Decliacutenio de qualidade Um sistema seraacute percebido com qualidade inferior como passar do tempo a menos que seu design tenha uma manutenccedilatildeo minuciosa e seadapte a novas restriccedilotildees

8 Sistema de Feedback Evoluir um sistema com sucesso requer reconhecer que oprocesso de desenvolvimento acontece em um sistema de feedback de vaacuterios ciclosagentes e niacuteveis

Os aspectos teacutecnicos que envolvem a evoluccedilatildeo de software levam em consideraccedilatildeo astecnologias utilizadas para o seu desenvolvimento desde a linguagem de programaccedilatildeo agravesmaacutequinas onde o software seraacute hospedado que sofrem atualizaccedilotildees recebem novas versotildeescom novas caracteriacutesticas implementadas

Um estudo realizado por Lavre mostra como a evoluccedilatildeo das linguagens de programa-ccedilatildeo no contexto da evoluccedilatildeo de software muitas vezes satildeo subestimadas uma vez quemuitos podem considerar em seus estudos a linguagem de computaccedilatildeo como um artefatoimutaacutevel [8] Por exemplo coloca-se muita ecircnfase e cuidado para realizar o versionamentode coacutedigo fonte de um software mas este pode ser tornar inutilizaacutevel futuramente se nin-gueacutem souber qual versatildeo de compilador determinada versatildeo de coacutedigo foi desenvolvida

Para natildeo se deixar estagnar linguagens de programaccedilatildeo precisam se adaptar e evoluirQuando uma linguagem de programaccedilatildeo atualiza softwares que eram antes consideradosatualizados podem se tornar rapidamente obsoletos E ao mesmo tempo que novascaracteriacutesticas satildeo adicionadas a linguagem precisa fornecer compatibilidade com versotildeesanteriores aumentando sua complexidade Desenvolvedores entatildeo encontram-se tambeacutemem um empasse buscando um equiliacutebrio entre manter a compatibilidade da ferramentacom versotildees anteriores da linguagem e atualizaacute-la para manter o software atualizado [9]

A estrateacutegia de refatoraccedilatildeo de coacutedigo pode ser uma opccedilatildeo que permite a linguageme o software co-evoluiacuterem com um menor grau de dificuldade [9] Refatoraccedilatildeo (do inglecircsrefactoring) eacute o processo de modificaccedilatildeo de um software com o objetivo de melhorar a es-trutura interna do mesmo sem alterar sua percepccedilatildeo externa Eacute uma maneira disciplinadade melhorar o design do coacutedigo apoacutes ele jaacute ter sido implementado Por exemplo dividiruma funcionalidade grande feita em apenas um bloco de coacutedigo em vaacuterios moacutedulos [15]

A refatoraccedilatildeo de coacutedigo pode ser um meio utilizado para evoluir o software adaptandoo coacutedigo com caracteriacutesticas novas introduzidas pela linguagem modificando o design dosistema sem comprometer sua integridade No entanto novos desafios surgem visto que

7

refatorar o coacutedigo fonte de um sistema de grande porte natildeo eacute uma tarefa faacutecil havendo anecessidade de ferramentas que possam automatizar o processo ou realizar um estudo paraentender como as novas caracteriacutesticas da linguagem podem ser utilizadas para substituirou melhorar funcionalidades obsoletas [9]

22 MSR Mineraccedilatildeo de dados e a Engenharia deSoftware

Com o objetivo de compreender prever e planejar os vaacuterios aspectos do desenvolvimentode um projeto em especial tudo que possa impactar na evoluccedilatildeo de software a teacutecnicade mineraccedilatildeo de dados tem sido bastante utilizada em engenharia de software [17]

O termo Mineraccedilatildeo de Repositoacuterios de Software (MSR) tem sido utilizado para descre-ver vaacuterias maneiras de se examinar repositoacuterios de software Um repositoacuterio de softwarepode ser considerado um artefato que eacute produzido e arquivado durante a evoluccedilatildeo desoftware [1] Estes responsoacuterios armazenam informaccedilotildees que podem fornecer todos osdetalhes de desenvolvimento do software provendo meios necessaacuterios para uma anaacuteliseaprofundada de evoluccedilatildeo de software

Repositoacuterios de software satildeo comumente utilizados para armazenar e acompanhar ohistoacuterico de desenvolvimento do software mas raramente usados para tomada de deci-sotildees em relaccedilatildeo ao projeto Assim pesquisadores de MSR buscam modificar a impressatildeode que tais repositoacuterios satildeo estaacuteticos que servem apenas para manutenccedilatildeo de registrostransformando-os em repositoacuterios ativos que podem auxiliar na tomada de decisatildeo em pro-jetos de software modernos atraveacutes da identificaccedilatildeo de padrotildees para realizar a propagaccedilatildeode mudanccedilas [18]

221 Classificaccedilatildeo

De acordo com Kagdi et al dentre as abordagens de MSR utilizadas atualmente eacute possiacuteveldescrevecirc-las para entatildeo comparaacute-las e possivelmente classificaacute-las levando em considera-ccedilatildeo uma taxonomia de quatro dimensotildees os repositoacuterios de software utilizados (fontes dedados) o propoacutesito do MSR a metodologia e a avaliaccedilatildeo da abordagem [1] como mostraa Figura 21 onde as taxonomias destacadas em amarelo satildeo as que prevaleceram poreacutemnatildeo exclusivamente na metodologia adotada por este trabalho

8

Figura 21 Taxonomia em camadas adaptada do trabalho de Kagdi et al [1]

Fontes de Dados

As fontes de informaccedilatildeo variam de acordo com a abordagem utilizada e dentre as informa-ccedilotildees mineradas em repositoacuterios de software inclui-se as seguintes categorias os artefatosde software e suas versotildees as diferenccedilas entre os artefatos de software e suas versotildees e osmetadados sobre as mudanccedilas no software

As fontes de dados podem ser melhor classificadas de acordo com Hassan et al [17]

bull Repositoacuterios de controle de Versatildeo estes repositoacuterios guardam o histoacuterico de desen-volvimento de um projeto armazenando todas as mudanccedilas no coacutedigo fonte assimcomo os metadados associados com cada mudanccedila Exemplos git SVN

bull Bug repositories Estes repositoacuterios rastreiam o histoacuterico de resoluccedilatildeo de bugs quesatildeo reportados por usuaacuterios e desenvolvedores Exemplos Bugzilla e Jira

9

bull Histoacuterico de Comunicaccedilatildeo (Archived communications) estes repositoacuterios rastreiamdiscussotildees sobre os vaacuterios aspectos de um projeto de software por sua vida uacutetil Porexemplo listas de e-mails

bull Deployment logs logs com informaccedilotildees do software gerados por ferramentas dedesenvolvimento

bull Repositoacuterios de software Repositoacuterios onde o coacutedigo fonte de vaacuterios projetos satildeoarmazenados como por exemplo Sourceforgenet

No contexto deste trabalho estes repositoacuterios consistem em fontes de coacutedigo armaze-nadas em sistemas de controle de versatildeo especificamente coacutedigos na plataforma Github

O propoacutesito

O propoacutesito da mineraccedilatildeo de repositoacuterios de software se resume nas perguntas de pes-quisa que podem ser respondidas utilizando mineraccedilatildeo Assim existem duas classes deperguntas de pesquisa para MSR [1]

A primeira eacute a pergunta de anaacutelise market-basket1 ldquoSe A acontece o que mais podeacontecerrdquo A resposta para este tipo de pergunta eacute um conjunto de regras descrevendotendecircncias de relacionamentos como por exemplo se A acontecer entatildeo B e C acontecemdurante um periacuteodo X

A segunda classe diz respeito agraves perguntas de prevalecircncia (Prevalence Questions -PQ) como por exemplo perguntas do tipo ldquoA funcionalidade Y foi modificadardquo quepossuem uma resposta booleana ou ldquoQuantas vezes esta funcionalidade Y foi modificadardquocontendo uma resposta quantitativa

As perguntas de pesquisa deste trabalho se encaixam majoritariamente na segundaclasse onde o objetivo traccedilado eacute respondido de forma quantitativa com algumas tentativasde classificaccedilatildeo de tipos de repositoacuterios como seraacute descrito nos capiacutetulos seguintes

A metodologia

A metodologia corresponde a maneira como as questotildees de MSR iratildeo ser respondidas evaacuterias abordagens estatildeo disponiacuteveis Poreacutem Kagdi indica duas estrateacutegias baacutesicas quepodem ser utilizadas

Primeiramente pode-se utilizar a mediccedilatildeo indireta e anaacutelise da evoluccedilatildeo do softwareEsta abordagem pode ser realizada da seguinte forma extrair e computar informaccedilotildeesde cada versatildeo de um software separadamente e em seguida individualmente comparar

1Anaacutelise Market-basket eacute uma teacutecnica de modelagem baseada na teoria de que se vocecirc comprar certostipos de produtos vocecirc haacute uma probabilidade maior (ou menor) de comprar outros tipos de produtos [19]

10

propriedades encontradas como por exemplo comparar duas versotildees distintas de umsoftware atraveacutes de um repositoacuterio github realizando uma investigaccedilatildeo de alto niacutevel noque diz respeito a evoluccedilatildeo do software [1]

A segunda perspectiva de metodologia que pode ser utilizada corresponde agrave mediccedilatildeodireta e anaacutelise da evoluccedilatildeo do software Ela diz respeito agraves investigaccedilotildees que estudamos mecanismos que leva um software a ser modificado de uma versatildeo para outra focandonas diferenccedilas especiacuteficas entre estas versotildees como por exemplo examinando mudanccedilasespeciacuteficas das classes arquivos funccedilotildees de cada parte do coacutedigo [1]

Assim eacute possiacutevel descrever explicitamente que este trabalho utiliza em sua maioriauma metodologia com mediccedilotildees diretas atraveacutes da anaacutelise estaacutetica de informaccedilotildees docoacutedigo fonte de diferente versotildees para analisar os diferentes padrotildees de desenvolvimentoem que expressotildees lambda (definidas no capiacutetulo seguinte) satildeo utilizadas

A Avaliaccedilatildeo

Por fim existem diversas formas para se avaliar o estudo realizado sempre levando emconsideraccedilatildeo a validade dos resultados obtidos Pode-se utilizar de meacutetricas para avaliar osdados considerando o quanto das informaccedilotildees obtidas satildeo relevantes Outra forma de seavaliar seria atraveacutes da utilizaccedilatildeo de modelos probabiliacutesticos seguindo uma abordagemde teoria da informaccedilatildeo Assim foram utilizadas determinadas meacutetricas quantitativaspara avaliar os resultados obtidos neste trabalho

23 Trabalhos Relacionados

Como ressaltado na introduccedilatildeo o foco deste trabalho encontra-se em utilizar teacutecnicas deMSR para caracterizar a adoccedilatildeo de expressotildees lambda em repositoacuterios Java Ao reali-zar um estudo sobre o estado da arte encontrou-se diversos trabalhos que utilizam deMSR para obter informaccedilotildees relevantes sobre repositoacuterios de software em diversos focose em especial trabalhos que investiguem repositoacuterios na linguagem Java Jaacute existemtambeacutem alguns trabalhos que apresentam ferramentas de refatoraccedilatildeo de coacutedigo para im-plementaccedilatildeo de expressotildees lambda com foco na evoluccedilatildeo do software Dentre os trabalhosencontrados mencionados destacam-se

bull Em um trabalho sobre utilizaccedilatildeo de refatoraccedilatildeo de coacutedigo para realizar a transiccedilatildeode coacutedigo Java para as novas caracteriacutesticas implementadas no Java 8 Gyori et alapresenta uma ferramenta que automatiza com sucesso o trabalho de conversatildeo decoacutedigo como Annonymous Inner Class para expressotildees lambda [12] O capiacutetulo aseguir descreve em detalhes estes conceitos

11

bull Regrowing a Language de Overbey apresenta um estudo sobre a importacircncia da co-evoluccedilatildeo entre a linguagem de programaccedilatildeo e os projetos de software focando naslinguagens Fortran e Java e provando como ferramentas de refatoraccedilatildeo de coacutedigoauxiliam para que o software consiga evoluir juntamente com sua linguagem deprogramaccedilatildeo [9]

bull O trabalho sobre a adoccedilatildeo de generics em coacutedigo Java feito por Parnin utiliza demineraccedilatildeo de dados para realizar uma investigaccedilatildeo empiacuterica avaliando projetos decoacutedigo aberto com o objetivo de observar como desenvolvedores destes projetos estatildeoutilizando generics em Java [20]

Os estudos mencionados focam em assuntos particulares pertinentes a este trabalhoem que de um lado tem-se trabalhos que mostram a necessidade de refatoraccedilatildeo de coacutedigopara evoluccedilatildeo de software e do outro tem-se trabalhos que mostram que eacute possiacutevel utilizarde MSR para entender melhor como a evoluccedilatildeo da linguagem de programaccedilatildeo Java temafetado projetos reais de coacutedigo aberto e como estes projetos estatildeo se adaptando a estasevoluccedilotildees

12

Capiacutetulo 3

Java SE 8 e JDK 8

Este trabalho tem como objetivo caracterizar a adoccedilatildeo de expressotildees Lambda em siste-mas Java que podem ser considerados legados pois foram concebidos em um momentoanterior a introduccedilatildeo dessa nova caracteriacutestica na linguagem Java Com o intuito de faci-litar o entendimento do leitor sobre tais construccedilotildees esse capiacutetulo apresenta informaccedilotildeeshistoacutericas referentes agrave linguagem Java desde sua criaccedilatildeo ateacute a sua ascensatildeo como umadas linguagens de programaccedilatildeo mais populares Aleacutem disso seratildeo apresentadas as novascaracteriacutesticas presentes na versatildeo Java SE 8 com destaque nas expressotildees Lambda e deque forma vieram para auxiliar no desenvolvimento de sistemas

31 Histoacuterico

Java eacute uma linguagem de programaccedilatildeo orientada a objetos para propoacutesitos gerais [21] Alinguagem nasceu com o nome de Oak no ano de 1991 com o foco em televisotildees digitais acabo mas devido agrave complexidade e poder da linguagem logo expandiu-se para os outrosdomiacutenios principalmente a Internet [22] Posteriormente a linguagem recebeu o nome deGreentalk devido agrave marca Oak jaacute ser registrada por outra empresa e o principal projeto daequipe se chamar Green Por fim o nome Java foi o mais votado pela equipe da Sun emuma reuniatildeo para decidir o mais raacutepido possiacutevel um nome definitivo para a linguagem [23]

Em 1995 em sua primeira versatildeo puacuteblica 10 a linguagem Java jaacute comeccedilava a terum crescimento em sua popularidade como Web Applet nos navegadores mais popularesfornecendo seguranccedila e rapidez nas plataformas mais utilizadas [24] A cada nova versatildeopublicada novas funcionalidades e plataformas eram adicionadas e tornavam a linguagemmais difundida no meio computacional fazendo com que em 2006 a linguagem fosse divi-dida em Java EE (foco em rede e serviccedilos web) Java ME (foco em sistemas embarcados)e Java SE (foco em desktops e servidores) [25]

13

Apoacutes anos de evoluccedilatildeo e aprimoramento atraveacutes de diversas versotildees como visto naTabela 31 hoje o Java se tornou uma das linguagens de programaccedilatildeo mais utilizadas nomundo estando em aproximadamente 15 das linhas de coacutedigo disponiacuteveis pela inter-net [11] A quantidade de plataformas suportadas pela linguagem e com o advento dosistema operacional Android sendo rodado na maior parte dos smartphones do mundoaleacutem da simplicidade em codificar no paradigma orientado a objetos foram os fatoresrelevantes para que a linguagem se popularizasse no mundo digital [26]

Tabela 31 As versotildees anteriores de java e principais caracteriacutesticasVersatildeo Principais caracteriacutesticasJava 10 JVM e JDKJava 2 Event Listeners

Kestrel (Java 3) HotSpot JVMMerlin (Java 4) Diversas novas APIs como Assertion e expressotildees regularesTiger (Java 5) Generics

Mustang (Java 6) Web ServicesDolphin (Java 7) Suporte a linguagens dinamicas

32 Princiacutepios

Com o foco em alcanccedilar a Web e participar mais ativamente do mercado virtual e e-Commerce foram projetados princiacutepios que permitissem com que a linguagem pudessealcanccedilar seus objetivos principais ao mesmo tempo que mantinha a facilidade e fami-liarizaccedilatildeo da linguagem a seus desenvolvedores [27] Dessa forma a equipe da Oracledeterminou cinco princiacutepios que caracterizariam o foco da linguagem Java

bull simples orientada a objeto e familiar projetada para ser orientada a objeto epermitir que seus desenvolvedores comecem a codificar rapidamente sem a necessi-dade de uma curva de aprendizagem acentuada

bull segura e robusta projetada para prover software confiaacutevel por meio de checagensa tempo de compilaccedilatildeo e execuccedilatildeo Haacute uma grande preocupaccedilatildeo com seguranccediladevido agrave larga utilizaccedilatildeo da linguagem em sistemas distribuiacutedos

bull de arquitetura neutra e portaacutevel projetada para ser independente de qualquerarquitetura bastando rodar a JVM dessa forma garantindo a portabilidade paravaacuterios ambientes e dispositivos

14

bull executada em alta performance projetada para fornecer a maior performancepossiacutevel em tempo de execuccedilatildeo com a utilizaccedilatildeo do garbage collector em uma threadde baixa prioridade

bull interpretada dinacircmica e threaded projetada para ser interpretada por qual-quer dispositivo que possua JVM desenvolvida garantindo um desenvolvimento raacute-pido e em ciclos O uso da classe Thread permite que a linguagem acompanhe atendecircncia do paralelismo Aleacutem disso a ligaccedilatildeo de classes eacute feita em tempo real esomente quando necessaacuteria tornando-a dinacircmica

33 Evoluccedilatildeo

A primeira versatildeo do Java 8 foi lanccedilada em 2014 [28] e apresentou diversas atualizaccedilotildeesespalhadas em categorias como linguagem seguranccedila Collections ferramentas deployentre outras Dentre a grande quantidade de mudanccedilas os destaques se encontraram nasnovas melhorias presentes na linguagem que afetaram de forma mais direta a maneiracom que os desenvolvedores passaram a tratar e organizar o coacutedigo fonte As atualizaccedilotildeesreferentes a linguagem descritas oficialmente pela Oracle [29] satildeo

1 Lambda Expressions ou apenas Expressotildees Lambda correspondem a uma novacaracteriacutestica que permite que uma pequena funcionalidade possa ser utilizada comoum argumento de um meacutetodo facilitando a escrita de accedilotildees que seratildeo feitas repetida-mente em uma Collection ou quando um processo se completa ou quando encontraum erro Eacute tambeacutem uma forma compacta de se escrever coacutedigo que previamenteera escrito com anonymous inner classes [29] A Listagem 31 mostra uma classehipoteacutetica Calculator cujo meacutetodo operateBinary() recebe como paracircmetro doisinteiros e um objeto da classe IntegerMath que representa a operaccedilatildeo que deveraacuteser realizada ou seja uma funcionalidade dinacircmica

1 pub l i c c l a s s Ca l cu la to r 2

3 i n t e r f a c e IntegerMath 4 i n t opera t i on ( i n t a i n t b) 5 6

7 pub l i c i n t operateBinary ( i n t a i n t b IntegerMath op ) 8 re turn op opera t i on (a b) 9

10

11 pub l i c s t a t i c void main ( St r ing a rgs ) 12

15

13 Calcu la to r myApp = new Ca lcu la to r ( ) 14 IntegerMath add i t i on = (a b) minusgt a + b 15 IntegerMath subt ra c t i on = (a b) minusgt a minus b 16 System out p r i n t l n ( 40 + 2 = +17 myApp operateBinary (40 2 add i t i on ) ) 18 System out p r i n t l n ( 20 minus 10 = +19 myApp operateBinary (20 10 sub t ra c t i on ) ) 20 21 22

Listagem 31 Exemplo de coacutedigo com o uso de Expressatildeo Lambda [30]

2 Method References Frequentemente expressotildees lambda criam meacutetodos anocircni-mos Algumas vezes poreacutem satildeo utilizadas para chamar um meacutetodo jaacute existentena classe Ao inveacutes de escrever a expressatildeo Lambda para esse caso pode-se optarpor utilizar um Method Reference que facilita a escrita e leitura desse uso de ex-pressatildeo Lambda [29] A Listagem 32 mostra um exemplo de um meacutetodo estaacuteticoque compara duas pessoas pelas suas idades e a Listagem 33 a utilizaccedilatildeo de MethodReference para aplicar a utilizaccedilatildeo desse meacutetodo em um array e reduzir a escrita deuma expressatildeo lambda a uma forma mais legiacutevel

1 pub l i c s t a t i c i n t compareByAge ( Person a Person b) 2 re turn a b i r thday compareTo (b b i r thday ) 3 4

Listagem 32 Exemplo de meacutetodo de uma classe Pessoa [31]

1 Arrays s o r t ( rosterAsArray Person compareByAge ) 2

Listagem 33 Exemplo de uso de Method Reference [31]

3 Default Methods satildeo meacutetodos com a palavra-chave default que servem para adi-cionar implementaccedilotildees de meacutetodos a uma interface de alguma biblioteca mantendoa compatibilidade binaacuteria com versotildees mais antigas dessa interface Tambeacutem pos-sibilita a implementaccedilatildeo de meacutetodos estaacuteticos em interfaces [29] A Listagem 34apresenta a inclusatildeo de um meacutetodo default na interface TimeClient

1 pub l i c i n t e r f a c e TimeClient 2 void setTime ( i n t hour i n t minute i n t second ) 3 void setDate ( i n t day i n t month i n t year ) 4 void setDateAndTime ( i n t day i n t month i n t year 5 i n t hour i n t minute i n t second )

16

6 LocalDateTime getLocalDateTime ( ) 7

8 s t a t i c ZoneId getZoneId ( S t r ing zoneStr ing ) 9 t ry

10 re turn ZoneId o f ( zoneStr ing ) 11 catch ( DateTimeException e ) 12 System e r r p r i n t l n ( I n v a l i d time zone + zoneStr ing

+13 us ing d e f a u l t time zone in s t ead ) 14 re turn ZoneId systemDefault ( ) 15 16 17

18 d e f a u l t ZonedDateTime getZonedDateTime ( St r ing zoneStr ing ) 19 re turn ZonedDateTime o f ( getLocalDateTime ( ) getZoneId (

zoneStr ing ) ) 20 21 22

Listagem 34 Exemplo de interface com um meacutetodo default [32]

4 Repeating Annotations permitem a implementaccedilatildeo e utilizaccedilatildeo de anotaccedilotildees deum mesmo tipo que podem ser utilizadas mais de uma vez para a mesma declara-ccedilatildeo [29] A Listagem 35 apresenta duas anotaccedilotildees iguais com paracircmetros diferentespermitindo uma customizaccedilatildeo maior na aplicaccedilatildeo de um tipo de anotaccedilatildeo

1 Schedule ( dayOfMonth= l a s t )2 Schedule (dayOfWeek= Fr i hour= 23 )3 pub l i c void doPeriodicCleanup ( ) 4

Listagem 35 Exemplo de Repeating Annotations [33]

5 Type Annotations permitem que anotaccedilotildees possam ser utilizadas em tipos aleacutemde declaraccedilotildees dessa forma pode-se garantir que um campo sempre atenda agraves suasexpectativas e evite testes desnecessaacuterios [29] A Listagem 36 mostra um exemplo derestriccedilatildeo a uma String que nunca poderaacute ser nula devido agrave anotaccedilatildeo de NonNull

1 NonNull S t r ing s t r

Listagem 36 Exemplo de Type Annotation garantindo que o campo nunca seja null [34]

17

34 Expressotildees Lambda

Uma das mudanccedilas mais interessantes implementadas no Java 8 foi a adiccedilatildeo de expressotildeeslambda As expressotildees lambda permitem que a linguagem Java possa atuar parcialmentecomo uma linguagem de programaccedilatildeo funcional onde comportamentos satildeo avaliados eaplicados diferentemente da programaccedilatildeo imperativa que foca na mudanccedila de estadosNa praacutetica um comportamento pode ser passado como paracircmetro de um meacutetodo atraveacutesde uma escrita mais reduzida e legiacutevel Os benefiacutecios de utilizar expressotildees lambda incluemuma melhora na legibilidade e organizaccedilatildeo de coacutedigo que antes era escrito com AnonymousInner Class aleacutem de permitir uma forma simples de utilizar comportamento paralelo como uso de Streams

341 Sintaxe

A sintaxe de uma expressatildeo lambda eacute dividida nas seguintes partes [30]

bull Uma lista de paracircmetros separados por viacutergulas

bull Um token representado por uma seta -gt

bull Um corpo que pode ser representado por uma expressatildeo uacutenica ou um bloco de coacutedigodentro de chaves

As Listagens 37 e 38 mostram duas formas diferentes de se aplicar expressotildees Lambdacom uma sintaxe similar A primeira aplica a expressatildeo diretamente apoacutes a seta utilizadanormalmente para trechos de coacutedigo pequenos e simples e a segunda utiliza-se de chavespara incorporar o coacutedigo e da palavra-chave return para especificar o retorno forma maisutilizada para uma quantidade maior de coacutedigo

1 p minusgt p getGender ( ) == Person Sex MALE2 ampamp p getAge ( ) gt= 183 ampamp p getAge ( ) lt= 25

Listagem 37 Exemplo de expressatildeo lambda com uma expressatildeo [30]

1 p minusgt 2 re turn p getGender ( ) == Person Sex MALE3 ampamp p getAge ( ) gt= 184 ampamp p getAge ( ) lt= 25 5

Listagem 38 Exemplo de expressatildeo lambda com um bloco de coacutedigo [30]

18

342 Principais formas de uso

Anonymous Inner Class

Antes do Java 8 a necessidade de passar funccedilotildees ou expressotildees como paracircmetro de algummeacutetodo era suprida atraveacutes de Anonymous Inner Classes A utilizaccedilatildeo desse tipo dedeclaraccedilatildeo junto com a anotaccedilatildeo de Override permite sobrescrever um meacutetodo de umainterface funcional e ao mesmo tempo passa-la como argumento para um meacutetodo Umaexpressatildeo lambda se comporta da mesma forma poreacutem a quantidade de coacutedigo escritopela Anonymous Inner Class eacute maior e pode dificultar a leitura de coacutedigo pois conteacutemmuita informaccedilatildeo natildeo utilizada para efetivo entendimento do que estaacute sendo feito naqueletrecho

A Listagem 39 apresenta a instanciaccedilatildeo da classe EventHandler internamente ao meacute-todo setOnAction() de forma que o desenvolvedor possa escrever o comportamento quedeseja passar como paracircmetro do meacutetodo atraveacutes da substituiccedilatildeo do meacutetodo handle()que jaacute existe pelo meacutetodo handle() criado e escrito pelo desenvolvedor

1 btn setOnAction (new EventHandlerltActionEvent gt() 2 Override3 pub l i c void handle ( ActionEvent event ) 4 System out p r i n t l n ( He l lo World ) 5 6 )

Listagem 39 Exemplo de uso de Anonymous Inner Class [35]

Interface funcional

Ao projetar um coacutedigo novo o desenvolvedor que optar por utilizar expressotildees lambdadeve iniciar com a criaccedilatildeo de uma interface funcional Esse tipo de interface possui umuacutenico meacutetodo abstrato permitindo que expressotildees lambda sejam usadas para sobrescrevero comportamento do meacutetodo abstrato Uma interface funcional pode possuir outros meacuteto-dos desde que sejam default Uma nova anotaccedilatildeo FunctionalInterface foi adicionadacom a atualizaccedilatildeo do Java 8 para conferir em tempo de compilaccedilatildeo se a interface satisfazos requisitos desse modelo de interface

A Listagem 310 apresenta um exemplo de interface funcional com o objetivo de permi-tir o uso de expressotildees lambda que utilizaratildeo de dois Double como paracircmetro e jaacute utilizada nova anotaccedilatildeo FunctionalInterface introduzida no Java 8

1 Funct iona l Inte r face2 pub l i c i n t e r f a c e DoubleOp 3 pub l i c Double apply ( Double a Double b)

19

4

Listagem 310 Exemplo de interface funcional

Dessa forma conforme as Listagens 311 e 312 o meacutetodo apply() pode tomar formade qualquer operaccedilatildeo entre dois Double que seraacute especificada quando a expressatildeo lambdafor montada dando o aspecto de linguagem funcional agrave linguagem e mais facilidade eliberdade ao desenvolvedor

1 pub l i c c l a s s Ca l cu la to r 2 pub l i c s t a t i c Double c a l c ( Double op1 Double op2 DoubleOp operator ) 3 re turn operator apply ( op1 op2 ) 4 5

Listagem 311 Exemplo de aplicaccedilatildeo da interface funcional

1 Double r e s u l t 1 = Ca lcu la to r c a l c (10d 50d ( a b ) minusgt a + b)

Listagem 312 Uso de expressatildeo lambda para o exemplo anterior

Collections

Dentre as atualizaccedilotildees de pacotes do Java 8 foi adicionado um meacutetodo stream() nainterface Collection Esse meacutetodo trata as Collection como streams o que significa queapesar de natildeo ser possiacutevel acessar elementos diretamente algumas novas manipulaccedilotildeessatildeo possiacuteveis Essas manipulaccedilotildees satildeo na verdade meacutetodos da interface Stream quepodem receber como paracircmetro uma expressatildeo lambda ou seja um comportamento a seraplicado agrave Collection Dentre os meacutetodos temos

bull filter() O meacutetodo filter() recebe uma expressatildeo lambda contendo uma condiccedilatildeopara filtragem da collection

bull map() O meacutetodo map() mapeia os elementos de uma Collection em outro objetocomo uma String A expressatildeo lambda passada por paracircmetro deve retornar o tipode objeto ao qual seraacute mapeado

bull forEach() O meacutetodo forEach() aplica uma operaccedilatildeo especiacutefica para cada ele-mento da Collection A expressatildeo lambda a ser passada deve conter a operaccedilatildeo aser realizada

bull min() e max() Os meacutetodos min() e max() retornam o elemento menor ou maiorda Collection dependendo da expressatildeo lambda passada como paracircmetro

20

A Listagem 313 demonstra como vaacuterias operaccedilotildees com uma Collection podem seraplicadas de uma vez de forma que lendo a expressatildeo lambda jaacute eacute possiacutevel saber oresultado da aplicaccedilatildeo do meacutetodo agrave Collection

1 r o s t e r2 stream ( )3 f i l t e r (4 p minusgt p getGender ( ) == Person Sex MALE5 ampamp p getAge ( ) gt= 186 ampamp p getAge ( ) lt= 25)7 map(p minusgt p getEmailAddress ( ) )8 forEach ( emai l minusgt System out p r i n t l n ( emai l ) )

Listagem 313 Exemplo de utilizaccedilatildeo de meacutetodos de stream com expressotildees lambda [30]

21

Capiacutetulo 4

Estudo e o Processo de Mineraccedilatildeo

A definiccedilatildeo da metodologia utilizada para realizaccedilatildeo deste trabalho eacute importante para queexista uma padronizaccedilatildeo e melhor entendimento de como os resultados foram obtidos paraque a replicaccedilatildeo do mesmo possa ser realizada em trabalhos futuros [36]

Figura 41 Processo utilizado para realizaccedilatildeo do estudo

O esquema representado na Figura 41 descreve o processo seguido para a realizaccedilatildeodeste trabalho que foi divido em trecircs grandes etapas a de planejamento definindo osobjetivos questotildees de pesquisa e meios de investigaccedilatildeo deste projeto a etapa de execuccedilatildeorealizando todo o procedimento metodoloacutegico definido para a coleta e refinamento de

22

dados e a etapa de avaliaccedilatildeo onde foram classificados e avaliados os dados coletadospara responder agraves questotildees de pesquisa

A seguir na primeira seccedilatildeo seratildeo apresentadas em detalhes as questotildees de pesquisa aserem respondidas Em seguida seraacute feito uma breve descriccedilatildeo da fonte de dados utilizada- especificamente os projetos utilizados como objetos de estudo deste trabalho e por fimtodo o restante da metodologia que foi de fato desenvolvida para obter os resultadosnecessaacuterios

41 Questotildees de Pesquisa

Com o objetivo de entender e caracterizar melhor o uso de expressotildees lambda foramdefinidas as seguintes questotildees de pesquisa a serem respondidas

bull PQ-1 Quando os projetos comeccedilaram a introduzir o uso de expressotildees lambda emseus coacutedigos e qual a meacutedia de expressotildees lambda por snapshots caso existam

bull PQ-2 Como as equipes de desenvolvimento estatildeo utilizando expressotildees lambdaatraveacutes de refatoraccedilatildeo de coacutedigo ou introduzindo apenas em coacutedigo novo

bull PQ-3 Quais satildeo os padrotildees tipicamente adotados para o uso de expressotildees lambda

A primeira pergunta de pesquisa gira em torno de como projetos populares open-sourceestatildeo se adaptando agrave introduccedilatildeo de expressotildees lambda em Java muitos projetos jaacute estatildeoutilizando as expressotildees lambda Se sim a partir de quando comeccedilaram a utilizaacute-lasdesde o iniacutecio da introduccedilatildeo das mesmas no Java 8 ou em um periacuteodo mais tardio Aleacutemdisso eacute interessante descobrir se a utilizaccedilatildeo dessa nova caracteriacutestica tem acontecido deforma expressiva ou natildeo

Em seguida para melhor entender a forma como as expressotildees lambda estatildeo sendointroduzidas em projetos eacute interessante investigar se as equipes de desenvolvimento estatildeose preocupando em refatorar coacutedigo com o objetivo de evoluir o software ou se estatildeoexperimentando utilizar expressotildees lambda apenas em coacutedigo novo introduzido

Como a introduccedilatildeo de novas funcionalidades em projetos open-source de grande escaladepende do objetivo do projeto e os padrotildees de projeto utilizados [37] espera-se obser-var diversas abordagens quanto a utilizaccedilatildeo de expressotildees lambda para entatildeo poderclassificar estes softwares quanto a abordagem utilizada

Eacute de grande importacircncia para este estudo conseguir identificar na praacutetica comoexpressotildees lambda estatildeo sendo tipicamente adotadas nestes projetos Assim a terceirapergunta de pesquisa busca identificar alguns exemplos de utilizaccedilatildeo atraveacutes da realizaccedilatildeode alguns estudos de caso

23

Eacute importante ressaltar que apesar de as expressotildees lambda serem uma alternativa aouso de AIC elas natildeo os substituem completamente Existem precondiccedilotildees para que umaAIC possa ser substituiacuteda por expressotildees lambda [12] descritas a seguir

bull AIC deve instanciar-se de uma interface

bull AIC natildeo deve possuir nenhum campo e declarar apenas um meacutetodo

bull AIC natildeo deve possuir uma referecircncia para this ou super

bull AIC natildeo deve declarar um meacutetodo recursivo

Para responder agrave primeira pergunta apenas dados gerais sobre todos os projetos seratildeonecessaacuterios ao passo que pelas perguntas 2 e 3 possuiacuterem uma natureza mais complexaseraacute necessaacuterio aleacutem de uma anaacutelise geral estatiacutestica a realizaccedilatildeo de alguns estudos decaso para obter resultados mais completos

42 Fonte de Dados e Objetos de Estudo

Para responder agraves perguntas de pesquisa estabelecidas foram selecionados os 99 projetosmais populares na linguagem Java dentro da plataforma github ateacute a data da coleta dosdados feita em Abril de 2017 Satildeo considerados populares os repositoacuterios que possuema maior quantidade possiacutevel de estrelas (stars) A decisatildeo de escolher os 99 projetos maispopulares foi por sua natureza imparcial e ao mesmo tempo para que se possa analisarprojetos que satildeo de familiaridade e conhecimento da comunidade do github e de domiacuteniopuacuteblico Os 99 projetos estatildeo listados no Anexo I

Para entender a transiccedilatildeo feita por esses projetos entre as versotildees anteriores do Java eo Java 8 com as expressotildees lambda eacute necessaacuterio analisar o coacutedigo de vaacuterias versotildees a fimde observar alguma mudanccedila para cada projeto Como satildeo 99 projetos e vaacuterios dessesprojetos possuem milhares de linhas de coacutedigo e commits seria impossiacutevel avaliar todosos commits Optou-se entatildeo por coletar snapshots mensais de cada projeto conformeprocedimento tambeacutem seguido anteriormente [38] Cada snapshots representa o estadodo projeto em um determinado mecircs e como criteacuterio de escolha padratildeo todos os snapshotsequivalem ao uacuteltimo commit realizado no determinado mecircs que este representa

O proacuteximo passo eacute determinar o periacuteodo de tempo em que esses snapshots seriamcoletados Como Java 8 (e consequentemente as expressotildees lambda) foi introduzidoapenas em meados de 2014 [28] coletar dados de projetos a partir de um periacuteodo muitoantes deste ano natildeo agregaria valor ao estudo em questatildeo Definiu-se entatildeo um periacuteodopara a coleta mensal desses snapshots atraveacutes dos anos Janeiro de 2013 um ano antesda introduccedilatildeo do Java 8 para que se pudesse identificar para todos os projetos o mecircs

24

exato em que expressotildees lambda foram introduzidas ateacute o mecircs da coleta de dados Abrilde 2017

Eacute importante ressaltar que a definiccedilatildeo dos meses foi definida do dia primeiro de ummecircs ao dia primeiro do proacuteximo mecircs e por consequecircncia alguns snapshots que deveriamrepresentar o final de determinado mecircs correspondem na verdade a commits realizadosno dia primeiro do mecircs seguinte Por exemplo pode existir casos em que o commit querepresente o mecircs de Marccedilo de 2016 seja na verdade o commit realizado no dia primeirode Abril de 2016 Isso se deve a natureza da forma como os resultados de log de commitssatildeo obtidos pelo git [39] Poreacutem isso natildeo interfere nas anaacutelises ou no propoacutesito destetrabalho uma vez que foram realizadas verificaccedilotildees e validaccedilotildees para que natildeo existamdatas repetidas (e consequentemente commits repetidos) por repositoacuterio

Neste trabalho o termo projeto e repositoacuterio foram utilizados de forma intercaladapara representar a mesma coisa o software desenvolvido que possui um repositoacuterio naplataforma github Os termos commit snapshops e versotildees tambeacutem representam a mesmacoisa uma vez que foi definido que seriam utilizados apenas um commit por mecircs pararepresentar um determinado snapshot ou versatildeo do repositoacuterio em questatildeo

Todos os 99 projetos seratildeo utilizados para a realizaccedilatildeo de uma anaacutelise geral de ca-racterizaccedilatildeo do uso de expressotildees lambda Para as anaacutelises aprofundadas foi feito umcriteacuterio de classificaccedilatildeo para que apenas alguns projetos possam ser analisados em niacutevelde coacutedigo como estudos de caso

Resumindo foram escolhidos os 99 projetos mais populares de Java no github cole-tando dados mensais de seus commits a partir do ano de 2013 ateacute a data da coleta dosdados lembrando que nem todos os projetos existem desde 2013 (projetos mais recentes)

43 Processo de Mineraccedilatildeo

A abordagem utilizada para coletar e analisar os 99 projetos escolhidos como mostra aFigura 42 foi realizada de forma automatizada utilizando scripts python e dois projetosdesenvolvidos em Java para a coleta e tratamento de dados como descrito a seguir

Primeiramente foi realizado uma coacutepia dos repositoacuterios atuais de todos os 99 projetosmais populares do github em Java Para automatizar o processo foi desenvolvido umscript em python que lista todos os projetos escolhidos clona todos os repositoacuterios emuma pasta na maacutequina local e cria um arquivo temporaacuterio com as informaccedilotildees do nomede cada repositoacuterio e seu caminho absoluto na maacutequina local

25

Figura 42 Metodologia implementada para coleta e tratamento de dados

Em seguida foi necessaacuterio realizar o checkout de todas as versotildees entre Janeiro de2013 a Abril de 2017 de cada projeto Por motivos de otimizaccedilatildeo de espaccedilo da maacutequinalocal e automatizaccedilatildeo no processo de checkout utilizou-se de um segundo script pythonque realizava as seguintes tarefas para cada mecircs em cada projeto verificar se dentreo mecircs estipulado houve algum commit para aquele projeto se sim pega-se o hash douacuteltimo commit do mecircs realiza o checkout conta-se a quantidade de linhas de coacutedigo emJava que o projeto tem utilizando a biblioteca cloc e armazena todas as informaccedilotildeespertinentes referentes a todos os projetos que naquele mecircs tiveram commits para que oprojeto static-analysis possa entatildeo ser executado sobre esses projetos naquele determinadomomento As informaccedilotildees coletadas que satildeo utilizadas pelo static-analysis correspondemao nome do projeto o hash do commit para aquela versatildeo a pasta onde o projeto estaacutearmazenado na maacutequina local a quantidade de linhas de coacutedigo Java do projeto e datareferente ao commit Essas informaccedilotildees satildeo pertinentes para que o projeto static-analysisconsiga funcionar de forma correta projeto este descrito em detalhes a seguir

431 static-analysis

O static-analysis foi um projeto desenvolvido anteriormente a este trabalho pelos alunosThiago Cavalcanti e Vinicius de Almeida cujo objetivo eacute realizar a anaacutelise estaacutetica de

26

coacutedigos-fonte Java e gerar arquivos de saiacuteda contendo informaccedilotildees de classes e meacutetodoscom suas devidas ocorrecircncias de caracteriacutesticas da linguagem [40]

A anaacutelise estaacutetica de coacutedigo consiste em analisar um coacutedigo-fonte sem a necessidadede executaacute-lo Esse tipo de anaacutelise eacute de extrema importacircncia para manter um coacutedigo dequalidade evitar futuras refatoraccedilotildees e obter informaccedilotildees estatiacutesticas de forma raacutepida epraacutetica [41]

Seguindo esse princiacutepio o static-analysis foi projetado para receber um arquivo deentrada csv seguindo o padratildeo

Tipo da Aplicaccedilatildeo Inicio do projeto Antes ou Apoacutes Java 5 Nome do ProjetoVersatildeo Caminho absolutoQuantidade de linhas de coacutedigo

Atraveacutes da informaccedilatildeo do caminho absoluto do projeto o static-analysis varre osdiretoacuterios em busca dos arquivos fonte java realiza o parse desses arquivos e utilizade Visitors para extrair as informaccedilotildees desejadas e exporta-las em arquivos csv Ouso de Visitors permite que sejam escolhidas as informaccedilotildees desejadas para a consultacomo expressotildees Lambda e AIC s aleacutem de possibilitar que sejam implementados novosVisitors conforme a linguagem evolua ou as necessidades mudem

Para este trabalho foram utilizados os Visitors de expressotildees Lambda map() filter()AICs e declaraccedilotildees de meacutetodos

432 BDAnalisador

Apoacutes obter todas as informaccedilotildees necessaacuterias geradas pelo static-analysis era preciso ma-nipular os dados de forma que facilitasse a coleta de dados para o estudo proposto Comovaacuterios arquivos em formato csv satildeo de difiacutecil manipulaccedilatildeo foi desenvolvido entatildeo umaferramenta chamada BDAnalisador Esta ferramenta eacute responsaacutevel por processar os arqui-vos em csv gerados pelo static-analysis e popular uma base de dados relacional MySQLcom as informaccedilotildees pertinentes a este estudo

O BDAnalisador foi desenvolvido com a intenccedilatildeo de tornar mais simples o trabalhocom os dados resultantes do static-analysis de forma que consultas em SQL pudessemser feitas a ponto de permitir a obtenccedilatildeo de resultados mais complexos Seguindo esseobjetivo o framework Hibernate foi escolhido como ferramenta para persistecircncia devidoa ser um framework jaacute consolidado no mercado e que de forma simples relaciona osobjetos Java ao banco de dados MySQL [42] A divisatildeo de classes foi projetada em quatroentidades Projeto Versao Classe e Metodo cada uma com seus respectivos camposcontendo as informaccedilotildees necessaacuterias para a pesquisa como pode ser visto na Figura 44Eacute importante ressaltar que a tabela de Versao guarda hashs de commits devido agrave escolhade utilizar commits para obter mais informaccedilatildeo de evoluccedilatildeo de coacutedigo em um menor

27

espaccedilo de tempo Aleacutem disso para este trabalho optou-se por persistir todos os meacutetodose classes de cada versatildeo sem se importar com a repeticcedilatildeo desses dados pois a hipoacutetesede haver grandes refatoraccedilotildees entre versotildees poderia comprometer a confiabilidade dasinformaccedilotildees

Figura 43 Diagrama de classes UML do BDAnalisador

Como visto na Figura 43 seguindo parcialmente a arquitetura MVC cada entidadepossui sua respectiva classe DAO(Data Access Object) para persistecircncia dos dados eapenas uma classe Controlador no projeto responsaacutevel pela manipulaccedilatildeo e parse dosdados dos arquivos csv gerados pelo static analysis para serem enviados agraves classes DAOO sistema inicia chamando o meacutetodo inicializar() da classe Controlador Esse meacutetodoeacute responsaacutevel por ler um arquivo de entrada csv que segue o mesmo modelo do arquivo dostatic-analysis citado na seccedilatildeo anterior O arquivo conteacutem os dados de todos os projetose suas respectivas versotildees dessa forma o meacutetodo instancia um objeto da classe Projetoe persiste o projeto no banco de dados Para cada versatildeo encontrada no arquivo deentrada o inicializar() aciona os meacutetodos responsaacuteveis por instanciar e preencher aslistas da classe Classe e Metodo Os meacutetodos responsaacuteveis por preencher as listas varremos arquivos csv gerados pelo static-analysis e fazem o parse das informaccedilotildees relevantescomo nomes dos meacutetodos e quantidades de lambdas para construir os objetos que seratildeogravados Ao final dos preenchimentos o objeto Versatildeo eacute instanciado e gravado no bancode dados atraveacutes de sua classe DAO ao mesmo tempo que grava suas respectivas Classese Metodos

28

Apoacutes vaacuterios testes e correccedilotildees de bugs o banco de dados se encontrava finalmente comas informaccedilotildees de 99 projetos Java open-source separados por um commit por mecircs desde2013 cada um com suas respectivas informaccedilotildees de classes meacutetodos e a quantidade deexpressotildees lambda filters e maps em cada meacutetodo Filter ou Filter pattern eacute o padratildeode projeto que tem como objetivo filtrar objetos de uma coleccedilatildeo (Collection) de acordocom algum criteacuterio Jaacute o map ou map pattern eacute um padratildeo que ldquomapeia os elementosde uma coleccedilatildeo aplicando uma funccedilatildeo a eles para uma nova coleccedilatildeo [43] A coleta deinformaccedilotildees sobre esses padrotildees podem ser uacuteteis para possiacuteveis anaacutelises de oportunidadesde uso de expressotildees lambda para refatoraccedilatildeo de coacutedigo

A Figura 44 mostra o esquema de como o banco de dados resultante foi gerado

Figura 44 Modelo relacional do banco de dados populado pelo BDAnalisador Imagemgerada com software DBeaver [2]

44 Classificaccedilatildeo e Anaacutelise

Com o banco de dados populado restam apenas as etapas de classificaccedilatildeo e anaacutelise pararesponder as questotildees de pesquisa propostas Para isso inicialmente houve uma tentativade se utilizar apenas queries SQL para analisar os dados de acordo com as informaccedilotildeesrelevantes Poreacutem devido ao fato de o banco de dados conter todas as informaccedilotildees detodos os projetos e todas as suas versotildees queries que possuem uma alta complexidadedemoravam muito tempo para retornar os dados

Assim com o objetivo de facilitar o trabalho alguns scripts python foram desenvolvi-dos para rodar as queries separadamente e individualmente para cada projeto de formaautomatizada a fim de melhorar o tempo de resposta para obtenccedilatildeo dos resultados

29

441 Meacutedia de Lambda

O primeiro script retorna a quantidade de expressotildees lambda (ou AICs) por n snapshotsque contenha expressotildees lambda O objetivo eacute ter uma visatildeo geral da meacutedia de expressotildeeslambda e AICs utilizadas por cada projeto e como nem todos os snapshots coletados decada projeto possuem expressotildees lambda e AICs apenas aqueles com alguma expressatildeolambda ou AIC satildeo incluiacutedos no caacutelculo da meacutedia

Mmedia =sumn qtdLambdai

n

442 Anaacutelise Temporal

O segundo script retorna para cada projeto a soma total da quantidade de expressotildeeslambda AIC map() e filter() no projeto inteiro para cada versatildeo Ou seja tem-seo total de cada uma das quatro propriedades selecionadas para cada mecircs do projetoobtendo assim uma visatildeo temporal de evoluccedilatildeo do uso das caracteriacutesticas descritas ATabela 41 ilustra parcialmente o resultado obtido para o projeto agera onde idVersaoeacute o identificador no banco de dados referente ao hash do commit mensal coletado qtd eacutea quantidade de cada uma das caracteriacutesticas escolhidas e a data do commit encontra-seno formato americano

Tabela 41 Informaccedilotildees mensais sobre o projeto ageraidVersao Data do Commit qtd lambda qtd AIC qtd maps qtd filter

823 512016 0 29 4 0755 612016 13 28 4 0686 6152016 13 29 4 0621 812016 13 29 4 0555 8162016 13 30 4 0485 922016 13 30 4 0422 10132016 14 30 4 0356 11282016 14 30 4 0295 12212016 21 30 5 0232 212017 21 30 5 0175 312017 21 30 5 0112 3312017 21 36 5 048 4242017 21 48 5 0

Os resultados obtidos com esta anaacutelise temporal permitiu a identificaccedilatildeo de padrotildees nautilizaccedilatildeo de expressotildees lambda em relaccedilatildeo a utilizaccedilatildeo de AIC por todos os projetos Foi

30

possiacutevel classificar todos os projetos em 6 grupos ilustrado na Figura 45 Primeiramenteseparou-se os projetos entre os que possuem expressotildees lambda e os que natildeo possuemDentre os que possuem identificou-se cinco categorias

1 Grupo 1 Quantidade de AICs e expressotildees lambda aumentam com o tempo pro-porcionalmente

2 Grupo 2 Quantidade de AICs diminui agrave medida que a quantidade de expressotildeeslambda aumentam e a quantidade de expressotildees lambda ultrapassa a quantidade deAIC em um determinado momento

3 Grupo 3 Quantidade de AICs diminui agrave medida que a quantidade de expressotildeeslambda aumentam mas a quantidade de AIC permanece superior agrave quantidade delambda

4 Grupo 4 Expressotildees lambda satildeo introduzidas e existem por um pequeno periacuteodode tempo mas satildeo completamente removidas posteriormente

5 Grupo 5 Quantidade de expressotildees lambda eacute constante e muito inferior compa-rado com a quantidade de AICs no projeto Foi determinado que para pertencera esta classificaccedilatildeo o projeto precisa ter uma razatildeo de meacutedia de expressotildees lamb-dasnapshot por meacutedia de AICsnapshot inferior a 020 Esse paracircmetro foi esta-belecido com o objetivo de definir um padratildeo para o que pode ser considerado umprojeto com poucas expressotildees lambda

Figura 45 Classificaccedilatildeo dos projetos

31

443 Refatoraccedilatildeo de Coacutedigo

O uacuteltimo script teve como objetivo realizar uma tentativa inicial de identificar refatoraccedilatildeode coacutedigo da seguinte maneira para todos os projetos que possuem expressotildees lambdaforam identificados o mecircs imediatamente antes da introduccedilatildeo de expressotildees lambda e omecircs seguinte onde houve a primeira ocorrecircncia de lambda no projeto Assim realizou-se uma anaacutelise do tamanho em quantidade de linhas de coacutedigo de todos os meacutetodosdo projeto que no mecircs seguinte tiveram introduccedilatildeo de lambda Em seguida fez-se umacomparaccedilatildeo com os mesmos meacutetodos em relaccedilatildeo ao mecircs anterior e assim foi possiacuteveldetectar quais meacutetodos tiveram a quantidade de linhas de coacutedigo reduzidas o que seriaum indicativo natildeo necessariamente exclusivo de que uma refatoraccedilatildeo de coacutedigo possa terocorrido

Sabe-se que este meacutetodo de detecccedilatildeo de refatoraccedilatildeo de coacutedigo possui suas limitaccedilotildeesuma vez que as comparaccedilotildees para saber se um meacutetodo existe em ambas versotildees eacute feitopuramente por comparaccedilatildeo de String (nome do meacutetodo) e a classe que este pertence

444 Casos de Uso

Os meacutetodos descritos acima ajudaram a identificar alguns padrotildees e facilitar a anaacutelise dosdados Poreacutem natildeo satildeo suficientes para que se possa responder agraves questotildees de pesquisaDessa forma apoacutes a identificaccedilatildeo dos grupos de classificaccedilatildeo para os projetos foramescolhidos um projeto de cada grupo (com exceccedilatildeo do grupo dos projetos sem expressotildeeslambda) para realizar um breve estudo de caso com o objetivo de identificar e caracterizarmelhor a adoccedilatildeo de expressotildees lambda Os projetos escolhidos foram agera vertxAndroid-CleanArchitecture RxJava e guava

32

Capiacutetulo 5

Resultados Obtidos e Anaacutelise

Neste capiacutetulo seratildeo apresentados os dados obtidos e anaacutelise com o objetivo de responderagraves questotildees de pesquisa propostas Como mencionado anteriormente as perguntas seratildeorespondidas de duas maneiras algumas com informaccedilotildees gerais sobre todos os projetose outras com breve estudos de caso envolvendo cinco projetos

51 Visatildeo Geral

Dentre os repositoacuterios coletados para a anaacutelise 74 (7474) natildeo utilizaram nenhumaexpressatildeo lambda no projeto durante todo o periacuteodo analisado (Janeiro de 2013 a Abrilde 2017) restando apenas 25 repositoacuterios (2525) com expressotildees lambda Eacute interessantedestacar que apesar de a quantidade de repositoacuterios que natildeo possuem expressotildees lambdaser relativamente expressiva muitos destes repositoacuterios satildeo de projetos em Java que umdia foram populares e atualmente natildeo estatildeo sendo mais desenvolvidos (por exemplo umaplicativo que soacute funciona para Android 23 atualmente descontinuado)

Levando em consideraccedilatildeo apenas os projetos que possuem expressotildees lambda exis-tem dois tipos de dados que podem ser analisados para responder agrave primeira questatildeo depesquisa atraveacutes dos dados obtidos pelo meacutetodo anteriormente mencionado como anaacutelisetemporal e a meacutedia de lambda por snapshot mencionados no capiacutetulo anterior

Com relaccedilatildeo ao ano em que a primeira ocorrecircncia foi encontrada 6 projetos introduzi-ram expressotildees lambda jaacute em 2014 8 comeccedilaram a utilizar em 2015 7 em 2016 e apenas4 tiveram a primeira ocorrecircncia de expressotildees lambda em 2017 Dessa forma percebe-seque os projetos estatildeo relativamente bem distribuiacutedos em grupos quanto ao ano em que seintroduziu expressotildees lambda

Pela meacutedia de lambda por snapshot (lambdasnapshot) a maioria (11 projetos) possuiuma quantidade expressiva acima de 100 lambdasnapshot (com 6 projetos entre 20 e 100lambdasnapshot e 8 projetos com menos de 20 lambdasnapshot) como apresentados no

33

graacutefico da Figura 51 Isso mostra que essa nova caracteriacutestica jaacute estaacute sendo bem utilizadanos projetos que comeccedilaram a migrar para a nova versatildeo do Java

Figura 51 Graacuteficos dos projetos separados por ano de introduccedilatildeo de expressotildees lambdae meacutedia de lambda por snapshot

Com isso pode-se observar que apesar de a quantidade de projetos que possuemexpressotildees lambda natildeo ser tatildeo alta eacute possiacutevel obter resultados expressivos uma vez quea quantidade dos projetos com lambda estatildeo bem dispersos quanto ao periacuteodo em quecomeccedilaram a adotar essa caracteriacutestica e a quantidade de expressotildees lambda por snapshot

511 Projetos Selecionados

Atraveacutes dos grupos de classificaccedilatildeo identificados pela anaacutelise temporal descritos na Figura45 cinco projetos foram selecionados para uma anaacutelise detalhada levando em consideraccedilatildeoo grupo em que eles pertencem Estes projetos seratildeo apresentados a seguir

512 agera

Agera eacute uma biblioteca Android que ajuda a introduzir programaccedilatildeo funcional reativa(functional reactive programming) em projetos Android Eacute um projeto recente lanccediladoem 2016 pela Google [44] e encontra-se no grupo dos projetos que introduziram expressotildeeslambda em 2016 no mesmo ano de seu lanccedilamento contendo uma meacutedia de expressotildeeslambda de 16 lambdasnapshot

Na classificaccedilatildeo estabelecida agera pertence ao Grupo 1 onde a quantidade de ex-pressotildees lambda no projeto com o tempo aumentam juntamente com a quantidade deAICs como mostra o graacutefico de anaacutelise temporal na Figura 52

34

Figura 52 Graacuteficos de anaacutelise temporal do projeto agera

513 vertx

Eclipse Vertx eacute um conjunto de ferramentas para criaccedilatildeo de reactive applications namaacutequina virtual Java (JVM) em grande escala [45] Seu primeiro lanccedilamento aconteceuem 2011 e a primeira ocorrecircncia de expressotildees lambda no projeto aconteceu em 2014 Esteprojeto possui uma meacutedia de 2867 lambdasnapshot e dentre os projetos consideradosneste trabalho eacute o que possui a maior quantidade de expressotildees lambda

Este projeto pertence ao Grupo 2 onde a quantidade de expressotildees lambda aumen-tou consideravelmente pelos meses ultrapassando a quantidade de AICs que diminuiudrasticamente como mostra a Figura 53

35

Figura 53 Graacuteficos de anaacutelise temporal do projeto Vertx

514 Android-CleanArchitecture

Apesar de ser uma amostra de projeto Android-CleanArchitecture que tem como objetivoconstruir aplicaccedilotildees Android utilizando clean architecture foi lanccedilado em 2014 mas semanteacutem sempre atualizado [46]

A introduccedilatildeo de expressotildees lambda que aconteceu no ano de 2015 se deu de formatiacutemida com uma meacutedia de 35 lambdasnapshot De qualquer forma este projeto conseguerepresentar com seu graacutefico de anaacutelise temporal o grupo 3 composto por projetos em quea quantidade de expressotildees lambda aumentou mas sem ultrapassar AICs que diminuiacuteramdemonstrado no graacutefico da Figura 54

36

Figura 54 Graacuteficos de anaacutelise temporal do projeto Android-CleanArchitecture

515 RxJava

Dentre os repositoacuterios estudados RxJava eacute considerado o mais popular Como umaimplementaccedilatildeo de Reactive Extensions para a JVM RxJava teve seu lanccedilamento dadoem 2013 [47] Expressotildees lambda apareceram pela primeira vez no ano de 2015 comuma meacutedia de 766 lambdasnapshot

Apesar de uma meacutedia relativamente alta o tempo de vida das expressotildees lambda nesteprojeto foi bem curto caracterizando assim projetos do grupo 4 houve a introduccedilatildeo dasexpressotildees lambda no projeto poreacutem houve a remoccedilatildeo completa de todas as expressotildeeslambda previamente introduzidas desaparecendo completamente do projeto ateacute a datada coleta de dados (Figura 55)

37

Figura 55 Graacuteficos de anaacutelise temporal do projeto RxJava

516 guava

Guava eacute um conjunto de bibliotecas para Java da Google lanccedilado em 2011 A atualizaccedilatildeodo coacutedigo do projeto para Java 8 aconteceu somente em 2016 e apesar do projeto conteruma meacutedia de 281 lambdasnapshot ele foi escolhido como representante dos projetosdo Grupo 5 (Figura 56) que possuem expressotildees lambda mas de forma natildeo expressiva osuficiente quando comparado com a quantidade de AIC pelo fato de sua razatildeo de meacutedia delambdasnapshot por meacutedia de AICsnapshot ser 004 Ou seja embora o projeto tenhaexpressotildees lambda estas satildeo consideradas muito poucas quando inseridas no contextogeral deste projeto que eacute considerado um projeto grande

38

Figura 56 Graacuteficos de anaacutelise temporal do projeto Guava

52 Refatoraccedilatildeo de Coacutedigo

Com o objetivo de caracterizar melhor como as expressotildees lambda estatildeo sendo utilizadaseacute interessante identificar se estas estatildeo sendo introduzidas atraveacutes de refatoraccedilatildeo de coacutedigoou em coacutedigo novo

Os projetos classificados como pertencentes ao Grupo 2 possuem em comum o fatode expressotildees lambda aumentarem a medida que AICs diminuem ultrapassando-as eessa caracteriacutestica em comum pode indicar que nestes projetos possivelmente houve re-fatoraccedilatildeo de coacutedigo visto que AIC sendo substituiacutedo por expressotildees lambda dentro dascondiccedilotildees determinadas eacute a maneira mais comum de se identificar refatoraccedilatildeo de coacute-digo para introduccedilatildeo de expressotildees lambda [12] Os projetos que compotildeem o grupo 2representam 44 de todos os projetos estudados que possuem expressotildees lambda o quepode ser um indicativo caso a hipoacutetese de refatoraccedilatildeo de coacutedigo seja positiva de quemuitos projetos que estatildeo adotando o Java 8 estatildeo se preocupando de alguma formacom refatoraccedilatildeo se coacutedigo Fazem parte desse grupo os seguintes projetos elasticsearchjava-design-patterns PocketHub presto RxJava-Android-Samples spark vertx zipkinjava8-tutorial dropwizard e material-dialogs

39

Outra maneira de verificar possiacuteveis indicadores de refatoraccedilatildeo de coacutedigo foi atraveacutesda anaacutelise dos tamanhos (em quantidade de linhas de coacutedigo) dos meacutetodos com expressotildeeslambda no mecircs em que se introduziu expressotildees lambda e um mecircs imediatamente antesdeste Essa anaacutelise mostra que dos 25 projetos com expressotildees lambda 12 (48) projetostiveram ao menos um meacutetodo em que houve uma diminuiccedilatildeo no tamanho o que podeser considerado um indicativo de refatoraccedilatildeo de coacutedigo A Figura 57 mostra todos osprojetos em relaccedilatildeo agrave quantidade total de meacutetodos que possuem lambda no primeiro mecircsde introduccedilatildeo do mesmo em vermelho comparado com a quantidade desses meacutetodos quetiveram uma diminuiccedilatildeo no tamanho quando comparados com o coacutedigo do mecircs anteriorem azul

Figura 57 Comparaccedilatildeo entre todos os projetos com expressatildeo lambda sobre refatoraccedilatildeode coacutedigo no mecircs de introduccedilatildeo da caracteriacutestica

Ainda observando a figura 57 com relaccedilatildeo aos projetos que natildeo tiveram nenhummeacutetodo com diminuiccedilatildeo de tamanho (barra azul) percebe-se que todos os 13 projetossequer tiveram uma quantidade significativa de meacutetodos que possuem expressotildees lambda(com o maior tendo apenas 5 meacutetodos) no mecircs de introduccedilatildeo da caracteriacutestica no projetoe ao mesmo tempo jaacute existiam no mecircs em que natildeo existia lambda no projeto Essa eacuteuma observaccedilatildeo importante porque projetos como vertx sendo este o que possui a maiormeacutedia de lambdasnapshot de todos os projetos e ao mesmo tempo tendo apenas trecircsmeacutetodos que continham expressotildees lambda no mecircs da introduccedilatildeo e que existiam no mecircs

40

anterior permitem inferir que todas as outras expressotildees lambda existentes no projetopara este determinado mecircs de introduccedilatildeo encontram-se em coacutedigo novo introduzido

Eacute importante ressaltar que somente essa anaacutelise natildeo eacute exclusivamente suficiente paradeterminar se estes projetos estatildeo realmente introduzindo lambda em coacutedigo novo ourealizando refatoraccedilatildeo uma vez que como a comparaccedilatildeo aconteceu apenas no mecircs deintroduccedilatildeo com o mecircs imediatamente anterior natildeo reflete todo o ciclo de vida do pro-jeto Por exemplo algumas equipes podem escolher refatorar o coacutedigo depois de umtempo de adaptaccedilatildeo apoacutes a transiccedilatildeo para a nova versatildeo da linguagem Assim paraobter uma melhor anaacutelise sobre refatoraccedilatildeo de coacutedigo ou natildeo feita nestes projetos aleacutemde outras anaacutelises referentes aos padrotildees tipicamente adotados para implementaccedilatildeo delambda nestes projetos seratildeo apresentados a seguir os estudos de caso dos cinco projetospreviamente selecionados

Outro ponto importante eacute o fato de que apesar das informaccedilotildees quanto agraves quantida-des de filter e map terem sido incluiacutedas inicialmente no trabalho para observar possiacuteveispadrotildees de refatoraccedilatildeo de coacutedigo percebeu-se que estas natildeo satildeo utilizadas de forma con-sideraacutevel pelos projetos estudados e para fins de anaacutelises generalizadas natildeo apresentaramtanta influecircncia na utilizaccedilatildeo de expressotildees lambda quanto a quantidade de AICs noprojeto

53 Estudos de Caso

Dentre os projetos analisados verificou-se que os projetos de pequeno e meacutedio porte op-taram por refatorar de uma vez seus coacutedigos para incluir expressotildees lambda em situaccedilotildeesem que se utilizava AICs anteriormente ou em alguns poucos casos de utilizaccedilatildeo deCollection Os projetos de grande porte natildeo apresentaram nenhuma refatoraccedilatildeo de coacute-digo ou uma refatoraccedilatildeo parcial gradativa provavelmente devido agrave grande quantidade dearquivos e coacutedigo que possuem o que pode tornar o trabalho de refatoraccedilatildeo extenso ecansativo

O projeto vertx que pertence ao grupo 2 dos projetos em que a quantidade de ex-pressotildees lambda aumentaram e as de AICs diminuiacuteram com lambda ultrapassando AICsexecutou inicialmente commits em maio de 2014 com adiccedilatildeo de coacutedigo novo utilizandoexpressotildees lambda e apoacutes um mecircs realizou um commit maior com a refatoraccedilatildeo de todasas AICs para expressotildees lambda Apoacutes a refatoraccedilatildeo o projeto se preocupou em mantera utilizaccedilatildeo de expressotildees lambda ao mesmo tempo que o uso de AICs se manteve apenasaos casos de classes com interfaces natildeo funcionais A Figura 58 apresenta uma parte docommit de refatoraccedilatildeo de coacutedigo que mostra em vermelho a parte eliminada do coacutedigo(AIC) e em verde o coacutedigo novo representando a substituiccedilatildeo por uma expressatildeo lambda

41

Figura 58 Commit de refatoraccedilatildeo de coacutedigo do projeto Vertx [3]

Alguns projetos ainda natildeo se preocuparam em refatorar o coacutedigo para o uso de ex-pressotildees lambda ateacute a data deste trabalho que eacute o caso do projeto guava que apresentouum commit em 03112016 com a atualizaccedilatildeo do projeto para Java 8 Mas a partir daatualizaccedilatildeo se preocupou em utilizar as expressotildees lambda apenas na implementaccedilatildeo decoacutedigo novo O cenaacuterio em que a refatoraccedilatildeo natildeo eacute prioridade ainda eacute a realidade de vaacuteriosprojetos de grande porte visto que os dados de projetos sem nenhuma expressatildeo lambdasatildeo o maior nuacutemero neste trabalho Poreacutem projetos que jaacute adotaram a utilizaccedilatildeo do Java8 tendem a mudar isso com o passar do tempo A Figura 59 apresenta em verde umaadiccedilatildeo de coacutedigo novo com expressatildeo lambda sem a eliminaccedilatildeo de algum coacutedigo anteriora esse que estaria em vermelho

42

Figura 59 Exemplo de um arquivo do commit de adiccedilatildeo de coacutedigo novo em Java 8 doprojeto Guava [4]

Na categoria de projetos em que os AICs e expressotildees lambda aumentam proporci-onalmente (grupo 1) o projeto agera realizou um commit em 19052016 com a adiccedilatildeoda biblioteca retrolambda como dependecircncia do projeto Essa biblioteca utilizada prin-cipalmente por projetos Android permite executar coacutedigo Java 8 contendo expressotildeeslambda em Java 5 6 e 7 [48] O commit tambeacutem apresenta refatoraccedilatildeo dos AICs ad-vindos de interfaces funcionais para expressotildees lambda Apesar de o projeto continuar autilizar as expressotildees lambda em seus commits posteriores o nuacutemero de AICs tambeacutemcontinuou a aumentar visualizando os commits posteriores notou-se que esses AICs satildeorelativos a interfaces natildeo funcionais ou seja que possuem mais de um meacutetodo O projetoAndroid-CleanArchitecture eacute similar ao agera pois tambeacutem optou pela instalaccedilatildeo da bi-blioteca retrolambda para uso de expressotildees lambda em seus coacutedigos e como tambeacutem eacuteum projeto de pequeno porte houve uma pequena refatoraccedilatildeo dos AICs A Figura 510mostra a parte do commit de refatoraccedilatildeo de coacutedigo em que o desenvolvedor adiciona abiblioteca retrolambda como dependecircncia

43

Figura 510 Commit de adiccedilatildeo da biblioteca Retrolambda no projeto Agera [5]

Outro caso interessante eacute o do projeto RxJava que em 2015 optou pela refatoraccedilatildeodo coacutedigo para a utilizaccedilatildeo de expressotildees lambda quase eliminando por completo o usode AICs mas que no ano seguinte reverteu os commits de forma que eliminasse comple-tamente o uso de expressotildees lambda para manter a retrocompatibilidade com o Java 6A Figura 511 demonstra uma parte do commit de reversatildeo do coacutedigo para Java 6 emque pode ser visto em vermelho o coacutedigo anterior com expressotildees lambda e o verde como novo coacutedigo utilizando AIC novamente

44

Figura 511 Commit de remoccedilatildeo de Lambdas e volta para o uso de AICs no projetoRXJava [6]

Essa preocupaccedilatildeo com retrocompatibilidade de coacutedigo pode ser um fator crucial nadecisatildeo das equipes de desenvolvimento na hora de decidir como fazer o software co-evoluircom a linguagem sem perder a compatibilidade com versotildees anteriores

45

Capiacutetulo 6

Consideraccedilotildees Finais

Este estudo permitiu entender melhor como projetos estatildeo realizando a migraccedilatildeo para oJava 8 em especial utilizando uma nova caracteriacutestica introduzida expressatildeo lambdaApesar de a maioria dos projetos populares considerados natildeo possuiacuterem nenhuma ocor-recircncia de expressotildees lambda os projetos que tinham expressotildees lambda foram suficientespara realizar um primeiro estudo de caracterizaccedilatildeo no uso desta caracteriacutestica e com osprojetos efetivamente utilizados para estudo foi possiacutevel agrupaacute-los quanto a maneira emque as expressotildees lambda estavam sendo utilizadas quando comparadas com AICs em 5grandes grupos quando AIC e lambda aumentam proporcionalmente quando AIC dimi-nui e lambda aumenta ultrapassando AIC quando AIC diminui mas continua superior aolambda crescente expressotildees lambda que foram introduzidas e retiradas completamentedo coacutedigo e expressotildees lambda que natildeo existem em quantidades expressivas

Foi possiacutevel entatildeo realizar um estudo aprofundado levando em consideraccedilatildeo as di-ferentes maneiras com que as expressotildees lambda foram adotadas nos projetos atraveacutes daescolha de um projeto que representasse cada grupo para anaacutelise Dentre os cinco projetosestudados foi possiacutevel observar alguns padrotildees tipicamente adotados por desenvolvedorespara implementar expressotildees lambda em seus projetos como a utilizaccedilatildeo da bibliotecas(retrolambda) que permitissem uma flexibilizaccedilatildeo na utilizaccedilatildeo de expressotildees lambda oucomo lambda eacute primariamente utilizada para substituir determinados AICs ou operaccedilotildeesem Collection

Aleacutem disso foi possiacutevel observar como a refatoraccedilatildeo de coacutedigo acontece em cada umdesses projetos Observou-se como projetos menores tendem a refatorar coacutedigo maisfacilmente ao passo que projetos maiores e mais complexos fazem menos refatoraccedilatildeo oudemoram mais entre o periacuteodo em que houve a primeira migraccedilatildeo de coacutedigo para a novaversatildeo da linguagem ateacute o periacuteodo em que realmente decidem refatorar coacutedigo Aleacutem dacomplexidade do projeto influenciar na decisatildeo de migrar o projeto para uma versatildeo maisrecente da linguagem a preocupaccedilatildeo com retrocompatibilidade com versotildees anteriores da

46

linguagem tambeacutem podem ser uma barreira para que projetos comecem a evoluir o coacutedigojuntamente com a evoluccedilatildeo da linguagem

Ainda assim foi possiacutevel observar que a preocupaccedilatildeo com a co-evoluccedilatildeo do software-linguagem existe entre os desenvolvedores de projetos mas a realizaccedilatildeo da migraccedilatildeo aindaacontece lentamente devido agrave diversos fatores que precisam ser levados em consideraccedilatildeopara a manutenccedilatildeo do projeto

Para trabalhos e contribuiccedilotildees futuras seria interessante desenvolver uma ferramentaque pudesse analisar diretamente no coacutedigo-fonte as oportunidades de aplicaccedilatildeo de ex-pressotildees lambda dessa forma poderiam ser analisadas as porcentagens de conversatildeo decoacutedigo para Java 8 e obter melhores conclusotildees sobre a importacircncia que os projetos estatildeodando para a evoluccedilatildeo de seus coacutedigos Outro fator interessante seria aplicar mais Visitorsagrave ferramenta static-analysis e fazer este mesmo estudo aplicado agrave outras caracteriacutesticasda linguagem

47

Referecircncias

[1] Kagdi Huzefa Michael L Collard e Jonathan I Maletic A survey and taxonomyof approaches for mining software repositories in the context of software evolution2007 ix 3 8 9 10 11

[2] DBeaver Dbeaver - features httpdbeaverjkissorgdocsfeatures ix 29

[3] Eclipse Vertx commit Java8-ify code httpsgithubcomeclipsevertxcommit93f95e9c77419f442a42fe711b6eeaef88192fd3 ix 42

[4] Google Guava commit Release java 8 changes to guava httpsgithubcomgoogleguavacommit73e382fa877f80994817a136b0adcc4365ccd904 ix 43

[5] Google Agera commit Collapsed testapp with retrolambda httpsgithubcomgoogleageracommit5e518b7b05f9e7a34a314945f68deff7b2c3e334 ix 44

[6] ReactiveX Rxjava commit 2x full jdk 6 compatible backport + includ-ing bugfixes up to today httpsgithubcomReactiveXRxJavacommit000a174d87a901135f9665d3b11f3627fd2dc4ed ix 45

[7] Godfrey M W e D M German The past present and future of software evolutionEm 2008 Frontiers of Maintenance paacuteginas 129ndash138 Sept 2008 1 6

[8] Favre J M Languages evolve too changing the software time scale Em Principles ofSoftware Evolution Eighth International Workshop on paacuteginas 33ndash42 IEEE 20051 5 7

[9] Overbey Jeffrey L e Ralph E Johnson Regrowing a language refactoring tools allowprogramming languages to evolve Em ACM SIGPLAN Notices volume 44 paacuteginas493ndash502 ACM 2009 1 5 7 8 12

[10] Grechanik Mark Collin McMillan Luca DeFerrari Marco Comi Stefano CrespiDenys Poshyvanyk Chen Fu Qing Xie e Carlo Ghezzi An empirical investiga-tion into a large-scale java open source code repository Em Proceedings of the2010 ACM-IEEE International Symposium on Empirical Software Engineering andMeasurement ESEM rsquo10 paacuteginas 111ndash1110 New York NY USA 2010 ACMISBN 978-1-4503-0039-1 httpdoiacmorg10114518527861852801 1

[11] TIOBE Tiobe httpswwwtiobecomtiobe-index 1 14

48

[12] Gyori Alex Lyle Franklin Danny Dig e Jan Lahoda Crossing the gap from im-perative to functional programming through refactoring Em Proceedings of the 20139th Joint Meeting on Foundations of Software Engineering ESECFSE 2013 paacute-ginas 543ndash553 New York NY USA 2013 ACM ISBN 978-1-4503-2237-9 httpdoiacmorg10114524914112491461 2 11 24 39

[13] OpenJDK State of the lambda httpcropenjdkjavanet~briangoetzlambdalambda-state-4html 2

[14] Han Jiawei Micheline Kamber e Jian Pei Data Mining Concepts and TechniquesMorgan Kaufmann Publishers Inc San Francisco CA USA 3rd ediccedilatildeo 2011ISBN 0123814790 9780123814791 3

[15] Fowler Martin e Kent Beck Refactoring improving the design of existing codeAddison-Wesley Professional 1999 5 7

[16] Lehman M M J F Ramil P D Wernick D E Perry e W M Turski Met-rics and laws of software evolution - the nineties view Em Proceedings of the4th International Symposium on Software Metrics METRICS rsquo97 paacuteginas 20ndashWashington DC USA 1997 IEEE Computer Society ISBN 0-8186-8093-8 httpdlacmorgcitationcfmid=823454823901 6

[17] Hassan Ahmed E e Tao Xie Software intelligence The future of mining softwareengineering data Em Proceedings of the FSESDP Workshop on Future of SoftwareEngineering Research FoSER rsquo10 paacuteginas 161ndash166 New York NY USA 2010ACM ISBN 978-1-4503-0427-6 httpdoiacmorg101145188236218823978 9

[18] Hassan Ahmed E The road ahead for mining software repositories Em Frontiers ofSoftware Maintenance 2008 FoSM 2008 paacuteginas 48ndash57 IEEE 2008 8

[19] Berry Michael J e Gordon Linoff Data Mining Techniques For Marketing Salesand Customer Support John Wiley amp Sons Inc New York NY USA 1997ISBN 0471179809 10

[20] Parnin Chris Christian Bird e Emerson Murphy-Hill Java generics adoption hownew features are introduced championed or ignored Em Proceedings of the 8thWorking Conference on Mining Software Repositories paacuteginas 3ndash12 ACM 2011 12

[21] Oracle The java language specification httpsdocsoraclecomjavasespecsjlsse8jls8pdf 13

[22] Oracle The history of java technology httpwwworaclecomtechnetworkjavajavaseoverviewjavahistory-index-198355html 13

[23] Murphy Kieron So why did they decide to call itjava httpwwwjavaworldcomarticle2077265core-javaso-why-did-they-decide-to-call-it-java-html 13

[24] McGraw Tata Object-oriented Programming with Java Essentials and ApplicationsHill Education 13

49

[25] Oracle Differences between java ee and java se httpdocsoraclecomjavaee6firstcupdocgkhoyhtml 13

[26] Lindsey Clark S The History of Java Cambridge 14

[27] Oracle The java language environment httpwwworaclecomtechnetworkjavaintro-141325html 14

[28] Oracle Jdk 8 httpopenjdkjavanetprojectsjdk8 15 24

[29] Oracle Enhancements in java se 8 httpdocsoraclecomjavase8docstechnotesguideslanguageenhancementshtmljavase8 15 16 17

[30] Oracle Lambda expressions httpdocsoraclecomjavasetutorialjavajavaOOlambdaexpressionshtml 16 18 21

[31] Oracle Method references httpdocsoraclecomjavasetutorialjavajavaOOmethodreferenceshtml 16

[32] Oracle Default methods httpdocsoraclecomjavasetutorialjavaIandIdefaultmethodshtml 17

[33] Oracle Repeating annotations httpdocsoraclecomjavasetutorialjavaannotationsrepeatinghtml 17

[34] Oracle Type annotations httpdocsoraclecomjavasetutorialjavaannotationstype_annotationshtml 17

[35] Oracle Anonymous inner classes httpsdocsoraclecomjavasetutorialjavajavaOOanonymousclasseshtml 19

[36] Kothari CR Research Methodology Methods and Techniques New Age Interna-tional (P) Limited 2004 ISBN 9788122415223 httpsbooksgooglecombrbooksid=8c6gkbKi-F4C 22

[37] Nakakoji Kumiyo Yasuhiro Yamamoto Yoshiyuki Nishinaka Kouichi Kishida eYunwen Ye Evolution patterns of open-source software systems and communitiesEm IWPSE rsquo02 Proceedings of the International Workshop on Principles of SoftwareEvolution paacuteginas 76ndash85 New York NY USA 2002 ACM Press ISBN 1581135459httpdxdoiorg101145512035512055 23

[38] Rahman Foyzur Christian Bird e Premkumar Devanbu Clones What is that smellEmpirical Software Engineering 17(4-5)503ndash530 2012 24

[39] Chacon Scott Pro Git Apress Berkely CA USA 1st ediccedilatildeo 2009ISBN 1430218339 9781430218333 25

[40] Cavalcanti Thiago Gomes e Viniacutecius Correa de Almeida Caracterizaccedilatildeo do uso deconstruccedilotildees da linguagem java em projetos open-source Publicaccedilatildeo online 2016httpbdmunbbrhandle1048315733 27

50

[41] Parr Terence Language Implementation Patterns Create Your Own Domain-Specific and General Programming Languages Pragmatic Bookshelf 1st ediccedilatildeo 2009ISBN 193435645X 9781934356456 27

[42] Janssen Thorben 5 reasons to use jpa hibernate Publicaccedilatildeo online httpswwwsitepointcom5-reasons-to-use-jpa-hibernate 27

[43] Franklin Lyle Alex Gyori Jan Lahoda e Danny Dig Lambdaficator From imperativeto functional programming through automated refactoring Em Proceedings of the2013 International Conference on Software Engineering ICSE rsquo13 paacuteginas 1287ndash1290 Piscataway NJ USA 2013 IEEE Press ISBN 978-1-4673-3076-3 httpdlacmorgcitationcfmid=24867882486986 29

[44] Google Agera httpsgithubcomgoogleagerawiki 34

[45] Eclipse Eclipse vertx httpvertxio 35

[46] Cejas Fernando Android cleanarchitecture httpsgithubcomandroid10Android-CleanArchitecture 36

[47] ReactiveX Rxjava httpsgithubcomReactiveXRxJava 37

[48] Luontola Esko Retrolambda httpsgithubcomorfjackalretrolambda 43

51

Anexo I

Projetos utilizados

fastjson

platform_frameworks_base

netty

material-dialogs

kotlin

okhttp

tinker

AndroidUtilCode

RxJava

spring-boot

java-design-patterns

elasticsearch

ExoPlayer

kafka

vertx

realm-java

guava

zipkin

bazel

stetho

Signal-Android

glide

agera

fresco

plaid

presto

libgdx

spark

52

disruptor

lottie-android

flexbox-layout

PocketHub

zxing

spring-framework

deeplearning4j

dropwizard

interviews

BaseRecyclerViewAdapterHelper

uCrop

DanmakuFlameMaster

lottie-react-native

android-UniversalMusicPlayer

AndroidInterview-Q-A

greenDAO

retrofit

MaterialDrawer

BottomBar

druid

MPAndroidChart

Hystrix

guice

recyclerview-animators

dubbo

androidannotations

RxJava-Android-Samples

PhotoView

clojure

CircleImageView

AndroidSwipeLayout

jedis

MaterialViewPager

butterknife

junit4

RxBinding

leakcanary

SimianArmy

picasso

UltimateRecyclerView

53

AndroidViewAnimations

AppIntro

FizzBuzzEnterpriseEdition

ion

cheesesquare

physical-web

RxAndroid

Android-CleanArchitecture

Calligraphy

Android-Bootstrap

iosched

Android_Data

MaterialDesignLibrary

ListViewAnimations

EventBus

java8-tutorial

AndroidSlidingUpPanel

dagger

okhttputils

logger

HomeMirror

Material-Animations

android-Ultra-Pull-To-Refresh

android-async-http

Android-ObservableScrollView

Android-Universal-Image-Loader

ActionBarSherlock

SlidingMenu

storm

PagerSlidingTabStrip

Android-PullToRefresh

54

  • Dedicatoacuteria
  • Agradecimentos
  • Resumo
  • Abstract
  • Introduccedilatildeo
    • Contexto
    • Objetivos
      • Objetivos Gerais
      • Objetivos Especiacuteficos
        • Metodologia
        • Organizaccedilatildeo do Trabalho
          • Evoluccedilatildeo e Mineraccedilatildeo de Repositoacuterios de Software
            • Evoluccedilatildeo de Software
            • MSR Mineraccedilatildeo de dados e a Engenharia de Software
              • Classificaccedilatildeo
                • Trabalhos Relacionados
                  • Java SE 8 e JDK 8
                    • Histoacuterico
                    • Princiacutepios
                    • Evoluccedilatildeo
                    • Expressotildees Lambda
                      • Sintaxe
                      • Principais formas de uso
                          • Estudo e o Processo de Mineraccedilatildeo
                            • Questotildees de Pesquisa
                            • Fonte de Dados e Objetos de Estudo
                            • Processo de Mineraccedilatildeo
                              • static-analysis
                              • BDAnalisador
                                • Classificaccedilatildeo e Anaacutelise
                                  • Meacutedia de Lambda
                                  • Anaacutelise Temporal
                                  • Refatoraccedilatildeo de Coacutedigo
                                  • Casos de Uso
                                      • Resultados Obtidos e Anaacutelise
                                        • Visatildeo Geral
                                          • Projetos Selecionados
                                          • agera
                                          • vertx
                                          • Android-CleanArchitecture
                                          • RxJava
                                          • guava
                                            • Refatoraccedilatildeo de Coacutedigo
                                            • Estudos de Caso
                                              • Consideraccedilotildees Finais
                                              • Referecircncias
                                              • Anexo
                                              • Projetos utilizados

Lista de Figuras

21 Taxonomia em camadas adaptada do trabalho de Kagdi et al [1] 9

41 Processo utilizado para realizaccedilatildeo do estudo 2242 Metodologia implementada para coleta e tratamento de dados 2643 Diagrama de classes UML do BDAnalisador 2844 Modelo relacional do banco de dados populado pelo BDAnalisador Imagem

gerada com software DBeaver [2] 2945 Classificaccedilatildeo dos projetos 31

51 Graacuteficos dos projetos separados por ano de introduccedilatildeo de expressotildees lambdae meacutedia de lambda por snapshot 34

52 Graacuteficos de anaacutelise temporal do projeto agera 3553 Graacuteficos de anaacutelise temporal do projeto Vertx 3654 Graacuteficos de anaacutelise temporal do projeto Android-CleanArchitecture 3755 Graacuteficos de anaacutelise temporal do projeto RxJava 3856 Graacuteficos de anaacutelise temporal do projeto Guava 3957 Comparaccedilatildeo entre todos os projetos com expressatildeo lambda sobre refatora-

ccedilatildeo de coacutedigo no mecircs de introduccedilatildeo da caracteriacutestica 4058 Commit de refatoraccedilatildeo de coacutedigo do projeto Vertx [3] 4259 Exemplo de um arquivo do commit de adiccedilatildeo de coacutedigo novo em Java 8 do

projeto Guava [4] 43510 Commit de adiccedilatildeo da biblioteca Retrolambda no projeto Agera [5] 44511 Commit de remoccedilatildeo de Lambdas e volta para o uso de AICs no projeto

RXJava [6] 45

ix

Lista de Tabelas

31 As versotildees anteriores de java e principais caracteriacutesticas 14

41 Informaccedilotildees mensais sobre o projeto agera 30

x

Capiacutetulo 1

Introduccedilatildeo

11 Contexto

A evoluccedilatildeo e manutenccedilatildeo de software eacute uma caracteriacutestica intriacutenseca do desenvolvimentode sistemas considerando que a partir do momento em que um software comeccedila a serdesenvolvido satildeo realizadas constantes manutenccedilotildees [7] Apesar de o conceito de evolu-ccedilatildeo de software representar uma grande aacuterea de pesquisa na engenharia de software nemsempre pesquisadores reconhecem a importacircncia da evoluccedilatildeo das linguagens de progra-maccedilatildeo como um grande fator influenciador na evoluccedilatildeo de software [8] uma vez que umsoftware que natildeo evolui junto com a sua linguagem tem a sua capacidade de evoluccedilatildeolimitada [9]

Surge entatildeo a necessidade de alinhar estudos empiacutericos com o intuito de investigar esteprocesso de evoluccedilatildeo do software juntamente com a evoluccedilatildeo de sua linguagem atraveacutesde investigaccedilatildeo e anaacutelise de seu coacutedigo fonte que pode ser feita por meio de anaacutelise de re-positoacuterios de software em grande escala o que deu origem a abordagem de Mineraccedilatildeo emRepositoacuterio de Software (MSR) O MSR tem como base o estudo sistemaacutetico e empiacutericode repositoacuterios de software com o objetivo de analisaacute-los utilizando informaccedilotildees estatis-ticamente uacuteteis coletadas para observar diversos padrotildees como a evoluccedilatildeo do softwarepadrotildees de projetos dentre outros [10]

A complexidade e dificuldade de realizar tal estudo empiacuterico eacute alta pois atualmenteexistem diversos tipos de plataformas para coleta de dados linguagens e focos variadosAssim para escolher o foco do objeto de estudo eacute necessaacuterio levar em consideraccedilatildeo estasdificuldades e especificaccedilotildees e dessa forma este trabalho tem como foco a anaacutelise desistemas de software na linguagem Java

Ateacute a data deste trabalho de acordo com os dados do TIOBE [11] Java eacute a linguagemde programaccedilatildeo com mais linhas de codigo catalogadas no mundo Isso faz com queseja extremamente interessante o estudo empiacuterico da evoluccedilatildeo da linguagem e software

1

desenvolvidos nela desde sua primeira versatildeo antes de se tornar uma linguagem populare ainda com poucos pacotes ateacute a sua atual versatildeo estaacutevel com uma grande quantidadede novas caracteriacutesticas

A versatildeo mais recente do Java a JDK 8 possui diversas adiccedilotildees interessantes para aorganizaccedilatildeo do coacutedigo e facilidade do programador Dessas novas implementaccedilotildees con-ceitos de linguagem funcional como expressotildees lambda e iteradores externos que recebemuma expressatildeo lambda como argumento como o map() filter() e forEach() tornarama escrita de coacutedigo paralelo mais simples e permitiram ganhos de performance [12]

Diversas linguagens de programaccedilatildeo tambeacutem populares como Javascript e Ruby jaacutepossuiacuteam expressotildees lambda desde suas versotildees iniciais sendo o Java 8 em 2014 maisuma linguagem a introduzir esse novo conceito Podemos descrever as expressotildees comopequenas funccedilotildees normalmente feitas em apenas uma linha sem um nome identificadorElas podem ser retornadas de outras funccedilotildees ou passadas como paracircmetro Um exemplode expressatildeo lambda pode ser visualizado pela funccedilatildeo de soma de dois inteiros escrita daforma (int x int y)rarr x + y [13]

Antes da inclusatildeo de expressotildees lambda em Java o mesmo comportamento era possiacutevelutilizando classes anocircnimas ou AICs (Anonymous inner classes) Contudo eacute necessaacute-rio a criaccedilatildeo de uma interface com apenas um meacutetodo e instanciaacute-la como uma AIC Autilizaccedilatildeo de AICs gera inuacutemeras linhas de coacutedigo adicionais que poderiam ser encapsu-ladas em apenas uma linha com a utilizaccedilatildeo de expressotildees lambda Como eacute interessantepara o programador ter um coacutedigo sempre mais legiacutevel e sucinto torna-se interessante arefatoraccedilatildeo de coacutedigo que utiliza uma tecnologia mais antiga para a nova

Assim este trabalho visa conduzir um estudo de mineraccedilatildeo em repositoacuterios de softwareopen-source desenvolvidos na linguagem Java para entender como desenvolvedores estatildeose adaptando agraves novas mudanccedilas introduzidas no Java 8

12 Objetivos

121 Objetivos Gerais

Este trabalho tem como objetivo geral caracterizar o uso de expressotildees lambda entre osprojetos Java mais populares desenvolvidos pela comunidade do GitHub

122 Objetivos Especiacuteficos

Sabendo do benefiacutecio da refatoraccedilatildeo de coacutedigo para o uso de expressotildees lambda e dapouca quantidade de estudos acadecircmicos sobre o assunto surge entatildeo uma oportunidadede pesquisa para melhor entender a forma como essa caracteriacutestica estaacute sendo adotada por

2

projetos com foco em refatoraccedilatildeo de coacutedigo o que originou a necessidade deste estudoAssim para alcanccedilar o objetivo deste trabalho foram traccedilados em forma de questotildees depesquisa os objetivos especiacuteficos a serem alcanccedilados por este trabalho

bull Quando os projetos Java de coacutedigo aberto comeccedilaram a introduzir o uso de expres-sotildees lambda em seus coacutedigos e quatildeo significativo eacute esse uso

bull Como as equipes de desenvolvimento estatildeo utilizando expressotildees lambda atraveacutesde refatoraccedilatildeo de coacutedigo ou introduzindo apenas em coacutedigo novo

bull Quais satildeo os padrotildees tipicamente adotados para o uso de expressotildees lambda

13 Metodologia

Este trabalho foi desenvolvido utilizando uma abordagem de MSR que dentro da clas-sificaccedilatildeo de Kagdi et al [1] pode ser divido em quatro grandes etapas Primeiramentedefiniu-se a fonte de dados a ser utilizada e dentre as possibilidades encontradas na lite-ratura [14] optou-se por utilizar repositoacuterios de controle de versatildeo mais especificamenteo Github tendo como criteacuterio de seleccedilatildeo os 99 repositoacuterios Java mais populares na plata-forma Em seguida definiu-se o propoacutesito do estudo no caso os objetivos em forma deperguntas de pesquisa a serem respondidas

A terceira grande etapa foi a definiccedilatildeo do meacutetodo em si a forma como seria realizadoo estudo e este por sua vez constitui-se de download de todos os 99 repositoacuterios maispopulares realizaccedilatildeo de uma anaacutelise estaacutetica para coletar informaccedilotildees necessaacuterias de cadaprojeto por versatildeo e armazenamento de informaccedilotildees pertinentes em uma base de dados

A etapa final foi a realizaccedilatildeo da avaliaccedilatildeo dos dados obtidos atraveacutes de meacutetricas eanaacutelises quantitativas para melhor responder as questotildees de pesquisa aleacutem de estudos decaso feitos com cinco projetos escolhos de acordo com a maneira distinta em que estesfazem o uso de expressotildees lambda

14 Organizaccedilatildeo do Trabalho

Este trabalho se divide em seis capiacutetulos

bull Capiacutetulo 2 Apresenta um referencial teoacuterico sobre evoluccedilatildeo de software demons-trando as estrateacutegias utilizadas e a importacircncia da evoluccedilatildeo em um projeto de coacutedigoaberto aleacutem de enunciar as leis de evoluccedilatildeo de software de Lehman O capiacutetulo tam-beacutem apresenta o processo de mineraccedilatildeo de dados explicando cada uma das camadasda classificaccedilatildeo e demonstra trabalhos relacionados a esse toacutepico que serviram debase para este trabalho

3

bull Capiacutetulo 3 Traz um contexto histoacuterico e teacutecnico da linguagem Java necessaacuteriospara entender a importacircncia que as novas caracteriacutesticas adicionadas na versatildeo8 fornecem para os desenvolvedores de projetos determinados a manter o projetosempre evoluiacutedo Tambeacutem eacute apresentada uma seccedilatildeo para demonstrar os detalhese formas de utilizaccedilatildeo das expressotildees Lambda que satildeo o foco dos objetivos destetrabalho

bull Capiacutetulo 4 Descreve a metodologia e processo utilizados para o desenvolvimentoe obtenccedilatildeo dos resultados deste trabalho O capiacutetulo desenvolve o contexto dasquestotildees de pesquisa e explica os motivos e processos de desenvolvimento das fer-ramentas utilizadas para minerar os dados aleacutem de determinar a classificaccedilatildeo dosresultados obtidos em grupos para facilitar a organizaccedilatildeo dos dados de forma queas perguntas sejam respondidas claramente

bull Capiacutetulo 5 Apresenta os resultados obtidos e de que forma eles ajudaram a respon-der as questotildees de pesquisa Eacute descrita uma anaacutelise de um projeto de cada categoriaespecificada no capiacutetulo anterior a fim de contextualizar cada tipo de resultado paraque o leitor entenda a forma que os projetos Java estatildeo lidando com as expressotildeesLambda

bull Capiacutetulo 6 Descreve as dificuldades e problemas obtidos durante o trabalho e deque forma eles influenciaram nos resultados Tambeacutem eacute apresentada uma seccedilatildeocontendo as ideias surgidas durante o desenvolvimento deste trabalho que ficarampara ser feitas no futuro devido agrave gama de informaccedilotildees que a mineraccedilatildeo dos dadostrouxe

4

Capiacutetulo 2

Evoluccedilatildeo e Mineraccedilatildeo deRepositoacuterios de Software

As linguagens de programaccedilatildeo estatildeo sempre evoluindo aumentando sua complexidade eexpressividade Da mesma forma aleacutem de se preocupar com dificuldades de estabelecercompatibilidade do software em relaccedilatildeo a tecnologias antigas desenvolvedores tambeacutemprecisam acompanhar essa evoluccedilatildeo das linguagens para que suas ferramentes natildeo setornem obsoletas [9] Isso agrega um grande desafio no desenvolvimento e evoluccedilatildeo desoftware

O conceito de evoluccedilatildeo de software amadureceu e se tornou um grande foco de pes-quisa Poreacutem nem sempre estudos de evoluccedilatildeo de software reconhecem a importacircncia daevoluccedilatildeo da linguagem de programaccedilatildeo no contexto do desenvolvimento de software [8]Quando um coacutedigo natildeo evolui junto com a linguagem com o objetivo de manter umacompatibilidade com versotildees anteriores sua capacidade de evoluccedilatildeo se torna limitada [9]

A refatoraccedilatildeo de coacutedigo que consiste em realizar mudanccedilas no coacutedigo fonte sem modi-ficar o comportamento observado do software [15] permite que a evoluccedilatildeo de linguagens eferramentas aconteccedilam mais naturalmente No entanto novos desafios surgem como porexemplo saber quando e como realizar a refatoraccedilatildeo de coacutedigo de forma eficiente e coesaDentre as teacutecnicas de pesquisa em engenharia de software para entender esse problematorna-se interessante explorar as teacutecnicas de mineraccedilatildeo de dados aplicados a repositoacuteriosde software com o objetivo de entender o relacionamento entre evoluccedilatildeo e refatoraccedilatildeo

Assim este capiacutetulo busca esclarecer conceitos e estrateacutegias de evoluccedilatildeo de softwaremineraccedilatildeo de repositoacuterios de software e o estado da arte sobre o assunto

5

21 Evoluccedilatildeo de Software

Durante o processo de produccedilatildeo e manutenccedilatildeo de software haacute a necessidade de diversastomadas de decisotildees sobre seu desenvolvimento como por exemplo decidir como melho-rar a qualidade do software Tais decisotildees precisam ser tomadas levando em consideraccedilatildeoo ambiente em que se estaacute inserido com novas tecnologias surgindo todos os dias fe-edback de usuaacuterios exigentes e concorrentes produzindo um software similar com ideiasinovadoras

Tudo isso acontece em um ritmo de constante mudanccedila e assim como diria Lehmaneacute imprescindiacutevel que software de sistemas sejam capazes de evoluir ou os mesmos correm orisco de sofrer uma morte prematura [16] fazendo assim da evoluccedilatildeo de software um con-ceito importante dentro do seu processo de desenvolvimento Essa evoluccedilatildeo deve ocorrerconsiderando o ambiente em que o software estaacute inserido o qual possui aspectos teacutecnicos esociais sua infraestrutura que pertence ao seu ambiente teacutecnico o qual sempre necessitamanutenccedilatildeo e ao mesmo tempo usuaacuterios que utilizam o software e estatildeo constantementeformando opiniotildees oferecendo feedback e na expectativa por novidades [7] Assim a me-dida que novas caracteriacutesticas satildeo desenvolvidas novas tecnologias de infraestrutura satildeonecessaacuterias novos requisitos satildeo adicionados e o sistema de software deve se adaptar aessas mudanccedilas

Com relaccedilatildeo aos aspectos sociais que envolvem a evoluccedilatildeo do software eacute importanteressaltar os conceitos baacutesicos de como essa evoluccedilatildeo acontece Durante um estudo empiacutericopioneiro na aacuterea de evoluccedilatildeo de software para sistemas de grande escala Lehman e seuscolaboradores formularam um conjunto de observaccedilotildees que hoje satildeo conhecidas como asleis da evoluccedilatildeo de software ou simplesmente Leis de Lehman [16] No geral as leis deevoluccedilatildeo de software podem ser descritas da seguinte forma [16]

1 Mudanccedila contiacutenua um sistema se tornaraacute progressivamente menos satisfatoacuteriopara seus usuaacuterios com o tempo a menos que se adapte continuamente agraves necessi-dades que surgiratildeo

2 Complexidade Crescente um sistema se tornaraacute cada vez mais complexo amenos que se trabalhe para explicitamente reduzir sua complexidade

3 Auto-regulaccedilatildeo o processo de evoluccedilatildeo de software eacute auto-regulatoacuterio no que dizrespeito agraves distribuiccedilotildees dos artefatos e produtos produzidos

4 Conservaccedilatildeo da estabilidade organizacional a taxa meacutedia de atividade globalefetiva em um sistema em evoluccedilatildeo natildeo muda com o tempo ou seja a meacutedia detrabalho e esforccedilo colocado em cada entrega do sistema permanece a mesma

6

5 Conservaccedilatildeo de familiaridade a quantidade de conteuacutedo novo em cada entregado sistema tende a se manter constante com o tempo

6 Crescimento contiacutenuo A quantidade de funcionalidades em um sistema cresceraacutecom o tempo com o objetivo de satisfazer seus usuaacuterios

7 Decliacutenio de qualidade Um sistema seraacute percebido com qualidade inferior como passar do tempo a menos que seu design tenha uma manutenccedilatildeo minuciosa e seadapte a novas restriccedilotildees

8 Sistema de Feedback Evoluir um sistema com sucesso requer reconhecer que oprocesso de desenvolvimento acontece em um sistema de feedback de vaacuterios ciclosagentes e niacuteveis

Os aspectos teacutecnicos que envolvem a evoluccedilatildeo de software levam em consideraccedilatildeo astecnologias utilizadas para o seu desenvolvimento desde a linguagem de programaccedilatildeo agravesmaacutequinas onde o software seraacute hospedado que sofrem atualizaccedilotildees recebem novas versotildeescom novas caracteriacutesticas implementadas

Um estudo realizado por Lavre mostra como a evoluccedilatildeo das linguagens de programa-ccedilatildeo no contexto da evoluccedilatildeo de software muitas vezes satildeo subestimadas uma vez quemuitos podem considerar em seus estudos a linguagem de computaccedilatildeo como um artefatoimutaacutevel [8] Por exemplo coloca-se muita ecircnfase e cuidado para realizar o versionamentode coacutedigo fonte de um software mas este pode ser tornar inutilizaacutevel futuramente se nin-gueacutem souber qual versatildeo de compilador determinada versatildeo de coacutedigo foi desenvolvida

Para natildeo se deixar estagnar linguagens de programaccedilatildeo precisam se adaptar e evoluirQuando uma linguagem de programaccedilatildeo atualiza softwares que eram antes consideradosatualizados podem se tornar rapidamente obsoletos E ao mesmo tempo que novascaracteriacutesticas satildeo adicionadas a linguagem precisa fornecer compatibilidade com versotildeesanteriores aumentando sua complexidade Desenvolvedores entatildeo encontram-se tambeacutemem um empasse buscando um equiliacutebrio entre manter a compatibilidade da ferramentacom versotildees anteriores da linguagem e atualizaacute-la para manter o software atualizado [9]

A estrateacutegia de refatoraccedilatildeo de coacutedigo pode ser uma opccedilatildeo que permite a linguageme o software co-evoluiacuterem com um menor grau de dificuldade [9] Refatoraccedilatildeo (do inglecircsrefactoring) eacute o processo de modificaccedilatildeo de um software com o objetivo de melhorar a es-trutura interna do mesmo sem alterar sua percepccedilatildeo externa Eacute uma maneira disciplinadade melhorar o design do coacutedigo apoacutes ele jaacute ter sido implementado Por exemplo dividiruma funcionalidade grande feita em apenas um bloco de coacutedigo em vaacuterios moacutedulos [15]

A refatoraccedilatildeo de coacutedigo pode ser um meio utilizado para evoluir o software adaptandoo coacutedigo com caracteriacutesticas novas introduzidas pela linguagem modificando o design dosistema sem comprometer sua integridade No entanto novos desafios surgem visto que

7

refatorar o coacutedigo fonte de um sistema de grande porte natildeo eacute uma tarefa faacutecil havendo anecessidade de ferramentas que possam automatizar o processo ou realizar um estudo paraentender como as novas caracteriacutesticas da linguagem podem ser utilizadas para substituirou melhorar funcionalidades obsoletas [9]

22 MSR Mineraccedilatildeo de dados e a Engenharia deSoftware

Com o objetivo de compreender prever e planejar os vaacuterios aspectos do desenvolvimentode um projeto em especial tudo que possa impactar na evoluccedilatildeo de software a teacutecnicade mineraccedilatildeo de dados tem sido bastante utilizada em engenharia de software [17]

O termo Mineraccedilatildeo de Repositoacuterios de Software (MSR) tem sido utilizado para descre-ver vaacuterias maneiras de se examinar repositoacuterios de software Um repositoacuterio de softwarepode ser considerado um artefato que eacute produzido e arquivado durante a evoluccedilatildeo desoftware [1] Estes responsoacuterios armazenam informaccedilotildees que podem fornecer todos osdetalhes de desenvolvimento do software provendo meios necessaacuterios para uma anaacuteliseaprofundada de evoluccedilatildeo de software

Repositoacuterios de software satildeo comumente utilizados para armazenar e acompanhar ohistoacuterico de desenvolvimento do software mas raramente usados para tomada de deci-sotildees em relaccedilatildeo ao projeto Assim pesquisadores de MSR buscam modificar a impressatildeode que tais repositoacuterios satildeo estaacuteticos que servem apenas para manutenccedilatildeo de registrostransformando-os em repositoacuterios ativos que podem auxiliar na tomada de decisatildeo em pro-jetos de software modernos atraveacutes da identificaccedilatildeo de padrotildees para realizar a propagaccedilatildeode mudanccedilas [18]

221 Classificaccedilatildeo

De acordo com Kagdi et al dentre as abordagens de MSR utilizadas atualmente eacute possiacuteveldescrevecirc-las para entatildeo comparaacute-las e possivelmente classificaacute-las levando em considera-ccedilatildeo uma taxonomia de quatro dimensotildees os repositoacuterios de software utilizados (fontes dedados) o propoacutesito do MSR a metodologia e a avaliaccedilatildeo da abordagem [1] como mostraa Figura 21 onde as taxonomias destacadas em amarelo satildeo as que prevaleceram poreacutemnatildeo exclusivamente na metodologia adotada por este trabalho

8

Figura 21 Taxonomia em camadas adaptada do trabalho de Kagdi et al [1]

Fontes de Dados

As fontes de informaccedilatildeo variam de acordo com a abordagem utilizada e dentre as informa-ccedilotildees mineradas em repositoacuterios de software inclui-se as seguintes categorias os artefatosde software e suas versotildees as diferenccedilas entre os artefatos de software e suas versotildees e osmetadados sobre as mudanccedilas no software

As fontes de dados podem ser melhor classificadas de acordo com Hassan et al [17]

bull Repositoacuterios de controle de Versatildeo estes repositoacuterios guardam o histoacuterico de desen-volvimento de um projeto armazenando todas as mudanccedilas no coacutedigo fonte assimcomo os metadados associados com cada mudanccedila Exemplos git SVN

bull Bug repositories Estes repositoacuterios rastreiam o histoacuterico de resoluccedilatildeo de bugs quesatildeo reportados por usuaacuterios e desenvolvedores Exemplos Bugzilla e Jira

9

bull Histoacuterico de Comunicaccedilatildeo (Archived communications) estes repositoacuterios rastreiamdiscussotildees sobre os vaacuterios aspectos de um projeto de software por sua vida uacutetil Porexemplo listas de e-mails

bull Deployment logs logs com informaccedilotildees do software gerados por ferramentas dedesenvolvimento

bull Repositoacuterios de software Repositoacuterios onde o coacutedigo fonte de vaacuterios projetos satildeoarmazenados como por exemplo Sourceforgenet

No contexto deste trabalho estes repositoacuterios consistem em fontes de coacutedigo armaze-nadas em sistemas de controle de versatildeo especificamente coacutedigos na plataforma Github

O propoacutesito

O propoacutesito da mineraccedilatildeo de repositoacuterios de software se resume nas perguntas de pes-quisa que podem ser respondidas utilizando mineraccedilatildeo Assim existem duas classes deperguntas de pesquisa para MSR [1]

A primeira eacute a pergunta de anaacutelise market-basket1 ldquoSe A acontece o que mais podeacontecerrdquo A resposta para este tipo de pergunta eacute um conjunto de regras descrevendotendecircncias de relacionamentos como por exemplo se A acontecer entatildeo B e C acontecemdurante um periacuteodo X

A segunda classe diz respeito agraves perguntas de prevalecircncia (Prevalence Questions -PQ) como por exemplo perguntas do tipo ldquoA funcionalidade Y foi modificadardquo quepossuem uma resposta booleana ou ldquoQuantas vezes esta funcionalidade Y foi modificadardquocontendo uma resposta quantitativa

As perguntas de pesquisa deste trabalho se encaixam majoritariamente na segundaclasse onde o objetivo traccedilado eacute respondido de forma quantitativa com algumas tentativasde classificaccedilatildeo de tipos de repositoacuterios como seraacute descrito nos capiacutetulos seguintes

A metodologia

A metodologia corresponde a maneira como as questotildees de MSR iratildeo ser respondidas evaacuterias abordagens estatildeo disponiacuteveis Poreacutem Kagdi indica duas estrateacutegias baacutesicas quepodem ser utilizadas

Primeiramente pode-se utilizar a mediccedilatildeo indireta e anaacutelise da evoluccedilatildeo do softwareEsta abordagem pode ser realizada da seguinte forma extrair e computar informaccedilotildeesde cada versatildeo de um software separadamente e em seguida individualmente comparar

1Anaacutelise Market-basket eacute uma teacutecnica de modelagem baseada na teoria de que se vocecirc comprar certostipos de produtos vocecirc haacute uma probabilidade maior (ou menor) de comprar outros tipos de produtos [19]

10

propriedades encontradas como por exemplo comparar duas versotildees distintas de umsoftware atraveacutes de um repositoacuterio github realizando uma investigaccedilatildeo de alto niacutevel noque diz respeito a evoluccedilatildeo do software [1]

A segunda perspectiva de metodologia que pode ser utilizada corresponde agrave mediccedilatildeodireta e anaacutelise da evoluccedilatildeo do software Ela diz respeito agraves investigaccedilotildees que estudamos mecanismos que leva um software a ser modificado de uma versatildeo para outra focandonas diferenccedilas especiacuteficas entre estas versotildees como por exemplo examinando mudanccedilasespeciacuteficas das classes arquivos funccedilotildees de cada parte do coacutedigo [1]

Assim eacute possiacutevel descrever explicitamente que este trabalho utiliza em sua maioriauma metodologia com mediccedilotildees diretas atraveacutes da anaacutelise estaacutetica de informaccedilotildees docoacutedigo fonte de diferente versotildees para analisar os diferentes padrotildees de desenvolvimentoem que expressotildees lambda (definidas no capiacutetulo seguinte) satildeo utilizadas

A Avaliaccedilatildeo

Por fim existem diversas formas para se avaliar o estudo realizado sempre levando emconsideraccedilatildeo a validade dos resultados obtidos Pode-se utilizar de meacutetricas para avaliar osdados considerando o quanto das informaccedilotildees obtidas satildeo relevantes Outra forma de seavaliar seria atraveacutes da utilizaccedilatildeo de modelos probabiliacutesticos seguindo uma abordagemde teoria da informaccedilatildeo Assim foram utilizadas determinadas meacutetricas quantitativaspara avaliar os resultados obtidos neste trabalho

23 Trabalhos Relacionados

Como ressaltado na introduccedilatildeo o foco deste trabalho encontra-se em utilizar teacutecnicas deMSR para caracterizar a adoccedilatildeo de expressotildees lambda em repositoacuterios Java Ao reali-zar um estudo sobre o estado da arte encontrou-se diversos trabalhos que utilizam deMSR para obter informaccedilotildees relevantes sobre repositoacuterios de software em diversos focose em especial trabalhos que investiguem repositoacuterios na linguagem Java Jaacute existemtambeacutem alguns trabalhos que apresentam ferramentas de refatoraccedilatildeo de coacutedigo para im-plementaccedilatildeo de expressotildees lambda com foco na evoluccedilatildeo do software Dentre os trabalhosencontrados mencionados destacam-se

bull Em um trabalho sobre utilizaccedilatildeo de refatoraccedilatildeo de coacutedigo para realizar a transiccedilatildeode coacutedigo Java para as novas caracteriacutesticas implementadas no Java 8 Gyori et alapresenta uma ferramenta que automatiza com sucesso o trabalho de conversatildeo decoacutedigo como Annonymous Inner Class para expressotildees lambda [12] O capiacutetulo aseguir descreve em detalhes estes conceitos

11

bull Regrowing a Language de Overbey apresenta um estudo sobre a importacircncia da co-evoluccedilatildeo entre a linguagem de programaccedilatildeo e os projetos de software focando naslinguagens Fortran e Java e provando como ferramentas de refatoraccedilatildeo de coacutedigoauxiliam para que o software consiga evoluir juntamente com sua linguagem deprogramaccedilatildeo [9]

bull O trabalho sobre a adoccedilatildeo de generics em coacutedigo Java feito por Parnin utiliza demineraccedilatildeo de dados para realizar uma investigaccedilatildeo empiacuterica avaliando projetos decoacutedigo aberto com o objetivo de observar como desenvolvedores destes projetos estatildeoutilizando generics em Java [20]

Os estudos mencionados focam em assuntos particulares pertinentes a este trabalhoem que de um lado tem-se trabalhos que mostram a necessidade de refatoraccedilatildeo de coacutedigopara evoluccedilatildeo de software e do outro tem-se trabalhos que mostram que eacute possiacutevel utilizarde MSR para entender melhor como a evoluccedilatildeo da linguagem de programaccedilatildeo Java temafetado projetos reais de coacutedigo aberto e como estes projetos estatildeo se adaptando a estasevoluccedilotildees

12

Capiacutetulo 3

Java SE 8 e JDK 8

Este trabalho tem como objetivo caracterizar a adoccedilatildeo de expressotildees Lambda em siste-mas Java que podem ser considerados legados pois foram concebidos em um momentoanterior a introduccedilatildeo dessa nova caracteriacutestica na linguagem Java Com o intuito de faci-litar o entendimento do leitor sobre tais construccedilotildees esse capiacutetulo apresenta informaccedilotildeeshistoacutericas referentes agrave linguagem Java desde sua criaccedilatildeo ateacute a sua ascensatildeo como umadas linguagens de programaccedilatildeo mais populares Aleacutem disso seratildeo apresentadas as novascaracteriacutesticas presentes na versatildeo Java SE 8 com destaque nas expressotildees Lambda e deque forma vieram para auxiliar no desenvolvimento de sistemas

31 Histoacuterico

Java eacute uma linguagem de programaccedilatildeo orientada a objetos para propoacutesitos gerais [21] Alinguagem nasceu com o nome de Oak no ano de 1991 com o foco em televisotildees digitais acabo mas devido agrave complexidade e poder da linguagem logo expandiu-se para os outrosdomiacutenios principalmente a Internet [22] Posteriormente a linguagem recebeu o nome deGreentalk devido agrave marca Oak jaacute ser registrada por outra empresa e o principal projeto daequipe se chamar Green Por fim o nome Java foi o mais votado pela equipe da Sun emuma reuniatildeo para decidir o mais raacutepido possiacutevel um nome definitivo para a linguagem [23]

Em 1995 em sua primeira versatildeo puacuteblica 10 a linguagem Java jaacute comeccedilava a terum crescimento em sua popularidade como Web Applet nos navegadores mais popularesfornecendo seguranccedila e rapidez nas plataformas mais utilizadas [24] A cada nova versatildeopublicada novas funcionalidades e plataformas eram adicionadas e tornavam a linguagemmais difundida no meio computacional fazendo com que em 2006 a linguagem fosse divi-dida em Java EE (foco em rede e serviccedilos web) Java ME (foco em sistemas embarcados)e Java SE (foco em desktops e servidores) [25]

13

Apoacutes anos de evoluccedilatildeo e aprimoramento atraveacutes de diversas versotildees como visto naTabela 31 hoje o Java se tornou uma das linguagens de programaccedilatildeo mais utilizadas nomundo estando em aproximadamente 15 das linhas de coacutedigo disponiacuteveis pela inter-net [11] A quantidade de plataformas suportadas pela linguagem e com o advento dosistema operacional Android sendo rodado na maior parte dos smartphones do mundoaleacutem da simplicidade em codificar no paradigma orientado a objetos foram os fatoresrelevantes para que a linguagem se popularizasse no mundo digital [26]

Tabela 31 As versotildees anteriores de java e principais caracteriacutesticasVersatildeo Principais caracteriacutesticasJava 10 JVM e JDKJava 2 Event Listeners

Kestrel (Java 3) HotSpot JVMMerlin (Java 4) Diversas novas APIs como Assertion e expressotildees regularesTiger (Java 5) Generics

Mustang (Java 6) Web ServicesDolphin (Java 7) Suporte a linguagens dinamicas

32 Princiacutepios

Com o foco em alcanccedilar a Web e participar mais ativamente do mercado virtual e e-Commerce foram projetados princiacutepios que permitissem com que a linguagem pudessealcanccedilar seus objetivos principais ao mesmo tempo que mantinha a facilidade e fami-liarizaccedilatildeo da linguagem a seus desenvolvedores [27] Dessa forma a equipe da Oracledeterminou cinco princiacutepios que caracterizariam o foco da linguagem Java

bull simples orientada a objeto e familiar projetada para ser orientada a objeto epermitir que seus desenvolvedores comecem a codificar rapidamente sem a necessi-dade de uma curva de aprendizagem acentuada

bull segura e robusta projetada para prover software confiaacutevel por meio de checagensa tempo de compilaccedilatildeo e execuccedilatildeo Haacute uma grande preocupaccedilatildeo com seguranccediladevido agrave larga utilizaccedilatildeo da linguagem em sistemas distribuiacutedos

bull de arquitetura neutra e portaacutevel projetada para ser independente de qualquerarquitetura bastando rodar a JVM dessa forma garantindo a portabilidade paravaacuterios ambientes e dispositivos

14

bull executada em alta performance projetada para fornecer a maior performancepossiacutevel em tempo de execuccedilatildeo com a utilizaccedilatildeo do garbage collector em uma threadde baixa prioridade

bull interpretada dinacircmica e threaded projetada para ser interpretada por qual-quer dispositivo que possua JVM desenvolvida garantindo um desenvolvimento raacute-pido e em ciclos O uso da classe Thread permite que a linguagem acompanhe atendecircncia do paralelismo Aleacutem disso a ligaccedilatildeo de classes eacute feita em tempo real esomente quando necessaacuteria tornando-a dinacircmica

33 Evoluccedilatildeo

A primeira versatildeo do Java 8 foi lanccedilada em 2014 [28] e apresentou diversas atualizaccedilotildeesespalhadas em categorias como linguagem seguranccedila Collections ferramentas deployentre outras Dentre a grande quantidade de mudanccedilas os destaques se encontraram nasnovas melhorias presentes na linguagem que afetaram de forma mais direta a maneiracom que os desenvolvedores passaram a tratar e organizar o coacutedigo fonte As atualizaccedilotildeesreferentes a linguagem descritas oficialmente pela Oracle [29] satildeo

1 Lambda Expressions ou apenas Expressotildees Lambda correspondem a uma novacaracteriacutestica que permite que uma pequena funcionalidade possa ser utilizada comoum argumento de um meacutetodo facilitando a escrita de accedilotildees que seratildeo feitas repetida-mente em uma Collection ou quando um processo se completa ou quando encontraum erro Eacute tambeacutem uma forma compacta de se escrever coacutedigo que previamenteera escrito com anonymous inner classes [29] A Listagem 31 mostra uma classehipoteacutetica Calculator cujo meacutetodo operateBinary() recebe como paracircmetro doisinteiros e um objeto da classe IntegerMath que representa a operaccedilatildeo que deveraacuteser realizada ou seja uma funcionalidade dinacircmica

1 pub l i c c l a s s Ca l cu la to r 2

3 i n t e r f a c e IntegerMath 4 i n t opera t i on ( i n t a i n t b) 5 6

7 pub l i c i n t operateBinary ( i n t a i n t b IntegerMath op ) 8 re turn op opera t i on (a b) 9

10

11 pub l i c s t a t i c void main ( St r ing a rgs ) 12

15

13 Calcu la to r myApp = new Ca lcu la to r ( ) 14 IntegerMath add i t i on = (a b) minusgt a + b 15 IntegerMath subt ra c t i on = (a b) minusgt a minus b 16 System out p r i n t l n ( 40 + 2 = +17 myApp operateBinary (40 2 add i t i on ) ) 18 System out p r i n t l n ( 20 minus 10 = +19 myApp operateBinary (20 10 sub t ra c t i on ) ) 20 21 22

Listagem 31 Exemplo de coacutedigo com o uso de Expressatildeo Lambda [30]

2 Method References Frequentemente expressotildees lambda criam meacutetodos anocircni-mos Algumas vezes poreacutem satildeo utilizadas para chamar um meacutetodo jaacute existentena classe Ao inveacutes de escrever a expressatildeo Lambda para esse caso pode-se optarpor utilizar um Method Reference que facilita a escrita e leitura desse uso de ex-pressatildeo Lambda [29] A Listagem 32 mostra um exemplo de um meacutetodo estaacuteticoque compara duas pessoas pelas suas idades e a Listagem 33 a utilizaccedilatildeo de MethodReference para aplicar a utilizaccedilatildeo desse meacutetodo em um array e reduzir a escrita deuma expressatildeo lambda a uma forma mais legiacutevel

1 pub l i c s t a t i c i n t compareByAge ( Person a Person b) 2 re turn a b i r thday compareTo (b b i r thday ) 3 4

Listagem 32 Exemplo de meacutetodo de uma classe Pessoa [31]

1 Arrays s o r t ( rosterAsArray Person compareByAge ) 2

Listagem 33 Exemplo de uso de Method Reference [31]

3 Default Methods satildeo meacutetodos com a palavra-chave default que servem para adi-cionar implementaccedilotildees de meacutetodos a uma interface de alguma biblioteca mantendoa compatibilidade binaacuteria com versotildees mais antigas dessa interface Tambeacutem pos-sibilita a implementaccedilatildeo de meacutetodos estaacuteticos em interfaces [29] A Listagem 34apresenta a inclusatildeo de um meacutetodo default na interface TimeClient

1 pub l i c i n t e r f a c e TimeClient 2 void setTime ( i n t hour i n t minute i n t second ) 3 void setDate ( i n t day i n t month i n t year ) 4 void setDateAndTime ( i n t day i n t month i n t year 5 i n t hour i n t minute i n t second )

16

6 LocalDateTime getLocalDateTime ( ) 7

8 s t a t i c ZoneId getZoneId ( S t r ing zoneStr ing ) 9 t ry

10 re turn ZoneId o f ( zoneStr ing ) 11 catch ( DateTimeException e ) 12 System e r r p r i n t l n ( I n v a l i d time zone + zoneStr ing

+13 us ing d e f a u l t time zone in s t ead ) 14 re turn ZoneId systemDefault ( ) 15 16 17

18 d e f a u l t ZonedDateTime getZonedDateTime ( St r ing zoneStr ing ) 19 re turn ZonedDateTime o f ( getLocalDateTime ( ) getZoneId (

zoneStr ing ) ) 20 21 22

Listagem 34 Exemplo de interface com um meacutetodo default [32]

4 Repeating Annotations permitem a implementaccedilatildeo e utilizaccedilatildeo de anotaccedilotildees deum mesmo tipo que podem ser utilizadas mais de uma vez para a mesma declara-ccedilatildeo [29] A Listagem 35 apresenta duas anotaccedilotildees iguais com paracircmetros diferentespermitindo uma customizaccedilatildeo maior na aplicaccedilatildeo de um tipo de anotaccedilatildeo

1 Schedule ( dayOfMonth= l a s t )2 Schedule (dayOfWeek= Fr i hour= 23 )3 pub l i c void doPeriodicCleanup ( ) 4

Listagem 35 Exemplo de Repeating Annotations [33]

5 Type Annotations permitem que anotaccedilotildees possam ser utilizadas em tipos aleacutemde declaraccedilotildees dessa forma pode-se garantir que um campo sempre atenda agraves suasexpectativas e evite testes desnecessaacuterios [29] A Listagem 36 mostra um exemplo derestriccedilatildeo a uma String que nunca poderaacute ser nula devido agrave anotaccedilatildeo de NonNull

1 NonNull S t r ing s t r

Listagem 36 Exemplo de Type Annotation garantindo que o campo nunca seja null [34]

17

34 Expressotildees Lambda

Uma das mudanccedilas mais interessantes implementadas no Java 8 foi a adiccedilatildeo de expressotildeeslambda As expressotildees lambda permitem que a linguagem Java possa atuar parcialmentecomo uma linguagem de programaccedilatildeo funcional onde comportamentos satildeo avaliados eaplicados diferentemente da programaccedilatildeo imperativa que foca na mudanccedila de estadosNa praacutetica um comportamento pode ser passado como paracircmetro de um meacutetodo atraveacutesde uma escrita mais reduzida e legiacutevel Os benefiacutecios de utilizar expressotildees lambda incluemuma melhora na legibilidade e organizaccedilatildeo de coacutedigo que antes era escrito com AnonymousInner Class aleacutem de permitir uma forma simples de utilizar comportamento paralelo como uso de Streams

341 Sintaxe

A sintaxe de uma expressatildeo lambda eacute dividida nas seguintes partes [30]

bull Uma lista de paracircmetros separados por viacutergulas

bull Um token representado por uma seta -gt

bull Um corpo que pode ser representado por uma expressatildeo uacutenica ou um bloco de coacutedigodentro de chaves

As Listagens 37 e 38 mostram duas formas diferentes de se aplicar expressotildees Lambdacom uma sintaxe similar A primeira aplica a expressatildeo diretamente apoacutes a seta utilizadanormalmente para trechos de coacutedigo pequenos e simples e a segunda utiliza-se de chavespara incorporar o coacutedigo e da palavra-chave return para especificar o retorno forma maisutilizada para uma quantidade maior de coacutedigo

1 p minusgt p getGender ( ) == Person Sex MALE2 ampamp p getAge ( ) gt= 183 ampamp p getAge ( ) lt= 25

Listagem 37 Exemplo de expressatildeo lambda com uma expressatildeo [30]

1 p minusgt 2 re turn p getGender ( ) == Person Sex MALE3 ampamp p getAge ( ) gt= 184 ampamp p getAge ( ) lt= 25 5

Listagem 38 Exemplo de expressatildeo lambda com um bloco de coacutedigo [30]

18

342 Principais formas de uso

Anonymous Inner Class

Antes do Java 8 a necessidade de passar funccedilotildees ou expressotildees como paracircmetro de algummeacutetodo era suprida atraveacutes de Anonymous Inner Classes A utilizaccedilatildeo desse tipo dedeclaraccedilatildeo junto com a anotaccedilatildeo de Override permite sobrescrever um meacutetodo de umainterface funcional e ao mesmo tempo passa-la como argumento para um meacutetodo Umaexpressatildeo lambda se comporta da mesma forma poreacutem a quantidade de coacutedigo escritopela Anonymous Inner Class eacute maior e pode dificultar a leitura de coacutedigo pois conteacutemmuita informaccedilatildeo natildeo utilizada para efetivo entendimento do que estaacute sendo feito naqueletrecho

A Listagem 39 apresenta a instanciaccedilatildeo da classe EventHandler internamente ao meacute-todo setOnAction() de forma que o desenvolvedor possa escrever o comportamento quedeseja passar como paracircmetro do meacutetodo atraveacutes da substituiccedilatildeo do meacutetodo handle()que jaacute existe pelo meacutetodo handle() criado e escrito pelo desenvolvedor

1 btn setOnAction (new EventHandlerltActionEvent gt() 2 Override3 pub l i c void handle ( ActionEvent event ) 4 System out p r i n t l n ( He l lo World ) 5 6 )

Listagem 39 Exemplo de uso de Anonymous Inner Class [35]

Interface funcional

Ao projetar um coacutedigo novo o desenvolvedor que optar por utilizar expressotildees lambdadeve iniciar com a criaccedilatildeo de uma interface funcional Esse tipo de interface possui umuacutenico meacutetodo abstrato permitindo que expressotildees lambda sejam usadas para sobrescrevero comportamento do meacutetodo abstrato Uma interface funcional pode possuir outros meacuteto-dos desde que sejam default Uma nova anotaccedilatildeo FunctionalInterface foi adicionadacom a atualizaccedilatildeo do Java 8 para conferir em tempo de compilaccedilatildeo se a interface satisfazos requisitos desse modelo de interface

A Listagem 310 apresenta um exemplo de interface funcional com o objetivo de permi-tir o uso de expressotildees lambda que utilizaratildeo de dois Double como paracircmetro e jaacute utilizada nova anotaccedilatildeo FunctionalInterface introduzida no Java 8

1 Funct iona l Inte r face2 pub l i c i n t e r f a c e DoubleOp 3 pub l i c Double apply ( Double a Double b)

19

4

Listagem 310 Exemplo de interface funcional

Dessa forma conforme as Listagens 311 e 312 o meacutetodo apply() pode tomar formade qualquer operaccedilatildeo entre dois Double que seraacute especificada quando a expressatildeo lambdafor montada dando o aspecto de linguagem funcional agrave linguagem e mais facilidade eliberdade ao desenvolvedor

1 pub l i c c l a s s Ca l cu la to r 2 pub l i c s t a t i c Double c a l c ( Double op1 Double op2 DoubleOp operator ) 3 re turn operator apply ( op1 op2 ) 4 5

Listagem 311 Exemplo de aplicaccedilatildeo da interface funcional

1 Double r e s u l t 1 = Ca lcu la to r c a l c (10d 50d ( a b ) minusgt a + b)

Listagem 312 Uso de expressatildeo lambda para o exemplo anterior

Collections

Dentre as atualizaccedilotildees de pacotes do Java 8 foi adicionado um meacutetodo stream() nainterface Collection Esse meacutetodo trata as Collection como streams o que significa queapesar de natildeo ser possiacutevel acessar elementos diretamente algumas novas manipulaccedilotildeessatildeo possiacuteveis Essas manipulaccedilotildees satildeo na verdade meacutetodos da interface Stream quepodem receber como paracircmetro uma expressatildeo lambda ou seja um comportamento a seraplicado agrave Collection Dentre os meacutetodos temos

bull filter() O meacutetodo filter() recebe uma expressatildeo lambda contendo uma condiccedilatildeopara filtragem da collection

bull map() O meacutetodo map() mapeia os elementos de uma Collection em outro objetocomo uma String A expressatildeo lambda passada por paracircmetro deve retornar o tipode objeto ao qual seraacute mapeado

bull forEach() O meacutetodo forEach() aplica uma operaccedilatildeo especiacutefica para cada ele-mento da Collection A expressatildeo lambda a ser passada deve conter a operaccedilatildeo aser realizada

bull min() e max() Os meacutetodos min() e max() retornam o elemento menor ou maiorda Collection dependendo da expressatildeo lambda passada como paracircmetro

20

A Listagem 313 demonstra como vaacuterias operaccedilotildees com uma Collection podem seraplicadas de uma vez de forma que lendo a expressatildeo lambda jaacute eacute possiacutevel saber oresultado da aplicaccedilatildeo do meacutetodo agrave Collection

1 r o s t e r2 stream ( )3 f i l t e r (4 p minusgt p getGender ( ) == Person Sex MALE5 ampamp p getAge ( ) gt= 186 ampamp p getAge ( ) lt= 25)7 map(p minusgt p getEmailAddress ( ) )8 forEach ( emai l minusgt System out p r i n t l n ( emai l ) )

Listagem 313 Exemplo de utilizaccedilatildeo de meacutetodos de stream com expressotildees lambda [30]

21

Capiacutetulo 4

Estudo e o Processo de Mineraccedilatildeo

A definiccedilatildeo da metodologia utilizada para realizaccedilatildeo deste trabalho eacute importante para queexista uma padronizaccedilatildeo e melhor entendimento de como os resultados foram obtidos paraque a replicaccedilatildeo do mesmo possa ser realizada em trabalhos futuros [36]

Figura 41 Processo utilizado para realizaccedilatildeo do estudo

O esquema representado na Figura 41 descreve o processo seguido para a realizaccedilatildeodeste trabalho que foi divido em trecircs grandes etapas a de planejamento definindo osobjetivos questotildees de pesquisa e meios de investigaccedilatildeo deste projeto a etapa de execuccedilatildeorealizando todo o procedimento metodoloacutegico definido para a coleta e refinamento de

22

dados e a etapa de avaliaccedilatildeo onde foram classificados e avaliados os dados coletadospara responder agraves questotildees de pesquisa

A seguir na primeira seccedilatildeo seratildeo apresentadas em detalhes as questotildees de pesquisa aserem respondidas Em seguida seraacute feito uma breve descriccedilatildeo da fonte de dados utilizada- especificamente os projetos utilizados como objetos de estudo deste trabalho e por fimtodo o restante da metodologia que foi de fato desenvolvida para obter os resultadosnecessaacuterios

41 Questotildees de Pesquisa

Com o objetivo de entender e caracterizar melhor o uso de expressotildees lambda foramdefinidas as seguintes questotildees de pesquisa a serem respondidas

bull PQ-1 Quando os projetos comeccedilaram a introduzir o uso de expressotildees lambda emseus coacutedigos e qual a meacutedia de expressotildees lambda por snapshots caso existam

bull PQ-2 Como as equipes de desenvolvimento estatildeo utilizando expressotildees lambdaatraveacutes de refatoraccedilatildeo de coacutedigo ou introduzindo apenas em coacutedigo novo

bull PQ-3 Quais satildeo os padrotildees tipicamente adotados para o uso de expressotildees lambda

A primeira pergunta de pesquisa gira em torno de como projetos populares open-sourceestatildeo se adaptando agrave introduccedilatildeo de expressotildees lambda em Java muitos projetos jaacute estatildeoutilizando as expressotildees lambda Se sim a partir de quando comeccedilaram a utilizaacute-lasdesde o iniacutecio da introduccedilatildeo das mesmas no Java 8 ou em um periacuteodo mais tardio Aleacutemdisso eacute interessante descobrir se a utilizaccedilatildeo dessa nova caracteriacutestica tem acontecido deforma expressiva ou natildeo

Em seguida para melhor entender a forma como as expressotildees lambda estatildeo sendointroduzidas em projetos eacute interessante investigar se as equipes de desenvolvimento estatildeose preocupando em refatorar coacutedigo com o objetivo de evoluir o software ou se estatildeoexperimentando utilizar expressotildees lambda apenas em coacutedigo novo introduzido

Como a introduccedilatildeo de novas funcionalidades em projetos open-source de grande escaladepende do objetivo do projeto e os padrotildees de projeto utilizados [37] espera-se obser-var diversas abordagens quanto a utilizaccedilatildeo de expressotildees lambda para entatildeo poderclassificar estes softwares quanto a abordagem utilizada

Eacute de grande importacircncia para este estudo conseguir identificar na praacutetica comoexpressotildees lambda estatildeo sendo tipicamente adotadas nestes projetos Assim a terceirapergunta de pesquisa busca identificar alguns exemplos de utilizaccedilatildeo atraveacutes da realizaccedilatildeode alguns estudos de caso

23

Eacute importante ressaltar que apesar de as expressotildees lambda serem uma alternativa aouso de AIC elas natildeo os substituem completamente Existem precondiccedilotildees para que umaAIC possa ser substituiacuteda por expressotildees lambda [12] descritas a seguir

bull AIC deve instanciar-se de uma interface

bull AIC natildeo deve possuir nenhum campo e declarar apenas um meacutetodo

bull AIC natildeo deve possuir uma referecircncia para this ou super

bull AIC natildeo deve declarar um meacutetodo recursivo

Para responder agrave primeira pergunta apenas dados gerais sobre todos os projetos seratildeonecessaacuterios ao passo que pelas perguntas 2 e 3 possuiacuterem uma natureza mais complexaseraacute necessaacuterio aleacutem de uma anaacutelise geral estatiacutestica a realizaccedilatildeo de alguns estudos decaso para obter resultados mais completos

42 Fonte de Dados e Objetos de Estudo

Para responder agraves perguntas de pesquisa estabelecidas foram selecionados os 99 projetosmais populares na linguagem Java dentro da plataforma github ateacute a data da coleta dosdados feita em Abril de 2017 Satildeo considerados populares os repositoacuterios que possuema maior quantidade possiacutevel de estrelas (stars) A decisatildeo de escolher os 99 projetos maispopulares foi por sua natureza imparcial e ao mesmo tempo para que se possa analisarprojetos que satildeo de familiaridade e conhecimento da comunidade do github e de domiacuteniopuacuteblico Os 99 projetos estatildeo listados no Anexo I

Para entender a transiccedilatildeo feita por esses projetos entre as versotildees anteriores do Java eo Java 8 com as expressotildees lambda eacute necessaacuterio analisar o coacutedigo de vaacuterias versotildees a fimde observar alguma mudanccedila para cada projeto Como satildeo 99 projetos e vaacuterios dessesprojetos possuem milhares de linhas de coacutedigo e commits seria impossiacutevel avaliar todosos commits Optou-se entatildeo por coletar snapshots mensais de cada projeto conformeprocedimento tambeacutem seguido anteriormente [38] Cada snapshots representa o estadodo projeto em um determinado mecircs e como criteacuterio de escolha padratildeo todos os snapshotsequivalem ao uacuteltimo commit realizado no determinado mecircs que este representa

O proacuteximo passo eacute determinar o periacuteodo de tempo em que esses snapshots seriamcoletados Como Java 8 (e consequentemente as expressotildees lambda) foi introduzidoapenas em meados de 2014 [28] coletar dados de projetos a partir de um periacuteodo muitoantes deste ano natildeo agregaria valor ao estudo em questatildeo Definiu-se entatildeo um periacuteodopara a coleta mensal desses snapshots atraveacutes dos anos Janeiro de 2013 um ano antesda introduccedilatildeo do Java 8 para que se pudesse identificar para todos os projetos o mecircs

24

exato em que expressotildees lambda foram introduzidas ateacute o mecircs da coleta de dados Abrilde 2017

Eacute importante ressaltar que a definiccedilatildeo dos meses foi definida do dia primeiro de ummecircs ao dia primeiro do proacuteximo mecircs e por consequecircncia alguns snapshots que deveriamrepresentar o final de determinado mecircs correspondem na verdade a commits realizadosno dia primeiro do mecircs seguinte Por exemplo pode existir casos em que o commit querepresente o mecircs de Marccedilo de 2016 seja na verdade o commit realizado no dia primeirode Abril de 2016 Isso se deve a natureza da forma como os resultados de log de commitssatildeo obtidos pelo git [39] Poreacutem isso natildeo interfere nas anaacutelises ou no propoacutesito destetrabalho uma vez que foram realizadas verificaccedilotildees e validaccedilotildees para que natildeo existamdatas repetidas (e consequentemente commits repetidos) por repositoacuterio

Neste trabalho o termo projeto e repositoacuterio foram utilizados de forma intercaladapara representar a mesma coisa o software desenvolvido que possui um repositoacuterio naplataforma github Os termos commit snapshops e versotildees tambeacutem representam a mesmacoisa uma vez que foi definido que seriam utilizados apenas um commit por mecircs pararepresentar um determinado snapshot ou versatildeo do repositoacuterio em questatildeo

Todos os 99 projetos seratildeo utilizados para a realizaccedilatildeo de uma anaacutelise geral de ca-racterizaccedilatildeo do uso de expressotildees lambda Para as anaacutelises aprofundadas foi feito umcriteacuterio de classificaccedilatildeo para que apenas alguns projetos possam ser analisados em niacutevelde coacutedigo como estudos de caso

Resumindo foram escolhidos os 99 projetos mais populares de Java no github cole-tando dados mensais de seus commits a partir do ano de 2013 ateacute a data da coleta dosdados lembrando que nem todos os projetos existem desde 2013 (projetos mais recentes)

43 Processo de Mineraccedilatildeo

A abordagem utilizada para coletar e analisar os 99 projetos escolhidos como mostra aFigura 42 foi realizada de forma automatizada utilizando scripts python e dois projetosdesenvolvidos em Java para a coleta e tratamento de dados como descrito a seguir

Primeiramente foi realizado uma coacutepia dos repositoacuterios atuais de todos os 99 projetosmais populares do github em Java Para automatizar o processo foi desenvolvido umscript em python que lista todos os projetos escolhidos clona todos os repositoacuterios emuma pasta na maacutequina local e cria um arquivo temporaacuterio com as informaccedilotildees do nomede cada repositoacuterio e seu caminho absoluto na maacutequina local

25

Figura 42 Metodologia implementada para coleta e tratamento de dados

Em seguida foi necessaacuterio realizar o checkout de todas as versotildees entre Janeiro de2013 a Abril de 2017 de cada projeto Por motivos de otimizaccedilatildeo de espaccedilo da maacutequinalocal e automatizaccedilatildeo no processo de checkout utilizou-se de um segundo script pythonque realizava as seguintes tarefas para cada mecircs em cada projeto verificar se dentreo mecircs estipulado houve algum commit para aquele projeto se sim pega-se o hash douacuteltimo commit do mecircs realiza o checkout conta-se a quantidade de linhas de coacutedigo emJava que o projeto tem utilizando a biblioteca cloc e armazena todas as informaccedilotildeespertinentes referentes a todos os projetos que naquele mecircs tiveram commits para que oprojeto static-analysis possa entatildeo ser executado sobre esses projetos naquele determinadomomento As informaccedilotildees coletadas que satildeo utilizadas pelo static-analysis correspondemao nome do projeto o hash do commit para aquela versatildeo a pasta onde o projeto estaacutearmazenado na maacutequina local a quantidade de linhas de coacutedigo Java do projeto e datareferente ao commit Essas informaccedilotildees satildeo pertinentes para que o projeto static-analysisconsiga funcionar de forma correta projeto este descrito em detalhes a seguir

431 static-analysis

O static-analysis foi um projeto desenvolvido anteriormente a este trabalho pelos alunosThiago Cavalcanti e Vinicius de Almeida cujo objetivo eacute realizar a anaacutelise estaacutetica de

26

coacutedigos-fonte Java e gerar arquivos de saiacuteda contendo informaccedilotildees de classes e meacutetodoscom suas devidas ocorrecircncias de caracteriacutesticas da linguagem [40]

A anaacutelise estaacutetica de coacutedigo consiste em analisar um coacutedigo-fonte sem a necessidadede executaacute-lo Esse tipo de anaacutelise eacute de extrema importacircncia para manter um coacutedigo dequalidade evitar futuras refatoraccedilotildees e obter informaccedilotildees estatiacutesticas de forma raacutepida epraacutetica [41]

Seguindo esse princiacutepio o static-analysis foi projetado para receber um arquivo deentrada csv seguindo o padratildeo

Tipo da Aplicaccedilatildeo Inicio do projeto Antes ou Apoacutes Java 5 Nome do ProjetoVersatildeo Caminho absolutoQuantidade de linhas de coacutedigo

Atraveacutes da informaccedilatildeo do caminho absoluto do projeto o static-analysis varre osdiretoacuterios em busca dos arquivos fonte java realiza o parse desses arquivos e utilizade Visitors para extrair as informaccedilotildees desejadas e exporta-las em arquivos csv Ouso de Visitors permite que sejam escolhidas as informaccedilotildees desejadas para a consultacomo expressotildees Lambda e AIC s aleacutem de possibilitar que sejam implementados novosVisitors conforme a linguagem evolua ou as necessidades mudem

Para este trabalho foram utilizados os Visitors de expressotildees Lambda map() filter()AICs e declaraccedilotildees de meacutetodos

432 BDAnalisador

Apoacutes obter todas as informaccedilotildees necessaacuterias geradas pelo static-analysis era preciso ma-nipular os dados de forma que facilitasse a coleta de dados para o estudo proposto Comovaacuterios arquivos em formato csv satildeo de difiacutecil manipulaccedilatildeo foi desenvolvido entatildeo umaferramenta chamada BDAnalisador Esta ferramenta eacute responsaacutevel por processar os arqui-vos em csv gerados pelo static-analysis e popular uma base de dados relacional MySQLcom as informaccedilotildees pertinentes a este estudo

O BDAnalisador foi desenvolvido com a intenccedilatildeo de tornar mais simples o trabalhocom os dados resultantes do static-analysis de forma que consultas em SQL pudessemser feitas a ponto de permitir a obtenccedilatildeo de resultados mais complexos Seguindo esseobjetivo o framework Hibernate foi escolhido como ferramenta para persistecircncia devidoa ser um framework jaacute consolidado no mercado e que de forma simples relaciona osobjetos Java ao banco de dados MySQL [42] A divisatildeo de classes foi projetada em quatroentidades Projeto Versao Classe e Metodo cada uma com seus respectivos camposcontendo as informaccedilotildees necessaacuterias para a pesquisa como pode ser visto na Figura 44Eacute importante ressaltar que a tabela de Versao guarda hashs de commits devido agrave escolhade utilizar commits para obter mais informaccedilatildeo de evoluccedilatildeo de coacutedigo em um menor

27

espaccedilo de tempo Aleacutem disso para este trabalho optou-se por persistir todos os meacutetodose classes de cada versatildeo sem se importar com a repeticcedilatildeo desses dados pois a hipoacutetesede haver grandes refatoraccedilotildees entre versotildees poderia comprometer a confiabilidade dasinformaccedilotildees

Figura 43 Diagrama de classes UML do BDAnalisador

Como visto na Figura 43 seguindo parcialmente a arquitetura MVC cada entidadepossui sua respectiva classe DAO(Data Access Object) para persistecircncia dos dados eapenas uma classe Controlador no projeto responsaacutevel pela manipulaccedilatildeo e parse dosdados dos arquivos csv gerados pelo static analysis para serem enviados agraves classes DAOO sistema inicia chamando o meacutetodo inicializar() da classe Controlador Esse meacutetodoeacute responsaacutevel por ler um arquivo de entrada csv que segue o mesmo modelo do arquivo dostatic-analysis citado na seccedilatildeo anterior O arquivo conteacutem os dados de todos os projetose suas respectivas versotildees dessa forma o meacutetodo instancia um objeto da classe Projetoe persiste o projeto no banco de dados Para cada versatildeo encontrada no arquivo deentrada o inicializar() aciona os meacutetodos responsaacuteveis por instanciar e preencher aslistas da classe Classe e Metodo Os meacutetodos responsaacuteveis por preencher as listas varremos arquivos csv gerados pelo static-analysis e fazem o parse das informaccedilotildees relevantescomo nomes dos meacutetodos e quantidades de lambdas para construir os objetos que seratildeogravados Ao final dos preenchimentos o objeto Versatildeo eacute instanciado e gravado no bancode dados atraveacutes de sua classe DAO ao mesmo tempo que grava suas respectivas Classese Metodos

28

Apoacutes vaacuterios testes e correccedilotildees de bugs o banco de dados se encontrava finalmente comas informaccedilotildees de 99 projetos Java open-source separados por um commit por mecircs desde2013 cada um com suas respectivas informaccedilotildees de classes meacutetodos e a quantidade deexpressotildees lambda filters e maps em cada meacutetodo Filter ou Filter pattern eacute o padratildeode projeto que tem como objetivo filtrar objetos de uma coleccedilatildeo (Collection) de acordocom algum criteacuterio Jaacute o map ou map pattern eacute um padratildeo que ldquomapeia os elementosde uma coleccedilatildeo aplicando uma funccedilatildeo a eles para uma nova coleccedilatildeo [43] A coleta deinformaccedilotildees sobre esses padrotildees podem ser uacuteteis para possiacuteveis anaacutelises de oportunidadesde uso de expressotildees lambda para refatoraccedilatildeo de coacutedigo

A Figura 44 mostra o esquema de como o banco de dados resultante foi gerado

Figura 44 Modelo relacional do banco de dados populado pelo BDAnalisador Imagemgerada com software DBeaver [2]

44 Classificaccedilatildeo e Anaacutelise

Com o banco de dados populado restam apenas as etapas de classificaccedilatildeo e anaacutelise pararesponder as questotildees de pesquisa propostas Para isso inicialmente houve uma tentativade se utilizar apenas queries SQL para analisar os dados de acordo com as informaccedilotildeesrelevantes Poreacutem devido ao fato de o banco de dados conter todas as informaccedilotildees detodos os projetos e todas as suas versotildees queries que possuem uma alta complexidadedemoravam muito tempo para retornar os dados

Assim com o objetivo de facilitar o trabalho alguns scripts python foram desenvolvi-dos para rodar as queries separadamente e individualmente para cada projeto de formaautomatizada a fim de melhorar o tempo de resposta para obtenccedilatildeo dos resultados

29

441 Meacutedia de Lambda

O primeiro script retorna a quantidade de expressotildees lambda (ou AICs) por n snapshotsque contenha expressotildees lambda O objetivo eacute ter uma visatildeo geral da meacutedia de expressotildeeslambda e AICs utilizadas por cada projeto e como nem todos os snapshots coletados decada projeto possuem expressotildees lambda e AICs apenas aqueles com alguma expressatildeolambda ou AIC satildeo incluiacutedos no caacutelculo da meacutedia

Mmedia =sumn qtdLambdai

n

442 Anaacutelise Temporal

O segundo script retorna para cada projeto a soma total da quantidade de expressotildeeslambda AIC map() e filter() no projeto inteiro para cada versatildeo Ou seja tem-seo total de cada uma das quatro propriedades selecionadas para cada mecircs do projetoobtendo assim uma visatildeo temporal de evoluccedilatildeo do uso das caracteriacutesticas descritas ATabela 41 ilustra parcialmente o resultado obtido para o projeto agera onde idVersaoeacute o identificador no banco de dados referente ao hash do commit mensal coletado qtd eacutea quantidade de cada uma das caracteriacutesticas escolhidas e a data do commit encontra-seno formato americano

Tabela 41 Informaccedilotildees mensais sobre o projeto ageraidVersao Data do Commit qtd lambda qtd AIC qtd maps qtd filter

823 512016 0 29 4 0755 612016 13 28 4 0686 6152016 13 29 4 0621 812016 13 29 4 0555 8162016 13 30 4 0485 922016 13 30 4 0422 10132016 14 30 4 0356 11282016 14 30 4 0295 12212016 21 30 5 0232 212017 21 30 5 0175 312017 21 30 5 0112 3312017 21 36 5 048 4242017 21 48 5 0

Os resultados obtidos com esta anaacutelise temporal permitiu a identificaccedilatildeo de padrotildees nautilizaccedilatildeo de expressotildees lambda em relaccedilatildeo a utilizaccedilatildeo de AIC por todos os projetos Foi

30

possiacutevel classificar todos os projetos em 6 grupos ilustrado na Figura 45 Primeiramenteseparou-se os projetos entre os que possuem expressotildees lambda e os que natildeo possuemDentre os que possuem identificou-se cinco categorias

1 Grupo 1 Quantidade de AICs e expressotildees lambda aumentam com o tempo pro-porcionalmente

2 Grupo 2 Quantidade de AICs diminui agrave medida que a quantidade de expressotildeeslambda aumentam e a quantidade de expressotildees lambda ultrapassa a quantidade deAIC em um determinado momento

3 Grupo 3 Quantidade de AICs diminui agrave medida que a quantidade de expressotildeeslambda aumentam mas a quantidade de AIC permanece superior agrave quantidade delambda

4 Grupo 4 Expressotildees lambda satildeo introduzidas e existem por um pequeno periacuteodode tempo mas satildeo completamente removidas posteriormente

5 Grupo 5 Quantidade de expressotildees lambda eacute constante e muito inferior compa-rado com a quantidade de AICs no projeto Foi determinado que para pertencera esta classificaccedilatildeo o projeto precisa ter uma razatildeo de meacutedia de expressotildees lamb-dasnapshot por meacutedia de AICsnapshot inferior a 020 Esse paracircmetro foi esta-belecido com o objetivo de definir um padratildeo para o que pode ser considerado umprojeto com poucas expressotildees lambda

Figura 45 Classificaccedilatildeo dos projetos

31

443 Refatoraccedilatildeo de Coacutedigo

O uacuteltimo script teve como objetivo realizar uma tentativa inicial de identificar refatoraccedilatildeode coacutedigo da seguinte maneira para todos os projetos que possuem expressotildees lambdaforam identificados o mecircs imediatamente antes da introduccedilatildeo de expressotildees lambda e omecircs seguinte onde houve a primeira ocorrecircncia de lambda no projeto Assim realizou-se uma anaacutelise do tamanho em quantidade de linhas de coacutedigo de todos os meacutetodosdo projeto que no mecircs seguinte tiveram introduccedilatildeo de lambda Em seguida fez-se umacomparaccedilatildeo com os mesmos meacutetodos em relaccedilatildeo ao mecircs anterior e assim foi possiacuteveldetectar quais meacutetodos tiveram a quantidade de linhas de coacutedigo reduzidas o que seriaum indicativo natildeo necessariamente exclusivo de que uma refatoraccedilatildeo de coacutedigo possa terocorrido

Sabe-se que este meacutetodo de detecccedilatildeo de refatoraccedilatildeo de coacutedigo possui suas limitaccedilotildeesuma vez que as comparaccedilotildees para saber se um meacutetodo existe em ambas versotildees eacute feitopuramente por comparaccedilatildeo de String (nome do meacutetodo) e a classe que este pertence

444 Casos de Uso

Os meacutetodos descritos acima ajudaram a identificar alguns padrotildees e facilitar a anaacutelise dosdados Poreacutem natildeo satildeo suficientes para que se possa responder agraves questotildees de pesquisaDessa forma apoacutes a identificaccedilatildeo dos grupos de classificaccedilatildeo para os projetos foramescolhidos um projeto de cada grupo (com exceccedilatildeo do grupo dos projetos sem expressotildeeslambda) para realizar um breve estudo de caso com o objetivo de identificar e caracterizarmelhor a adoccedilatildeo de expressotildees lambda Os projetos escolhidos foram agera vertxAndroid-CleanArchitecture RxJava e guava

32

Capiacutetulo 5

Resultados Obtidos e Anaacutelise

Neste capiacutetulo seratildeo apresentados os dados obtidos e anaacutelise com o objetivo de responderagraves questotildees de pesquisa propostas Como mencionado anteriormente as perguntas seratildeorespondidas de duas maneiras algumas com informaccedilotildees gerais sobre todos os projetose outras com breve estudos de caso envolvendo cinco projetos

51 Visatildeo Geral

Dentre os repositoacuterios coletados para a anaacutelise 74 (7474) natildeo utilizaram nenhumaexpressatildeo lambda no projeto durante todo o periacuteodo analisado (Janeiro de 2013 a Abrilde 2017) restando apenas 25 repositoacuterios (2525) com expressotildees lambda Eacute interessantedestacar que apesar de a quantidade de repositoacuterios que natildeo possuem expressotildees lambdaser relativamente expressiva muitos destes repositoacuterios satildeo de projetos em Java que umdia foram populares e atualmente natildeo estatildeo sendo mais desenvolvidos (por exemplo umaplicativo que soacute funciona para Android 23 atualmente descontinuado)

Levando em consideraccedilatildeo apenas os projetos que possuem expressotildees lambda exis-tem dois tipos de dados que podem ser analisados para responder agrave primeira questatildeo depesquisa atraveacutes dos dados obtidos pelo meacutetodo anteriormente mencionado como anaacutelisetemporal e a meacutedia de lambda por snapshot mencionados no capiacutetulo anterior

Com relaccedilatildeo ao ano em que a primeira ocorrecircncia foi encontrada 6 projetos introduzi-ram expressotildees lambda jaacute em 2014 8 comeccedilaram a utilizar em 2015 7 em 2016 e apenas4 tiveram a primeira ocorrecircncia de expressotildees lambda em 2017 Dessa forma percebe-seque os projetos estatildeo relativamente bem distribuiacutedos em grupos quanto ao ano em que seintroduziu expressotildees lambda

Pela meacutedia de lambda por snapshot (lambdasnapshot) a maioria (11 projetos) possuiuma quantidade expressiva acima de 100 lambdasnapshot (com 6 projetos entre 20 e 100lambdasnapshot e 8 projetos com menos de 20 lambdasnapshot) como apresentados no

33

graacutefico da Figura 51 Isso mostra que essa nova caracteriacutestica jaacute estaacute sendo bem utilizadanos projetos que comeccedilaram a migrar para a nova versatildeo do Java

Figura 51 Graacuteficos dos projetos separados por ano de introduccedilatildeo de expressotildees lambdae meacutedia de lambda por snapshot

Com isso pode-se observar que apesar de a quantidade de projetos que possuemexpressotildees lambda natildeo ser tatildeo alta eacute possiacutevel obter resultados expressivos uma vez quea quantidade dos projetos com lambda estatildeo bem dispersos quanto ao periacuteodo em quecomeccedilaram a adotar essa caracteriacutestica e a quantidade de expressotildees lambda por snapshot

511 Projetos Selecionados

Atraveacutes dos grupos de classificaccedilatildeo identificados pela anaacutelise temporal descritos na Figura45 cinco projetos foram selecionados para uma anaacutelise detalhada levando em consideraccedilatildeoo grupo em que eles pertencem Estes projetos seratildeo apresentados a seguir

512 agera

Agera eacute uma biblioteca Android que ajuda a introduzir programaccedilatildeo funcional reativa(functional reactive programming) em projetos Android Eacute um projeto recente lanccediladoem 2016 pela Google [44] e encontra-se no grupo dos projetos que introduziram expressotildeeslambda em 2016 no mesmo ano de seu lanccedilamento contendo uma meacutedia de expressotildeeslambda de 16 lambdasnapshot

Na classificaccedilatildeo estabelecida agera pertence ao Grupo 1 onde a quantidade de ex-pressotildees lambda no projeto com o tempo aumentam juntamente com a quantidade deAICs como mostra o graacutefico de anaacutelise temporal na Figura 52

34

Figura 52 Graacuteficos de anaacutelise temporal do projeto agera

513 vertx

Eclipse Vertx eacute um conjunto de ferramentas para criaccedilatildeo de reactive applications namaacutequina virtual Java (JVM) em grande escala [45] Seu primeiro lanccedilamento aconteceuem 2011 e a primeira ocorrecircncia de expressotildees lambda no projeto aconteceu em 2014 Esteprojeto possui uma meacutedia de 2867 lambdasnapshot e dentre os projetos consideradosneste trabalho eacute o que possui a maior quantidade de expressotildees lambda

Este projeto pertence ao Grupo 2 onde a quantidade de expressotildees lambda aumen-tou consideravelmente pelos meses ultrapassando a quantidade de AICs que diminuiudrasticamente como mostra a Figura 53

35

Figura 53 Graacuteficos de anaacutelise temporal do projeto Vertx

514 Android-CleanArchitecture

Apesar de ser uma amostra de projeto Android-CleanArchitecture que tem como objetivoconstruir aplicaccedilotildees Android utilizando clean architecture foi lanccedilado em 2014 mas semanteacutem sempre atualizado [46]

A introduccedilatildeo de expressotildees lambda que aconteceu no ano de 2015 se deu de formatiacutemida com uma meacutedia de 35 lambdasnapshot De qualquer forma este projeto conseguerepresentar com seu graacutefico de anaacutelise temporal o grupo 3 composto por projetos em quea quantidade de expressotildees lambda aumentou mas sem ultrapassar AICs que diminuiacuteramdemonstrado no graacutefico da Figura 54

36

Figura 54 Graacuteficos de anaacutelise temporal do projeto Android-CleanArchitecture

515 RxJava

Dentre os repositoacuterios estudados RxJava eacute considerado o mais popular Como umaimplementaccedilatildeo de Reactive Extensions para a JVM RxJava teve seu lanccedilamento dadoem 2013 [47] Expressotildees lambda apareceram pela primeira vez no ano de 2015 comuma meacutedia de 766 lambdasnapshot

Apesar de uma meacutedia relativamente alta o tempo de vida das expressotildees lambda nesteprojeto foi bem curto caracterizando assim projetos do grupo 4 houve a introduccedilatildeo dasexpressotildees lambda no projeto poreacutem houve a remoccedilatildeo completa de todas as expressotildeeslambda previamente introduzidas desaparecendo completamente do projeto ateacute a datada coleta de dados (Figura 55)

37

Figura 55 Graacuteficos de anaacutelise temporal do projeto RxJava

516 guava

Guava eacute um conjunto de bibliotecas para Java da Google lanccedilado em 2011 A atualizaccedilatildeodo coacutedigo do projeto para Java 8 aconteceu somente em 2016 e apesar do projeto conteruma meacutedia de 281 lambdasnapshot ele foi escolhido como representante dos projetosdo Grupo 5 (Figura 56) que possuem expressotildees lambda mas de forma natildeo expressiva osuficiente quando comparado com a quantidade de AIC pelo fato de sua razatildeo de meacutedia delambdasnapshot por meacutedia de AICsnapshot ser 004 Ou seja embora o projeto tenhaexpressotildees lambda estas satildeo consideradas muito poucas quando inseridas no contextogeral deste projeto que eacute considerado um projeto grande

38

Figura 56 Graacuteficos de anaacutelise temporal do projeto Guava

52 Refatoraccedilatildeo de Coacutedigo

Com o objetivo de caracterizar melhor como as expressotildees lambda estatildeo sendo utilizadaseacute interessante identificar se estas estatildeo sendo introduzidas atraveacutes de refatoraccedilatildeo de coacutedigoou em coacutedigo novo

Os projetos classificados como pertencentes ao Grupo 2 possuem em comum o fatode expressotildees lambda aumentarem a medida que AICs diminuem ultrapassando-as eessa caracteriacutestica em comum pode indicar que nestes projetos possivelmente houve re-fatoraccedilatildeo de coacutedigo visto que AIC sendo substituiacutedo por expressotildees lambda dentro dascondiccedilotildees determinadas eacute a maneira mais comum de se identificar refatoraccedilatildeo de coacute-digo para introduccedilatildeo de expressotildees lambda [12] Os projetos que compotildeem o grupo 2representam 44 de todos os projetos estudados que possuem expressotildees lambda o quepode ser um indicativo caso a hipoacutetese de refatoraccedilatildeo de coacutedigo seja positiva de quemuitos projetos que estatildeo adotando o Java 8 estatildeo se preocupando de alguma formacom refatoraccedilatildeo se coacutedigo Fazem parte desse grupo os seguintes projetos elasticsearchjava-design-patterns PocketHub presto RxJava-Android-Samples spark vertx zipkinjava8-tutorial dropwizard e material-dialogs

39

Outra maneira de verificar possiacuteveis indicadores de refatoraccedilatildeo de coacutedigo foi atraveacutesda anaacutelise dos tamanhos (em quantidade de linhas de coacutedigo) dos meacutetodos com expressotildeeslambda no mecircs em que se introduziu expressotildees lambda e um mecircs imediatamente antesdeste Essa anaacutelise mostra que dos 25 projetos com expressotildees lambda 12 (48) projetostiveram ao menos um meacutetodo em que houve uma diminuiccedilatildeo no tamanho o que podeser considerado um indicativo de refatoraccedilatildeo de coacutedigo A Figura 57 mostra todos osprojetos em relaccedilatildeo agrave quantidade total de meacutetodos que possuem lambda no primeiro mecircsde introduccedilatildeo do mesmo em vermelho comparado com a quantidade desses meacutetodos quetiveram uma diminuiccedilatildeo no tamanho quando comparados com o coacutedigo do mecircs anteriorem azul

Figura 57 Comparaccedilatildeo entre todos os projetos com expressatildeo lambda sobre refatoraccedilatildeode coacutedigo no mecircs de introduccedilatildeo da caracteriacutestica

Ainda observando a figura 57 com relaccedilatildeo aos projetos que natildeo tiveram nenhummeacutetodo com diminuiccedilatildeo de tamanho (barra azul) percebe-se que todos os 13 projetossequer tiveram uma quantidade significativa de meacutetodos que possuem expressotildees lambda(com o maior tendo apenas 5 meacutetodos) no mecircs de introduccedilatildeo da caracteriacutestica no projetoe ao mesmo tempo jaacute existiam no mecircs em que natildeo existia lambda no projeto Essa eacuteuma observaccedilatildeo importante porque projetos como vertx sendo este o que possui a maiormeacutedia de lambdasnapshot de todos os projetos e ao mesmo tempo tendo apenas trecircsmeacutetodos que continham expressotildees lambda no mecircs da introduccedilatildeo e que existiam no mecircs

40

anterior permitem inferir que todas as outras expressotildees lambda existentes no projetopara este determinado mecircs de introduccedilatildeo encontram-se em coacutedigo novo introduzido

Eacute importante ressaltar que somente essa anaacutelise natildeo eacute exclusivamente suficiente paradeterminar se estes projetos estatildeo realmente introduzindo lambda em coacutedigo novo ourealizando refatoraccedilatildeo uma vez que como a comparaccedilatildeo aconteceu apenas no mecircs deintroduccedilatildeo com o mecircs imediatamente anterior natildeo reflete todo o ciclo de vida do pro-jeto Por exemplo algumas equipes podem escolher refatorar o coacutedigo depois de umtempo de adaptaccedilatildeo apoacutes a transiccedilatildeo para a nova versatildeo da linguagem Assim paraobter uma melhor anaacutelise sobre refatoraccedilatildeo de coacutedigo ou natildeo feita nestes projetos aleacutemde outras anaacutelises referentes aos padrotildees tipicamente adotados para implementaccedilatildeo delambda nestes projetos seratildeo apresentados a seguir os estudos de caso dos cinco projetospreviamente selecionados

Outro ponto importante eacute o fato de que apesar das informaccedilotildees quanto agraves quantida-des de filter e map terem sido incluiacutedas inicialmente no trabalho para observar possiacuteveispadrotildees de refatoraccedilatildeo de coacutedigo percebeu-se que estas natildeo satildeo utilizadas de forma con-sideraacutevel pelos projetos estudados e para fins de anaacutelises generalizadas natildeo apresentaramtanta influecircncia na utilizaccedilatildeo de expressotildees lambda quanto a quantidade de AICs noprojeto

53 Estudos de Caso

Dentre os projetos analisados verificou-se que os projetos de pequeno e meacutedio porte op-taram por refatorar de uma vez seus coacutedigos para incluir expressotildees lambda em situaccedilotildeesem que se utilizava AICs anteriormente ou em alguns poucos casos de utilizaccedilatildeo deCollection Os projetos de grande porte natildeo apresentaram nenhuma refatoraccedilatildeo de coacute-digo ou uma refatoraccedilatildeo parcial gradativa provavelmente devido agrave grande quantidade dearquivos e coacutedigo que possuem o que pode tornar o trabalho de refatoraccedilatildeo extenso ecansativo

O projeto vertx que pertence ao grupo 2 dos projetos em que a quantidade de ex-pressotildees lambda aumentaram e as de AICs diminuiacuteram com lambda ultrapassando AICsexecutou inicialmente commits em maio de 2014 com adiccedilatildeo de coacutedigo novo utilizandoexpressotildees lambda e apoacutes um mecircs realizou um commit maior com a refatoraccedilatildeo de todasas AICs para expressotildees lambda Apoacutes a refatoraccedilatildeo o projeto se preocupou em mantera utilizaccedilatildeo de expressotildees lambda ao mesmo tempo que o uso de AICs se manteve apenasaos casos de classes com interfaces natildeo funcionais A Figura 58 apresenta uma parte docommit de refatoraccedilatildeo de coacutedigo que mostra em vermelho a parte eliminada do coacutedigo(AIC) e em verde o coacutedigo novo representando a substituiccedilatildeo por uma expressatildeo lambda

41

Figura 58 Commit de refatoraccedilatildeo de coacutedigo do projeto Vertx [3]

Alguns projetos ainda natildeo se preocuparam em refatorar o coacutedigo para o uso de ex-pressotildees lambda ateacute a data deste trabalho que eacute o caso do projeto guava que apresentouum commit em 03112016 com a atualizaccedilatildeo do projeto para Java 8 Mas a partir daatualizaccedilatildeo se preocupou em utilizar as expressotildees lambda apenas na implementaccedilatildeo decoacutedigo novo O cenaacuterio em que a refatoraccedilatildeo natildeo eacute prioridade ainda eacute a realidade de vaacuteriosprojetos de grande porte visto que os dados de projetos sem nenhuma expressatildeo lambdasatildeo o maior nuacutemero neste trabalho Poreacutem projetos que jaacute adotaram a utilizaccedilatildeo do Java8 tendem a mudar isso com o passar do tempo A Figura 59 apresenta em verde umaadiccedilatildeo de coacutedigo novo com expressatildeo lambda sem a eliminaccedilatildeo de algum coacutedigo anteriora esse que estaria em vermelho

42

Figura 59 Exemplo de um arquivo do commit de adiccedilatildeo de coacutedigo novo em Java 8 doprojeto Guava [4]

Na categoria de projetos em que os AICs e expressotildees lambda aumentam proporci-onalmente (grupo 1) o projeto agera realizou um commit em 19052016 com a adiccedilatildeoda biblioteca retrolambda como dependecircncia do projeto Essa biblioteca utilizada prin-cipalmente por projetos Android permite executar coacutedigo Java 8 contendo expressotildeeslambda em Java 5 6 e 7 [48] O commit tambeacutem apresenta refatoraccedilatildeo dos AICs ad-vindos de interfaces funcionais para expressotildees lambda Apesar de o projeto continuar autilizar as expressotildees lambda em seus commits posteriores o nuacutemero de AICs tambeacutemcontinuou a aumentar visualizando os commits posteriores notou-se que esses AICs satildeorelativos a interfaces natildeo funcionais ou seja que possuem mais de um meacutetodo O projetoAndroid-CleanArchitecture eacute similar ao agera pois tambeacutem optou pela instalaccedilatildeo da bi-blioteca retrolambda para uso de expressotildees lambda em seus coacutedigos e como tambeacutem eacuteum projeto de pequeno porte houve uma pequena refatoraccedilatildeo dos AICs A Figura 510mostra a parte do commit de refatoraccedilatildeo de coacutedigo em que o desenvolvedor adiciona abiblioteca retrolambda como dependecircncia

43

Figura 510 Commit de adiccedilatildeo da biblioteca Retrolambda no projeto Agera [5]

Outro caso interessante eacute o do projeto RxJava que em 2015 optou pela refatoraccedilatildeodo coacutedigo para a utilizaccedilatildeo de expressotildees lambda quase eliminando por completo o usode AICs mas que no ano seguinte reverteu os commits de forma que eliminasse comple-tamente o uso de expressotildees lambda para manter a retrocompatibilidade com o Java 6A Figura 511 demonstra uma parte do commit de reversatildeo do coacutedigo para Java 6 emque pode ser visto em vermelho o coacutedigo anterior com expressotildees lambda e o verde como novo coacutedigo utilizando AIC novamente

44

Figura 511 Commit de remoccedilatildeo de Lambdas e volta para o uso de AICs no projetoRXJava [6]

Essa preocupaccedilatildeo com retrocompatibilidade de coacutedigo pode ser um fator crucial nadecisatildeo das equipes de desenvolvimento na hora de decidir como fazer o software co-evoluircom a linguagem sem perder a compatibilidade com versotildees anteriores

45

Capiacutetulo 6

Consideraccedilotildees Finais

Este estudo permitiu entender melhor como projetos estatildeo realizando a migraccedilatildeo para oJava 8 em especial utilizando uma nova caracteriacutestica introduzida expressatildeo lambdaApesar de a maioria dos projetos populares considerados natildeo possuiacuterem nenhuma ocor-recircncia de expressotildees lambda os projetos que tinham expressotildees lambda foram suficientespara realizar um primeiro estudo de caracterizaccedilatildeo no uso desta caracteriacutestica e com osprojetos efetivamente utilizados para estudo foi possiacutevel agrupaacute-los quanto a maneira emque as expressotildees lambda estavam sendo utilizadas quando comparadas com AICs em 5grandes grupos quando AIC e lambda aumentam proporcionalmente quando AIC dimi-nui e lambda aumenta ultrapassando AIC quando AIC diminui mas continua superior aolambda crescente expressotildees lambda que foram introduzidas e retiradas completamentedo coacutedigo e expressotildees lambda que natildeo existem em quantidades expressivas

Foi possiacutevel entatildeo realizar um estudo aprofundado levando em consideraccedilatildeo as di-ferentes maneiras com que as expressotildees lambda foram adotadas nos projetos atraveacutes daescolha de um projeto que representasse cada grupo para anaacutelise Dentre os cinco projetosestudados foi possiacutevel observar alguns padrotildees tipicamente adotados por desenvolvedorespara implementar expressotildees lambda em seus projetos como a utilizaccedilatildeo da bibliotecas(retrolambda) que permitissem uma flexibilizaccedilatildeo na utilizaccedilatildeo de expressotildees lambda oucomo lambda eacute primariamente utilizada para substituir determinados AICs ou operaccedilotildeesem Collection

Aleacutem disso foi possiacutevel observar como a refatoraccedilatildeo de coacutedigo acontece em cada umdesses projetos Observou-se como projetos menores tendem a refatorar coacutedigo maisfacilmente ao passo que projetos maiores e mais complexos fazem menos refatoraccedilatildeo oudemoram mais entre o periacuteodo em que houve a primeira migraccedilatildeo de coacutedigo para a novaversatildeo da linguagem ateacute o periacuteodo em que realmente decidem refatorar coacutedigo Aleacutem dacomplexidade do projeto influenciar na decisatildeo de migrar o projeto para uma versatildeo maisrecente da linguagem a preocupaccedilatildeo com retrocompatibilidade com versotildees anteriores da

46

linguagem tambeacutem podem ser uma barreira para que projetos comecem a evoluir o coacutedigojuntamente com a evoluccedilatildeo da linguagem

Ainda assim foi possiacutevel observar que a preocupaccedilatildeo com a co-evoluccedilatildeo do software-linguagem existe entre os desenvolvedores de projetos mas a realizaccedilatildeo da migraccedilatildeo aindaacontece lentamente devido agrave diversos fatores que precisam ser levados em consideraccedilatildeopara a manutenccedilatildeo do projeto

Para trabalhos e contribuiccedilotildees futuras seria interessante desenvolver uma ferramentaque pudesse analisar diretamente no coacutedigo-fonte as oportunidades de aplicaccedilatildeo de ex-pressotildees lambda dessa forma poderiam ser analisadas as porcentagens de conversatildeo decoacutedigo para Java 8 e obter melhores conclusotildees sobre a importacircncia que os projetos estatildeodando para a evoluccedilatildeo de seus coacutedigos Outro fator interessante seria aplicar mais Visitorsagrave ferramenta static-analysis e fazer este mesmo estudo aplicado agrave outras caracteriacutesticasda linguagem

47

Referecircncias

[1] Kagdi Huzefa Michael L Collard e Jonathan I Maletic A survey and taxonomyof approaches for mining software repositories in the context of software evolution2007 ix 3 8 9 10 11

[2] DBeaver Dbeaver - features httpdbeaverjkissorgdocsfeatures ix 29

[3] Eclipse Vertx commit Java8-ify code httpsgithubcomeclipsevertxcommit93f95e9c77419f442a42fe711b6eeaef88192fd3 ix 42

[4] Google Guava commit Release java 8 changes to guava httpsgithubcomgoogleguavacommit73e382fa877f80994817a136b0adcc4365ccd904 ix 43

[5] Google Agera commit Collapsed testapp with retrolambda httpsgithubcomgoogleageracommit5e518b7b05f9e7a34a314945f68deff7b2c3e334 ix 44

[6] ReactiveX Rxjava commit 2x full jdk 6 compatible backport + includ-ing bugfixes up to today httpsgithubcomReactiveXRxJavacommit000a174d87a901135f9665d3b11f3627fd2dc4ed ix 45

[7] Godfrey M W e D M German The past present and future of software evolutionEm 2008 Frontiers of Maintenance paacuteginas 129ndash138 Sept 2008 1 6

[8] Favre J M Languages evolve too changing the software time scale Em Principles ofSoftware Evolution Eighth International Workshop on paacuteginas 33ndash42 IEEE 20051 5 7

[9] Overbey Jeffrey L e Ralph E Johnson Regrowing a language refactoring tools allowprogramming languages to evolve Em ACM SIGPLAN Notices volume 44 paacuteginas493ndash502 ACM 2009 1 5 7 8 12

[10] Grechanik Mark Collin McMillan Luca DeFerrari Marco Comi Stefano CrespiDenys Poshyvanyk Chen Fu Qing Xie e Carlo Ghezzi An empirical investiga-tion into a large-scale java open source code repository Em Proceedings of the2010 ACM-IEEE International Symposium on Empirical Software Engineering andMeasurement ESEM rsquo10 paacuteginas 111ndash1110 New York NY USA 2010 ACMISBN 978-1-4503-0039-1 httpdoiacmorg10114518527861852801 1

[11] TIOBE Tiobe httpswwwtiobecomtiobe-index 1 14

48

[12] Gyori Alex Lyle Franklin Danny Dig e Jan Lahoda Crossing the gap from im-perative to functional programming through refactoring Em Proceedings of the 20139th Joint Meeting on Foundations of Software Engineering ESECFSE 2013 paacute-ginas 543ndash553 New York NY USA 2013 ACM ISBN 978-1-4503-2237-9 httpdoiacmorg10114524914112491461 2 11 24 39

[13] OpenJDK State of the lambda httpcropenjdkjavanet~briangoetzlambdalambda-state-4html 2

[14] Han Jiawei Micheline Kamber e Jian Pei Data Mining Concepts and TechniquesMorgan Kaufmann Publishers Inc San Francisco CA USA 3rd ediccedilatildeo 2011ISBN 0123814790 9780123814791 3

[15] Fowler Martin e Kent Beck Refactoring improving the design of existing codeAddison-Wesley Professional 1999 5 7

[16] Lehman M M J F Ramil P D Wernick D E Perry e W M Turski Met-rics and laws of software evolution - the nineties view Em Proceedings of the4th International Symposium on Software Metrics METRICS rsquo97 paacuteginas 20ndashWashington DC USA 1997 IEEE Computer Society ISBN 0-8186-8093-8 httpdlacmorgcitationcfmid=823454823901 6

[17] Hassan Ahmed E e Tao Xie Software intelligence The future of mining softwareengineering data Em Proceedings of the FSESDP Workshop on Future of SoftwareEngineering Research FoSER rsquo10 paacuteginas 161ndash166 New York NY USA 2010ACM ISBN 978-1-4503-0427-6 httpdoiacmorg101145188236218823978 9

[18] Hassan Ahmed E The road ahead for mining software repositories Em Frontiers ofSoftware Maintenance 2008 FoSM 2008 paacuteginas 48ndash57 IEEE 2008 8

[19] Berry Michael J e Gordon Linoff Data Mining Techniques For Marketing Salesand Customer Support John Wiley amp Sons Inc New York NY USA 1997ISBN 0471179809 10

[20] Parnin Chris Christian Bird e Emerson Murphy-Hill Java generics adoption hownew features are introduced championed or ignored Em Proceedings of the 8thWorking Conference on Mining Software Repositories paacuteginas 3ndash12 ACM 2011 12

[21] Oracle The java language specification httpsdocsoraclecomjavasespecsjlsse8jls8pdf 13

[22] Oracle The history of java technology httpwwworaclecomtechnetworkjavajavaseoverviewjavahistory-index-198355html 13

[23] Murphy Kieron So why did they decide to call itjava httpwwwjavaworldcomarticle2077265core-javaso-why-did-they-decide-to-call-it-java-html 13

[24] McGraw Tata Object-oriented Programming with Java Essentials and ApplicationsHill Education 13

49

[25] Oracle Differences between java ee and java se httpdocsoraclecomjavaee6firstcupdocgkhoyhtml 13

[26] Lindsey Clark S The History of Java Cambridge 14

[27] Oracle The java language environment httpwwworaclecomtechnetworkjavaintro-141325html 14

[28] Oracle Jdk 8 httpopenjdkjavanetprojectsjdk8 15 24

[29] Oracle Enhancements in java se 8 httpdocsoraclecomjavase8docstechnotesguideslanguageenhancementshtmljavase8 15 16 17

[30] Oracle Lambda expressions httpdocsoraclecomjavasetutorialjavajavaOOlambdaexpressionshtml 16 18 21

[31] Oracle Method references httpdocsoraclecomjavasetutorialjavajavaOOmethodreferenceshtml 16

[32] Oracle Default methods httpdocsoraclecomjavasetutorialjavaIandIdefaultmethodshtml 17

[33] Oracle Repeating annotations httpdocsoraclecomjavasetutorialjavaannotationsrepeatinghtml 17

[34] Oracle Type annotations httpdocsoraclecomjavasetutorialjavaannotationstype_annotationshtml 17

[35] Oracle Anonymous inner classes httpsdocsoraclecomjavasetutorialjavajavaOOanonymousclasseshtml 19

[36] Kothari CR Research Methodology Methods and Techniques New Age Interna-tional (P) Limited 2004 ISBN 9788122415223 httpsbooksgooglecombrbooksid=8c6gkbKi-F4C 22

[37] Nakakoji Kumiyo Yasuhiro Yamamoto Yoshiyuki Nishinaka Kouichi Kishida eYunwen Ye Evolution patterns of open-source software systems and communitiesEm IWPSE rsquo02 Proceedings of the International Workshop on Principles of SoftwareEvolution paacuteginas 76ndash85 New York NY USA 2002 ACM Press ISBN 1581135459httpdxdoiorg101145512035512055 23

[38] Rahman Foyzur Christian Bird e Premkumar Devanbu Clones What is that smellEmpirical Software Engineering 17(4-5)503ndash530 2012 24

[39] Chacon Scott Pro Git Apress Berkely CA USA 1st ediccedilatildeo 2009ISBN 1430218339 9781430218333 25

[40] Cavalcanti Thiago Gomes e Viniacutecius Correa de Almeida Caracterizaccedilatildeo do uso deconstruccedilotildees da linguagem java em projetos open-source Publicaccedilatildeo online 2016httpbdmunbbrhandle1048315733 27

50

[41] Parr Terence Language Implementation Patterns Create Your Own Domain-Specific and General Programming Languages Pragmatic Bookshelf 1st ediccedilatildeo 2009ISBN 193435645X 9781934356456 27

[42] Janssen Thorben 5 reasons to use jpa hibernate Publicaccedilatildeo online httpswwwsitepointcom5-reasons-to-use-jpa-hibernate 27

[43] Franklin Lyle Alex Gyori Jan Lahoda e Danny Dig Lambdaficator From imperativeto functional programming through automated refactoring Em Proceedings of the2013 International Conference on Software Engineering ICSE rsquo13 paacuteginas 1287ndash1290 Piscataway NJ USA 2013 IEEE Press ISBN 978-1-4673-3076-3 httpdlacmorgcitationcfmid=24867882486986 29

[44] Google Agera httpsgithubcomgoogleagerawiki 34

[45] Eclipse Eclipse vertx httpvertxio 35

[46] Cejas Fernando Android cleanarchitecture httpsgithubcomandroid10Android-CleanArchitecture 36

[47] ReactiveX Rxjava httpsgithubcomReactiveXRxJava 37

[48] Luontola Esko Retrolambda httpsgithubcomorfjackalretrolambda 43

51

Anexo I

Projetos utilizados

fastjson

platform_frameworks_base

netty

material-dialogs

kotlin

okhttp

tinker

AndroidUtilCode

RxJava

spring-boot

java-design-patterns

elasticsearch

ExoPlayer

kafka

vertx

realm-java

guava

zipkin

bazel

stetho

Signal-Android

glide

agera

fresco

plaid

presto

libgdx

spark

52

disruptor

lottie-android

flexbox-layout

PocketHub

zxing

spring-framework

deeplearning4j

dropwizard

interviews

BaseRecyclerViewAdapterHelper

uCrop

DanmakuFlameMaster

lottie-react-native

android-UniversalMusicPlayer

AndroidInterview-Q-A

greenDAO

retrofit

MaterialDrawer

BottomBar

druid

MPAndroidChart

Hystrix

guice

recyclerview-animators

dubbo

androidannotations

RxJava-Android-Samples

PhotoView

clojure

CircleImageView

AndroidSwipeLayout

jedis

MaterialViewPager

butterknife

junit4

RxBinding

leakcanary

SimianArmy

picasso

UltimateRecyclerView

53

AndroidViewAnimations

AppIntro

FizzBuzzEnterpriseEdition

ion

cheesesquare

physical-web

RxAndroid

Android-CleanArchitecture

Calligraphy

Android-Bootstrap

iosched

Android_Data

MaterialDesignLibrary

ListViewAnimations

EventBus

java8-tutorial

AndroidSlidingUpPanel

dagger

okhttputils

logger

HomeMirror

Material-Animations

android-Ultra-Pull-To-Refresh

android-async-http

Android-ObservableScrollView

Android-Universal-Image-Loader

ActionBarSherlock

SlidingMenu

storm

PagerSlidingTabStrip

Android-PullToRefresh

54

  • Dedicatoacuteria
  • Agradecimentos
  • Resumo
  • Abstract
  • Introduccedilatildeo
    • Contexto
    • Objetivos
      • Objetivos Gerais
      • Objetivos Especiacuteficos
        • Metodologia
        • Organizaccedilatildeo do Trabalho
          • Evoluccedilatildeo e Mineraccedilatildeo de Repositoacuterios de Software
            • Evoluccedilatildeo de Software
            • MSR Mineraccedilatildeo de dados e a Engenharia de Software
              • Classificaccedilatildeo
                • Trabalhos Relacionados
                  • Java SE 8 e JDK 8
                    • Histoacuterico
                    • Princiacutepios
                    • Evoluccedilatildeo
                    • Expressotildees Lambda
                      • Sintaxe
                      • Principais formas de uso
                          • Estudo e o Processo de Mineraccedilatildeo
                            • Questotildees de Pesquisa
                            • Fonte de Dados e Objetos de Estudo
                            • Processo de Mineraccedilatildeo
                              • static-analysis
                              • BDAnalisador
                                • Classificaccedilatildeo e Anaacutelise
                                  • Meacutedia de Lambda
                                  • Anaacutelise Temporal
                                  • Refatoraccedilatildeo de Coacutedigo
                                  • Casos de Uso
                                      • Resultados Obtidos e Anaacutelise
                                        • Visatildeo Geral
                                          • Projetos Selecionados
                                          • agera
                                          • vertx
                                          • Android-CleanArchitecture
                                          • RxJava
                                          • guava
                                            • Refatoraccedilatildeo de Coacutedigo
                                            • Estudos de Caso
                                              • Consideraccedilotildees Finais
                                              • Referecircncias
                                              • Anexo
                                              • Projetos utilizados

Lista de Tabelas

31 As versotildees anteriores de java e principais caracteriacutesticas 14

41 Informaccedilotildees mensais sobre o projeto agera 30

x

Capiacutetulo 1

Introduccedilatildeo

11 Contexto

A evoluccedilatildeo e manutenccedilatildeo de software eacute uma caracteriacutestica intriacutenseca do desenvolvimentode sistemas considerando que a partir do momento em que um software comeccedila a serdesenvolvido satildeo realizadas constantes manutenccedilotildees [7] Apesar de o conceito de evolu-ccedilatildeo de software representar uma grande aacuterea de pesquisa na engenharia de software nemsempre pesquisadores reconhecem a importacircncia da evoluccedilatildeo das linguagens de progra-maccedilatildeo como um grande fator influenciador na evoluccedilatildeo de software [8] uma vez que umsoftware que natildeo evolui junto com a sua linguagem tem a sua capacidade de evoluccedilatildeolimitada [9]

Surge entatildeo a necessidade de alinhar estudos empiacutericos com o intuito de investigar esteprocesso de evoluccedilatildeo do software juntamente com a evoluccedilatildeo de sua linguagem atraveacutesde investigaccedilatildeo e anaacutelise de seu coacutedigo fonte que pode ser feita por meio de anaacutelise de re-positoacuterios de software em grande escala o que deu origem a abordagem de Mineraccedilatildeo emRepositoacuterio de Software (MSR) O MSR tem como base o estudo sistemaacutetico e empiacutericode repositoacuterios de software com o objetivo de analisaacute-los utilizando informaccedilotildees estatis-ticamente uacuteteis coletadas para observar diversos padrotildees como a evoluccedilatildeo do softwarepadrotildees de projetos dentre outros [10]

A complexidade e dificuldade de realizar tal estudo empiacuterico eacute alta pois atualmenteexistem diversos tipos de plataformas para coleta de dados linguagens e focos variadosAssim para escolher o foco do objeto de estudo eacute necessaacuterio levar em consideraccedilatildeo estasdificuldades e especificaccedilotildees e dessa forma este trabalho tem como foco a anaacutelise desistemas de software na linguagem Java

Ateacute a data deste trabalho de acordo com os dados do TIOBE [11] Java eacute a linguagemde programaccedilatildeo com mais linhas de codigo catalogadas no mundo Isso faz com queseja extremamente interessante o estudo empiacuterico da evoluccedilatildeo da linguagem e software

1

desenvolvidos nela desde sua primeira versatildeo antes de se tornar uma linguagem populare ainda com poucos pacotes ateacute a sua atual versatildeo estaacutevel com uma grande quantidadede novas caracteriacutesticas

A versatildeo mais recente do Java a JDK 8 possui diversas adiccedilotildees interessantes para aorganizaccedilatildeo do coacutedigo e facilidade do programador Dessas novas implementaccedilotildees con-ceitos de linguagem funcional como expressotildees lambda e iteradores externos que recebemuma expressatildeo lambda como argumento como o map() filter() e forEach() tornarama escrita de coacutedigo paralelo mais simples e permitiram ganhos de performance [12]

Diversas linguagens de programaccedilatildeo tambeacutem populares como Javascript e Ruby jaacutepossuiacuteam expressotildees lambda desde suas versotildees iniciais sendo o Java 8 em 2014 maisuma linguagem a introduzir esse novo conceito Podemos descrever as expressotildees comopequenas funccedilotildees normalmente feitas em apenas uma linha sem um nome identificadorElas podem ser retornadas de outras funccedilotildees ou passadas como paracircmetro Um exemplode expressatildeo lambda pode ser visualizado pela funccedilatildeo de soma de dois inteiros escrita daforma (int x int y)rarr x + y [13]

Antes da inclusatildeo de expressotildees lambda em Java o mesmo comportamento era possiacutevelutilizando classes anocircnimas ou AICs (Anonymous inner classes) Contudo eacute necessaacute-rio a criaccedilatildeo de uma interface com apenas um meacutetodo e instanciaacute-la como uma AIC Autilizaccedilatildeo de AICs gera inuacutemeras linhas de coacutedigo adicionais que poderiam ser encapsu-ladas em apenas uma linha com a utilizaccedilatildeo de expressotildees lambda Como eacute interessantepara o programador ter um coacutedigo sempre mais legiacutevel e sucinto torna-se interessante arefatoraccedilatildeo de coacutedigo que utiliza uma tecnologia mais antiga para a nova

Assim este trabalho visa conduzir um estudo de mineraccedilatildeo em repositoacuterios de softwareopen-source desenvolvidos na linguagem Java para entender como desenvolvedores estatildeose adaptando agraves novas mudanccedilas introduzidas no Java 8

12 Objetivos

121 Objetivos Gerais

Este trabalho tem como objetivo geral caracterizar o uso de expressotildees lambda entre osprojetos Java mais populares desenvolvidos pela comunidade do GitHub

122 Objetivos Especiacuteficos

Sabendo do benefiacutecio da refatoraccedilatildeo de coacutedigo para o uso de expressotildees lambda e dapouca quantidade de estudos acadecircmicos sobre o assunto surge entatildeo uma oportunidadede pesquisa para melhor entender a forma como essa caracteriacutestica estaacute sendo adotada por

2

projetos com foco em refatoraccedilatildeo de coacutedigo o que originou a necessidade deste estudoAssim para alcanccedilar o objetivo deste trabalho foram traccedilados em forma de questotildees depesquisa os objetivos especiacuteficos a serem alcanccedilados por este trabalho

bull Quando os projetos Java de coacutedigo aberto comeccedilaram a introduzir o uso de expres-sotildees lambda em seus coacutedigos e quatildeo significativo eacute esse uso

bull Como as equipes de desenvolvimento estatildeo utilizando expressotildees lambda atraveacutesde refatoraccedilatildeo de coacutedigo ou introduzindo apenas em coacutedigo novo

bull Quais satildeo os padrotildees tipicamente adotados para o uso de expressotildees lambda

13 Metodologia

Este trabalho foi desenvolvido utilizando uma abordagem de MSR que dentro da clas-sificaccedilatildeo de Kagdi et al [1] pode ser divido em quatro grandes etapas Primeiramentedefiniu-se a fonte de dados a ser utilizada e dentre as possibilidades encontradas na lite-ratura [14] optou-se por utilizar repositoacuterios de controle de versatildeo mais especificamenteo Github tendo como criteacuterio de seleccedilatildeo os 99 repositoacuterios Java mais populares na plata-forma Em seguida definiu-se o propoacutesito do estudo no caso os objetivos em forma deperguntas de pesquisa a serem respondidas

A terceira grande etapa foi a definiccedilatildeo do meacutetodo em si a forma como seria realizadoo estudo e este por sua vez constitui-se de download de todos os 99 repositoacuterios maispopulares realizaccedilatildeo de uma anaacutelise estaacutetica para coletar informaccedilotildees necessaacuterias de cadaprojeto por versatildeo e armazenamento de informaccedilotildees pertinentes em uma base de dados

A etapa final foi a realizaccedilatildeo da avaliaccedilatildeo dos dados obtidos atraveacutes de meacutetricas eanaacutelises quantitativas para melhor responder as questotildees de pesquisa aleacutem de estudos decaso feitos com cinco projetos escolhos de acordo com a maneira distinta em que estesfazem o uso de expressotildees lambda

14 Organizaccedilatildeo do Trabalho

Este trabalho se divide em seis capiacutetulos

bull Capiacutetulo 2 Apresenta um referencial teoacuterico sobre evoluccedilatildeo de software demons-trando as estrateacutegias utilizadas e a importacircncia da evoluccedilatildeo em um projeto de coacutedigoaberto aleacutem de enunciar as leis de evoluccedilatildeo de software de Lehman O capiacutetulo tam-beacutem apresenta o processo de mineraccedilatildeo de dados explicando cada uma das camadasda classificaccedilatildeo e demonstra trabalhos relacionados a esse toacutepico que serviram debase para este trabalho

3

bull Capiacutetulo 3 Traz um contexto histoacuterico e teacutecnico da linguagem Java necessaacuteriospara entender a importacircncia que as novas caracteriacutesticas adicionadas na versatildeo8 fornecem para os desenvolvedores de projetos determinados a manter o projetosempre evoluiacutedo Tambeacutem eacute apresentada uma seccedilatildeo para demonstrar os detalhese formas de utilizaccedilatildeo das expressotildees Lambda que satildeo o foco dos objetivos destetrabalho

bull Capiacutetulo 4 Descreve a metodologia e processo utilizados para o desenvolvimentoe obtenccedilatildeo dos resultados deste trabalho O capiacutetulo desenvolve o contexto dasquestotildees de pesquisa e explica os motivos e processos de desenvolvimento das fer-ramentas utilizadas para minerar os dados aleacutem de determinar a classificaccedilatildeo dosresultados obtidos em grupos para facilitar a organizaccedilatildeo dos dados de forma queas perguntas sejam respondidas claramente

bull Capiacutetulo 5 Apresenta os resultados obtidos e de que forma eles ajudaram a respon-der as questotildees de pesquisa Eacute descrita uma anaacutelise de um projeto de cada categoriaespecificada no capiacutetulo anterior a fim de contextualizar cada tipo de resultado paraque o leitor entenda a forma que os projetos Java estatildeo lidando com as expressotildeesLambda

bull Capiacutetulo 6 Descreve as dificuldades e problemas obtidos durante o trabalho e deque forma eles influenciaram nos resultados Tambeacutem eacute apresentada uma seccedilatildeocontendo as ideias surgidas durante o desenvolvimento deste trabalho que ficarampara ser feitas no futuro devido agrave gama de informaccedilotildees que a mineraccedilatildeo dos dadostrouxe

4

Capiacutetulo 2

Evoluccedilatildeo e Mineraccedilatildeo deRepositoacuterios de Software

As linguagens de programaccedilatildeo estatildeo sempre evoluindo aumentando sua complexidade eexpressividade Da mesma forma aleacutem de se preocupar com dificuldades de estabelecercompatibilidade do software em relaccedilatildeo a tecnologias antigas desenvolvedores tambeacutemprecisam acompanhar essa evoluccedilatildeo das linguagens para que suas ferramentes natildeo setornem obsoletas [9] Isso agrega um grande desafio no desenvolvimento e evoluccedilatildeo desoftware

O conceito de evoluccedilatildeo de software amadureceu e se tornou um grande foco de pes-quisa Poreacutem nem sempre estudos de evoluccedilatildeo de software reconhecem a importacircncia daevoluccedilatildeo da linguagem de programaccedilatildeo no contexto do desenvolvimento de software [8]Quando um coacutedigo natildeo evolui junto com a linguagem com o objetivo de manter umacompatibilidade com versotildees anteriores sua capacidade de evoluccedilatildeo se torna limitada [9]

A refatoraccedilatildeo de coacutedigo que consiste em realizar mudanccedilas no coacutedigo fonte sem modi-ficar o comportamento observado do software [15] permite que a evoluccedilatildeo de linguagens eferramentas aconteccedilam mais naturalmente No entanto novos desafios surgem como porexemplo saber quando e como realizar a refatoraccedilatildeo de coacutedigo de forma eficiente e coesaDentre as teacutecnicas de pesquisa em engenharia de software para entender esse problematorna-se interessante explorar as teacutecnicas de mineraccedilatildeo de dados aplicados a repositoacuteriosde software com o objetivo de entender o relacionamento entre evoluccedilatildeo e refatoraccedilatildeo

Assim este capiacutetulo busca esclarecer conceitos e estrateacutegias de evoluccedilatildeo de softwaremineraccedilatildeo de repositoacuterios de software e o estado da arte sobre o assunto

5

21 Evoluccedilatildeo de Software

Durante o processo de produccedilatildeo e manutenccedilatildeo de software haacute a necessidade de diversastomadas de decisotildees sobre seu desenvolvimento como por exemplo decidir como melho-rar a qualidade do software Tais decisotildees precisam ser tomadas levando em consideraccedilatildeoo ambiente em que se estaacute inserido com novas tecnologias surgindo todos os dias fe-edback de usuaacuterios exigentes e concorrentes produzindo um software similar com ideiasinovadoras

Tudo isso acontece em um ritmo de constante mudanccedila e assim como diria Lehmaneacute imprescindiacutevel que software de sistemas sejam capazes de evoluir ou os mesmos correm orisco de sofrer uma morte prematura [16] fazendo assim da evoluccedilatildeo de software um con-ceito importante dentro do seu processo de desenvolvimento Essa evoluccedilatildeo deve ocorrerconsiderando o ambiente em que o software estaacute inserido o qual possui aspectos teacutecnicos esociais sua infraestrutura que pertence ao seu ambiente teacutecnico o qual sempre necessitamanutenccedilatildeo e ao mesmo tempo usuaacuterios que utilizam o software e estatildeo constantementeformando opiniotildees oferecendo feedback e na expectativa por novidades [7] Assim a me-dida que novas caracteriacutesticas satildeo desenvolvidas novas tecnologias de infraestrutura satildeonecessaacuterias novos requisitos satildeo adicionados e o sistema de software deve se adaptar aessas mudanccedilas

Com relaccedilatildeo aos aspectos sociais que envolvem a evoluccedilatildeo do software eacute importanteressaltar os conceitos baacutesicos de como essa evoluccedilatildeo acontece Durante um estudo empiacutericopioneiro na aacuterea de evoluccedilatildeo de software para sistemas de grande escala Lehman e seuscolaboradores formularam um conjunto de observaccedilotildees que hoje satildeo conhecidas como asleis da evoluccedilatildeo de software ou simplesmente Leis de Lehman [16] No geral as leis deevoluccedilatildeo de software podem ser descritas da seguinte forma [16]

1 Mudanccedila contiacutenua um sistema se tornaraacute progressivamente menos satisfatoacuteriopara seus usuaacuterios com o tempo a menos que se adapte continuamente agraves necessi-dades que surgiratildeo

2 Complexidade Crescente um sistema se tornaraacute cada vez mais complexo amenos que se trabalhe para explicitamente reduzir sua complexidade

3 Auto-regulaccedilatildeo o processo de evoluccedilatildeo de software eacute auto-regulatoacuterio no que dizrespeito agraves distribuiccedilotildees dos artefatos e produtos produzidos

4 Conservaccedilatildeo da estabilidade organizacional a taxa meacutedia de atividade globalefetiva em um sistema em evoluccedilatildeo natildeo muda com o tempo ou seja a meacutedia detrabalho e esforccedilo colocado em cada entrega do sistema permanece a mesma

6

5 Conservaccedilatildeo de familiaridade a quantidade de conteuacutedo novo em cada entregado sistema tende a se manter constante com o tempo

6 Crescimento contiacutenuo A quantidade de funcionalidades em um sistema cresceraacutecom o tempo com o objetivo de satisfazer seus usuaacuterios

7 Decliacutenio de qualidade Um sistema seraacute percebido com qualidade inferior como passar do tempo a menos que seu design tenha uma manutenccedilatildeo minuciosa e seadapte a novas restriccedilotildees

8 Sistema de Feedback Evoluir um sistema com sucesso requer reconhecer que oprocesso de desenvolvimento acontece em um sistema de feedback de vaacuterios ciclosagentes e niacuteveis

Os aspectos teacutecnicos que envolvem a evoluccedilatildeo de software levam em consideraccedilatildeo astecnologias utilizadas para o seu desenvolvimento desde a linguagem de programaccedilatildeo agravesmaacutequinas onde o software seraacute hospedado que sofrem atualizaccedilotildees recebem novas versotildeescom novas caracteriacutesticas implementadas

Um estudo realizado por Lavre mostra como a evoluccedilatildeo das linguagens de programa-ccedilatildeo no contexto da evoluccedilatildeo de software muitas vezes satildeo subestimadas uma vez quemuitos podem considerar em seus estudos a linguagem de computaccedilatildeo como um artefatoimutaacutevel [8] Por exemplo coloca-se muita ecircnfase e cuidado para realizar o versionamentode coacutedigo fonte de um software mas este pode ser tornar inutilizaacutevel futuramente se nin-gueacutem souber qual versatildeo de compilador determinada versatildeo de coacutedigo foi desenvolvida

Para natildeo se deixar estagnar linguagens de programaccedilatildeo precisam se adaptar e evoluirQuando uma linguagem de programaccedilatildeo atualiza softwares que eram antes consideradosatualizados podem se tornar rapidamente obsoletos E ao mesmo tempo que novascaracteriacutesticas satildeo adicionadas a linguagem precisa fornecer compatibilidade com versotildeesanteriores aumentando sua complexidade Desenvolvedores entatildeo encontram-se tambeacutemem um empasse buscando um equiliacutebrio entre manter a compatibilidade da ferramentacom versotildees anteriores da linguagem e atualizaacute-la para manter o software atualizado [9]

A estrateacutegia de refatoraccedilatildeo de coacutedigo pode ser uma opccedilatildeo que permite a linguageme o software co-evoluiacuterem com um menor grau de dificuldade [9] Refatoraccedilatildeo (do inglecircsrefactoring) eacute o processo de modificaccedilatildeo de um software com o objetivo de melhorar a es-trutura interna do mesmo sem alterar sua percepccedilatildeo externa Eacute uma maneira disciplinadade melhorar o design do coacutedigo apoacutes ele jaacute ter sido implementado Por exemplo dividiruma funcionalidade grande feita em apenas um bloco de coacutedigo em vaacuterios moacutedulos [15]

A refatoraccedilatildeo de coacutedigo pode ser um meio utilizado para evoluir o software adaptandoo coacutedigo com caracteriacutesticas novas introduzidas pela linguagem modificando o design dosistema sem comprometer sua integridade No entanto novos desafios surgem visto que

7

refatorar o coacutedigo fonte de um sistema de grande porte natildeo eacute uma tarefa faacutecil havendo anecessidade de ferramentas que possam automatizar o processo ou realizar um estudo paraentender como as novas caracteriacutesticas da linguagem podem ser utilizadas para substituirou melhorar funcionalidades obsoletas [9]

22 MSR Mineraccedilatildeo de dados e a Engenharia deSoftware

Com o objetivo de compreender prever e planejar os vaacuterios aspectos do desenvolvimentode um projeto em especial tudo que possa impactar na evoluccedilatildeo de software a teacutecnicade mineraccedilatildeo de dados tem sido bastante utilizada em engenharia de software [17]

O termo Mineraccedilatildeo de Repositoacuterios de Software (MSR) tem sido utilizado para descre-ver vaacuterias maneiras de se examinar repositoacuterios de software Um repositoacuterio de softwarepode ser considerado um artefato que eacute produzido e arquivado durante a evoluccedilatildeo desoftware [1] Estes responsoacuterios armazenam informaccedilotildees que podem fornecer todos osdetalhes de desenvolvimento do software provendo meios necessaacuterios para uma anaacuteliseaprofundada de evoluccedilatildeo de software

Repositoacuterios de software satildeo comumente utilizados para armazenar e acompanhar ohistoacuterico de desenvolvimento do software mas raramente usados para tomada de deci-sotildees em relaccedilatildeo ao projeto Assim pesquisadores de MSR buscam modificar a impressatildeode que tais repositoacuterios satildeo estaacuteticos que servem apenas para manutenccedilatildeo de registrostransformando-os em repositoacuterios ativos que podem auxiliar na tomada de decisatildeo em pro-jetos de software modernos atraveacutes da identificaccedilatildeo de padrotildees para realizar a propagaccedilatildeode mudanccedilas [18]

221 Classificaccedilatildeo

De acordo com Kagdi et al dentre as abordagens de MSR utilizadas atualmente eacute possiacuteveldescrevecirc-las para entatildeo comparaacute-las e possivelmente classificaacute-las levando em considera-ccedilatildeo uma taxonomia de quatro dimensotildees os repositoacuterios de software utilizados (fontes dedados) o propoacutesito do MSR a metodologia e a avaliaccedilatildeo da abordagem [1] como mostraa Figura 21 onde as taxonomias destacadas em amarelo satildeo as que prevaleceram poreacutemnatildeo exclusivamente na metodologia adotada por este trabalho

8

Figura 21 Taxonomia em camadas adaptada do trabalho de Kagdi et al [1]

Fontes de Dados

As fontes de informaccedilatildeo variam de acordo com a abordagem utilizada e dentre as informa-ccedilotildees mineradas em repositoacuterios de software inclui-se as seguintes categorias os artefatosde software e suas versotildees as diferenccedilas entre os artefatos de software e suas versotildees e osmetadados sobre as mudanccedilas no software

As fontes de dados podem ser melhor classificadas de acordo com Hassan et al [17]

bull Repositoacuterios de controle de Versatildeo estes repositoacuterios guardam o histoacuterico de desen-volvimento de um projeto armazenando todas as mudanccedilas no coacutedigo fonte assimcomo os metadados associados com cada mudanccedila Exemplos git SVN

bull Bug repositories Estes repositoacuterios rastreiam o histoacuterico de resoluccedilatildeo de bugs quesatildeo reportados por usuaacuterios e desenvolvedores Exemplos Bugzilla e Jira

9

bull Histoacuterico de Comunicaccedilatildeo (Archived communications) estes repositoacuterios rastreiamdiscussotildees sobre os vaacuterios aspectos de um projeto de software por sua vida uacutetil Porexemplo listas de e-mails

bull Deployment logs logs com informaccedilotildees do software gerados por ferramentas dedesenvolvimento

bull Repositoacuterios de software Repositoacuterios onde o coacutedigo fonte de vaacuterios projetos satildeoarmazenados como por exemplo Sourceforgenet

No contexto deste trabalho estes repositoacuterios consistem em fontes de coacutedigo armaze-nadas em sistemas de controle de versatildeo especificamente coacutedigos na plataforma Github

O propoacutesito

O propoacutesito da mineraccedilatildeo de repositoacuterios de software se resume nas perguntas de pes-quisa que podem ser respondidas utilizando mineraccedilatildeo Assim existem duas classes deperguntas de pesquisa para MSR [1]

A primeira eacute a pergunta de anaacutelise market-basket1 ldquoSe A acontece o que mais podeacontecerrdquo A resposta para este tipo de pergunta eacute um conjunto de regras descrevendotendecircncias de relacionamentos como por exemplo se A acontecer entatildeo B e C acontecemdurante um periacuteodo X

A segunda classe diz respeito agraves perguntas de prevalecircncia (Prevalence Questions -PQ) como por exemplo perguntas do tipo ldquoA funcionalidade Y foi modificadardquo quepossuem uma resposta booleana ou ldquoQuantas vezes esta funcionalidade Y foi modificadardquocontendo uma resposta quantitativa

As perguntas de pesquisa deste trabalho se encaixam majoritariamente na segundaclasse onde o objetivo traccedilado eacute respondido de forma quantitativa com algumas tentativasde classificaccedilatildeo de tipos de repositoacuterios como seraacute descrito nos capiacutetulos seguintes

A metodologia

A metodologia corresponde a maneira como as questotildees de MSR iratildeo ser respondidas evaacuterias abordagens estatildeo disponiacuteveis Poreacutem Kagdi indica duas estrateacutegias baacutesicas quepodem ser utilizadas

Primeiramente pode-se utilizar a mediccedilatildeo indireta e anaacutelise da evoluccedilatildeo do softwareEsta abordagem pode ser realizada da seguinte forma extrair e computar informaccedilotildeesde cada versatildeo de um software separadamente e em seguida individualmente comparar

1Anaacutelise Market-basket eacute uma teacutecnica de modelagem baseada na teoria de que se vocecirc comprar certostipos de produtos vocecirc haacute uma probabilidade maior (ou menor) de comprar outros tipos de produtos [19]

10

propriedades encontradas como por exemplo comparar duas versotildees distintas de umsoftware atraveacutes de um repositoacuterio github realizando uma investigaccedilatildeo de alto niacutevel noque diz respeito a evoluccedilatildeo do software [1]

A segunda perspectiva de metodologia que pode ser utilizada corresponde agrave mediccedilatildeodireta e anaacutelise da evoluccedilatildeo do software Ela diz respeito agraves investigaccedilotildees que estudamos mecanismos que leva um software a ser modificado de uma versatildeo para outra focandonas diferenccedilas especiacuteficas entre estas versotildees como por exemplo examinando mudanccedilasespeciacuteficas das classes arquivos funccedilotildees de cada parte do coacutedigo [1]

Assim eacute possiacutevel descrever explicitamente que este trabalho utiliza em sua maioriauma metodologia com mediccedilotildees diretas atraveacutes da anaacutelise estaacutetica de informaccedilotildees docoacutedigo fonte de diferente versotildees para analisar os diferentes padrotildees de desenvolvimentoem que expressotildees lambda (definidas no capiacutetulo seguinte) satildeo utilizadas

A Avaliaccedilatildeo

Por fim existem diversas formas para se avaliar o estudo realizado sempre levando emconsideraccedilatildeo a validade dos resultados obtidos Pode-se utilizar de meacutetricas para avaliar osdados considerando o quanto das informaccedilotildees obtidas satildeo relevantes Outra forma de seavaliar seria atraveacutes da utilizaccedilatildeo de modelos probabiliacutesticos seguindo uma abordagemde teoria da informaccedilatildeo Assim foram utilizadas determinadas meacutetricas quantitativaspara avaliar os resultados obtidos neste trabalho

23 Trabalhos Relacionados

Como ressaltado na introduccedilatildeo o foco deste trabalho encontra-se em utilizar teacutecnicas deMSR para caracterizar a adoccedilatildeo de expressotildees lambda em repositoacuterios Java Ao reali-zar um estudo sobre o estado da arte encontrou-se diversos trabalhos que utilizam deMSR para obter informaccedilotildees relevantes sobre repositoacuterios de software em diversos focose em especial trabalhos que investiguem repositoacuterios na linguagem Java Jaacute existemtambeacutem alguns trabalhos que apresentam ferramentas de refatoraccedilatildeo de coacutedigo para im-plementaccedilatildeo de expressotildees lambda com foco na evoluccedilatildeo do software Dentre os trabalhosencontrados mencionados destacam-se

bull Em um trabalho sobre utilizaccedilatildeo de refatoraccedilatildeo de coacutedigo para realizar a transiccedilatildeode coacutedigo Java para as novas caracteriacutesticas implementadas no Java 8 Gyori et alapresenta uma ferramenta que automatiza com sucesso o trabalho de conversatildeo decoacutedigo como Annonymous Inner Class para expressotildees lambda [12] O capiacutetulo aseguir descreve em detalhes estes conceitos

11

bull Regrowing a Language de Overbey apresenta um estudo sobre a importacircncia da co-evoluccedilatildeo entre a linguagem de programaccedilatildeo e os projetos de software focando naslinguagens Fortran e Java e provando como ferramentas de refatoraccedilatildeo de coacutedigoauxiliam para que o software consiga evoluir juntamente com sua linguagem deprogramaccedilatildeo [9]

bull O trabalho sobre a adoccedilatildeo de generics em coacutedigo Java feito por Parnin utiliza demineraccedilatildeo de dados para realizar uma investigaccedilatildeo empiacuterica avaliando projetos decoacutedigo aberto com o objetivo de observar como desenvolvedores destes projetos estatildeoutilizando generics em Java [20]

Os estudos mencionados focam em assuntos particulares pertinentes a este trabalhoem que de um lado tem-se trabalhos que mostram a necessidade de refatoraccedilatildeo de coacutedigopara evoluccedilatildeo de software e do outro tem-se trabalhos que mostram que eacute possiacutevel utilizarde MSR para entender melhor como a evoluccedilatildeo da linguagem de programaccedilatildeo Java temafetado projetos reais de coacutedigo aberto e como estes projetos estatildeo se adaptando a estasevoluccedilotildees

12

Capiacutetulo 3

Java SE 8 e JDK 8

Este trabalho tem como objetivo caracterizar a adoccedilatildeo de expressotildees Lambda em siste-mas Java que podem ser considerados legados pois foram concebidos em um momentoanterior a introduccedilatildeo dessa nova caracteriacutestica na linguagem Java Com o intuito de faci-litar o entendimento do leitor sobre tais construccedilotildees esse capiacutetulo apresenta informaccedilotildeeshistoacutericas referentes agrave linguagem Java desde sua criaccedilatildeo ateacute a sua ascensatildeo como umadas linguagens de programaccedilatildeo mais populares Aleacutem disso seratildeo apresentadas as novascaracteriacutesticas presentes na versatildeo Java SE 8 com destaque nas expressotildees Lambda e deque forma vieram para auxiliar no desenvolvimento de sistemas

31 Histoacuterico

Java eacute uma linguagem de programaccedilatildeo orientada a objetos para propoacutesitos gerais [21] Alinguagem nasceu com o nome de Oak no ano de 1991 com o foco em televisotildees digitais acabo mas devido agrave complexidade e poder da linguagem logo expandiu-se para os outrosdomiacutenios principalmente a Internet [22] Posteriormente a linguagem recebeu o nome deGreentalk devido agrave marca Oak jaacute ser registrada por outra empresa e o principal projeto daequipe se chamar Green Por fim o nome Java foi o mais votado pela equipe da Sun emuma reuniatildeo para decidir o mais raacutepido possiacutevel um nome definitivo para a linguagem [23]

Em 1995 em sua primeira versatildeo puacuteblica 10 a linguagem Java jaacute comeccedilava a terum crescimento em sua popularidade como Web Applet nos navegadores mais popularesfornecendo seguranccedila e rapidez nas plataformas mais utilizadas [24] A cada nova versatildeopublicada novas funcionalidades e plataformas eram adicionadas e tornavam a linguagemmais difundida no meio computacional fazendo com que em 2006 a linguagem fosse divi-dida em Java EE (foco em rede e serviccedilos web) Java ME (foco em sistemas embarcados)e Java SE (foco em desktops e servidores) [25]

13

Apoacutes anos de evoluccedilatildeo e aprimoramento atraveacutes de diversas versotildees como visto naTabela 31 hoje o Java se tornou uma das linguagens de programaccedilatildeo mais utilizadas nomundo estando em aproximadamente 15 das linhas de coacutedigo disponiacuteveis pela inter-net [11] A quantidade de plataformas suportadas pela linguagem e com o advento dosistema operacional Android sendo rodado na maior parte dos smartphones do mundoaleacutem da simplicidade em codificar no paradigma orientado a objetos foram os fatoresrelevantes para que a linguagem se popularizasse no mundo digital [26]

Tabela 31 As versotildees anteriores de java e principais caracteriacutesticasVersatildeo Principais caracteriacutesticasJava 10 JVM e JDKJava 2 Event Listeners

Kestrel (Java 3) HotSpot JVMMerlin (Java 4) Diversas novas APIs como Assertion e expressotildees regularesTiger (Java 5) Generics

Mustang (Java 6) Web ServicesDolphin (Java 7) Suporte a linguagens dinamicas

32 Princiacutepios

Com o foco em alcanccedilar a Web e participar mais ativamente do mercado virtual e e-Commerce foram projetados princiacutepios que permitissem com que a linguagem pudessealcanccedilar seus objetivos principais ao mesmo tempo que mantinha a facilidade e fami-liarizaccedilatildeo da linguagem a seus desenvolvedores [27] Dessa forma a equipe da Oracledeterminou cinco princiacutepios que caracterizariam o foco da linguagem Java

bull simples orientada a objeto e familiar projetada para ser orientada a objeto epermitir que seus desenvolvedores comecem a codificar rapidamente sem a necessi-dade de uma curva de aprendizagem acentuada

bull segura e robusta projetada para prover software confiaacutevel por meio de checagensa tempo de compilaccedilatildeo e execuccedilatildeo Haacute uma grande preocupaccedilatildeo com seguranccediladevido agrave larga utilizaccedilatildeo da linguagem em sistemas distribuiacutedos

bull de arquitetura neutra e portaacutevel projetada para ser independente de qualquerarquitetura bastando rodar a JVM dessa forma garantindo a portabilidade paravaacuterios ambientes e dispositivos

14

bull executada em alta performance projetada para fornecer a maior performancepossiacutevel em tempo de execuccedilatildeo com a utilizaccedilatildeo do garbage collector em uma threadde baixa prioridade

bull interpretada dinacircmica e threaded projetada para ser interpretada por qual-quer dispositivo que possua JVM desenvolvida garantindo um desenvolvimento raacute-pido e em ciclos O uso da classe Thread permite que a linguagem acompanhe atendecircncia do paralelismo Aleacutem disso a ligaccedilatildeo de classes eacute feita em tempo real esomente quando necessaacuteria tornando-a dinacircmica

33 Evoluccedilatildeo

A primeira versatildeo do Java 8 foi lanccedilada em 2014 [28] e apresentou diversas atualizaccedilotildeesespalhadas em categorias como linguagem seguranccedila Collections ferramentas deployentre outras Dentre a grande quantidade de mudanccedilas os destaques se encontraram nasnovas melhorias presentes na linguagem que afetaram de forma mais direta a maneiracom que os desenvolvedores passaram a tratar e organizar o coacutedigo fonte As atualizaccedilotildeesreferentes a linguagem descritas oficialmente pela Oracle [29] satildeo

1 Lambda Expressions ou apenas Expressotildees Lambda correspondem a uma novacaracteriacutestica que permite que uma pequena funcionalidade possa ser utilizada comoum argumento de um meacutetodo facilitando a escrita de accedilotildees que seratildeo feitas repetida-mente em uma Collection ou quando um processo se completa ou quando encontraum erro Eacute tambeacutem uma forma compacta de se escrever coacutedigo que previamenteera escrito com anonymous inner classes [29] A Listagem 31 mostra uma classehipoteacutetica Calculator cujo meacutetodo operateBinary() recebe como paracircmetro doisinteiros e um objeto da classe IntegerMath que representa a operaccedilatildeo que deveraacuteser realizada ou seja uma funcionalidade dinacircmica

1 pub l i c c l a s s Ca l cu la to r 2

3 i n t e r f a c e IntegerMath 4 i n t opera t i on ( i n t a i n t b) 5 6

7 pub l i c i n t operateBinary ( i n t a i n t b IntegerMath op ) 8 re turn op opera t i on (a b) 9

10

11 pub l i c s t a t i c void main ( St r ing a rgs ) 12

15

13 Calcu la to r myApp = new Ca lcu la to r ( ) 14 IntegerMath add i t i on = (a b) minusgt a + b 15 IntegerMath subt ra c t i on = (a b) minusgt a minus b 16 System out p r i n t l n ( 40 + 2 = +17 myApp operateBinary (40 2 add i t i on ) ) 18 System out p r i n t l n ( 20 minus 10 = +19 myApp operateBinary (20 10 sub t ra c t i on ) ) 20 21 22

Listagem 31 Exemplo de coacutedigo com o uso de Expressatildeo Lambda [30]

2 Method References Frequentemente expressotildees lambda criam meacutetodos anocircni-mos Algumas vezes poreacutem satildeo utilizadas para chamar um meacutetodo jaacute existentena classe Ao inveacutes de escrever a expressatildeo Lambda para esse caso pode-se optarpor utilizar um Method Reference que facilita a escrita e leitura desse uso de ex-pressatildeo Lambda [29] A Listagem 32 mostra um exemplo de um meacutetodo estaacuteticoque compara duas pessoas pelas suas idades e a Listagem 33 a utilizaccedilatildeo de MethodReference para aplicar a utilizaccedilatildeo desse meacutetodo em um array e reduzir a escrita deuma expressatildeo lambda a uma forma mais legiacutevel

1 pub l i c s t a t i c i n t compareByAge ( Person a Person b) 2 re turn a b i r thday compareTo (b b i r thday ) 3 4

Listagem 32 Exemplo de meacutetodo de uma classe Pessoa [31]

1 Arrays s o r t ( rosterAsArray Person compareByAge ) 2

Listagem 33 Exemplo de uso de Method Reference [31]

3 Default Methods satildeo meacutetodos com a palavra-chave default que servem para adi-cionar implementaccedilotildees de meacutetodos a uma interface de alguma biblioteca mantendoa compatibilidade binaacuteria com versotildees mais antigas dessa interface Tambeacutem pos-sibilita a implementaccedilatildeo de meacutetodos estaacuteticos em interfaces [29] A Listagem 34apresenta a inclusatildeo de um meacutetodo default na interface TimeClient

1 pub l i c i n t e r f a c e TimeClient 2 void setTime ( i n t hour i n t minute i n t second ) 3 void setDate ( i n t day i n t month i n t year ) 4 void setDateAndTime ( i n t day i n t month i n t year 5 i n t hour i n t minute i n t second )

16

6 LocalDateTime getLocalDateTime ( ) 7

8 s t a t i c ZoneId getZoneId ( S t r ing zoneStr ing ) 9 t ry

10 re turn ZoneId o f ( zoneStr ing ) 11 catch ( DateTimeException e ) 12 System e r r p r i n t l n ( I n v a l i d time zone + zoneStr ing

+13 us ing d e f a u l t time zone in s t ead ) 14 re turn ZoneId systemDefault ( ) 15 16 17

18 d e f a u l t ZonedDateTime getZonedDateTime ( St r ing zoneStr ing ) 19 re turn ZonedDateTime o f ( getLocalDateTime ( ) getZoneId (

zoneStr ing ) ) 20 21 22

Listagem 34 Exemplo de interface com um meacutetodo default [32]

4 Repeating Annotations permitem a implementaccedilatildeo e utilizaccedilatildeo de anotaccedilotildees deum mesmo tipo que podem ser utilizadas mais de uma vez para a mesma declara-ccedilatildeo [29] A Listagem 35 apresenta duas anotaccedilotildees iguais com paracircmetros diferentespermitindo uma customizaccedilatildeo maior na aplicaccedilatildeo de um tipo de anotaccedilatildeo

1 Schedule ( dayOfMonth= l a s t )2 Schedule (dayOfWeek= Fr i hour= 23 )3 pub l i c void doPeriodicCleanup ( ) 4

Listagem 35 Exemplo de Repeating Annotations [33]

5 Type Annotations permitem que anotaccedilotildees possam ser utilizadas em tipos aleacutemde declaraccedilotildees dessa forma pode-se garantir que um campo sempre atenda agraves suasexpectativas e evite testes desnecessaacuterios [29] A Listagem 36 mostra um exemplo derestriccedilatildeo a uma String que nunca poderaacute ser nula devido agrave anotaccedilatildeo de NonNull

1 NonNull S t r ing s t r

Listagem 36 Exemplo de Type Annotation garantindo que o campo nunca seja null [34]

17

34 Expressotildees Lambda

Uma das mudanccedilas mais interessantes implementadas no Java 8 foi a adiccedilatildeo de expressotildeeslambda As expressotildees lambda permitem que a linguagem Java possa atuar parcialmentecomo uma linguagem de programaccedilatildeo funcional onde comportamentos satildeo avaliados eaplicados diferentemente da programaccedilatildeo imperativa que foca na mudanccedila de estadosNa praacutetica um comportamento pode ser passado como paracircmetro de um meacutetodo atraveacutesde uma escrita mais reduzida e legiacutevel Os benefiacutecios de utilizar expressotildees lambda incluemuma melhora na legibilidade e organizaccedilatildeo de coacutedigo que antes era escrito com AnonymousInner Class aleacutem de permitir uma forma simples de utilizar comportamento paralelo como uso de Streams

341 Sintaxe

A sintaxe de uma expressatildeo lambda eacute dividida nas seguintes partes [30]

bull Uma lista de paracircmetros separados por viacutergulas

bull Um token representado por uma seta -gt

bull Um corpo que pode ser representado por uma expressatildeo uacutenica ou um bloco de coacutedigodentro de chaves

As Listagens 37 e 38 mostram duas formas diferentes de se aplicar expressotildees Lambdacom uma sintaxe similar A primeira aplica a expressatildeo diretamente apoacutes a seta utilizadanormalmente para trechos de coacutedigo pequenos e simples e a segunda utiliza-se de chavespara incorporar o coacutedigo e da palavra-chave return para especificar o retorno forma maisutilizada para uma quantidade maior de coacutedigo

1 p minusgt p getGender ( ) == Person Sex MALE2 ampamp p getAge ( ) gt= 183 ampamp p getAge ( ) lt= 25

Listagem 37 Exemplo de expressatildeo lambda com uma expressatildeo [30]

1 p minusgt 2 re turn p getGender ( ) == Person Sex MALE3 ampamp p getAge ( ) gt= 184 ampamp p getAge ( ) lt= 25 5

Listagem 38 Exemplo de expressatildeo lambda com um bloco de coacutedigo [30]

18

342 Principais formas de uso

Anonymous Inner Class

Antes do Java 8 a necessidade de passar funccedilotildees ou expressotildees como paracircmetro de algummeacutetodo era suprida atraveacutes de Anonymous Inner Classes A utilizaccedilatildeo desse tipo dedeclaraccedilatildeo junto com a anotaccedilatildeo de Override permite sobrescrever um meacutetodo de umainterface funcional e ao mesmo tempo passa-la como argumento para um meacutetodo Umaexpressatildeo lambda se comporta da mesma forma poreacutem a quantidade de coacutedigo escritopela Anonymous Inner Class eacute maior e pode dificultar a leitura de coacutedigo pois conteacutemmuita informaccedilatildeo natildeo utilizada para efetivo entendimento do que estaacute sendo feito naqueletrecho

A Listagem 39 apresenta a instanciaccedilatildeo da classe EventHandler internamente ao meacute-todo setOnAction() de forma que o desenvolvedor possa escrever o comportamento quedeseja passar como paracircmetro do meacutetodo atraveacutes da substituiccedilatildeo do meacutetodo handle()que jaacute existe pelo meacutetodo handle() criado e escrito pelo desenvolvedor

1 btn setOnAction (new EventHandlerltActionEvent gt() 2 Override3 pub l i c void handle ( ActionEvent event ) 4 System out p r i n t l n ( He l lo World ) 5 6 )

Listagem 39 Exemplo de uso de Anonymous Inner Class [35]

Interface funcional

Ao projetar um coacutedigo novo o desenvolvedor que optar por utilizar expressotildees lambdadeve iniciar com a criaccedilatildeo de uma interface funcional Esse tipo de interface possui umuacutenico meacutetodo abstrato permitindo que expressotildees lambda sejam usadas para sobrescrevero comportamento do meacutetodo abstrato Uma interface funcional pode possuir outros meacuteto-dos desde que sejam default Uma nova anotaccedilatildeo FunctionalInterface foi adicionadacom a atualizaccedilatildeo do Java 8 para conferir em tempo de compilaccedilatildeo se a interface satisfazos requisitos desse modelo de interface

A Listagem 310 apresenta um exemplo de interface funcional com o objetivo de permi-tir o uso de expressotildees lambda que utilizaratildeo de dois Double como paracircmetro e jaacute utilizada nova anotaccedilatildeo FunctionalInterface introduzida no Java 8

1 Funct iona l Inte r face2 pub l i c i n t e r f a c e DoubleOp 3 pub l i c Double apply ( Double a Double b)

19

4

Listagem 310 Exemplo de interface funcional

Dessa forma conforme as Listagens 311 e 312 o meacutetodo apply() pode tomar formade qualquer operaccedilatildeo entre dois Double que seraacute especificada quando a expressatildeo lambdafor montada dando o aspecto de linguagem funcional agrave linguagem e mais facilidade eliberdade ao desenvolvedor

1 pub l i c c l a s s Ca l cu la to r 2 pub l i c s t a t i c Double c a l c ( Double op1 Double op2 DoubleOp operator ) 3 re turn operator apply ( op1 op2 ) 4 5

Listagem 311 Exemplo de aplicaccedilatildeo da interface funcional

1 Double r e s u l t 1 = Ca lcu la to r c a l c (10d 50d ( a b ) minusgt a + b)

Listagem 312 Uso de expressatildeo lambda para o exemplo anterior

Collections

Dentre as atualizaccedilotildees de pacotes do Java 8 foi adicionado um meacutetodo stream() nainterface Collection Esse meacutetodo trata as Collection como streams o que significa queapesar de natildeo ser possiacutevel acessar elementos diretamente algumas novas manipulaccedilotildeessatildeo possiacuteveis Essas manipulaccedilotildees satildeo na verdade meacutetodos da interface Stream quepodem receber como paracircmetro uma expressatildeo lambda ou seja um comportamento a seraplicado agrave Collection Dentre os meacutetodos temos

bull filter() O meacutetodo filter() recebe uma expressatildeo lambda contendo uma condiccedilatildeopara filtragem da collection

bull map() O meacutetodo map() mapeia os elementos de uma Collection em outro objetocomo uma String A expressatildeo lambda passada por paracircmetro deve retornar o tipode objeto ao qual seraacute mapeado

bull forEach() O meacutetodo forEach() aplica uma operaccedilatildeo especiacutefica para cada ele-mento da Collection A expressatildeo lambda a ser passada deve conter a operaccedilatildeo aser realizada

bull min() e max() Os meacutetodos min() e max() retornam o elemento menor ou maiorda Collection dependendo da expressatildeo lambda passada como paracircmetro

20

A Listagem 313 demonstra como vaacuterias operaccedilotildees com uma Collection podem seraplicadas de uma vez de forma que lendo a expressatildeo lambda jaacute eacute possiacutevel saber oresultado da aplicaccedilatildeo do meacutetodo agrave Collection

1 r o s t e r2 stream ( )3 f i l t e r (4 p minusgt p getGender ( ) == Person Sex MALE5 ampamp p getAge ( ) gt= 186 ampamp p getAge ( ) lt= 25)7 map(p minusgt p getEmailAddress ( ) )8 forEach ( emai l minusgt System out p r i n t l n ( emai l ) )

Listagem 313 Exemplo de utilizaccedilatildeo de meacutetodos de stream com expressotildees lambda [30]

21

Capiacutetulo 4

Estudo e o Processo de Mineraccedilatildeo

A definiccedilatildeo da metodologia utilizada para realizaccedilatildeo deste trabalho eacute importante para queexista uma padronizaccedilatildeo e melhor entendimento de como os resultados foram obtidos paraque a replicaccedilatildeo do mesmo possa ser realizada em trabalhos futuros [36]

Figura 41 Processo utilizado para realizaccedilatildeo do estudo

O esquema representado na Figura 41 descreve o processo seguido para a realizaccedilatildeodeste trabalho que foi divido em trecircs grandes etapas a de planejamento definindo osobjetivos questotildees de pesquisa e meios de investigaccedilatildeo deste projeto a etapa de execuccedilatildeorealizando todo o procedimento metodoloacutegico definido para a coleta e refinamento de

22

dados e a etapa de avaliaccedilatildeo onde foram classificados e avaliados os dados coletadospara responder agraves questotildees de pesquisa

A seguir na primeira seccedilatildeo seratildeo apresentadas em detalhes as questotildees de pesquisa aserem respondidas Em seguida seraacute feito uma breve descriccedilatildeo da fonte de dados utilizada- especificamente os projetos utilizados como objetos de estudo deste trabalho e por fimtodo o restante da metodologia que foi de fato desenvolvida para obter os resultadosnecessaacuterios

41 Questotildees de Pesquisa

Com o objetivo de entender e caracterizar melhor o uso de expressotildees lambda foramdefinidas as seguintes questotildees de pesquisa a serem respondidas

bull PQ-1 Quando os projetos comeccedilaram a introduzir o uso de expressotildees lambda emseus coacutedigos e qual a meacutedia de expressotildees lambda por snapshots caso existam

bull PQ-2 Como as equipes de desenvolvimento estatildeo utilizando expressotildees lambdaatraveacutes de refatoraccedilatildeo de coacutedigo ou introduzindo apenas em coacutedigo novo

bull PQ-3 Quais satildeo os padrotildees tipicamente adotados para o uso de expressotildees lambda

A primeira pergunta de pesquisa gira em torno de como projetos populares open-sourceestatildeo se adaptando agrave introduccedilatildeo de expressotildees lambda em Java muitos projetos jaacute estatildeoutilizando as expressotildees lambda Se sim a partir de quando comeccedilaram a utilizaacute-lasdesde o iniacutecio da introduccedilatildeo das mesmas no Java 8 ou em um periacuteodo mais tardio Aleacutemdisso eacute interessante descobrir se a utilizaccedilatildeo dessa nova caracteriacutestica tem acontecido deforma expressiva ou natildeo

Em seguida para melhor entender a forma como as expressotildees lambda estatildeo sendointroduzidas em projetos eacute interessante investigar se as equipes de desenvolvimento estatildeose preocupando em refatorar coacutedigo com o objetivo de evoluir o software ou se estatildeoexperimentando utilizar expressotildees lambda apenas em coacutedigo novo introduzido

Como a introduccedilatildeo de novas funcionalidades em projetos open-source de grande escaladepende do objetivo do projeto e os padrotildees de projeto utilizados [37] espera-se obser-var diversas abordagens quanto a utilizaccedilatildeo de expressotildees lambda para entatildeo poderclassificar estes softwares quanto a abordagem utilizada

Eacute de grande importacircncia para este estudo conseguir identificar na praacutetica comoexpressotildees lambda estatildeo sendo tipicamente adotadas nestes projetos Assim a terceirapergunta de pesquisa busca identificar alguns exemplos de utilizaccedilatildeo atraveacutes da realizaccedilatildeode alguns estudos de caso

23

Eacute importante ressaltar que apesar de as expressotildees lambda serem uma alternativa aouso de AIC elas natildeo os substituem completamente Existem precondiccedilotildees para que umaAIC possa ser substituiacuteda por expressotildees lambda [12] descritas a seguir

bull AIC deve instanciar-se de uma interface

bull AIC natildeo deve possuir nenhum campo e declarar apenas um meacutetodo

bull AIC natildeo deve possuir uma referecircncia para this ou super

bull AIC natildeo deve declarar um meacutetodo recursivo

Para responder agrave primeira pergunta apenas dados gerais sobre todos os projetos seratildeonecessaacuterios ao passo que pelas perguntas 2 e 3 possuiacuterem uma natureza mais complexaseraacute necessaacuterio aleacutem de uma anaacutelise geral estatiacutestica a realizaccedilatildeo de alguns estudos decaso para obter resultados mais completos

42 Fonte de Dados e Objetos de Estudo

Para responder agraves perguntas de pesquisa estabelecidas foram selecionados os 99 projetosmais populares na linguagem Java dentro da plataforma github ateacute a data da coleta dosdados feita em Abril de 2017 Satildeo considerados populares os repositoacuterios que possuema maior quantidade possiacutevel de estrelas (stars) A decisatildeo de escolher os 99 projetos maispopulares foi por sua natureza imparcial e ao mesmo tempo para que se possa analisarprojetos que satildeo de familiaridade e conhecimento da comunidade do github e de domiacuteniopuacuteblico Os 99 projetos estatildeo listados no Anexo I

Para entender a transiccedilatildeo feita por esses projetos entre as versotildees anteriores do Java eo Java 8 com as expressotildees lambda eacute necessaacuterio analisar o coacutedigo de vaacuterias versotildees a fimde observar alguma mudanccedila para cada projeto Como satildeo 99 projetos e vaacuterios dessesprojetos possuem milhares de linhas de coacutedigo e commits seria impossiacutevel avaliar todosos commits Optou-se entatildeo por coletar snapshots mensais de cada projeto conformeprocedimento tambeacutem seguido anteriormente [38] Cada snapshots representa o estadodo projeto em um determinado mecircs e como criteacuterio de escolha padratildeo todos os snapshotsequivalem ao uacuteltimo commit realizado no determinado mecircs que este representa

O proacuteximo passo eacute determinar o periacuteodo de tempo em que esses snapshots seriamcoletados Como Java 8 (e consequentemente as expressotildees lambda) foi introduzidoapenas em meados de 2014 [28] coletar dados de projetos a partir de um periacuteodo muitoantes deste ano natildeo agregaria valor ao estudo em questatildeo Definiu-se entatildeo um periacuteodopara a coleta mensal desses snapshots atraveacutes dos anos Janeiro de 2013 um ano antesda introduccedilatildeo do Java 8 para que se pudesse identificar para todos os projetos o mecircs

24

exato em que expressotildees lambda foram introduzidas ateacute o mecircs da coleta de dados Abrilde 2017

Eacute importante ressaltar que a definiccedilatildeo dos meses foi definida do dia primeiro de ummecircs ao dia primeiro do proacuteximo mecircs e por consequecircncia alguns snapshots que deveriamrepresentar o final de determinado mecircs correspondem na verdade a commits realizadosno dia primeiro do mecircs seguinte Por exemplo pode existir casos em que o commit querepresente o mecircs de Marccedilo de 2016 seja na verdade o commit realizado no dia primeirode Abril de 2016 Isso se deve a natureza da forma como os resultados de log de commitssatildeo obtidos pelo git [39] Poreacutem isso natildeo interfere nas anaacutelises ou no propoacutesito destetrabalho uma vez que foram realizadas verificaccedilotildees e validaccedilotildees para que natildeo existamdatas repetidas (e consequentemente commits repetidos) por repositoacuterio

Neste trabalho o termo projeto e repositoacuterio foram utilizados de forma intercaladapara representar a mesma coisa o software desenvolvido que possui um repositoacuterio naplataforma github Os termos commit snapshops e versotildees tambeacutem representam a mesmacoisa uma vez que foi definido que seriam utilizados apenas um commit por mecircs pararepresentar um determinado snapshot ou versatildeo do repositoacuterio em questatildeo

Todos os 99 projetos seratildeo utilizados para a realizaccedilatildeo de uma anaacutelise geral de ca-racterizaccedilatildeo do uso de expressotildees lambda Para as anaacutelises aprofundadas foi feito umcriteacuterio de classificaccedilatildeo para que apenas alguns projetos possam ser analisados em niacutevelde coacutedigo como estudos de caso

Resumindo foram escolhidos os 99 projetos mais populares de Java no github cole-tando dados mensais de seus commits a partir do ano de 2013 ateacute a data da coleta dosdados lembrando que nem todos os projetos existem desde 2013 (projetos mais recentes)

43 Processo de Mineraccedilatildeo

A abordagem utilizada para coletar e analisar os 99 projetos escolhidos como mostra aFigura 42 foi realizada de forma automatizada utilizando scripts python e dois projetosdesenvolvidos em Java para a coleta e tratamento de dados como descrito a seguir

Primeiramente foi realizado uma coacutepia dos repositoacuterios atuais de todos os 99 projetosmais populares do github em Java Para automatizar o processo foi desenvolvido umscript em python que lista todos os projetos escolhidos clona todos os repositoacuterios emuma pasta na maacutequina local e cria um arquivo temporaacuterio com as informaccedilotildees do nomede cada repositoacuterio e seu caminho absoluto na maacutequina local

25

Figura 42 Metodologia implementada para coleta e tratamento de dados

Em seguida foi necessaacuterio realizar o checkout de todas as versotildees entre Janeiro de2013 a Abril de 2017 de cada projeto Por motivos de otimizaccedilatildeo de espaccedilo da maacutequinalocal e automatizaccedilatildeo no processo de checkout utilizou-se de um segundo script pythonque realizava as seguintes tarefas para cada mecircs em cada projeto verificar se dentreo mecircs estipulado houve algum commit para aquele projeto se sim pega-se o hash douacuteltimo commit do mecircs realiza o checkout conta-se a quantidade de linhas de coacutedigo emJava que o projeto tem utilizando a biblioteca cloc e armazena todas as informaccedilotildeespertinentes referentes a todos os projetos que naquele mecircs tiveram commits para que oprojeto static-analysis possa entatildeo ser executado sobre esses projetos naquele determinadomomento As informaccedilotildees coletadas que satildeo utilizadas pelo static-analysis correspondemao nome do projeto o hash do commit para aquela versatildeo a pasta onde o projeto estaacutearmazenado na maacutequina local a quantidade de linhas de coacutedigo Java do projeto e datareferente ao commit Essas informaccedilotildees satildeo pertinentes para que o projeto static-analysisconsiga funcionar de forma correta projeto este descrito em detalhes a seguir

431 static-analysis

O static-analysis foi um projeto desenvolvido anteriormente a este trabalho pelos alunosThiago Cavalcanti e Vinicius de Almeida cujo objetivo eacute realizar a anaacutelise estaacutetica de

26

coacutedigos-fonte Java e gerar arquivos de saiacuteda contendo informaccedilotildees de classes e meacutetodoscom suas devidas ocorrecircncias de caracteriacutesticas da linguagem [40]

A anaacutelise estaacutetica de coacutedigo consiste em analisar um coacutedigo-fonte sem a necessidadede executaacute-lo Esse tipo de anaacutelise eacute de extrema importacircncia para manter um coacutedigo dequalidade evitar futuras refatoraccedilotildees e obter informaccedilotildees estatiacutesticas de forma raacutepida epraacutetica [41]

Seguindo esse princiacutepio o static-analysis foi projetado para receber um arquivo deentrada csv seguindo o padratildeo

Tipo da Aplicaccedilatildeo Inicio do projeto Antes ou Apoacutes Java 5 Nome do ProjetoVersatildeo Caminho absolutoQuantidade de linhas de coacutedigo

Atraveacutes da informaccedilatildeo do caminho absoluto do projeto o static-analysis varre osdiretoacuterios em busca dos arquivos fonte java realiza o parse desses arquivos e utilizade Visitors para extrair as informaccedilotildees desejadas e exporta-las em arquivos csv Ouso de Visitors permite que sejam escolhidas as informaccedilotildees desejadas para a consultacomo expressotildees Lambda e AIC s aleacutem de possibilitar que sejam implementados novosVisitors conforme a linguagem evolua ou as necessidades mudem

Para este trabalho foram utilizados os Visitors de expressotildees Lambda map() filter()AICs e declaraccedilotildees de meacutetodos

432 BDAnalisador

Apoacutes obter todas as informaccedilotildees necessaacuterias geradas pelo static-analysis era preciso ma-nipular os dados de forma que facilitasse a coleta de dados para o estudo proposto Comovaacuterios arquivos em formato csv satildeo de difiacutecil manipulaccedilatildeo foi desenvolvido entatildeo umaferramenta chamada BDAnalisador Esta ferramenta eacute responsaacutevel por processar os arqui-vos em csv gerados pelo static-analysis e popular uma base de dados relacional MySQLcom as informaccedilotildees pertinentes a este estudo

O BDAnalisador foi desenvolvido com a intenccedilatildeo de tornar mais simples o trabalhocom os dados resultantes do static-analysis de forma que consultas em SQL pudessemser feitas a ponto de permitir a obtenccedilatildeo de resultados mais complexos Seguindo esseobjetivo o framework Hibernate foi escolhido como ferramenta para persistecircncia devidoa ser um framework jaacute consolidado no mercado e que de forma simples relaciona osobjetos Java ao banco de dados MySQL [42] A divisatildeo de classes foi projetada em quatroentidades Projeto Versao Classe e Metodo cada uma com seus respectivos camposcontendo as informaccedilotildees necessaacuterias para a pesquisa como pode ser visto na Figura 44Eacute importante ressaltar que a tabela de Versao guarda hashs de commits devido agrave escolhade utilizar commits para obter mais informaccedilatildeo de evoluccedilatildeo de coacutedigo em um menor

27

espaccedilo de tempo Aleacutem disso para este trabalho optou-se por persistir todos os meacutetodose classes de cada versatildeo sem se importar com a repeticcedilatildeo desses dados pois a hipoacutetesede haver grandes refatoraccedilotildees entre versotildees poderia comprometer a confiabilidade dasinformaccedilotildees

Figura 43 Diagrama de classes UML do BDAnalisador

Como visto na Figura 43 seguindo parcialmente a arquitetura MVC cada entidadepossui sua respectiva classe DAO(Data Access Object) para persistecircncia dos dados eapenas uma classe Controlador no projeto responsaacutevel pela manipulaccedilatildeo e parse dosdados dos arquivos csv gerados pelo static analysis para serem enviados agraves classes DAOO sistema inicia chamando o meacutetodo inicializar() da classe Controlador Esse meacutetodoeacute responsaacutevel por ler um arquivo de entrada csv que segue o mesmo modelo do arquivo dostatic-analysis citado na seccedilatildeo anterior O arquivo conteacutem os dados de todos os projetose suas respectivas versotildees dessa forma o meacutetodo instancia um objeto da classe Projetoe persiste o projeto no banco de dados Para cada versatildeo encontrada no arquivo deentrada o inicializar() aciona os meacutetodos responsaacuteveis por instanciar e preencher aslistas da classe Classe e Metodo Os meacutetodos responsaacuteveis por preencher as listas varremos arquivos csv gerados pelo static-analysis e fazem o parse das informaccedilotildees relevantescomo nomes dos meacutetodos e quantidades de lambdas para construir os objetos que seratildeogravados Ao final dos preenchimentos o objeto Versatildeo eacute instanciado e gravado no bancode dados atraveacutes de sua classe DAO ao mesmo tempo que grava suas respectivas Classese Metodos

28

Apoacutes vaacuterios testes e correccedilotildees de bugs o banco de dados se encontrava finalmente comas informaccedilotildees de 99 projetos Java open-source separados por um commit por mecircs desde2013 cada um com suas respectivas informaccedilotildees de classes meacutetodos e a quantidade deexpressotildees lambda filters e maps em cada meacutetodo Filter ou Filter pattern eacute o padratildeode projeto que tem como objetivo filtrar objetos de uma coleccedilatildeo (Collection) de acordocom algum criteacuterio Jaacute o map ou map pattern eacute um padratildeo que ldquomapeia os elementosde uma coleccedilatildeo aplicando uma funccedilatildeo a eles para uma nova coleccedilatildeo [43] A coleta deinformaccedilotildees sobre esses padrotildees podem ser uacuteteis para possiacuteveis anaacutelises de oportunidadesde uso de expressotildees lambda para refatoraccedilatildeo de coacutedigo

A Figura 44 mostra o esquema de como o banco de dados resultante foi gerado

Figura 44 Modelo relacional do banco de dados populado pelo BDAnalisador Imagemgerada com software DBeaver [2]

44 Classificaccedilatildeo e Anaacutelise

Com o banco de dados populado restam apenas as etapas de classificaccedilatildeo e anaacutelise pararesponder as questotildees de pesquisa propostas Para isso inicialmente houve uma tentativade se utilizar apenas queries SQL para analisar os dados de acordo com as informaccedilotildeesrelevantes Poreacutem devido ao fato de o banco de dados conter todas as informaccedilotildees detodos os projetos e todas as suas versotildees queries que possuem uma alta complexidadedemoravam muito tempo para retornar os dados

Assim com o objetivo de facilitar o trabalho alguns scripts python foram desenvolvi-dos para rodar as queries separadamente e individualmente para cada projeto de formaautomatizada a fim de melhorar o tempo de resposta para obtenccedilatildeo dos resultados

29

441 Meacutedia de Lambda

O primeiro script retorna a quantidade de expressotildees lambda (ou AICs) por n snapshotsque contenha expressotildees lambda O objetivo eacute ter uma visatildeo geral da meacutedia de expressotildeeslambda e AICs utilizadas por cada projeto e como nem todos os snapshots coletados decada projeto possuem expressotildees lambda e AICs apenas aqueles com alguma expressatildeolambda ou AIC satildeo incluiacutedos no caacutelculo da meacutedia

Mmedia =sumn qtdLambdai

n

442 Anaacutelise Temporal

O segundo script retorna para cada projeto a soma total da quantidade de expressotildeeslambda AIC map() e filter() no projeto inteiro para cada versatildeo Ou seja tem-seo total de cada uma das quatro propriedades selecionadas para cada mecircs do projetoobtendo assim uma visatildeo temporal de evoluccedilatildeo do uso das caracteriacutesticas descritas ATabela 41 ilustra parcialmente o resultado obtido para o projeto agera onde idVersaoeacute o identificador no banco de dados referente ao hash do commit mensal coletado qtd eacutea quantidade de cada uma das caracteriacutesticas escolhidas e a data do commit encontra-seno formato americano

Tabela 41 Informaccedilotildees mensais sobre o projeto ageraidVersao Data do Commit qtd lambda qtd AIC qtd maps qtd filter

823 512016 0 29 4 0755 612016 13 28 4 0686 6152016 13 29 4 0621 812016 13 29 4 0555 8162016 13 30 4 0485 922016 13 30 4 0422 10132016 14 30 4 0356 11282016 14 30 4 0295 12212016 21 30 5 0232 212017 21 30 5 0175 312017 21 30 5 0112 3312017 21 36 5 048 4242017 21 48 5 0

Os resultados obtidos com esta anaacutelise temporal permitiu a identificaccedilatildeo de padrotildees nautilizaccedilatildeo de expressotildees lambda em relaccedilatildeo a utilizaccedilatildeo de AIC por todos os projetos Foi

30

possiacutevel classificar todos os projetos em 6 grupos ilustrado na Figura 45 Primeiramenteseparou-se os projetos entre os que possuem expressotildees lambda e os que natildeo possuemDentre os que possuem identificou-se cinco categorias

1 Grupo 1 Quantidade de AICs e expressotildees lambda aumentam com o tempo pro-porcionalmente

2 Grupo 2 Quantidade de AICs diminui agrave medida que a quantidade de expressotildeeslambda aumentam e a quantidade de expressotildees lambda ultrapassa a quantidade deAIC em um determinado momento

3 Grupo 3 Quantidade de AICs diminui agrave medida que a quantidade de expressotildeeslambda aumentam mas a quantidade de AIC permanece superior agrave quantidade delambda

4 Grupo 4 Expressotildees lambda satildeo introduzidas e existem por um pequeno periacuteodode tempo mas satildeo completamente removidas posteriormente

5 Grupo 5 Quantidade de expressotildees lambda eacute constante e muito inferior compa-rado com a quantidade de AICs no projeto Foi determinado que para pertencera esta classificaccedilatildeo o projeto precisa ter uma razatildeo de meacutedia de expressotildees lamb-dasnapshot por meacutedia de AICsnapshot inferior a 020 Esse paracircmetro foi esta-belecido com o objetivo de definir um padratildeo para o que pode ser considerado umprojeto com poucas expressotildees lambda

Figura 45 Classificaccedilatildeo dos projetos

31

443 Refatoraccedilatildeo de Coacutedigo

O uacuteltimo script teve como objetivo realizar uma tentativa inicial de identificar refatoraccedilatildeode coacutedigo da seguinte maneira para todos os projetos que possuem expressotildees lambdaforam identificados o mecircs imediatamente antes da introduccedilatildeo de expressotildees lambda e omecircs seguinte onde houve a primeira ocorrecircncia de lambda no projeto Assim realizou-se uma anaacutelise do tamanho em quantidade de linhas de coacutedigo de todos os meacutetodosdo projeto que no mecircs seguinte tiveram introduccedilatildeo de lambda Em seguida fez-se umacomparaccedilatildeo com os mesmos meacutetodos em relaccedilatildeo ao mecircs anterior e assim foi possiacuteveldetectar quais meacutetodos tiveram a quantidade de linhas de coacutedigo reduzidas o que seriaum indicativo natildeo necessariamente exclusivo de que uma refatoraccedilatildeo de coacutedigo possa terocorrido

Sabe-se que este meacutetodo de detecccedilatildeo de refatoraccedilatildeo de coacutedigo possui suas limitaccedilotildeesuma vez que as comparaccedilotildees para saber se um meacutetodo existe em ambas versotildees eacute feitopuramente por comparaccedilatildeo de String (nome do meacutetodo) e a classe que este pertence

444 Casos de Uso

Os meacutetodos descritos acima ajudaram a identificar alguns padrotildees e facilitar a anaacutelise dosdados Poreacutem natildeo satildeo suficientes para que se possa responder agraves questotildees de pesquisaDessa forma apoacutes a identificaccedilatildeo dos grupos de classificaccedilatildeo para os projetos foramescolhidos um projeto de cada grupo (com exceccedilatildeo do grupo dos projetos sem expressotildeeslambda) para realizar um breve estudo de caso com o objetivo de identificar e caracterizarmelhor a adoccedilatildeo de expressotildees lambda Os projetos escolhidos foram agera vertxAndroid-CleanArchitecture RxJava e guava

32

Capiacutetulo 5

Resultados Obtidos e Anaacutelise

Neste capiacutetulo seratildeo apresentados os dados obtidos e anaacutelise com o objetivo de responderagraves questotildees de pesquisa propostas Como mencionado anteriormente as perguntas seratildeorespondidas de duas maneiras algumas com informaccedilotildees gerais sobre todos os projetose outras com breve estudos de caso envolvendo cinco projetos

51 Visatildeo Geral

Dentre os repositoacuterios coletados para a anaacutelise 74 (7474) natildeo utilizaram nenhumaexpressatildeo lambda no projeto durante todo o periacuteodo analisado (Janeiro de 2013 a Abrilde 2017) restando apenas 25 repositoacuterios (2525) com expressotildees lambda Eacute interessantedestacar que apesar de a quantidade de repositoacuterios que natildeo possuem expressotildees lambdaser relativamente expressiva muitos destes repositoacuterios satildeo de projetos em Java que umdia foram populares e atualmente natildeo estatildeo sendo mais desenvolvidos (por exemplo umaplicativo que soacute funciona para Android 23 atualmente descontinuado)

Levando em consideraccedilatildeo apenas os projetos que possuem expressotildees lambda exis-tem dois tipos de dados que podem ser analisados para responder agrave primeira questatildeo depesquisa atraveacutes dos dados obtidos pelo meacutetodo anteriormente mencionado como anaacutelisetemporal e a meacutedia de lambda por snapshot mencionados no capiacutetulo anterior

Com relaccedilatildeo ao ano em que a primeira ocorrecircncia foi encontrada 6 projetos introduzi-ram expressotildees lambda jaacute em 2014 8 comeccedilaram a utilizar em 2015 7 em 2016 e apenas4 tiveram a primeira ocorrecircncia de expressotildees lambda em 2017 Dessa forma percebe-seque os projetos estatildeo relativamente bem distribuiacutedos em grupos quanto ao ano em que seintroduziu expressotildees lambda

Pela meacutedia de lambda por snapshot (lambdasnapshot) a maioria (11 projetos) possuiuma quantidade expressiva acima de 100 lambdasnapshot (com 6 projetos entre 20 e 100lambdasnapshot e 8 projetos com menos de 20 lambdasnapshot) como apresentados no

33

graacutefico da Figura 51 Isso mostra que essa nova caracteriacutestica jaacute estaacute sendo bem utilizadanos projetos que comeccedilaram a migrar para a nova versatildeo do Java

Figura 51 Graacuteficos dos projetos separados por ano de introduccedilatildeo de expressotildees lambdae meacutedia de lambda por snapshot

Com isso pode-se observar que apesar de a quantidade de projetos que possuemexpressotildees lambda natildeo ser tatildeo alta eacute possiacutevel obter resultados expressivos uma vez quea quantidade dos projetos com lambda estatildeo bem dispersos quanto ao periacuteodo em quecomeccedilaram a adotar essa caracteriacutestica e a quantidade de expressotildees lambda por snapshot

511 Projetos Selecionados

Atraveacutes dos grupos de classificaccedilatildeo identificados pela anaacutelise temporal descritos na Figura45 cinco projetos foram selecionados para uma anaacutelise detalhada levando em consideraccedilatildeoo grupo em que eles pertencem Estes projetos seratildeo apresentados a seguir

512 agera

Agera eacute uma biblioteca Android que ajuda a introduzir programaccedilatildeo funcional reativa(functional reactive programming) em projetos Android Eacute um projeto recente lanccediladoem 2016 pela Google [44] e encontra-se no grupo dos projetos que introduziram expressotildeeslambda em 2016 no mesmo ano de seu lanccedilamento contendo uma meacutedia de expressotildeeslambda de 16 lambdasnapshot

Na classificaccedilatildeo estabelecida agera pertence ao Grupo 1 onde a quantidade de ex-pressotildees lambda no projeto com o tempo aumentam juntamente com a quantidade deAICs como mostra o graacutefico de anaacutelise temporal na Figura 52

34

Figura 52 Graacuteficos de anaacutelise temporal do projeto agera

513 vertx

Eclipse Vertx eacute um conjunto de ferramentas para criaccedilatildeo de reactive applications namaacutequina virtual Java (JVM) em grande escala [45] Seu primeiro lanccedilamento aconteceuem 2011 e a primeira ocorrecircncia de expressotildees lambda no projeto aconteceu em 2014 Esteprojeto possui uma meacutedia de 2867 lambdasnapshot e dentre os projetos consideradosneste trabalho eacute o que possui a maior quantidade de expressotildees lambda

Este projeto pertence ao Grupo 2 onde a quantidade de expressotildees lambda aumen-tou consideravelmente pelos meses ultrapassando a quantidade de AICs que diminuiudrasticamente como mostra a Figura 53

35

Figura 53 Graacuteficos de anaacutelise temporal do projeto Vertx

514 Android-CleanArchitecture

Apesar de ser uma amostra de projeto Android-CleanArchitecture que tem como objetivoconstruir aplicaccedilotildees Android utilizando clean architecture foi lanccedilado em 2014 mas semanteacutem sempre atualizado [46]

A introduccedilatildeo de expressotildees lambda que aconteceu no ano de 2015 se deu de formatiacutemida com uma meacutedia de 35 lambdasnapshot De qualquer forma este projeto conseguerepresentar com seu graacutefico de anaacutelise temporal o grupo 3 composto por projetos em quea quantidade de expressotildees lambda aumentou mas sem ultrapassar AICs que diminuiacuteramdemonstrado no graacutefico da Figura 54

36

Figura 54 Graacuteficos de anaacutelise temporal do projeto Android-CleanArchitecture

515 RxJava

Dentre os repositoacuterios estudados RxJava eacute considerado o mais popular Como umaimplementaccedilatildeo de Reactive Extensions para a JVM RxJava teve seu lanccedilamento dadoem 2013 [47] Expressotildees lambda apareceram pela primeira vez no ano de 2015 comuma meacutedia de 766 lambdasnapshot

Apesar de uma meacutedia relativamente alta o tempo de vida das expressotildees lambda nesteprojeto foi bem curto caracterizando assim projetos do grupo 4 houve a introduccedilatildeo dasexpressotildees lambda no projeto poreacutem houve a remoccedilatildeo completa de todas as expressotildeeslambda previamente introduzidas desaparecendo completamente do projeto ateacute a datada coleta de dados (Figura 55)

37

Figura 55 Graacuteficos de anaacutelise temporal do projeto RxJava

516 guava

Guava eacute um conjunto de bibliotecas para Java da Google lanccedilado em 2011 A atualizaccedilatildeodo coacutedigo do projeto para Java 8 aconteceu somente em 2016 e apesar do projeto conteruma meacutedia de 281 lambdasnapshot ele foi escolhido como representante dos projetosdo Grupo 5 (Figura 56) que possuem expressotildees lambda mas de forma natildeo expressiva osuficiente quando comparado com a quantidade de AIC pelo fato de sua razatildeo de meacutedia delambdasnapshot por meacutedia de AICsnapshot ser 004 Ou seja embora o projeto tenhaexpressotildees lambda estas satildeo consideradas muito poucas quando inseridas no contextogeral deste projeto que eacute considerado um projeto grande

38

Figura 56 Graacuteficos de anaacutelise temporal do projeto Guava

52 Refatoraccedilatildeo de Coacutedigo

Com o objetivo de caracterizar melhor como as expressotildees lambda estatildeo sendo utilizadaseacute interessante identificar se estas estatildeo sendo introduzidas atraveacutes de refatoraccedilatildeo de coacutedigoou em coacutedigo novo

Os projetos classificados como pertencentes ao Grupo 2 possuem em comum o fatode expressotildees lambda aumentarem a medida que AICs diminuem ultrapassando-as eessa caracteriacutestica em comum pode indicar que nestes projetos possivelmente houve re-fatoraccedilatildeo de coacutedigo visto que AIC sendo substituiacutedo por expressotildees lambda dentro dascondiccedilotildees determinadas eacute a maneira mais comum de se identificar refatoraccedilatildeo de coacute-digo para introduccedilatildeo de expressotildees lambda [12] Os projetos que compotildeem o grupo 2representam 44 de todos os projetos estudados que possuem expressotildees lambda o quepode ser um indicativo caso a hipoacutetese de refatoraccedilatildeo de coacutedigo seja positiva de quemuitos projetos que estatildeo adotando o Java 8 estatildeo se preocupando de alguma formacom refatoraccedilatildeo se coacutedigo Fazem parte desse grupo os seguintes projetos elasticsearchjava-design-patterns PocketHub presto RxJava-Android-Samples spark vertx zipkinjava8-tutorial dropwizard e material-dialogs

39

Outra maneira de verificar possiacuteveis indicadores de refatoraccedilatildeo de coacutedigo foi atraveacutesda anaacutelise dos tamanhos (em quantidade de linhas de coacutedigo) dos meacutetodos com expressotildeeslambda no mecircs em que se introduziu expressotildees lambda e um mecircs imediatamente antesdeste Essa anaacutelise mostra que dos 25 projetos com expressotildees lambda 12 (48) projetostiveram ao menos um meacutetodo em que houve uma diminuiccedilatildeo no tamanho o que podeser considerado um indicativo de refatoraccedilatildeo de coacutedigo A Figura 57 mostra todos osprojetos em relaccedilatildeo agrave quantidade total de meacutetodos que possuem lambda no primeiro mecircsde introduccedilatildeo do mesmo em vermelho comparado com a quantidade desses meacutetodos quetiveram uma diminuiccedilatildeo no tamanho quando comparados com o coacutedigo do mecircs anteriorem azul

Figura 57 Comparaccedilatildeo entre todos os projetos com expressatildeo lambda sobre refatoraccedilatildeode coacutedigo no mecircs de introduccedilatildeo da caracteriacutestica

Ainda observando a figura 57 com relaccedilatildeo aos projetos que natildeo tiveram nenhummeacutetodo com diminuiccedilatildeo de tamanho (barra azul) percebe-se que todos os 13 projetossequer tiveram uma quantidade significativa de meacutetodos que possuem expressotildees lambda(com o maior tendo apenas 5 meacutetodos) no mecircs de introduccedilatildeo da caracteriacutestica no projetoe ao mesmo tempo jaacute existiam no mecircs em que natildeo existia lambda no projeto Essa eacuteuma observaccedilatildeo importante porque projetos como vertx sendo este o que possui a maiormeacutedia de lambdasnapshot de todos os projetos e ao mesmo tempo tendo apenas trecircsmeacutetodos que continham expressotildees lambda no mecircs da introduccedilatildeo e que existiam no mecircs

40

anterior permitem inferir que todas as outras expressotildees lambda existentes no projetopara este determinado mecircs de introduccedilatildeo encontram-se em coacutedigo novo introduzido

Eacute importante ressaltar que somente essa anaacutelise natildeo eacute exclusivamente suficiente paradeterminar se estes projetos estatildeo realmente introduzindo lambda em coacutedigo novo ourealizando refatoraccedilatildeo uma vez que como a comparaccedilatildeo aconteceu apenas no mecircs deintroduccedilatildeo com o mecircs imediatamente anterior natildeo reflete todo o ciclo de vida do pro-jeto Por exemplo algumas equipes podem escolher refatorar o coacutedigo depois de umtempo de adaptaccedilatildeo apoacutes a transiccedilatildeo para a nova versatildeo da linguagem Assim paraobter uma melhor anaacutelise sobre refatoraccedilatildeo de coacutedigo ou natildeo feita nestes projetos aleacutemde outras anaacutelises referentes aos padrotildees tipicamente adotados para implementaccedilatildeo delambda nestes projetos seratildeo apresentados a seguir os estudos de caso dos cinco projetospreviamente selecionados

Outro ponto importante eacute o fato de que apesar das informaccedilotildees quanto agraves quantida-des de filter e map terem sido incluiacutedas inicialmente no trabalho para observar possiacuteveispadrotildees de refatoraccedilatildeo de coacutedigo percebeu-se que estas natildeo satildeo utilizadas de forma con-sideraacutevel pelos projetos estudados e para fins de anaacutelises generalizadas natildeo apresentaramtanta influecircncia na utilizaccedilatildeo de expressotildees lambda quanto a quantidade de AICs noprojeto

53 Estudos de Caso

Dentre os projetos analisados verificou-se que os projetos de pequeno e meacutedio porte op-taram por refatorar de uma vez seus coacutedigos para incluir expressotildees lambda em situaccedilotildeesem que se utilizava AICs anteriormente ou em alguns poucos casos de utilizaccedilatildeo deCollection Os projetos de grande porte natildeo apresentaram nenhuma refatoraccedilatildeo de coacute-digo ou uma refatoraccedilatildeo parcial gradativa provavelmente devido agrave grande quantidade dearquivos e coacutedigo que possuem o que pode tornar o trabalho de refatoraccedilatildeo extenso ecansativo

O projeto vertx que pertence ao grupo 2 dos projetos em que a quantidade de ex-pressotildees lambda aumentaram e as de AICs diminuiacuteram com lambda ultrapassando AICsexecutou inicialmente commits em maio de 2014 com adiccedilatildeo de coacutedigo novo utilizandoexpressotildees lambda e apoacutes um mecircs realizou um commit maior com a refatoraccedilatildeo de todasas AICs para expressotildees lambda Apoacutes a refatoraccedilatildeo o projeto se preocupou em mantera utilizaccedilatildeo de expressotildees lambda ao mesmo tempo que o uso de AICs se manteve apenasaos casos de classes com interfaces natildeo funcionais A Figura 58 apresenta uma parte docommit de refatoraccedilatildeo de coacutedigo que mostra em vermelho a parte eliminada do coacutedigo(AIC) e em verde o coacutedigo novo representando a substituiccedilatildeo por uma expressatildeo lambda

41

Figura 58 Commit de refatoraccedilatildeo de coacutedigo do projeto Vertx [3]

Alguns projetos ainda natildeo se preocuparam em refatorar o coacutedigo para o uso de ex-pressotildees lambda ateacute a data deste trabalho que eacute o caso do projeto guava que apresentouum commit em 03112016 com a atualizaccedilatildeo do projeto para Java 8 Mas a partir daatualizaccedilatildeo se preocupou em utilizar as expressotildees lambda apenas na implementaccedilatildeo decoacutedigo novo O cenaacuterio em que a refatoraccedilatildeo natildeo eacute prioridade ainda eacute a realidade de vaacuteriosprojetos de grande porte visto que os dados de projetos sem nenhuma expressatildeo lambdasatildeo o maior nuacutemero neste trabalho Poreacutem projetos que jaacute adotaram a utilizaccedilatildeo do Java8 tendem a mudar isso com o passar do tempo A Figura 59 apresenta em verde umaadiccedilatildeo de coacutedigo novo com expressatildeo lambda sem a eliminaccedilatildeo de algum coacutedigo anteriora esse que estaria em vermelho

42

Figura 59 Exemplo de um arquivo do commit de adiccedilatildeo de coacutedigo novo em Java 8 doprojeto Guava [4]

Na categoria de projetos em que os AICs e expressotildees lambda aumentam proporci-onalmente (grupo 1) o projeto agera realizou um commit em 19052016 com a adiccedilatildeoda biblioteca retrolambda como dependecircncia do projeto Essa biblioteca utilizada prin-cipalmente por projetos Android permite executar coacutedigo Java 8 contendo expressotildeeslambda em Java 5 6 e 7 [48] O commit tambeacutem apresenta refatoraccedilatildeo dos AICs ad-vindos de interfaces funcionais para expressotildees lambda Apesar de o projeto continuar autilizar as expressotildees lambda em seus commits posteriores o nuacutemero de AICs tambeacutemcontinuou a aumentar visualizando os commits posteriores notou-se que esses AICs satildeorelativos a interfaces natildeo funcionais ou seja que possuem mais de um meacutetodo O projetoAndroid-CleanArchitecture eacute similar ao agera pois tambeacutem optou pela instalaccedilatildeo da bi-blioteca retrolambda para uso de expressotildees lambda em seus coacutedigos e como tambeacutem eacuteum projeto de pequeno porte houve uma pequena refatoraccedilatildeo dos AICs A Figura 510mostra a parte do commit de refatoraccedilatildeo de coacutedigo em que o desenvolvedor adiciona abiblioteca retrolambda como dependecircncia

43

Figura 510 Commit de adiccedilatildeo da biblioteca Retrolambda no projeto Agera [5]

Outro caso interessante eacute o do projeto RxJava que em 2015 optou pela refatoraccedilatildeodo coacutedigo para a utilizaccedilatildeo de expressotildees lambda quase eliminando por completo o usode AICs mas que no ano seguinte reverteu os commits de forma que eliminasse comple-tamente o uso de expressotildees lambda para manter a retrocompatibilidade com o Java 6A Figura 511 demonstra uma parte do commit de reversatildeo do coacutedigo para Java 6 emque pode ser visto em vermelho o coacutedigo anterior com expressotildees lambda e o verde como novo coacutedigo utilizando AIC novamente

44

Figura 511 Commit de remoccedilatildeo de Lambdas e volta para o uso de AICs no projetoRXJava [6]

Essa preocupaccedilatildeo com retrocompatibilidade de coacutedigo pode ser um fator crucial nadecisatildeo das equipes de desenvolvimento na hora de decidir como fazer o software co-evoluircom a linguagem sem perder a compatibilidade com versotildees anteriores

45

Capiacutetulo 6

Consideraccedilotildees Finais

Este estudo permitiu entender melhor como projetos estatildeo realizando a migraccedilatildeo para oJava 8 em especial utilizando uma nova caracteriacutestica introduzida expressatildeo lambdaApesar de a maioria dos projetos populares considerados natildeo possuiacuterem nenhuma ocor-recircncia de expressotildees lambda os projetos que tinham expressotildees lambda foram suficientespara realizar um primeiro estudo de caracterizaccedilatildeo no uso desta caracteriacutestica e com osprojetos efetivamente utilizados para estudo foi possiacutevel agrupaacute-los quanto a maneira emque as expressotildees lambda estavam sendo utilizadas quando comparadas com AICs em 5grandes grupos quando AIC e lambda aumentam proporcionalmente quando AIC dimi-nui e lambda aumenta ultrapassando AIC quando AIC diminui mas continua superior aolambda crescente expressotildees lambda que foram introduzidas e retiradas completamentedo coacutedigo e expressotildees lambda que natildeo existem em quantidades expressivas

Foi possiacutevel entatildeo realizar um estudo aprofundado levando em consideraccedilatildeo as di-ferentes maneiras com que as expressotildees lambda foram adotadas nos projetos atraveacutes daescolha de um projeto que representasse cada grupo para anaacutelise Dentre os cinco projetosestudados foi possiacutevel observar alguns padrotildees tipicamente adotados por desenvolvedorespara implementar expressotildees lambda em seus projetos como a utilizaccedilatildeo da bibliotecas(retrolambda) que permitissem uma flexibilizaccedilatildeo na utilizaccedilatildeo de expressotildees lambda oucomo lambda eacute primariamente utilizada para substituir determinados AICs ou operaccedilotildeesem Collection

Aleacutem disso foi possiacutevel observar como a refatoraccedilatildeo de coacutedigo acontece em cada umdesses projetos Observou-se como projetos menores tendem a refatorar coacutedigo maisfacilmente ao passo que projetos maiores e mais complexos fazem menos refatoraccedilatildeo oudemoram mais entre o periacuteodo em que houve a primeira migraccedilatildeo de coacutedigo para a novaversatildeo da linguagem ateacute o periacuteodo em que realmente decidem refatorar coacutedigo Aleacutem dacomplexidade do projeto influenciar na decisatildeo de migrar o projeto para uma versatildeo maisrecente da linguagem a preocupaccedilatildeo com retrocompatibilidade com versotildees anteriores da

46

linguagem tambeacutem podem ser uma barreira para que projetos comecem a evoluir o coacutedigojuntamente com a evoluccedilatildeo da linguagem

Ainda assim foi possiacutevel observar que a preocupaccedilatildeo com a co-evoluccedilatildeo do software-linguagem existe entre os desenvolvedores de projetos mas a realizaccedilatildeo da migraccedilatildeo aindaacontece lentamente devido agrave diversos fatores que precisam ser levados em consideraccedilatildeopara a manutenccedilatildeo do projeto

Para trabalhos e contribuiccedilotildees futuras seria interessante desenvolver uma ferramentaque pudesse analisar diretamente no coacutedigo-fonte as oportunidades de aplicaccedilatildeo de ex-pressotildees lambda dessa forma poderiam ser analisadas as porcentagens de conversatildeo decoacutedigo para Java 8 e obter melhores conclusotildees sobre a importacircncia que os projetos estatildeodando para a evoluccedilatildeo de seus coacutedigos Outro fator interessante seria aplicar mais Visitorsagrave ferramenta static-analysis e fazer este mesmo estudo aplicado agrave outras caracteriacutesticasda linguagem

47

Referecircncias

[1] Kagdi Huzefa Michael L Collard e Jonathan I Maletic A survey and taxonomyof approaches for mining software repositories in the context of software evolution2007 ix 3 8 9 10 11

[2] DBeaver Dbeaver - features httpdbeaverjkissorgdocsfeatures ix 29

[3] Eclipse Vertx commit Java8-ify code httpsgithubcomeclipsevertxcommit93f95e9c77419f442a42fe711b6eeaef88192fd3 ix 42

[4] Google Guava commit Release java 8 changes to guava httpsgithubcomgoogleguavacommit73e382fa877f80994817a136b0adcc4365ccd904 ix 43

[5] Google Agera commit Collapsed testapp with retrolambda httpsgithubcomgoogleageracommit5e518b7b05f9e7a34a314945f68deff7b2c3e334 ix 44

[6] ReactiveX Rxjava commit 2x full jdk 6 compatible backport + includ-ing bugfixes up to today httpsgithubcomReactiveXRxJavacommit000a174d87a901135f9665d3b11f3627fd2dc4ed ix 45

[7] Godfrey M W e D M German The past present and future of software evolutionEm 2008 Frontiers of Maintenance paacuteginas 129ndash138 Sept 2008 1 6

[8] Favre J M Languages evolve too changing the software time scale Em Principles ofSoftware Evolution Eighth International Workshop on paacuteginas 33ndash42 IEEE 20051 5 7

[9] Overbey Jeffrey L e Ralph E Johnson Regrowing a language refactoring tools allowprogramming languages to evolve Em ACM SIGPLAN Notices volume 44 paacuteginas493ndash502 ACM 2009 1 5 7 8 12

[10] Grechanik Mark Collin McMillan Luca DeFerrari Marco Comi Stefano CrespiDenys Poshyvanyk Chen Fu Qing Xie e Carlo Ghezzi An empirical investiga-tion into a large-scale java open source code repository Em Proceedings of the2010 ACM-IEEE International Symposium on Empirical Software Engineering andMeasurement ESEM rsquo10 paacuteginas 111ndash1110 New York NY USA 2010 ACMISBN 978-1-4503-0039-1 httpdoiacmorg10114518527861852801 1

[11] TIOBE Tiobe httpswwwtiobecomtiobe-index 1 14

48

[12] Gyori Alex Lyle Franklin Danny Dig e Jan Lahoda Crossing the gap from im-perative to functional programming through refactoring Em Proceedings of the 20139th Joint Meeting on Foundations of Software Engineering ESECFSE 2013 paacute-ginas 543ndash553 New York NY USA 2013 ACM ISBN 978-1-4503-2237-9 httpdoiacmorg10114524914112491461 2 11 24 39

[13] OpenJDK State of the lambda httpcropenjdkjavanet~briangoetzlambdalambda-state-4html 2

[14] Han Jiawei Micheline Kamber e Jian Pei Data Mining Concepts and TechniquesMorgan Kaufmann Publishers Inc San Francisco CA USA 3rd ediccedilatildeo 2011ISBN 0123814790 9780123814791 3

[15] Fowler Martin e Kent Beck Refactoring improving the design of existing codeAddison-Wesley Professional 1999 5 7

[16] Lehman M M J F Ramil P D Wernick D E Perry e W M Turski Met-rics and laws of software evolution - the nineties view Em Proceedings of the4th International Symposium on Software Metrics METRICS rsquo97 paacuteginas 20ndashWashington DC USA 1997 IEEE Computer Society ISBN 0-8186-8093-8 httpdlacmorgcitationcfmid=823454823901 6

[17] Hassan Ahmed E e Tao Xie Software intelligence The future of mining softwareengineering data Em Proceedings of the FSESDP Workshop on Future of SoftwareEngineering Research FoSER rsquo10 paacuteginas 161ndash166 New York NY USA 2010ACM ISBN 978-1-4503-0427-6 httpdoiacmorg101145188236218823978 9

[18] Hassan Ahmed E The road ahead for mining software repositories Em Frontiers ofSoftware Maintenance 2008 FoSM 2008 paacuteginas 48ndash57 IEEE 2008 8

[19] Berry Michael J e Gordon Linoff Data Mining Techniques For Marketing Salesand Customer Support John Wiley amp Sons Inc New York NY USA 1997ISBN 0471179809 10

[20] Parnin Chris Christian Bird e Emerson Murphy-Hill Java generics adoption hownew features are introduced championed or ignored Em Proceedings of the 8thWorking Conference on Mining Software Repositories paacuteginas 3ndash12 ACM 2011 12

[21] Oracle The java language specification httpsdocsoraclecomjavasespecsjlsse8jls8pdf 13

[22] Oracle The history of java technology httpwwworaclecomtechnetworkjavajavaseoverviewjavahistory-index-198355html 13

[23] Murphy Kieron So why did they decide to call itjava httpwwwjavaworldcomarticle2077265core-javaso-why-did-they-decide-to-call-it-java-html 13

[24] McGraw Tata Object-oriented Programming with Java Essentials and ApplicationsHill Education 13

49

[25] Oracle Differences between java ee and java se httpdocsoraclecomjavaee6firstcupdocgkhoyhtml 13

[26] Lindsey Clark S The History of Java Cambridge 14

[27] Oracle The java language environment httpwwworaclecomtechnetworkjavaintro-141325html 14

[28] Oracle Jdk 8 httpopenjdkjavanetprojectsjdk8 15 24

[29] Oracle Enhancements in java se 8 httpdocsoraclecomjavase8docstechnotesguideslanguageenhancementshtmljavase8 15 16 17

[30] Oracle Lambda expressions httpdocsoraclecomjavasetutorialjavajavaOOlambdaexpressionshtml 16 18 21

[31] Oracle Method references httpdocsoraclecomjavasetutorialjavajavaOOmethodreferenceshtml 16

[32] Oracle Default methods httpdocsoraclecomjavasetutorialjavaIandIdefaultmethodshtml 17

[33] Oracle Repeating annotations httpdocsoraclecomjavasetutorialjavaannotationsrepeatinghtml 17

[34] Oracle Type annotations httpdocsoraclecomjavasetutorialjavaannotationstype_annotationshtml 17

[35] Oracle Anonymous inner classes httpsdocsoraclecomjavasetutorialjavajavaOOanonymousclasseshtml 19

[36] Kothari CR Research Methodology Methods and Techniques New Age Interna-tional (P) Limited 2004 ISBN 9788122415223 httpsbooksgooglecombrbooksid=8c6gkbKi-F4C 22

[37] Nakakoji Kumiyo Yasuhiro Yamamoto Yoshiyuki Nishinaka Kouichi Kishida eYunwen Ye Evolution patterns of open-source software systems and communitiesEm IWPSE rsquo02 Proceedings of the International Workshop on Principles of SoftwareEvolution paacuteginas 76ndash85 New York NY USA 2002 ACM Press ISBN 1581135459httpdxdoiorg101145512035512055 23

[38] Rahman Foyzur Christian Bird e Premkumar Devanbu Clones What is that smellEmpirical Software Engineering 17(4-5)503ndash530 2012 24

[39] Chacon Scott Pro Git Apress Berkely CA USA 1st ediccedilatildeo 2009ISBN 1430218339 9781430218333 25

[40] Cavalcanti Thiago Gomes e Viniacutecius Correa de Almeida Caracterizaccedilatildeo do uso deconstruccedilotildees da linguagem java em projetos open-source Publicaccedilatildeo online 2016httpbdmunbbrhandle1048315733 27

50

[41] Parr Terence Language Implementation Patterns Create Your Own Domain-Specific and General Programming Languages Pragmatic Bookshelf 1st ediccedilatildeo 2009ISBN 193435645X 9781934356456 27

[42] Janssen Thorben 5 reasons to use jpa hibernate Publicaccedilatildeo online httpswwwsitepointcom5-reasons-to-use-jpa-hibernate 27

[43] Franklin Lyle Alex Gyori Jan Lahoda e Danny Dig Lambdaficator From imperativeto functional programming through automated refactoring Em Proceedings of the2013 International Conference on Software Engineering ICSE rsquo13 paacuteginas 1287ndash1290 Piscataway NJ USA 2013 IEEE Press ISBN 978-1-4673-3076-3 httpdlacmorgcitationcfmid=24867882486986 29

[44] Google Agera httpsgithubcomgoogleagerawiki 34

[45] Eclipse Eclipse vertx httpvertxio 35

[46] Cejas Fernando Android cleanarchitecture httpsgithubcomandroid10Android-CleanArchitecture 36

[47] ReactiveX Rxjava httpsgithubcomReactiveXRxJava 37

[48] Luontola Esko Retrolambda httpsgithubcomorfjackalretrolambda 43

51

Anexo I

Projetos utilizados

fastjson

platform_frameworks_base

netty

material-dialogs

kotlin

okhttp

tinker

AndroidUtilCode

RxJava

spring-boot

java-design-patterns

elasticsearch

ExoPlayer

kafka

vertx

realm-java

guava

zipkin

bazel

stetho

Signal-Android

glide

agera

fresco

plaid

presto

libgdx

spark

52

disruptor

lottie-android

flexbox-layout

PocketHub

zxing

spring-framework

deeplearning4j

dropwizard

interviews

BaseRecyclerViewAdapterHelper

uCrop

DanmakuFlameMaster

lottie-react-native

android-UniversalMusicPlayer

AndroidInterview-Q-A

greenDAO

retrofit

MaterialDrawer

BottomBar

druid

MPAndroidChart

Hystrix

guice

recyclerview-animators

dubbo

androidannotations

RxJava-Android-Samples

PhotoView

clojure

CircleImageView

AndroidSwipeLayout

jedis

MaterialViewPager

butterknife

junit4

RxBinding

leakcanary

SimianArmy

picasso

UltimateRecyclerView

53

AndroidViewAnimations

AppIntro

FizzBuzzEnterpriseEdition

ion

cheesesquare

physical-web

RxAndroid

Android-CleanArchitecture

Calligraphy

Android-Bootstrap

iosched

Android_Data

MaterialDesignLibrary

ListViewAnimations

EventBus

java8-tutorial

AndroidSlidingUpPanel

dagger

okhttputils

logger

HomeMirror

Material-Animations

android-Ultra-Pull-To-Refresh

android-async-http

Android-ObservableScrollView

Android-Universal-Image-Loader

ActionBarSherlock

SlidingMenu

storm

PagerSlidingTabStrip

Android-PullToRefresh

54

  • Dedicatoacuteria
  • Agradecimentos
  • Resumo
  • Abstract
  • Introduccedilatildeo
    • Contexto
    • Objetivos
      • Objetivos Gerais
      • Objetivos Especiacuteficos
        • Metodologia
        • Organizaccedilatildeo do Trabalho
          • Evoluccedilatildeo e Mineraccedilatildeo de Repositoacuterios de Software
            • Evoluccedilatildeo de Software
            • MSR Mineraccedilatildeo de dados e a Engenharia de Software
              • Classificaccedilatildeo
                • Trabalhos Relacionados
                  • Java SE 8 e JDK 8
                    • Histoacuterico
                    • Princiacutepios
                    • Evoluccedilatildeo
                    • Expressotildees Lambda
                      • Sintaxe
                      • Principais formas de uso
                          • Estudo e o Processo de Mineraccedilatildeo
                            • Questotildees de Pesquisa
                            • Fonte de Dados e Objetos de Estudo
                            • Processo de Mineraccedilatildeo
                              • static-analysis
                              • BDAnalisador
                                • Classificaccedilatildeo e Anaacutelise
                                  • Meacutedia de Lambda
                                  • Anaacutelise Temporal
                                  • Refatoraccedilatildeo de Coacutedigo
                                  • Casos de Uso
                                      • Resultados Obtidos e Anaacutelise
                                        • Visatildeo Geral
                                          • Projetos Selecionados
                                          • agera
                                          • vertx
                                          • Android-CleanArchitecture
                                          • RxJava
                                          • guava
                                            • Refatoraccedilatildeo de Coacutedigo
                                            • Estudos de Caso
                                              • Consideraccedilotildees Finais
                                              • Referecircncias
                                              • Anexo
                                              • Projetos utilizados

Capiacutetulo 1

Introduccedilatildeo

11 Contexto

A evoluccedilatildeo e manutenccedilatildeo de software eacute uma caracteriacutestica intriacutenseca do desenvolvimentode sistemas considerando que a partir do momento em que um software comeccedila a serdesenvolvido satildeo realizadas constantes manutenccedilotildees [7] Apesar de o conceito de evolu-ccedilatildeo de software representar uma grande aacuterea de pesquisa na engenharia de software nemsempre pesquisadores reconhecem a importacircncia da evoluccedilatildeo das linguagens de progra-maccedilatildeo como um grande fator influenciador na evoluccedilatildeo de software [8] uma vez que umsoftware que natildeo evolui junto com a sua linguagem tem a sua capacidade de evoluccedilatildeolimitada [9]

Surge entatildeo a necessidade de alinhar estudos empiacutericos com o intuito de investigar esteprocesso de evoluccedilatildeo do software juntamente com a evoluccedilatildeo de sua linguagem atraveacutesde investigaccedilatildeo e anaacutelise de seu coacutedigo fonte que pode ser feita por meio de anaacutelise de re-positoacuterios de software em grande escala o que deu origem a abordagem de Mineraccedilatildeo emRepositoacuterio de Software (MSR) O MSR tem como base o estudo sistemaacutetico e empiacutericode repositoacuterios de software com o objetivo de analisaacute-los utilizando informaccedilotildees estatis-ticamente uacuteteis coletadas para observar diversos padrotildees como a evoluccedilatildeo do softwarepadrotildees de projetos dentre outros [10]

A complexidade e dificuldade de realizar tal estudo empiacuterico eacute alta pois atualmenteexistem diversos tipos de plataformas para coleta de dados linguagens e focos variadosAssim para escolher o foco do objeto de estudo eacute necessaacuterio levar em consideraccedilatildeo estasdificuldades e especificaccedilotildees e dessa forma este trabalho tem como foco a anaacutelise desistemas de software na linguagem Java

Ateacute a data deste trabalho de acordo com os dados do TIOBE [11] Java eacute a linguagemde programaccedilatildeo com mais linhas de codigo catalogadas no mundo Isso faz com queseja extremamente interessante o estudo empiacuterico da evoluccedilatildeo da linguagem e software

1

desenvolvidos nela desde sua primeira versatildeo antes de se tornar uma linguagem populare ainda com poucos pacotes ateacute a sua atual versatildeo estaacutevel com uma grande quantidadede novas caracteriacutesticas

A versatildeo mais recente do Java a JDK 8 possui diversas adiccedilotildees interessantes para aorganizaccedilatildeo do coacutedigo e facilidade do programador Dessas novas implementaccedilotildees con-ceitos de linguagem funcional como expressotildees lambda e iteradores externos que recebemuma expressatildeo lambda como argumento como o map() filter() e forEach() tornarama escrita de coacutedigo paralelo mais simples e permitiram ganhos de performance [12]

Diversas linguagens de programaccedilatildeo tambeacutem populares como Javascript e Ruby jaacutepossuiacuteam expressotildees lambda desde suas versotildees iniciais sendo o Java 8 em 2014 maisuma linguagem a introduzir esse novo conceito Podemos descrever as expressotildees comopequenas funccedilotildees normalmente feitas em apenas uma linha sem um nome identificadorElas podem ser retornadas de outras funccedilotildees ou passadas como paracircmetro Um exemplode expressatildeo lambda pode ser visualizado pela funccedilatildeo de soma de dois inteiros escrita daforma (int x int y)rarr x + y [13]

Antes da inclusatildeo de expressotildees lambda em Java o mesmo comportamento era possiacutevelutilizando classes anocircnimas ou AICs (Anonymous inner classes) Contudo eacute necessaacute-rio a criaccedilatildeo de uma interface com apenas um meacutetodo e instanciaacute-la como uma AIC Autilizaccedilatildeo de AICs gera inuacutemeras linhas de coacutedigo adicionais que poderiam ser encapsu-ladas em apenas uma linha com a utilizaccedilatildeo de expressotildees lambda Como eacute interessantepara o programador ter um coacutedigo sempre mais legiacutevel e sucinto torna-se interessante arefatoraccedilatildeo de coacutedigo que utiliza uma tecnologia mais antiga para a nova

Assim este trabalho visa conduzir um estudo de mineraccedilatildeo em repositoacuterios de softwareopen-source desenvolvidos na linguagem Java para entender como desenvolvedores estatildeose adaptando agraves novas mudanccedilas introduzidas no Java 8

12 Objetivos

121 Objetivos Gerais

Este trabalho tem como objetivo geral caracterizar o uso de expressotildees lambda entre osprojetos Java mais populares desenvolvidos pela comunidade do GitHub

122 Objetivos Especiacuteficos

Sabendo do benefiacutecio da refatoraccedilatildeo de coacutedigo para o uso de expressotildees lambda e dapouca quantidade de estudos acadecircmicos sobre o assunto surge entatildeo uma oportunidadede pesquisa para melhor entender a forma como essa caracteriacutestica estaacute sendo adotada por

2

projetos com foco em refatoraccedilatildeo de coacutedigo o que originou a necessidade deste estudoAssim para alcanccedilar o objetivo deste trabalho foram traccedilados em forma de questotildees depesquisa os objetivos especiacuteficos a serem alcanccedilados por este trabalho

bull Quando os projetos Java de coacutedigo aberto comeccedilaram a introduzir o uso de expres-sotildees lambda em seus coacutedigos e quatildeo significativo eacute esse uso

bull Como as equipes de desenvolvimento estatildeo utilizando expressotildees lambda atraveacutesde refatoraccedilatildeo de coacutedigo ou introduzindo apenas em coacutedigo novo

bull Quais satildeo os padrotildees tipicamente adotados para o uso de expressotildees lambda

13 Metodologia

Este trabalho foi desenvolvido utilizando uma abordagem de MSR que dentro da clas-sificaccedilatildeo de Kagdi et al [1] pode ser divido em quatro grandes etapas Primeiramentedefiniu-se a fonte de dados a ser utilizada e dentre as possibilidades encontradas na lite-ratura [14] optou-se por utilizar repositoacuterios de controle de versatildeo mais especificamenteo Github tendo como criteacuterio de seleccedilatildeo os 99 repositoacuterios Java mais populares na plata-forma Em seguida definiu-se o propoacutesito do estudo no caso os objetivos em forma deperguntas de pesquisa a serem respondidas

A terceira grande etapa foi a definiccedilatildeo do meacutetodo em si a forma como seria realizadoo estudo e este por sua vez constitui-se de download de todos os 99 repositoacuterios maispopulares realizaccedilatildeo de uma anaacutelise estaacutetica para coletar informaccedilotildees necessaacuterias de cadaprojeto por versatildeo e armazenamento de informaccedilotildees pertinentes em uma base de dados

A etapa final foi a realizaccedilatildeo da avaliaccedilatildeo dos dados obtidos atraveacutes de meacutetricas eanaacutelises quantitativas para melhor responder as questotildees de pesquisa aleacutem de estudos decaso feitos com cinco projetos escolhos de acordo com a maneira distinta em que estesfazem o uso de expressotildees lambda

14 Organizaccedilatildeo do Trabalho

Este trabalho se divide em seis capiacutetulos

bull Capiacutetulo 2 Apresenta um referencial teoacuterico sobre evoluccedilatildeo de software demons-trando as estrateacutegias utilizadas e a importacircncia da evoluccedilatildeo em um projeto de coacutedigoaberto aleacutem de enunciar as leis de evoluccedilatildeo de software de Lehman O capiacutetulo tam-beacutem apresenta o processo de mineraccedilatildeo de dados explicando cada uma das camadasda classificaccedilatildeo e demonstra trabalhos relacionados a esse toacutepico que serviram debase para este trabalho

3

bull Capiacutetulo 3 Traz um contexto histoacuterico e teacutecnico da linguagem Java necessaacuteriospara entender a importacircncia que as novas caracteriacutesticas adicionadas na versatildeo8 fornecem para os desenvolvedores de projetos determinados a manter o projetosempre evoluiacutedo Tambeacutem eacute apresentada uma seccedilatildeo para demonstrar os detalhese formas de utilizaccedilatildeo das expressotildees Lambda que satildeo o foco dos objetivos destetrabalho

bull Capiacutetulo 4 Descreve a metodologia e processo utilizados para o desenvolvimentoe obtenccedilatildeo dos resultados deste trabalho O capiacutetulo desenvolve o contexto dasquestotildees de pesquisa e explica os motivos e processos de desenvolvimento das fer-ramentas utilizadas para minerar os dados aleacutem de determinar a classificaccedilatildeo dosresultados obtidos em grupos para facilitar a organizaccedilatildeo dos dados de forma queas perguntas sejam respondidas claramente

bull Capiacutetulo 5 Apresenta os resultados obtidos e de que forma eles ajudaram a respon-der as questotildees de pesquisa Eacute descrita uma anaacutelise de um projeto de cada categoriaespecificada no capiacutetulo anterior a fim de contextualizar cada tipo de resultado paraque o leitor entenda a forma que os projetos Java estatildeo lidando com as expressotildeesLambda

bull Capiacutetulo 6 Descreve as dificuldades e problemas obtidos durante o trabalho e deque forma eles influenciaram nos resultados Tambeacutem eacute apresentada uma seccedilatildeocontendo as ideias surgidas durante o desenvolvimento deste trabalho que ficarampara ser feitas no futuro devido agrave gama de informaccedilotildees que a mineraccedilatildeo dos dadostrouxe

4

Capiacutetulo 2

Evoluccedilatildeo e Mineraccedilatildeo deRepositoacuterios de Software

As linguagens de programaccedilatildeo estatildeo sempre evoluindo aumentando sua complexidade eexpressividade Da mesma forma aleacutem de se preocupar com dificuldades de estabelecercompatibilidade do software em relaccedilatildeo a tecnologias antigas desenvolvedores tambeacutemprecisam acompanhar essa evoluccedilatildeo das linguagens para que suas ferramentes natildeo setornem obsoletas [9] Isso agrega um grande desafio no desenvolvimento e evoluccedilatildeo desoftware

O conceito de evoluccedilatildeo de software amadureceu e se tornou um grande foco de pes-quisa Poreacutem nem sempre estudos de evoluccedilatildeo de software reconhecem a importacircncia daevoluccedilatildeo da linguagem de programaccedilatildeo no contexto do desenvolvimento de software [8]Quando um coacutedigo natildeo evolui junto com a linguagem com o objetivo de manter umacompatibilidade com versotildees anteriores sua capacidade de evoluccedilatildeo se torna limitada [9]

A refatoraccedilatildeo de coacutedigo que consiste em realizar mudanccedilas no coacutedigo fonte sem modi-ficar o comportamento observado do software [15] permite que a evoluccedilatildeo de linguagens eferramentas aconteccedilam mais naturalmente No entanto novos desafios surgem como porexemplo saber quando e como realizar a refatoraccedilatildeo de coacutedigo de forma eficiente e coesaDentre as teacutecnicas de pesquisa em engenharia de software para entender esse problematorna-se interessante explorar as teacutecnicas de mineraccedilatildeo de dados aplicados a repositoacuteriosde software com o objetivo de entender o relacionamento entre evoluccedilatildeo e refatoraccedilatildeo

Assim este capiacutetulo busca esclarecer conceitos e estrateacutegias de evoluccedilatildeo de softwaremineraccedilatildeo de repositoacuterios de software e o estado da arte sobre o assunto

5

21 Evoluccedilatildeo de Software

Durante o processo de produccedilatildeo e manutenccedilatildeo de software haacute a necessidade de diversastomadas de decisotildees sobre seu desenvolvimento como por exemplo decidir como melho-rar a qualidade do software Tais decisotildees precisam ser tomadas levando em consideraccedilatildeoo ambiente em que se estaacute inserido com novas tecnologias surgindo todos os dias fe-edback de usuaacuterios exigentes e concorrentes produzindo um software similar com ideiasinovadoras

Tudo isso acontece em um ritmo de constante mudanccedila e assim como diria Lehmaneacute imprescindiacutevel que software de sistemas sejam capazes de evoluir ou os mesmos correm orisco de sofrer uma morte prematura [16] fazendo assim da evoluccedilatildeo de software um con-ceito importante dentro do seu processo de desenvolvimento Essa evoluccedilatildeo deve ocorrerconsiderando o ambiente em que o software estaacute inserido o qual possui aspectos teacutecnicos esociais sua infraestrutura que pertence ao seu ambiente teacutecnico o qual sempre necessitamanutenccedilatildeo e ao mesmo tempo usuaacuterios que utilizam o software e estatildeo constantementeformando opiniotildees oferecendo feedback e na expectativa por novidades [7] Assim a me-dida que novas caracteriacutesticas satildeo desenvolvidas novas tecnologias de infraestrutura satildeonecessaacuterias novos requisitos satildeo adicionados e o sistema de software deve se adaptar aessas mudanccedilas

Com relaccedilatildeo aos aspectos sociais que envolvem a evoluccedilatildeo do software eacute importanteressaltar os conceitos baacutesicos de como essa evoluccedilatildeo acontece Durante um estudo empiacutericopioneiro na aacuterea de evoluccedilatildeo de software para sistemas de grande escala Lehman e seuscolaboradores formularam um conjunto de observaccedilotildees que hoje satildeo conhecidas como asleis da evoluccedilatildeo de software ou simplesmente Leis de Lehman [16] No geral as leis deevoluccedilatildeo de software podem ser descritas da seguinte forma [16]

1 Mudanccedila contiacutenua um sistema se tornaraacute progressivamente menos satisfatoacuteriopara seus usuaacuterios com o tempo a menos que se adapte continuamente agraves necessi-dades que surgiratildeo

2 Complexidade Crescente um sistema se tornaraacute cada vez mais complexo amenos que se trabalhe para explicitamente reduzir sua complexidade

3 Auto-regulaccedilatildeo o processo de evoluccedilatildeo de software eacute auto-regulatoacuterio no que dizrespeito agraves distribuiccedilotildees dos artefatos e produtos produzidos

4 Conservaccedilatildeo da estabilidade organizacional a taxa meacutedia de atividade globalefetiva em um sistema em evoluccedilatildeo natildeo muda com o tempo ou seja a meacutedia detrabalho e esforccedilo colocado em cada entrega do sistema permanece a mesma

6

5 Conservaccedilatildeo de familiaridade a quantidade de conteuacutedo novo em cada entregado sistema tende a se manter constante com o tempo

6 Crescimento contiacutenuo A quantidade de funcionalidades em um sistema cresceraacutecom o tempo com o objetivo de satisfazer seus usuaacuterios

7 Decliacutenio de qualidade Um sistema seraacute percebido com qualidade inferior como passar do tempo a menos que seu design tenha uma manutenccedilatildeo minuciosa e seadapte a novas restriccedilotildees

8 Sistema de Feedback Evoluir um sistema com sucesso requer reconhecer que oprocesso de desenvolvimento acontece em um sistema de feedback de vaacuterios ciclosagentes e niacuteveis

Os aspectos teacutecnicos que envolvem a evoluccedilatildeo de software levam em consideraccedilatildeo astecnologias utilizadas para o seu desenvolvimento desde a linguagem de programaccedilatildeo agravesmaacutequinas onde o software seraacute hospedado que sofrem atualizaccedilotildees recebem novas versotildeescom novas caracteriacutesticas implementadas

Um estudo realizado por Lavre mostra como a evoluccedilatildeo das linguagens de programa-ccedilatildeo no contexto da evoluccedilatildeo de software muitas vezes satildeo subestimadas uma vez quemuitos podem considerar em seus estudos a linguagem de computaccedilatildeo como um artefatoimutaacutevel [8] Por exemplo coloca-se muita ecircnfase e cuidado para realizar o versionamentode coacutedigo fonte de um software mas este pode ser tornar inutilizaacutevel futuramente se nin-gueacutem souber qual versatildeo de compilador determinada versatildeo de coacutedigo foi desenvolvida

Para natildeo se deixar estagnar linguagens de programaccedilatildeo precisam se adaptar e evoluirQuando uma linguagem de programaccedilatildeo atualiza softwares que eram antes consideradosatualizados podem se tornar rapidamente obsoletos E ao mesmo tempo que novascaracteriacutesticas satildeo adicionadas a linguagem precisa fornecer compatibilidade com versotildeesanteriores aumentando sua complexidade Desenvolvedores entatildeo encontram-se tambeacutemem um empasse buscando um equiliacutebrio entre manter a compatibilidade da ferramentacom versotildees anteriores da linguagem e atualizaacute-la para manter o software atualizado [9]

A estrateacutegia de refatoraccedilatildeo de coacutedigo pode ser uma opccedilatildeo que permite a linguageme o software co-evoluiacuterem com um menor grau de dificuldade [9] Refatoraccedilatildeo (do inglecircsrefactoring) eacute o processo de modificaccedilatildeo de um software com o objetivo de melhorar a es-trutura interna do mesmo sem alterar sua percepccedilatildeo externa Eacute uma maneira disciplinadade melhorar o design do coacutedigo apoacutes ele jaacute ter sido implementado Por exemplo dividiruma funcionalidade grande feita em apenas um bloco de coacutedigo em vaacuterios moacutedulos [15]

A refatoraccedilatildeo de coacutedigo pode ser um meio utilizado para evoluir o software adaptandoo coacutedigo com caracteriacutesticas novas introduzidas pela linguagem modificando o design dosistema sem comprometer sua integridade No entanto novos desafios surgem visto que

7

refatorar o coacutedigo fonte de um sistema de grande porte natildeo eacute uma tarefa faacutecil havendo anecessidade de ferramentas que possam automatizar o processo ou realizar um estudo paraentender como as novas caracteriacutesticas da linguagem podem ser utilizadas para substituirou melhorar funcionalidades obsoletas [9]

22 MSR Mineraccedilatildeo de dados e a Engenharia deSoftware

Com o objetivo de compreender prever e planejar os vaacuterios aspectos do desenvolvimentode um projeto em especial tudo que possa impactar na evoluccedilatildeo de software a teacutecnicade mineraccedilatildeo de dados tem sido bastante utilizada em engenharia de software [17]

O termo Mineraccedilatildeo de Repositoacuterios de Software (MSR) tem sido utilizado para descre-ver vaacuterias maneiras de se examinar repositoacuterios de software Um repositoacuterio de softwarepode ser considerado um artefato que eacute produzido e arquivado durante a evoluccedilatildeo desoftware [1] Estes responsoacuterios armazenam informaccedilotildees que podem fornecer todos osdetalhes de desenvolvimento do software provendo meios necessaacuterios para uma anaacuteliseaprofundada de evoluccedilatildeo de software

Repositoacuterios de software satildeo comumente utilizados para armazenar e acompanhar ohistoacuterico de desenvolvimento do software mas raramente usados para tomada de deci-sotildees em relaccedilatildeo ao projeto Assim pesquisadores de MSR buscam modificar a impressatildeode que tais repositoacuterios satildeo estaacuteticos que servem apenas para manutenccedilatildeo de registrostransformando-os em repositoacuterios ativos que podem auxiliar na tomada de decisatildeo em pro-jetos de software modernos atraveacutes da identificaccedilatildeo de padrotildees para realizar a propagaccedilatildeode mudanccedilas [18]

221 Classificaccedilatildeo

De acordo com Kagdi et al dentre as abordagens de MSR utilizadas atualmente eacute possiacuteveldescrevecirc-las para entatildeo comparaacute-las e possivelmente classificaacute-las levando em considera-ccedilatildeo uma taxonomia de quatro dimensotildees os repositoacuterios de software utilizados (fontes dedados) o propoacutesito do MSR a metodologia e a avaliaccedilatildeo da abordagem [1] como mostraa Figura 21 onde as taxonomias destacadas em amarelo satildeo as que prevaleceram poreacutemnatildeo exclusivamente na metodologia adotada por este trabalho

8

Figura 21 Taxonomia em camadas adaptada do trabalho de Kagdi et al [1]

Fontes de Dados

As fontes de informaccedilatildeo variam de acordo com a abordagem utilizada e dentre as informa-ccedilotildees mineradas em repositoacuterios de software inclui-se as seguintes categorias os artefatosde software e suas versotildees as diferenccedilas entre os artefatos de software e suas versotildees e osmetadados sobre as mudanccedilas no software

As fontes de dados podem ser melhor classificadas de acordo com Hassan et al [17]

bull Repositoacuterios de controle de Versatildeo estes repositoacuterios guardam o histoacuterico de desen-volvimento de um projeto armazenando todas as mudanccedilas no coacutedigo fonte assimcomo os metadados associados com cada mudanccedila Exemplos git SVN

bull Bug repositories Estes repositoacuterios rastreiam o histoacuterico de resoluccedilatildeo de bugs quesatildeo reportados por usuaacuterios e desenvolvedores Exemplos Bugzilla e Jira

9

bull Histoacuterico de Comunicaccedilatildeo (Archived communications) estes repositoacuterios rastreiamdiscussotildees sobre os vaacuterios aspectos de um projeto de software por sua vida uacutetil Porexemplo listas de e-mails

bull Deployment logs logs com informaccedilotildees do software gerados por ferramentas dedesenvolvimento

bull Repositoacuterios de software Repositoacuterios onde o coacutedigo fonte de vaacuterios projetos satildeoarmazenados como por exemplo Sourceforgenet

No contexto deste trabalho estes repositoacuterios consistem em fontes de coacutedigo armaze-nadas em sistemas de controle de versatildeo especificamente coacutedigos na plataforma Github

O propoacutesito

O propoacutesito da mineraccedilatildeo de repositoacuterios de software se resume nas perguntas de pes-quisa que podem ser respondidas utilizando mineraccedilatildeo Assim existem duas classes deperguntas de pesquisa para MSR [1]

A primeira eacute a pergunta de anaacutelise market-basket1 ldquoSe A acontece o que mais podeacontecerrdquo A resposta para este tipo de pergunta eacute um conjunto de regras descrevendotendecircncias de relacionamentos como por exemplo se A acontecer entatildeo B e C acontecemdurante um periacuteodo X

A segunda classe diz respeito agraves perguntas de prevalecircncia (Prevalence Questions -PQ) como por exemplo perguntas do tipo ldquoA funcionalidade Y foi modificadardquo quepossuem uma resposta booleana ou ldquoQuantas vezes esta funcionalidade Y foi modificadardquocontendo uma resposta quantitativa

As perguntas de pesquisa deste trabalho se encaixam majoritariamente na segundaclasse onde o objetivo traccedilado eacute respondido de forma quantitativa com algumas tentativasde classificaccedilatildeo de tipos de repositoacuterios como seraacute descrito nos capiacutetulos seguintes

A metodologia

A metodologia corresponde a maneira como as questotildees de MSR iratildeo ser respondidas evaacuterias abordagens estatildeo disponiacuteveis Poreacutem Kagdi indica duas estrateacutegias baacutesicas quepodem ser utilizadas

Primeiramente pode-se utilizar a mediccedilatildeo indireta e anaacutelise da evoluccedilatildeo do softwareEsta abordagem pode ser realizada da seguinte forma extrair e computar informaccedilotildeesde cada versatildeo de um software separadamente e em seguida individualmente comparar

1Anaacutelise Market-basket eacute uma teacutecnica de modelagem baseada na teoria de que se vocecirc comprar certostipos de produtos vocecirc haacute uma probabilidade maior (ou menor) de comprar outros tipos de produtos [19]

10

propriedades encontradas como por exemplo comparar duas versotildees distintas de umsoftware atraveacutes de um repositoacuterio github realizando uma investigaccedilatildeo de alto niacutevel noque diz respeito a evoluccedilatildeo do software [1]

A segunda perspectiva de metodologia que pode ser utilizada corresponde agrave mediccedilatildeodireta e anaacutelise da evoluccedilatildeo do software Ela diz respeito agraves investigaccedilotildees que estudamos mecanismos que leva um software a ser modificado de uma versatildeo para outra focandonas diferenccedilas especiacuteficas entre estas versotildees como por exemplo examinando mudanccedilasespeciacuteficas das classes arquivos funccedilotildees de cada parte do coacutedigo [1]

Assim eacute possiacutevel descrever explicitamente que este trabalho utiliza em sua maioriauma metodologia com mediccedilotildees diretas atraveacutes da anaacutelise estaacutetica de informaccedilotildees docoacutedigo fonte de diferente versotildees para analisar os diferentes padrotildees de desenvolvimentoem que expressotildees lambda (definidas no capiacutetulo seguinte) satildeo utilizadas

A Avaliaccedilatildeo

Por fim existem diversas formas para se avaliar o estudo realizado sempre levando emconsideraccedilatildeo a validade dos resultados obtidos Pode-se utilizar de meacutetricas para avaliar osdados considerando o quanto das informaccedilotildees obtidas satildeo relevantes Outra forma de seavaliar seria atraveacutes da utilizaccedilatildeo de modelos probabiliacutesticos seguindo uma abordagemde teoria da informaccedilatildeo Assim foram utilizadas determinadas meacutetricas quantitativaspara avaliar os resultados obtidos neste trabalho

23 Trabalhos Relacionados

Como ressaltado na introduccedilatildeo o foco deste trabalho encontra-se em utilizar teacutecnicas deMSR para caracterizar a adoccedilatildeo de expressotildees lambda em repositoacuterios Java Ao reali-zar um estudo sobre o estado da arte encontrou-se diversos trabalhos que utilizam deMSR para obter informaccedilotildees relevantes sobre repositoacuterios de software em diversos focose em especial trabalhos que investiguem repositoacuterios na linguagem Java Jaacute existemtambeacutem alguns trabalhos que apresentam ferramentas de refatoraccedilatildeo de coacutedigo para im-plementaccedilatildeo de expressotildees lambda com foco na evoluccedilatildeo do software Dentre os trabalhosencontrados mencionados destacam-se

bull Em um trabalho sobre utilizaccedilatildeo de refatoraccedilatildeo de coacutedigo para realizar a transiccedilatildeode coacutedigo Java para as novas caracteriacutesticas implementadas no Java 8 Gyori et alapresenta uma ferramenta que automatiza com sucesso o trabalho de conversatildeo decoacutedigo como Annonymous Inner Class para expressotildees lambda [12] O capiacutetulo aseguir descreve em detalhes estes conceitos

11

bull Regrowing a Language de Overbey apresenta um estudo sobre a importacircncia da co-evoluccedilatildeo entre a linguagem de programaccedilatildeo e os projetos de software focando naslinguagens Fortran e Java e provando como ferramentas de refatoraccedilatildeo de coacutedigoauxiliam para que o software consiga evoluir juntamente com sua linguagem deprogramaccedilatildeo [9]

bull O trabalho sobre a adoccedilatildeo de generics em coacutedigo Java feito por Parnin utiliza demineraccedilatildeo de dados para realizar uma investigaccedilatildeo empiacuterica avaliando projetos decoacutedigo aberto com o objetivo de observar como desenvolvedores destes projetos estatildeoutilizando generics em Java [20]

Os estudos mencionados focam em assuntos particulares pertinentes a este trabalhoem que de um lado tem-se trabalhos que mostram a necessidade de refatoraccedilatildeo de coacutedigopara evoluccedilatildeo de software e do outro tem-se trabalhos que mostram que eacute possiacutevel utilizarde MSR para entender melhor como a evoluccedilatildeo da linguagem de programaccedilatildeo Java temafetado projetos reais de coacutedigo aberto e como estes projetos estatildeo se adaptando a estasevoluccedilotildees

12

Capiacutetulo 3

Java SE 8 e JDK 8

Este trabalho tem como objetivo caracterizar a adoccedilatildeo de expressotildees Lambda em siste-mas Java que podem ser considerados legados pois foram concebidos em um momentoanterior a introduccedilatildeo dessa nova caracteriacutestica na linguagem Java Com o intuito de faci-litar o entendimento do leitor sobre tais construccedilotildees esse capiacutetulo apresenta informaccedilotildeeshistoacutericas referentes agrave linguagem Java desde sua criaccedilatildeo ateacute a sua ascensatildeo como umadas linguagens de programaccedilatildeo mais populares Aleacutem disso seratildeo apresentadas as novascaracteriacutesticas presentes na versatildeo Java SE 8 com destaque nas expressotildees Lambda e deque forma vieram para auxiliar no desenvolvimento de sistemas

31 Histoacuterico

Java eacute uma linguagem de programaccedilatildeo orientada a objetos para propoacutesitos gerais [21] Alinguagem nasceu com o nome de Oak no ano de 1991 com o foco em televisotildees digitais acabo mas devido agrave complexidade e poder da linguagem logo expandiu-se para os outrosdomiacutenios principalmente a Internet [22] Posteriormente a linguagem recebeu o nome deGreentalk devido agrave marca Oak jaacute ser registrada por outra empresa e o principal projeto daequipe se chamar Green Por fim o nome Java foi o mais votado pela equipe da Sun emuma reuniatildeo para decidir o mais raacutepido possiacutevel um nome definitivo para a linguagem [23]

Em 1995 em sua primeira versatildeo puacuteblica 10 a linguagem Java jaacute comeccedilava a terum crescimento em sua popularidade como Web Applet nos navegadores mais popularesfornecendo seguranccedila e rapidez nas plataformas mais utilizadas [24] A cada nova versatildeopublicada novas funcionalidades e plataformas eram adicionadas e tornavam a linguagemmais difundida no meio computacional fazendo com que em 2006 a linguagem fosse divi-dida em Java EE (foco em rede e serviccedilos web) Java ME (foco em sistemas embarcados)e Java SE (foco em desktops e servidores) [25]

13

Apoacutes anos de evoluccedilatildeo e aprimoramento atraveacutes de diversas versotildees como visto naTabela 31 hoje o Java se tornou uma das linguagens de programaccedilatildeo mais utilizadas nomundo estando em aproximadamente 15 das linhas de coacutedigo disponiacuteveis pela inter-net [11] A quantidade de plataformas suportadas pela linguagem e com o advento dosistema operacional Android sendo rodado na maior parte dos smartphones do mundoaleacutem da simplicidade em codificar no paradigma orientado a objetos foram os fatoresrelevantes para que a linguagem se popularizasse no mundo digital [26]

Tabela 31 As versotildees anteriores de java e principais caracteriacutesticasVersatildeo Principais caracteriacutesticasJava 10 JVM e JDKJava 2 Event Listeners

Kestrel (Java 3) HotSpot JVMMerlin (Java 4) Diversas novas APIs como Assertion e expressotildees regularesTiger (Java 5) Generics

Mustang (Java 6) Web ServicesDolphin (Java 7) Suporte a linguagens dinamicas

32 Princiacutepios

Com o foco em alcanccedilar a Web e participar mais ativamente do mercado virtual e e-Commerce foram projetados princiacutepios que permitissem com que a linguagem pudessealcanccedilar seus objetivos principais ao mesmo tempo que mantinha a facilidade e fami-liarizaccedilatildeo da linguagem a seus desenvolvedores [27] Dessa forma a equipe da Oracledeterminou cinco princiacutepios que caracterizariam o foco da linguagem Java

bull simples orientada a objeto e familiar projetada para ser orientada a objeto epermitir que seus desenvolvedores comecem a codificar rapidamente sem a necessi-dade de uma curva de aprendizagem acentuada

bull segura e robusta projetada para prover software confiaacutevel por meio de checagensa tempo de compilaccedilatildeo e execuccedilatildeo Haacute uma grande preocupaccedilatildeo com seguranccediladevido agrave larga utilizaccedilatildeo da linguagem em sistemas distribuiacutedos

bull de arquitetura neutra e portaacutevel projetada para ser independente de qualquerarquitetura bastando rodar a JVM dessa forma garantindo a portabilidade paravaacuterios ambientes e dispositivos

14

bull executada em alta performance projetada para fornecer a maior performancepossiacutevel em tempo de execuccedilatildeo com a utilizaccedilatildeo do garbage collector em uma threadde baixa prioridade

bull interpretada dinacircmica e threaded projetada para ser interpretada por qual-quer dispositivo que possua JVM desenvolvida garantindo um desenvolvimento raacute-pido e em ciclos O uso da classe Thread permite que a linguagem acompanhe atendecircncia do paralelismo Aleacutem disso a ligaccedilatildeo de classes eacute feita em tempo real esomente quando necessaacuteria tornando-a dinacircmica

33 Evoluccedilatildeo

A primeira versatildeo do Java 8 foi lanccedilada em 2014 [28] e apresentou diversas atualizaccedilotildeesespalhadas em categorias como linguagem seguranccedila Collections ferramentas deployentre outras Dentre a grande quantidade de mudanccedilas os destaques se encontraram nasnovas melhorias presentes na linguagem que afetaram de forma mais direta a maneiracom que os desenvolvedores passaram a tratar e organizar o coacutedigo fonte As atualizaccedilotildeesreferentes a linguagem descritas oficialmente pela Oracle [29] satildeo

1 Lambda Expressions ou apenas Expressotildees Lambda correspondem a uma novacaracteriacutestica que permite que uma pequena funcionalidade possa ser utilizada comoum argumento de um meacutetodo facilitando a escrita de accedilotildees que seratildeo feitas repetida-mente em uma Collection ou quando um processo se completa ou quando encontraum erro Eacute tambeacutem uma forma compacta de se escrever coacutedigo que previamenteera escrito com anonymous inner classes [29] A Listagem 31 mostra uma classehipoteacutetica Calculator cujo meacutetodo operateBinary() recebe como paracircmetro doisinteiros e um objeto da classe IntegerMath que representa a operaccedilatildeo que deveraacuteser realizada ou seja uma funcionalidade dinacircmica

1 pub l i c c l a s s Ca l cu la to r 2

3 i n t e r f a c e IntegerMath 4 i n t opera t i on ( i n t a i n t b) 5 6

7 pub l i c i n t operateBinary ( i n t a i n t b IntegerMath op ) 8 re turn op opera t i on (a b) 9

10

11 pub l i c s t a t i c void main ( St r ing a rgs ) 12

15

13 Calcu la to r myApp = new Ca lcu la to r ( ) 14 IntegerMath add i t i on = (a b) minusgt a + b 15 IntegerMath subt ra c t i on = (a b) minusgt a minus b 16 System out p r i n t l n ( 40 + 2 = +17 myApp operateBinary (40 2 add i t i on ) ) 18 System out p r i n t l n ( 20 minus 10 = +19 myApp operateBinary (20 10 sub t ra c t i on ) ) 20 21 22

Listagem 31 Exemplo de coacutedigo com o uso de Expressatildeo Lambda [30]

2 Method References Frequentemente expressotildees lambda criam meacutetodos anocircni-mos Algumas vezes poreacutem satildeo utilizadas para chamar um meacutetodo jaacute existentena classe Ao inveacutes de escrever a expressatildeo Lambda para esse caso pode-se optarpor utilizar um Method Reference que facilita a escrita e leitura desse uso de ex-pressatildeo Lambda [29] A Listagem 32 mostra um exemplo de um meacutetodo estaacuteticoque compara duas pessoas pelas suas idades e a Listagem 33 a utilizaccedilatildeo de MethodReference para aplicar a utilizaccedilatildeo desse meacutetodo em um array e reduzir a escrita deuma expressatildeo lambda a uma forma mais legiacutevel

1 pub l i c s t a t i c i n t compareByAge ( Person a Person b) 2 re turn a b i r thday compareTo (b b i r thday ) 3 4

Listagem 32 Exemplo de meacutetodo de uma classe Pessoa [31]

1 Arrays s o r t ( rosterAsArray Person compareByAge ) 2

Listagem 33 Exemplo de uso de Method Reference [31]

3 Default Methods satildeo meacutetodos com a palavra-chave default que servem para adi-cionar implementaccedilotildees de meacutetodos a uma interface de alguma biblioteca mantendoa compatibilidade binaacuteria com versotildees mais antigas dessa interface Tambeacutem pos-sibilita a implementaccedilatildeo de meacutetodos estaacuteticos em interfaces [29] A Listagem 34apresenta a inclusatildeo de um meacutetodo default na interface TimeClient

1 pub l i c i n t e r f a c e TimeClient 2 void setTime ( i n t hour i n t minute i n t second ) 3 void setDate ( i n t day i n t month i n t year ) 4 void setDateAndTime ( i n t day i n t month i n t year 5 i n t hour i n t minute i n t second )

16

6 LocalDateTime getLocalDateTime ( ) 7

8 s t a t i c ZoneId getZoneId ( S t r ing zoneStr ing ) 9 t ry

10 re turn ZoneId o f ( zoneStr ing ) 11 catch ( DateTimeException e ) 12 System e r r p r i n t l n ( I n v a l i d time zone + zoneStr ing

+13 us ing d e f a u l t time zone in s t ead ) 14 re turn ZoneId systemDefault ( ) 15 16 17

18 d e f a u l t ZonedDateTime getZonedDateTime ( St r ing zoneStr ing ) 19 re turn ZonedDateTime o f ( getLocalDateTime ( ) getZoneId (

zoneStr ing ) ) 20 21 22

Listagem 34 Exemplo de interface com um meacutetodo default [32]

4 Repeating Annotations permitem a implementaccedilatildeo e utilizaccedilatildeo de anotaccedilotildees deum mesmo tipo que podem ser utilizadas mais de uma vez para a mesma declara-ccedilatildeo [29] A Listagem 35 apresenta duas anotaccedilotildees iguais com paracircmetros diferentespermitindo uma customizaccedilatildeo maior na aplicaccedilatildeo de um tipo de anotaccedilatildeo

1 Schedule ( dayOfMonth= l a s t )2 Schedule (dayOfWeek= Fr i hour= 23 )3 pub l i c void doPeriodicCleanup ( ) 4

Listagem 35 Exemplo de Repeating Annotations [33]

5 Type Annotations permitem que anotaccedilotildees possam ser utilizadas em tipos aleacutemde declaraccedilotildees dessa forma pode-se garantir que um campo sempre atenda agraves suasexpectativas e evite testes desnecessaacuterios [29] A Listagem 36 mostra um exemplo derestriccedilatildeo a uma String que nunca poderaacute ser nula devido agrave anotaccedilatildeo de NonNull

1 NonNull S t r ing s t r

Listagem 36 Exemplo de Type Annotation garantindo que o campo nunca seja null [34]

17

34 Expressotildees Lambda

Uma das mudanccedilas mais interessantes implementadas no Java 8 foi a adiccedilatildeo de expressotildeeslambda As expressotildees lambda permitem que a linguagem Java possa atuar parcialmentecomo uma linguagem de programaccedilatildeo funcional onde comportamentos satildeo avaliados eaplicados diferentemente da programaccedilatildeo imperativa que foca na mudanccedila de estadosNa praacutetica um comportamento pode ser passado como paracircmetro de um meacutetodo atraveacutesde uma escrita mais reduzida e legiacutevel Os benefiacutecios de utilizar expressotildees lambda incluemuma melhora na legibilidade e organizaccedilatildeo de coacutedigo que antes era escrito com AnonymousInner Class aleacutem de permitir uma forma simples de utilizar comportamento paralelo como uso de Streams

341 Sintaxe

A sintaxe de uma expressatildeo lambda eacute dividida nas seguintes partes [30]

bull Uma lista de paracircmetros separados por viacutergulas

bull Um token representado por uma seta -gt

bull Um corpo que pode ser representado por uma expressatildeo uacutenica ou um bloco de coacutedigodentro de chaves

As Listagens 37 e 38 mostram duas formas diferentes de se aplicar expressotildees Lambdacom uma sintaxe similar A primeira aplica a expressatildeo diretamente apoacutes a seta utilizadanormalmente para trechos de coacutedigo pequenos e simples e a segunda utiliza-se de chavespara incorporar o coacutedigo e da palavra-chave return para especificar o retorno forma maisutilizada para uma quantidade maior de coacutedigo

1 p minusgt p getGender ( ) == Person Sex MALE2 ampamp p getAge ( ) gt= 183 ampamp p getAge ( ) lt= 25

Listagem 37 Exemplo de expressatildeo lambda com uma expressatildeo [30]

1 p minusgt 2 re turn p getGender ( ) == Person Sex MALE3 ampamp p getAge ( ) gt= 184 ampamp p getAge ( ) lt= 25 5

Listagem 38 Exemplo de expressatildeo lambda com um bloco de coacutedigo [30]

18

342 Principais formas de uso

Anonymous Inner Class

Antes do Java 8 a necessidade de passar funccedilotildees ou expressotildees como paracircmetro de algummeacutetodo era suprida atraveacutes de Anonymous Inner Classes A utilizaccedilatildeo desse tipo dedeclaraccedilatildeo junto com a anotaccedilatildeo de Override permite sobrescrever um meacutetodo de umainterface funcional e ao mesmo tempo passa-la como argumento para um meacutetodo Umaexpressatildeo lambda se comporta da mesma forma poreacutem a quantidade de coacutedigo escritopela Anonymous Inner Class eacute maior e pode dificultar a leitura de coacutedigo pois conteacutemmuita informaccedilatildeo natildeo utilizada para efetivo entendimento do que estaacute sendo feito naqueletrecho

A Listagem 39 apresenta a instanciaccedilatildeo da classe EventHandler internamente ao meacute-todo setOnAction() de forma que o desenvolvedor possa escrever o comportamento quedeseja passar como paracircmetro do meacutetodo atraveacutes da substituiccedilatildeo do meacutetodo handle()que jaacute existe pelo meacutetodo handle() criado e escrito pelo desenvolvedor

1 btn setOnAction (new EventHandlerltActionEvent gt() 2 Override3 pub l i c void handle ( ActionEvent event ) 4 System out p r i n t l n ( He l lo World ) 5 6 )

Listagem 39 Exemplo de uso de Anonymous Inner Class [35]

Interface funcional

Ao projetar um coacutedigo novo o desenvolvedor que optar por utilizar expressotildees lambdadeve iniciar com a criaccedilatildeo de uma interface funcional Esse tipo de interface possui umuacutenico meacutetodo abstrato permitindo que expressotildees lambda sejam usadas para sobrescrevero comportamento do meacutetodo abstrato Uma interface funcional pode possuir outros meacuteto-dos desde que sejam default Uma nova anotaccedilatildeo FunctionalInterface foi adicionadacom a atualizaccedilatildeo do Java 8 para conferir em tempo de compilaccedilatildeo se a interface satisfazos requisitos desse modelo de interface

A Listagem 310 apresenta um exemplo de interface funcional com o objetivo de permi-tir o uso de expressotildees lambda que utilizaratildeo de dois Double como paracircmetro e jaacute utilizada nova anotaccedilatildeo FunctionalInterface introduzida no Java 8

1 Funct iona l Inte r face2 pub l i c i n t e r f a c e DoubleOp 3 pub l i c Double apply ( Double a Double b)

19

4

Listagem 310 Exemplo de interface funcional

Dessa forma conforme as Listagens 311 e 312 o meacutetodo apply() pode tomar formade qualquer operaccedilatildeo entre dois Double que seraacute especificada quando a expressatildeo lambdafor montada dando o aspecto de linguagem funcional agrave linguagem e mais facilidade eliberdade ao desenvolvedor

1 pub l i c c l a s s Ca l cu la to r 2 pub l i c s t a t i c Double c a l c ( Double op1 Double op2 DoubleOp operator ) 3 re turn operator apply ( op1 op2 ) 4 5

Listagem 311 Exemplo de aplicaccedilatildeo da interface funcional

1 Double r e s u l t 1 = Ca lcu la to r c a l c (10d 50d ( a b ) minusgt a + b)

Listagem 312 Uso de expressatildeo lambda para o exemplo anterior

Collections

Dentre as atualizaccedilotildees de pacotes do Java 8 foi adicionado um meacutetodo stream() nainterface Collection Esse meacutetodo trata as Collection como streams o que significa queapesar de natildeo ser possiacutevel acessar elementos diretamente algumas novas manipulaccedilotildeessatildeo possiacuteveis Essas manipulaccedilotildees satildeo na verdade meacutetodos da interface Stream quepodem receber como paracircmetro uma expressatildeo lambda ou seja um comportamento a seraplicado agrave Collection Dentre os meacutetodos temos

bull filter() O meacutetodo filter() recebe uma expressatildeo lambda contendo uma condiccedilatildeopara filtragem da collection

bull map() O meacutetodo map() mapeia os elementos de uma Collection em outro objetocomo uma String A expressatildeo lambda passada por paracircmetro deve retornar o tipode objeto ao qual seraacute mapeado

bull forEach() O meacutetodo forEach() aplica uma operaccedilatildeo especiacutefica para cada ele-mento da Collection A expressatildeo lambda a ser passada deve conter a operaccedilatildeo aser realizada

bull min() e max() Os meacutetodos min() e max() retornam o elemento menor ou maiorda Collection dependendo da expressatildeo lambda passada como paracircmetro

20

A Listagem 313 demonstra como vaacuterias operaccedilotildees com uma Collection podem seraplicadas de uma vez de forma que lendo a expressatildeo lambda jaacute eacute possiacutevel saber oresultado da aplicaccedilatildeo do meacutetodo agrave Collection

1 r o s t e r2 stream ( )3 f i l t e r (4 p minusgt p getGender ( ) == Person Sex MALE5 ampamp p getAge ( ) gt= 186 ampamp p getAge ( ) lt= 25)7 map(p minusgt p getEmailAddress ( ) )8 forEach ( emai l minusgt System out p r i n t l n ( emai l ) )

Listagem 313 Exemplo de utilizaccedilatildeo de meacutetodos de stream com expressotildees lambda [30]

21

Capiacutetulo 4

Estudo e o Processo de Mineraccedilatildeo

A definiccedilatildeo da metodologia utilizada para realizaccedilatildeo deste trabalho eacute importante para queexista uma padronizaccedilatildeo e melhor entendimento de como os resultados foram obtidos paraque a replicaccedilatildeo do mesmo possa ser realizada em trabalhos futuros [36]

Figura 41 Processo utilizado para realizaccedilatildeo do estudo

O esquema representado na Figura 41 descreve o processo seguido para a realizaccedilatildeodeste trabalho que foi divido em trecircs grandes etapas a de planejamento definindo osobjetivos questotildees de pesquisa e meios de investigaccedilatildeo deste projeto a etapa de execuccedilatildeorealizando todo o procedimento metodoloacutegico definido para a coleta e refinamento de

22

dados e a etapa de avaliaccedilatildeo onde foram classificados e avaliados os dados coletadospara responder agraves questotildees de pesquisa

A seguir na primeira seccedilatildeo seratildeo apresentadas em detalhes as questotildees de pesquisa aserem respondidas Em seguida seraacute feito uma breve descriccedilatildeo da fonte de dados utilizada- especificamente os projetos utilizados como objetos de estudo deste trabalho e por fimtodo o restante da metodologia que foi de fato desenvolvida para obter os resultadosnecessaacuterios

41 Questotildees de Pesquisa

Com o objetivo de entender e caracterizar melhor o uso de expressotildees lambda foramdefinidas as seguintes questotildees de pesquisa a serem respondidas

bull PQ-1 Quando os projetos comeccedilaram a introduzir o uso de expressotildees lambda emseus coacutedigos e qual a meacutedia de expressotildees lambda por snapshots caso existam

bull PQ-2 Como as equipes de desenvolvimento estatildeo utilizando expressotildees lambdaatraveacutes de refatoraccedilatildeo de coacutedigo ou introduzindo apenas em coacutedigo novo

bull PQ-3 Quais satildeo os padrotildees tipicamente adotados para o uso de expressotildees lambda

A primeira pergunta de pesquisa gira em torno de como projetos populares open-sourceestatildeo se adaptando agrave introduccedilatildeo de expressotildees lambda em Java muitos projetos jaacute estatildeoutilizando as expressotildees lambda Se sim a partir de quando comeccedilaram a utilizaacute-lasdesde o iniacutecio da introduccedilatildeo das mesmas no Java 8 ou em um periacuteodo mais tardio Aleacutemdisso eacute interessante descobrir se a utilizaccedilatildeo dessa nova caracteriacutestica tem acontecido deforma expressiva ou natildeo

Em seguida para melhor entender a forma como as expressotildees lambda estatildeo sendointroduzidas em projetos eacute interessante investigar se as equipes de desenvolvimento estatildeose preocupando em refatorar coacutedigo com o objetivo de evoluir o software ou se estatildeoexperimentando utilizar expressotildees lambda apenas em coacutedigo novo introduzido

Como a introduccedilatildeo de novas funcionalidades em projetos open-source de grande escaladepende do objetivo do projeto e os padrotildees de projeto utilizados [37] espera-se obser-var diversas abordagens quanto a utilizaccedilatildeo de expressotildees lambda para entatildeo poderclassificar estes softwares quanto a abordagem utilizada

Eacute de grande importacircncia para este estudo conseguir identificar na praacutetica comoexpressotildees lambda estatildeo sendo tipicamente adotadas nestes projetos Assim a terceirapergunta de pesquisa busca identificar alguns exemplos de utilizaccedilatildeo atraveacutes da realizaccedilatildeode alguns estudos de caso

23

Eacute importante ressaltar que apesar de as expressotildees lambda serem uma alternativa aouso de AIC elas natildeo os substituem completamente Existem precondiccedilotildees para que umaAIC possa ser substituiacuteda por expressotildees lambda [12] descritas a seguir

bull AIC deve instanciar-se de uma interface

bull AIC natildeo deve possuir nenhum campo e declarar apenas um meacutetodo

bull AIC natildeo deve possuir uma referecircncia para this ou super

bull AIC natildeo deve declarar um meacutetodo recursivo

Para responder agrave primeira pergunta apenas dados gerais sobre todos os projetos seratildeonecessaacuterios ao passo que pelas perguntas 2 e 3 possuiacuterem uma natureza mais complexaseraacute necessaacuterio aleacutem de uma anaacutelise geral estatiacutestica a realizaccedilatildeo de alguns estudos decaso para obter resultados mais completos

42 Fonte de Dados e Objetos de Estudo

Para responder agraves perguntas de pesquisa estabelecidas foram selecionados os 99 projetosmais populares na linguagem Java dentro da plataforma github ateacute a data da coleta dosdados feita em Abril de 2017 Satildeo considerados populares os repositoacuterios que possuema maior quantidade possiacutevel de estrelas (stars) A decisatildeo de escolher os 99 projetos maispopulares foi por sua natureza imparcial e ao mesmo tempo para que se possa analisarprojetos que satildeo de familiaridade e conhecimento da comunidade do github e de domiacuteniopuacuteblico Os 99 projetos estatildeo listados no Anexo I

Para entender a transiccedilatildeo feita por esses projetos entre as versotildees anteriores do Java eo Java 8 com as expressotildees lambda eacute necessaacuterio analisar o coacutedigo de vaacuterias versotildees a fimde observar alguma mudanccedila para cada projeto Como satildeo 99 projetos e vaacuterios dessesprojetos possuem milhares de linhas de coacutedigo e commits seria impossiacutevel avaliar todosos commits Optou-se entatildeo por coletar snapshots mensais de cada projeto conformeprocedimento tambeacutem seguido anteriormente [38] Cada snapshots representa o estadodo projeto em um determinado mecircs e como criteacuterio de escolha padratildeo todos os snapshotsequivalem ao uacuteltimo commit realizado no determinado mecircs que este representa

O proacuteximo passo eacute determinar o periacuteodo de tempo em que esses snapshots seriamcoletados Como Java 8 (e consequentemente as expressotildees lambda) foi introduzidoapenas em meados de 2014 [28] coletar dados de projetos a partir de um periacuteodo muitoantes deste ano natildeo agregaria valor ao estudo em questatildeo Definiu-se entatildeo um periacuteodopara a coleta mensal desses snapshots atraveacutes dos anos Janeiro de 2013 um ano antesda introduccedilatildeo do Java 8 para que se pudesse identificar para todos os projetos o mecircs

24

exato em que expressotildees lambda foram introduzidas ateacute o mecircs da coleta de dados Abrilde 2017

Eacute importante ressaltar que a definiccedilatildeo dos meses foi definida do dia primeiro de ummecircs ao dia primeiro do proacuteximo mecircs e por consequecircncia alguns snapshots que deveriamrepresentar o final de determinado mecircs correspondem na verdade a commits realizadosno dia primeiro do mecircs seguinte Por exemplo pode existir casos em que o commit querepresente o mecircs de Marccedilo de 2016 seja na verdade o commit realizado no dia primeirode Abril de 2016 Isso se deve a natureza da forma como os resultados de log de commitssatildeo obtidos pelo git [39] Poreacutem isso natildeo interfere nas anaacutelises ou no propoacutesito destetrabalho uma vez que foram realizadas verificaccedilotildees e validaccedilotildees para que natildeo existamdatas repetidas (e consequentemente commits repetidos) por repositoacuterio

Neste trabalho o termo projeto e repositoacuterio foram utilizados de forma intercaladapara representar a mesma coisa o software desenvolvido que possui um repositoacuterio naplataforma github Os termos commit snapshops e versotildees tambeacutem representam a mesmacoisa uma vez que foi definido que seriam utilizados apenas um commit por mecircs pararepresentar um determinado snapshot ou versatildeo do repositoacuterio em questatildeo

Todos os 99 projetos seratildeo utilizados para a realizaccedilatildeo de uma anaacutelise geral de ca-racterizaccedilatildeo do uso de expressotildees lambda Para as anaacutelises aprofundadas foi feito umcriteacuterio de classificaccedilatildeo para que apenas alguns projetos possam ser analisados em niacutevelde coacutedigo como estudos de caso

Resumindo foram escolhidos os 99 projetos mais populares de Java no github cole-tando dados mensais de seus commits a partir do ano de 2013 ateacute a data da coleta dosdados lembrando que nem todos os projetos existem desde 2013 (projetos mais recentes)

43 Processo de Mineraccedilatildeo

A abordagem utilizada para coletar e analisar os 99 projetos escolhidos como mostra aFigura 42 foi realizada de forma automatizada utilizando scripts python e dois projetosdesenvolvidos em Java para a coleta e tratamento de dados como descrito a seguir

Primeiramente foi realizado uma coacutepia dos repositoacuterios atuais de todos os 99 projetosmais populares do github em Java Para automatizar o processo foi desenvolvido umscript em python que lista todos os projetos escolhidos clona todos os repositoacuterios emuma pasta na maacutequina local e cria um arquivo temporaacuterio com as informaccedilotildees do nomede cada repositoacuterio e seu caminho absoluto na maacutequina local

25

Figura 42 Metodologia implementada para coleta e tratamento de dados

Em seguida foi necessaacuterio realizar o checkout de todas as versotildees entre Janeiro de2013 a Abril de 2017 de cada projeto Por motivos de otimizaccedilatildeo de espaccedilo da maacutequinalocal e automatizaccedilatildeo no processo de checkout utilizou-se de um segundo script pythonque realizava as seguintes tarefas para cada mecircs em cada projeto verificar se dentreo mecircs estipulado houve algum commit para aquele projeto se sim pega-se o hash douacuteltimo commit do mecircs realiza o checkout conta-se a quantidade de linhas de coacutedigo emJava que o projeto tem utilizando a biblioteca cloc e armazena todas as informaccedilotildeespertinentes referentes a todos os projetos que naquele mecircs tiveram commits para que oprojeto static-analysis possa entatildeo ser executado sobre esses projetos naquele determinadomomento As informaccedilotildees coletadas que satildeo utilizadas pelo static-analysis correspondemao nome do projeto o hash do commit para aquela versatildeo a pasta onde o projeto estaacutearmazenado na maacutequina local a quantidade de linhas de coacutedigo Java do projeto e datareferente ao commit Essas informaccedilotildees satildeo pertinentes para que o projeto static-analysisconsiga funcionar de forma correta projeto este descrito em detalhes a seguir

431 static-analysis

O static-analysis foi um projeto desenvolvido anteriormente a este trabalho pelos alunosThiago Cavalcanti e Vinicius de Almeida cujo objetivo eacute realizar a anaacutelise estaacutetica de

26

coacutedigos-fonte Java e gerar arquivos de saiacuteda contendo informaccedilotildees de classes e meacutetodoscom suas devidas ocorrecircncias de caracteriacutesticas da linguagem [40]

A anaacutelise estaacutetica de coacutedigo consiste em analisar um coacutedigo-fonte sem a necessidadede executaacute-lo Esse tipo de anaacutelise eacute de extrema importacircncia para manter um coacutedigo dequalidade evitar futuras refatoraccedilotildees e obter informaccedilotildees estatiacutesticas de forma raacutepida epraacutetica [41]

Seguindo esse princiacutepio o static-analysis foi projetado para receber um arquivo deentrada csv seguindo o padratildeo

Tipo da Aplicaccedilatildeo Inicio do projeto Antes ou Apoacutes Java 5 Nome do ProjetoVersatildeo Caminho absolutoQuantidade de linhas de coacutedigo

Atraveacutes da informaccedilatildeo do caminho absoluto do projeto o static-analysis varre osdiretoacuterios em busca dos arquivos fonte java realiza o parse desses arquivos e utilizade Visitors para extrair as informaccedilotildees desejadas e exporta-las em arquivos csv Ouso de Visitors permite que sejam escolhidas as informaccedilotildees desejadas para a consultacomo expressotildees Lambda e AIC s aleacutem de possibilitar que sejam implementados novosVisitors conforme a linguagem evolua ou as necessidades mudem

Para este trabalho foram utilizados os Visitors de expressotildees Lambda map() filter()AICs e declaraccedilotildees de meacutetodos

432 BDAnalisador

Apoacutes obter todas as informaccedilotildees necessaacuterias geradas pelo static-analysis era preciso ma-nipular os dados de forma que facilitasse a coleta de dados para o estudo proposto Comovaacuterios arquivos em formato csv satildeo de difiacutecil manipulaccedilatildeo foi desenvolvido entatildeo umaferramenta chamada BDAnalisador Esta ferramenta eacute responsaacutevel por processar os arqui-vos em csv gerados pelo static-analysis e popular uma base de dados relacional MySQLcom as informaccedilotildees pertinentes a este estudo

O BDAnalisador foi desenvolvido com a intenccedilatildeo de tornar mais simples o trabalhocom os dados resultantes do static-analysis de forma que consultas em SQL pudessemser feitas a ponto de permitir a obtenccedilatildeo de resultados mais complexos Seguindo esseobjetivo o framework Hibernate foi escolhido como ferramenta para persistecircncia devidoa ser um framework jaacute consolidado no mercado e que de forma simples relaciona osobjetos Java ao banco de dados MySQL [42] A divisatildeo de classes foi projetada em quatroentidades Projeto Versao Classe e Metodo cada uma com seus respectivos camposcontendo as informaccedilotildees necessaacuterias para a pesquisa como pode ser visto na Figura 44Eacute importante ressaltar que a tabela de Versao guarda hashs de commits devido agrave escolhade utilizar commits para obter mais informaccedilatildeo de evoluccedilatildeo de coacutedigo em um menor

27

espaccedilo de tempo Aleacutem disso para este trabalho optou-se por persistir todos os meacutetodose classes de cada versatildeo sem se importar com a repeticcedilatildeo desses dados pois a hipoacutetesede haver grandes refatoraccedilotildees entre versotildees poderia comprometer a confiabilidade dasinformaccedilotildees

Figura 43 Diagrama de classes UML do BDAnalisador

Como visto na Figura 43 seguindo parcialmente a arquitetura MVC cada entidadepossui sua respectiva classe DAO(Data Access Object) para persistecircncia dos dados eapenas uma classe Controlador no projeto responsaacutevel pela manipulaccedilatildeo e parse dosdados dos arquivos csv gerados pelo static analysis para serem enviados agraves classes DAOO sistema inicia chamando o meacutetodo inicializar() da classe Controlador Esse meacutetodoeacute responsaacutevel por ler um arquivo de entrada csv que segue o mesmo modelo do arquivo dostatic-analysis citado na seccedilatildeo anterior O arquivo conteacutem os dados de todos os projetose suas respectivas versotildees dessa forma o meacutetodo instancia um objeto da classe Projetoe persiste o projeto no banco de dados Para cada versatildeo encontrada no arquivo deentrada o inicializar() aciona os meacutetodos responsaacuteveis por instanciar e preencher aslistas da classe Classe e Metodo Os meacutetodos responsaacuteveis por preencher as listas varremos arquivos csv gerados pelo static-analysis e fazem o parse das informaccedilotildees relevantescomo nomes dos meacutetodos e quantidades de lambdas para construir os objetos que seratildeogravados Ao final dos preenchimentos o objeto Versatildeo eacute instanciado e gravado no bancode dados atraveacutes de sua classe DAO ao mesmo tempo que grava suas respectivas Classese Metodos

28

Apoacutes vaacuterios testes e correccedilotildees de bugs o banco de dados se encontrava finalmente comas informaccedilotildees de 99 projetos Java open-source separados por um commit por mecircs desde2013 cada um com suas respectivas informaccedilotildees de classes meacutetodos e a quantidade deexpressotildees lambda filters e maps em cada meacutetodo Filter ou Filter pattern eacute o padratildeode projeto que tem como objetivo filtrar objetos de uma coleccedilatildeo (Collection) de acordocom algum criteacuterio Jaacute o map ou map pattern eacute um padratildeo que ldquomapeia os elementosde uma coleccedilatildeo aplicando uma funccedilatildeo a eles para uma nova coleccedilatildeo [43] A coleta deinformaccedilotildees sobre esses padrotildees podem ser uacuteteis para possiacuteveis anaacutelises de oportunidadesde uso de expressotildees lambda para refatoraccedilatildeo de coacutedigo

A Figura 44 mostra o esquema de como o banco de dados resultante foi gerado

Figura 44 Modelo relacional do banco de dados populado pelo BDAnalisador Imagemgerada com software DBeaver [2]

44 Classificaccedilatildeo e Anaacutelise

Com o banco de dados populado restam apenas as etapas de classificaccedilatildeo e anaacutelise pararesponder as questotildees de pesquisa propostas Para isso inicialmente houve uma tentativade se utilizar apenas queries SQL para analisar os dados de acordo com as informaccedilotildeesrelevantes Poreacutem devido ao fato de o banco de dados conter todas as informaccedilotildees detodos os projetos e todas as suas versotildees queries que possuem uma alta complexidadedemoravam muito tempo para retornar os dados

Assim com o objetivo de facilitar o trabalho alguns scripts python foram desenvolvi-dos para rodar as queries separadamente e individualmente para cada projeto de formaautomatizada a fim de melhorar o tempo de resposta para obtenccedilatildeo dos resultados

29

441 Meacutedia de Lambda

O primeiro script retorna a quantidade de expressotildees lambda (ou AICs) por n snapshotsque contenha expressotildees lambda O objetivo eacute ter uma visatildeo geral da meacutedia de expressotildeeslambda e AICs utilizadas por cada projeto e como nem todos os snapshots coletados decada projeto possuem expressotildees lambda e AICs apenas aqueles com alguma expressatildeolambda ou AIC satildeo incluiacutedos no caacutelculo da meacutedia

Mmedia =sumn qtdLambdai

n

442 Anaacutelise Temporal

O segundo script retorna para cada projeto a soma total da quantidade de expressotildeeslambda AIC map() e filter() no projeto inteiro para cada versatildeo Ou seja tem-seo total de cada uma das quatro propriedades selecionadas para cada mecircs do projetoobtendo assim uma visatildeo temporal de evoluccedilatildeo do uso das caracteriacutesticas descritas ATabela 41 ilustra parcialmente o resultado obtido para o projeto agera onde idVersaoeacute o identificador no banco de dados referente ao hash do commit mensal coletado qtd eacutea quantidade de cada uma das caracteriacutesticas escolhidas e a data do commit encontra-seno formato americano

Tabela 41 Informaccedilotildees mensais sobre o projeto ageraidVersao Data do Commit qtd lambda qtd AIC qtd maps qtd filter

823 512016 0 29 4 0755 612016 13 28 4 0686 6152016 13 29 4 0621 812016 13 29 4 0555 8162016 13 30 4 0485 922016 13 30 4 0422 10132016 14 30 4 0356 11282016 14 30 4 0295 12212016 21 30 5 0232 212017 21 30 5 0175 312017 21 30 5 0112 3312017 21 36 5 048 4242017 21 48 5 0

Os resultados obtidos com esta anaacutelise temporal permitiu a identificaccedilatildeo de padrotildees nautilizaccedilatildeo de expressotildees lambda em relaccedilatildeo a utilizaccedilatildeo de AIC por todos os projetos Foi

30

possiacutevel classificar todos os projetos em 6 grupos ilustrado na Figura 45 Primeiramenteseparou-se os projetos entre os que possuem expressotildees lambda e os que natildeo possuemDentre os que possuem identificou-se cinco categorias

1 Grupo 1 Quantidade de AICs e expressotildees lambda aumentam com o tempo pro-porcionalmente

2 Grupo 2 Quantidade de AICs diminui agrave medida que a quantidade de expressotildeeslambda aumentam e a quantidade de expressotildees lambda ultrapassa a quantidade deAIC em um determinado momento

3 Grupo 3 Quantidade de AICs diminui agrave medida que a quantidade de expressotildeeslambda aumentam mas a quantidade de AIC permanece superior agrave quantidade delambda

4 Grupo 4 Expressotildees lambda satildeo introduzidas e existem por um pequeno periacuteodode tempo mas satildeo completamente removidas posteriormente

5 Grupo 5 Quantidade de expressotildees lambda eacute constante e muito inferior compa-rado com a quantidade de AICs no projeto Foi determinado que para pertencera esta classificaccedilatildeo o projeto precisa ter uma razatildeo de meacutedia de expressotildees lamb-dasnapshot por meacutedia de AICsnapshot inferior a 020 Esse paracircmetro foi esta-belecido com o objetivo de definir um padratildeo para o que pode ser considerado umprojeto com poucas expressotildees lambda

Figura 45 Classificaccedilatildeo dos projetos

31

443 Refatoraccedilatildeo de Coacutedigo

O uacuteltimo script teve como objetivo realizar uma tentativa inicial de identificar refatoraccedilatildeode coacutedigo da seguinte maneira para todos os projetos que possuem expressotildees lambdaforam identificados o mecircs imediatamente antes da introduccedilatildeo de expressotildees lambda e omecircs seguinte onde houve a primeira ocorrecircncia de lambda no projeto Assim realizou-se uma anaacutelise do tamanho em quantidade de linhas de coacutedigo de todos os meacutetodosdo projeto que no mecircs seguinte tiveram introduccedilatildeo de lambda Em seguida fez-se umacomparaccedilatildeo com os mesmos meacutetodos em relaccedilatildeo ao mecircs anterior e assim foi possiacuteveldetectar quais meacutetodos tiveram a quantidade de linhas de coacutedigo reduzidas o que seriaum indicativo natildeo necessariamente exclusivo de que uma refatoraccedilatildeo de coacutedigo possa terocorrido

Sabe-se que este meacutetodo de detecccedilatildeo de refatoraccedilatildeo de coacutedigo possui suas limitaccedilotildeesuma vez que as comparaccedilotildees para saber se um meacutetodo existe em ambas versotildees eacute feitopuramente por comparaccedilatildeo de String (nome do meacutetodo) e a classe que este pertence

444 Casos de Uso

Os meacutetodos descritos acima ajudaram a identificar alguns padrotildees e facilitar a anaacutelise dosdados Poreacutem natildeo satildeo suficientes para que se possa responder agraves questotildees de pesquisaDessa forma apoacutes a identificaccedilatildeo dos grupos de classificaccedilatildeo para os projetos foramescolhidos um projeto de cada grupo (com exceccedilatildeo do grupo dos projetos sem expressotildeeslambda) para realizar um breve estudo de caso com o objetivo de identificar e caracterizarmelhor a adoccedilatildeo de expressotildees lambda Os projetos escolhidos foram agera vertxAndroid-CleanArchitecture RxJava e guava

32

Capiacutetulo 5

Resultados Obtidos e Anaacutelise

Neste capiacutetulo seratildeo apresentados os dados obtidos e anaacutelise com o objetivo de responderagraves questotildees de pesquisa propostas Como mencionado anteriormente as perguntas seratildeorespondidas de duas maneiras algumas com informaccedilotildees gerais sobre todos os projetose outras com breve estudos de caso envolvendo cinco projetos

51 Visatildeo Geral

Dentre os repositoacuterios coletados para a anaacutelise 74 (7474) natildeo utilizaram nenhumaexpressatildeo lambda no projeto durante todo o periacuteodo analisado (Janeiro de 2013 a Abrilde 2017) restando apenas 25 repositoacuterios (2525) com expressotildees lambda Eacute interessantedestacar que apesar de a quantidade de repositoacuterios que natildeo possuem expressotildees lambdaser relativamente expressiva muitos destes repositoacuterios satildeo de projetos em Java que umdia foram populares e atualmente natildeo estatildeo sendo mais desenvolvidos (por exemplo umaplicativo que soacute funciona para Android 23 atualmente descontinuado)

Levando em consideraccedilatildeo apenas os projetos que possuem expressotildees lambda exis-tem dois tipos de dados que podem ser analisados para responder agrave primeira questatildeo depesquisa atraveacutes dos dados obtidos pelo meacutetodo anteriormente mencionado como anaacutelisetemporal e a meacutedia de lambda por snapshot mencionados no capiacutetulo anterior

Com relaccedilatildeo ao ano em que a primeira ocorrecircncia foi encontrada 6 projetos introduzi-ram expressotildees lambda jaacute em 2014 8 comeccedilaram a utilizar em 2015 7 em 2016 e apenas4 tiveram a primeira ocorrecircncia de expressotildees lambda em 2017 Dessa forma percebe-seque os projetos estatildeo relativamente bem distribuiacutedos em grupos quanto ao ano em que seintroduziu expressotildees lambda

Pela meacutedia de lambda por snapshot (lambdasnapshot) a maioria (11 projetos) possuiuma quantidade expressiva acima de 100 lambdasnapshot (com 6 projetos entre 20 e 100lambdasnapshot e 8 projetos com menos de 20 lambdasnapshot) como apresentados no

33

graacutefico da Figura 51 Isso mostra que essa nova caracteriacutestica jaacute estaacute sendo bem utilizadanos projetos que comeccedilaram a migrar para a nova versatildeo do Java

Figura 51 Graacuteficos dos projetos separados por ano de introduccedilatildeo de expressotildees lambdae meacutedia de lambda por snapshot

Com isso pode-se observar que apesar de a quantidade de projetos que possuemexpressotildees lambda natildeo ser tatildeo alta eacute possiacutevel obter resultados expressivos uma vez quea quantidade dos projetos com lambda estatildeo bem dispersos quanto ao periacuteodo em quecomeccedilaram a adotar essa caracteriacutestica e a quantidade de expressotildees lambda por snapshot

511 Projetos Selecionados

Atraveacutes dos grupos de classificaccedilatildeo identificados pela anaacutelise temporal descritos na Figura45 cinco projetos foram selecionados para uma anaacutelise detalhada levando em consideraccedilatildeoo grupo em que eles pertencem Estes projetos seratildeo apresentados a seguir

512 agera

Agera eacute uma biblioteca Android que ajuda a introduzir programaccedilatildeo funcional reativa(functional reactive programming) em projetos Android Eacute um projeto recente lanccediladoem 2016 pela Google [44] e encontra-se no grupo dos projetos que introduziram expressotildeeslambda em 2016 no mesmo ano de seu lanccedilamento contendo uma meacutedia de expressotildeeslambda de 16 lambdasnapshot

Na classificaccedilatildeo estabelecida agera pertence ao Grupo 1 onde a quantidade de ex-pressotildees lambda no projeto com o tempo aumentam juntamente com a quantidade deAICs como mostra o graacutefico de anaacutelise temporal na Figura 52

34

Figura 52 Graacuteficos de anaacutelise temporal do projeto agera

513 vertx

Eclipse Vertx eacute um conjunto de ferramentas para criaccedilatildeo de reactive applications namaacutequina virtual Java (JVM) em grande escala [45] Seu primeiro lanccedilamento aconteceuem 2011 e a primeira ocorrecircncia de expressotildees lambda no projeto aconteceu em 2014 Esteprojeto possui uma meacutedia de 2867 lambdasnapshot e dentre os projetos consideradosneste trabalho eacute o que possui a maior quantidade de expressotildees lambda

Este projeto pertence ao Grupo 2 onde a quantidade de expressotildees lambda aumen-tou consideravelmente pelos meses ultrapassando a quantidade de AICs que diminuiudrasticamente como mostra a Figura 53

35

Figura 53 Graacuteficos de anaacutelise temporal do projeto Vertx

514 Android-CleanArchitecture

Apesar de ser uma amostra de projeto Android-CleanArchitecture que tem como objetivoconstruir aplicaccedilotildees Android utilizando clean architecture foi lanccedilado em 2014 mas semanteacutem sempre atualizado [46]

A introduccedilatildeo de expressotildees lambda que aconteceu no ano de 2015 se deu de formatiacutemida com uma meacutedia de 35 lambdasnapshot De qualquer forma este projeto conseguerepresentar com seu graacutefico de anaacutelise temporal o grupo 3 composto por projetos em quea quantidade de expressotildees lambda aumentou mas sem ultrapassar AICs que diminuiacuteramdemonstrado no graacutefico da Figura 54

36

Figura 54 Graacuteficos de anaacutelise temporal do projeto Android-CleanArchitecture

515 RxJava

Dentre os repositoacuterios estudados RxJava eacute considerado o mais popular Como umaimplementaccedilatildeo de Reactive Extensions para a JVM RxJava teve seu lanccedilamento dadoem 2013 [47] Expressotildees lambda apareceram pela primeira vez no ano de 2015 comuma meacutedia de 766 lambdasnapshot

Apesar de uma meacutedia relativamente alta o tempo de vida das expressotildees lambda nesteprojeto foi bem curto caracterizando assim projetos do grupo 4 houve a introduccedilatildeo dasexpressotildees lambda no projeto poreacutem houve a remoccedilatildeo completa de todas as expressotildeeslambda previamente introduzidas desaparecendo completamente do projeto ateacute a datada coleta de dados (Figura 55)

37

Figura 55 Graacuteficos de anaacutelise temporal do projeto RxJava

516 guava

Guava eacute um conjunto de bibliotecas para Java da Google lanccedilado em 2011 A atualizaccedilatildeodo coacutedigo do projeto para Java 8 aconteceu somente em 2016 e apesar do projeto conteruma meacutedia de 281 lambdasnapshot ele foi escolhido como representante dos projetosdo Grupo 5 (Figura 56) que possuem expressotildees lambda mas de forma natildeo expressiva osuficiente quando comparado com a quantidade de AIC pelo fato de sua razatildeo de meacutedia delambdasnapshot por meacutedia de AICsnapshot ser 004 Ou seja embora o projeto tenhaexpressotildees lambda estas satildeo consideradas muito poucas quando inseridas no contextogeral deste projeto que eacute considerado um projeto grande

38

Figura 56 Graacuteficos de anaacutelise temporal do projeto Guava

52 Refatoraccedilatildeo de Coacutedigo

Com o objetivo de caracterizar melhor como as expressotildees lambda estatildeo sendo utilizadaseacute interessante identificar se estas estatildeo sendo introduzidas atraveacutes de refatoraccedilatildeo de coacutedigoou em coacutedigo novo

Os projetos classificados como pertencentes ao Grupo 2 possuem em comum o fatode expressotildees lambda aumentarem a medida que AICs diminuem ultrapassando-as eessa caracteriacutestica em comum pode indicar que nestes projetos possivelmente houve re-fatoraccedilatildeo de coacutedigo visto que AIC sendo substituiacutedo por expressotildees lambda dentro dascondiccedilotildees determinadas eacute a maneira mais comum de se identificar refatoraccedilatildeo de coacute-digo para introduccedilatildeo de expressotildees lambda [12] Os projetos que compotildeem o grupo 2representam 44 de todos os projetos estudados que possuem expressotildees lambda o quepode ser um indicativo caso a hipoacutetese de refatoraccedilatildeo de coacutedigo seja positiva de quemuitos projetos que estatildeo adotando o Java 8 estatildeo se preocupando de alguma formacom refatoraccedilatildeo se coacutedigo Fazem parte desse grupo os seguintes projetos elasticsearchjava-design-patterns PocketHub presto RxJava-Android-Samples spark vertx zipkinjava8-tutorial dropwizard e material-dialogs

39

Outra maneira de verificar possiacuteveis indicadores de refatoraccedilatildeo de coacutedigo foi atraveacutesda anaacutelise dos tamanhos (em quantidade de linhas de coacutedigo) dos meacutetodos com expressotildeeslambda no mecircs em que se introduziu expressotildees lambda e um mecircs imediatamente antesdeste Essa anaacutelise mostra que dos 25 projetos com expressotildees lambda 12 (48) projetostiveram ao menos um meacutetodo em que houve uma diminuiccedilatildeo no tamanho o que podeser considerado um indicativo de refatoraccedilatildeo de coacutedigo A Figura 57 mostra todos osprojetos em relaccedilatildeo agrave quantidade total de meacutetodos que possuem lambda no primeiro mecircsde introduccedilatildeo do mesmo em vermelho comparado com a quantidade desses meacutetodos quetiveram uma diminuiccedilatildeo no tamanho quando comparados com o coacutedigo do mecircs anteriorem azul

Figura 57 Comparaccedilatildeo entre todos os projetos com expressatildeo lambda sobre refatoraccedilatildeode coacutedigo no mecircs de introduccedilatildeo da caracteriacutestica

Ainda observando a figura 57 com relaccedilatildeo aos projetos que natildeo tiveram nenhummeacutetodo com diminuiccedilatildeo de tamanho (barra azul) percebe-se que todos os 13 projetossequer tiveram uma quantidade significativa de meacutetodos que possuem expressotildees lambda(com o maior tendo apenas 5 meacutetodos) no mecircs de introduccedilatildeo da caracteriacutestica no projetoe ao mesmo tempo jaacute existiam no mecircs em que natildeo existia lambda no projeto Essa eacuteuma observaccedilatildeo importante porque projetos como vertx sendo este o que possui a maiormeacutedia de lambdasnapshot de todos os projetos e ao mesmo tempo tendo apenas trecircsmeacutetodos que continham expressotildees lambda no mecircs da introduccedilatildeo e que existiam no mecircs

40

anterior permitem inferir que todas as outras expressotildees lambda existentes no projetopara este determinado mecircs de introduccedilatildeo encontram-se em coacutedigo novo introduzido

Eacute importante ressaltar que somente essa anaacutelise natildeo eacute exclusivamente suficiente paradeterminar se estes projetos estatildeo realmente introduzindo lambda em coacutedigo novo ourealizando refatoraccedilatildeo uma vez que como a comparaccedilatildeo aconteceu apenas no mecircs deintroduccedilatildeo com o mecircs imediatamente anterior natildeo reflete todo o ciclo de vida do pro-jeto Por exemplo algumas equipes podem escolher refatorar o coacutedigo depois de umtempo de adaptaccedilatildeo apoacutes a transiccedilatildeo para a nova versatildeo da linguagem Assim paraobter uma melhor anaacutelise sobre refatoraccedilatildeo de coacutedigo ou natildeo feita nestes projetos aleacutemde outras anaacutelises referentes aos padrotildees tipicamente adotados para implementaccedilatildeo delambda nestes projetos seratildeo apresentados a seguir os estudos de caso dos cinco projetospreviamente selecionados

Outro ponto importante eacute o fato de que apesar das informaccedilotildees quanto agraves quantida-des de filter e map terem sido incluiacutedas inicialmente no trabalho para observar possiacuteveispadrotildees de refatoraccedilatildeo de coacutedigo percebeu-se que estas natildeo satildeo utilizadas de forma con-sideraacutevel pelos projetos estudados e para fins de anaacutelises generalizadas natildeo apresentaramtanta influecircncia na utilizaccedilatildeo de expressotildees lambda quanto a quantidade de AICs noprojeto

53 Estudos de Caso

Dentre os projetos analisados verificou-se que os projetos de pequeno e meacutedio porte op-taram por refatorar de uma vez seus coacutedigos para incluir expressotildees lambda em situaccedilotildeesem que se utilizava AICs anteriormente ou em alguns poucos casos de utilizaccedilatildeo deCollection Os projetos de grande porte natildeo apresentaram nenhuma refatoraccedilatildeo de coacute-digo ou uma refatoraccedilatildeo parcial gradativa provavelmente devido agrave grande quantidade dearquivos e coacutedigo que possuem o que pode tornar o trabalho de refatoraccedilatildeo extenso ecansativo

O projeto vertx que pertence ao grupo 2 dos projetos em que a quantidade de ex-pressotildees lambda aumentaram e as de AICs diminuiacuteram com lambda ultrapassando AICsexecutou inicialmente commits em maio de 2014 com adiccedilatildeo de coacutedigo novo utilizandoexpressotildees lambda e apoacutes um mecircs realizou um commit maior com a refatoraccedilatildeo de todasas AICs para expressotildees lambda Apoacutes a refatoraccedilatildeo o projeto se preocupou em mantera utilizaccedilatildeo de expressotildees lambda ao mesmo tempo que o uso de AICs se manteve apenasaos casos de classes com interfaces natildeo funcionais A Figura 58 apresenta uma parte docommit de refatoraccedilatildeo de coacutedigo que mostra em vermelho a parte eliminada do coacutedigo(AIC) e em verde o coacutedigo novo representando a substituiccedilatildeo por uma expressatildeo lambda

41

Figura 58 Commit de refatoraccedilatildeo de coacutedigo do projeto Vertx [3]

Alguns projetos ainda natildeo se preocuparam em refatorar o coacutedigo para o uso de ex-pressotildees lambda ateacute a data deste trabalho que eacute o caso do projeto guava que apresentouum commit em 03112016 com a atualizaccedilatildeo do projeto para Java 8 Mas a partir daatualizaccedilatildeo se preocupou em utilizar as expressotildees lambda apenas na implementaccedilatildeo decoacutedigo novo O cenaacuterio em que a refatoraccedilatildeo natildeo eacute prioridade ainda eacute a realidade de vaacuteriosprojetos de grande porte visto que os dados de projetos sem nenhuma expressatildeo lambdasatildeo o maior nuacutemero neste trabalho Poreacutem projetos que jaacute adotaram a utilizaccedilatildeo do Java8 tendem a mudar isso com o passar do tempo A Figura 59 apresenta em verde umaadiccedilatildeo de coacutedigo novo com expressatildeo lambda sem a eliminaccedilatildeo de algum coacutedigo anteriora esse que estaria em vermelho

42

Figura 59 Exemplo de um arquivo do commit de adiccedilatildeo de coacutedigo novo em Java 8 doprojeto Guava [4]

Na categoria de projetos em que os AICs e expressotildees lambda aumentam proporci-onalmente (grupo 1) o projeto agera realizou um commit em 19052016 com a adiccedilatildeoda biblioteca retrolambda como dependecircncia do projeto Essa biblioteca utilizada prin-cipalmente por projetos Android permite executar coacutedigo Java 8 contendo expressotildeeslambda em Java 5 6 e 7 [48] O commit tambeacutem apresenta refatoraccedilatildeo dos AICs ad-vindos de interfaces funcionais para expressotildees lambda Apesar de o projeto continuar autilizar as expressotildees lambda em seus commits posteriores o nuacutemero de AICs tambeacutemcontinuou a aumentar visualizando os commits posteriores notou-se que esses AICs satildeorelativos a interfaces natildeo funcionais ou seja que possuem mais de um meacutetodo O projetoAndroid-CleanArchitecture eacute similar ao agera pois tambeacutem optou pela instalaccedilatildeo da bi-blioteca retrolambda para uso de expressotildees lambda em seus coacutedigos e como tambeacutem eacuteum projeto de pequeno porte houve uma pequena refatoraccedilatildeo dos AICs A Figura 510mostra a parte do commit de refatoraccedilatildeo de coacutedigo em que o desenvolvedor adiciona abiblioteca retrolambda como dependecircncia

43

Figura 510 Commit de adiccedilatildeo da biblioteca Retrolambda no projeto Agera [5]

Outro caso interessante eacute o do projeto RxJava que em 2015 optou pela refatoraccedilatildeodo coacutedigo para a utilizaccedilatildeo de expressotildees lambda quase eliminando por completo o usode AICs mas que no ano seguinte reverteu os commits de forma que eliminasse comple-tamente o uso de expressotildees lambda para manter a retrocompatibilidade com o Java 6A Figura 511 demonstra uma parte do commit de reversatildeo do coacutedigo para Java 6 emque pode ser visto em vermelho o coacutedigo anterior com expressotildees lambda e o verde como novo coacutedigo utilizando AIC novamente

44

Figura 511 Commit de remoccedilatildeo de Lambdas e volta para o uso de AICs no projetoRXJava [6]

Essa preocupaccedilatildeo com retrocompatibilidade de coacutedigo pode ser um fator crucial nadecisatildeo das equipes de desenvolvimento na hora de decidir como fazer o software co-evoluircom a linguagem sem perder a compatibilidade com versotildees anteriores

45

Capiacutetulo 6

Consideraccedilotildees Finais

Este estudo permitiu entender melhor como projetos estatildeo realizando a migraccedilatildeo para oJava 8 em especial utilizando uma nova caracteriacutestica introduzida expressatildeo lambdaApesar de a maioria dos projetos populares considerados natildeo possuiacuterem nenhuma ocor-recircncia de expressotildees lambda os projetos que tinham expressotildees lambda foram suficientespara realizar um primeiro estudo de caracterizaccedilatildeo no uso desta caracteriacutestica e com osprojetos efetivamente utilizados para estudo foi possiacutevel agrupaacute-los quanto a maneira emque as expressotildees lambda estavam sendo utilizadas quando comparadas com AICs em 5grandes grupos quando AIC e lambda aumentam proporcionalmente quando AIC dimi-nui e lambda aumenta ultrapassando AIC quando AIC diminui mas continua superior aolambda crescente expressotildees lambda que foram introduzidas e retiradas completamentedo coacutedigo e expressotildees lambda que natildeo existem em quantidades expressivas

Foi possiacutevel entatildeo realizar um estudo aprofundado levando em consideraccedilatildeo as di-ferentes maneiras com que as expressotildees lambda foram adotadas nos projetos atraveacutes daescolha de um projeto que representasse cada grupo para anaacutelise Dentre os cinco projetosestudados foi possiacutevel observar alguns padrotildees tipicamente adotados por desenvolvedorespara implementar expressotildees lambda em seus projetos como a utilizaccedilatildeo da bibliotecas(retrolambda) que permitissem uma flexibilizaccedilatildeo na utilizaccedilatildeo de expressotildees lambda oucomo lambda eacute primariamente utilizada para substituir determinados AICs ou operaccedilotildeesem Collection

Aleacutem disso foi possiacutevel observar como a refatoraccedilatildeo de coacutedigo acontece em cada umdesses projetos Observou-se como projetos menores tendem a refatorar coacutedigo maisfacilmente ao passo que projetos maiores e mais complexos fazem menos refatoraccedilatildeo oudemoram mais entre o periacuteodo em que houve a primeira migraccedilatildeo de coacutedigo para a novaversatildeo da linguagem ateacute o periacuteodo em que realmente decidem refatorar coacutedigo Aleacutem dacomplexidade do projeto influenciar na decisatildeo de migrar o projeto para uma versatildeo maisrecente da linguagem a preocupaccedilatildeo com retrocompatibilidade com versotildees anteriores da

46

linguagem tambeacutem podem ser uma barreira para que projetos comecem a evoluir o coacutedigojuntamente com a evoluccedilatildeo da linguagem

Ainda assim foi possiacutevel observar que a preocupaccedilatildeo com a co-evoluccedilatildeo do software-linguagem existe entre os desenvolvedores de projetos mas a realizaccedilatildeo da migraccedilatildeo aindaacontece lentamente devido agrave diversos fatores que precisam ser levados em consideraccedilatildeopara a manutenccedilatildeo do projeto

Para trabalhos e contribuiccedilotildees futuras seria interessante desenvolver uma ferramentaque pudesse analisar diretamente no coacutedigo-fonte as oportunidades de aplicaccedilatildeo de ex-pressotildees lambda dessa forma poderiam ser analisadas as porcentagens de conversatildeo decoacutedigo para Java 8 e obter melhores conclusotildees sobre a importacircncia que os projetos estatildeodando para a evoluccedilatildeo de seus coacutedigos Outro fator interessante seria aplicar mais Visitorsagrave ferramenta static-analysis e fazer este mesmo estudo aplicado agrave outras caracteriacutesticasda linguagem

47

Referecircncias

[1] Kagdi Huzefa Michael L Collard e Jonathan I Maletic A survey and taxonomyof approaches for mining software repositories in the context of software evolution2007 ix 3 8 9 10 11

[2] DBeaver Dbeaver - features httpdbeaverjkissorgdocsfeatures ix 29

[3] Eclipse Vertx commit Java8-ify code httpsgithubcomeclipsevertxcommit93f95e9c77419f442a42fe711b6eeaef88192fd3 ix 42

[4] Google Guava commit Release java 8 changes to guava httpsgithubcomgoogleguavacommit73e382fa877f80994817a136b0adcc4365ccd904 ix 43

[5] Google Agera commit Collapsed testapp with retrolambda httpsgithubcomgoogleageracommit5e518b7b05f9e7a34a314945f68deff7b2c3e334 ix 44

[6] ReactiveX Rxjava commit 2x full jdk 6 compatible backport + includ-ing bugfixes up to today httpsgithubcomReactiveXRxJavacommit000a174d87a901135f9665d3b11f3627fd2dc4ed ix 45

[7] Godfrey M W e D M German The past present and future of software evolutionEm 2008 Frontiers of Maintenance paacuteginas 129ndash138 Sept 2008 1 6

[8] Favre J M Languages evolve too changing the software time scale Em Principles ofSoftware Evolution Eighth International Workshop on paacuteginas 33ndash42 IEEE 20051 5 7

[9] Overbey Jeffrey L e Ralph E Johnson Regrowing a language refactoring tools allowprogramming languages to evolve Em ACM SIGPLAN Notices volume 44 paacuteginas493ndash502 ACM 2009 1 5 7 8 12

[10] Grechanik Mark Collin McMillan Luca DeFerrari Marco Comi Stefano CrespiDenys Poshyvanyk Chen Fu Qing Xie e Carlo Ghezzi An empirical investiga-tion into a large-scale java open source code repository Em Proceedings of the2010 ACM-IEEE International Symposium on Empirical Software Engineering andMeasurement ESEM rsquo10 paacuteginas 111ndash1110 New York NY USA 2010 ACMISBN 978-1-4503-0039-1 httpdoiacmorg10114518527861852801 1

[11] TIOBE Tiobe httpswwwtiobecomtiobe-index 1 14

48

[12] Gyori Alex Lyle Franklin Danny Dig e Jan Lahoda Crossing the gap from im-perative to functional programming through refactoring Em Proceedings of the 20139th Joint Meeting on Foundations of Software Engineering ESECFSE 2013 paacute-ginas 543ndash553 New York NY USA 2013 ACM ISBN 978-1-4503-2237-9 httpdoiacmorg10114524914112491461 2 11 24 39

[13] OpenJDK State of the lambda httpcropenjdkjavanet~briangoetzlambdalambda-state-4html 2

[14] Han Jiawei Micheline Kamber e Jian Pei Data Mining Concepts and TechniquesMorgan Kaufmann Publishers Inc San Francisco CA USA 3rd ediccedilatildeo 2011ISBN 0123814790 9780123814791 3

[15] Fowler Martin e Kent Beck Refactoring improving the design of existing codeAddison-Wesley Professional 1999 5 7

[16] Lehman M M J F Ramil P D Wernick D E Perry e W M Turski Met-rics and laws of software evolution - the nineties view Em Proceedings of the4th International Symposium on Software Metrics METRICS rsquo97 paacuteginas 20ndashWashington DC USA 1997 IEEE Computer Society ISBN 0-8186-8093-8 httpdlacmorgcitationcfmid=823454823901 6

[17] Hassan Ahmed E e Tao Xie Software intelligence The future of mining softwareengineering data Em Proceedings of the FSESDP Workshop on Future of SoftwareEngineering Research FoSER rsquo10 paacuteginas 161ndash166 New York NY USA 2010ACM ISBN 978-1-4503-0427-6 httpdoiacmorg101145188236218823978 9

[18] Hassan Ahmed E The road ahead for mining software repositories Em Frontiers ofSoftware Maintenance 2008 FoSM 2008 paacuteginas 48ndash57 IEEE 2008 8

[19] Berry Michael J e Gordon Linoff Data Mining Techniques For Marketing Salesand Customer Support John Wiley amp Sons Inc New York NY USA 1997ISBN 0471179809 10

[20] Parnin Chris Christian Bird e Emerson Murphy-Hill Java generics adoption hownew features are introduced championed or ignored Em Proceedings of the 8thWorking Conference on Mining Software Repositories paacuteginas 3ndash12 ACM 2011 12

[21] Oracle The java language specification httpsdocsoraclecomjavasespecsjlsse8jls8pdf 13

[22] Oracle The history of java technology httpwwworaclecomtechnetworkjavajavaseoverviewjavahistory-index-198355html 13

[23] Murphy Kieron So why did they decide to call itjava httpwwwjavaworldcomarticle2077265core-javaso-why-did-they-decide-to-call-it-java-html 13

[24] McGraw Tata Object-oriented Programming with Java Essentials and ApplicationsHill Education 13

49

[25] Oracle Differences between java ee and java se httpdocsoraclecomjavaee6firstcupdocgkhoyhtml 13

[26] Lindsey Clark S The History of Java Cambridge 14

[27] Oracle The java language environment httpwwworaclecomtechnetworkjavaintro-141325html 14

[28] Oracle Jdk 8 httpopenjdkjavanetprojectsjdk8 15 24

[29] Oracle Enhancements in java se 8 httpdocsoraclecomjavase8docstechnotesguideslanguageenhancementshtmljavase8 15 16 17

[30] Oracle Lambda expressions httpdocsoraclecomjavasetutorialjavajavaOOlambdaexpressionshtml 16 18 21

[31] Oracle Method references httpdocsoraclecomjavasetutorialjavajavaOOmethodreferenceshtml 16

[32] Oracle Default methods httpdocsoraclecomjavasetutorialjavaIandIdefaultmethodshtml 17

[33] Oracle Repeating annotations httpdocsoraclecomjavasetutorialjavaannotationsrepeatinghtml 17

[34] Oracle Type annotations httpdocsoraclecomjavasetutorialjavaannotationstype_annotationshtml 17

[35] Oracle Anonymous inner classes httpsdocsoraclecomjavasetutorialjavajavaOOanonymousclasseshtml 19

[36] Kothari CR Research Methodology Methods and Techniques New Age Interna-tional (P) Limited 2004 ISBN 9788122415223 httpsbooksgooglecombrbooksid=8c6gkbKi-F4C 22

[37] Nakakoji Kumiyo Yasuhiro Yamamoto Yoshiyuki Nishinaka Kouichi Kishida eYunwen Ye Evolution patterns of open-source software systems and communitiesEm IWPSE rsquo02 Proceedings of the International Workshop on Principles of SoftwareEvolution paacuteginas 76ndash85 New York NY USA 2002 ACM Press ISBN 1581135459httpdxdoiorg101145512035512055 23

[38] Rahman Foyzur Christian Bird e Premkumar Devanbu Clones What is that smellEmpirical Software Engineering 17(4-5)503ndash530 2012 24

[39] Chacon Scott Pro Git Apress Berkely CA USA 1st ediccedilatildeo 2009ISBN 1430218339 9781430218333 25

[40] Cavalcanti Thiago Gomes e Viniacutecius Correa de Almeida Caracterizaccedilatildeo do uso deconstruccedilotildees da linguagem java em projetos open-source Publicaccedilatildeo online 2016httpbdmunbbrhandle1048315733 27

50

[41] Parr Terence Language Implementation Patterns Create Your Own Domain-Specific and General Programming Languages Pragmatic Bookshelf 1st ediccedilatildeo 2009ISBN 193435645X 9781934356456 27

[42] Janssen Thorben 5 reasons to use jpa hibernate Publicaccedilatildeo online httpswwwsitepointcom5-reasons-to-use-jpa-hibernate 27

[43] Franklin Lyle Alex Gyori Jan Lahoda e Danny Dig Lambdaficator From imperativeto functional programming through automated refactoring Em Proceedings of the2013 International Conference on Software Engineering ICSE rsquo13 paacuteginas 1287ndash1290 Piscataway NJ USA 2013 IEEE Press ISBN 978-1-4673-3076-3 httpdlacmorgcitationcfmid=24867882486986 29

[44] Google Agera httpsgithubcomgoogleagerawiki 34

[45] Eclipse Eclipse vertx httpvertxio 35

[46] Cejas Fernando Android cleanarchitecture httpsgithubcomandroid10Android-CleanArchitecture 36

[47] ReactiveX Rxjava httpsgithubcomReactiveXRxJava 37

[48] Luontola Esko Retrolambda httpsgithubcomorfjackalretrolambda 43

51

Anexo I

Projetos utilizados

fastjson

platform_frameworks_base

netty

material-dialogs

kotlin

okhttp

tinker

AndroidUtilCode

RxJava

spring-boot

java-design-patterns

elasticsearch

ExoPlayer

kafka

vertx

realm-java

guava

zipkin

bazel

stetho

Signal-Android

glide

agera

fresco

plaid

presto

libgdx

spark

52

disruptor

lottie-android

flexbox-layout

PocketHub

zxing

spring-framework

deeplearning4j

dropwizard

interviews

BaseRecyclerViewAdapterHelper

uCrop

DanmakuFlameMaster

lottie-react-native

android-UniversalMusicPlayer

AndroidInterview-Q-A

greenDAO

retrofit

MaterialDrawer

BottomBar

druid

MPAndroidChart

Hystrix

guice

recyclerview-animators

dubbo

androidannotations

RxJava-Android-Samples

PhotoView

clojure

CircleImageView

AndroidSwipeLayout

jedis

MaterialViewPager

butterknife

junit4

RxBinding

leakcanary

SimianArmy

picasso

UltimateRecyclerView

53

AndroidViewAnimations

AppIntro

FizzBuzzEnterpriseEdition

ion

cheesesquare

physical-web

RxAndroid

Android-CleanArchitecture

Calligraphy

Android-Bootstrap

iosched

Android_Data

MaterialDesignLibrary

ListViewAnimations

EventBus

java8-tutorial

AndroidSlidingUpPanel

dagger

okhttputils

logger

HomeMirror

Material-Animations

android-Ultra-Pull-To-Refresh

android-async-http

Android-ObservableScrollView

Android-Universal-Image-Loader

ActionBarSherlock

SlidingMenu

storm

PagerSlidingTabStrip

Android-PullToRefresh

54

  • Dedicatoacuteria
  • Agradecimentos
  • Resumo
  • Abstract
  • Introduccedilatildeo
    • Contexto
    • Objetivos
      • Objetivos Gerais
      • Objetivos Especiacuteficos
        • Metodologia
        • Organizaccedilatildeo do Trabalho
          • Evoluccedilatildeo e Mineraccedilatildeo de Repositoacuterios de Software
            • Evoluccedilatildeo de Software
            • MSR Mineraccedilatildeo de dados e a Engenharia de Software
              • Classificaccedilatildeo
                • Trabalhos Relacionados
                  • Java SE 8 e JDK 8
                    • Histoacuterico
                    • Princiacutepios
                    • Evoluccedilatildeo
                    • Expressotildees Lambda
                      • Sintaxe
                      • Principais formas de uso
                          • Estudo e o Processo de Mineraccedilatildeo
                            • Questotildees de Pesquisa
                            • Fonte de Dados e Objetos de Estudo
                            • Processo de Mineraccedilatildeo
                              • static-analysis
                              • BDAnalisador
                                • Classificaccedilatildeo e Anaacutelise
                                  • Meacutedia de Lambda
                                  • Anaacutelise Temporal
                                  • Refatoraccedilatildeo de Coacutedigo
                                  • Casos de Uso
                                      • Resultados Obtidos e Anaacutelise
                                        • Visatildeo Geral
                                          • Projetos Selecionados
                                          • agera
                                          • vertx
                                          • Android-CleanArchitecture
                                          • RxJava
                                          • guava
                                            • Refatoraccedilatildeo de Coacutedigo
                                            • Estudos de Caso
                                              • Consideraccedilotildees Finais
                                              • Referecircncias
                                              • Anexo
                                              • Projetos utilizados

desenvolvidos nela desde sua primeira versatildeo antes de se tornar uma linguagem populare ainda com poucos pacotes ateacute a sua atual versatildeo estaacutevel com uma grande quantidadede novas caracteriacutesticas

A versatildeo mais recente do Java a JDK 8 possui diversas adiccedilotildees interessantes para aorganizaccedilatildeo do coacutedigo e facilidade do programador Dessas novas implementaccedilotildees con-ceitos de linguagem funcional como expressotildees lambda e iteradores externos que recebemuma expressatildeo lambda como argumento como o map() filter() e forEach() tornarama escrita de coacutedigo paralelo mais simples e permitiram ganhos de performance [12]

Diversas linguagens de programaccedilatildeo tambeacutem populares como Javascript e Ruby jaacutepossuiacuteam expressotildees lambda desde suas versotildees iniciais sendo o Java 8 em 2014 maisuma linguagem a introduzir esse novo conceito Podemos descrever as expressotildees comopequenas funccedilotildees normalmente feitas em apenas uma linha sem um nome identificadorElas podem ser retornadas de outras funccedilotildees ou passadas como paracircmetro Um exemplode expressatildeo lambda pode ser visualizado pela funccedilatildeo de soma de dois inteiros escrita daforma (int x int y)rarr x + y [13]

Antes da inclusatildeo de expressotildees lambda em Java o mesmo comportamento era possiacutevelutilizando classes anocircnimas ou AICs (Anonymous inner classes) Contudo eacute necessaacute-rio a criaccedilatildeo de uma interface com apenas um meacutetodo e instanciaacute-la como uma AIC Autilizaccedilatildeo de AICs gera inuacutemeras linhas de coacutedigo adicionais que poderiam ser encapsu-ladas em apenas uma linha com a utilizaccedilatildeo de expressotildees lambda Como eacute interessantepara o programador ter um coacutedigo sempre mais legiacutevel e sucinto torna-se interessante arefatoraccedilatildeo de coacutedigo que utiliza uma tecnologia mais antiga para a nova

Assim este trabalho visa conduzir um estudo de mineraccedilatildeo em repositoacuterios de softwareopen-source desenvolvidos na linguagem Java para entender como desenvolvedores estatildeose adaptando agraves novas mudanccedilas introduzidas no Java 8

12 Objetivos

121 Objetivos Gerais

Este trabalho tem como objetivo geral caracterizar o uso de expressotildees lambda entre osprojetos Java mais populares desenvolvidos pela comunidade do GitHub

122 Objetivos Especiacuteficos

Sabendo do benefiacutecio da refatoraccedilatildeo de coacutedigo para o uso de expressotildees lambda e dapouca quantidade de estudos acadecircmicos sobre o assunto surge entatildeo uma oportunidadede pesquisa para melhor entender a forma como essa caracteriacutestica estaacute sendo adotada por

2

projetos com foco em refatoraccedilatildeo de coacutedigo o que originou a necessidade deste estudoAssim para alcanccedilar o objetivo deste trabalho foram traccedilados em forma de questotildees depesquisa os objetivos especiacuteficos a serem alcanccedilados por este trabalho

bull Quando os projetos Java de coacutedigo aberto comeccedilaram a introduzir o uso de expres-sotildees lambda em seus coacutedigos e quatildeo significativo eacute esse uso

bull Como as equipes de desenvolvimento estatildeo utilizando expressotildees lambda atraveacutesde refatoraccedilatildeo de coacutedigo ou introduzindo apenas em coacutedigo novo

bull Quais satildeo os padrotildees tipicamente adotados para o uso de expressotildees lambda

13 Metodologia

Este trabalho foi desenvolvido utilizando uma abordagem de MSR que dentro da clas-sificaccedilatildeo de Kagdi et al [1] pode ser divido em quatro grandes etapas Primeiramentedefiniu-se a fonte de dados a ser utilizada e dentre as possibilidades encontradas na lite-ratura [14] optou-se por utilizar repositoacuterios de controle de versatildeo mais especificamenteo Github tendo como criteacuterio de seleccedilatildeo os 99 repositoacuterios Java mais populares na plata-forma Em seguida definiu-se o propoacutesito do estudo no caso os objetivos em forma deperguntas de pesquisa a serem respondidas

A terceira grande etapa foi a definiccedilatildeo do meacutetodo em si a forma como seria realizadoo estudo e este por sua vez constitui-se de download de todos os 99 repositoacuterios maispopulares realizaccedilatildeo de uma anaacutelise estaacutetica para coletar informaccedilotildees necessaacuterias de cadaprojeto por versatildeo e armazenamento de informaccedilotildees pertinentes em uma base de dados

A etapa final foi a realizaccedilatildeo da avaliaccedilatildeo dos dados obtidos atraveacutes de meacutetricas eanaacutelises quantitativas para melhor responder as questotildees de pesquisa aleacutem de estudos decaso feitos com cinco projetos escolhos de acordo com a maneira distinta em que estesfazem o uso de expressotildees lambda

14 Organizaccedilatildeo do Trabalho

Este trabalho se divide em seis capiacutetulos

bull Capiacutetulo 2 Apresenta um referencial teoacuterico sobre evoluccedilatildeo de software demons-trando as estrateacutegias utilizadas e a importacircncia da evoluccedilatildeo em um projeto de coacutedigoaberto aleacutem de enunciar as leis de evoluccedilatildeo de software de Lehman O capiacutetulo tam-beacutem apresenta o processo de mineraccedilatildeo de dados explicando cada uma das camadasda classificaccedilatildeo e demonstra trabalhos relacionados a esse toacutepico que serviram debase para este trabalho

3

bull Capiacutetulo 3 Traz um contexto histoacuterico e teacutecnico da linguagem Java necessaacuteriospara entender a importacircncia que as novas caracteriacutesticas adicionadas na versatildeo8 fornecem para os desenvolvedores de projetos determinados a manter o projetosempre evoluiacutedo Tambeacutem eacute apresentada uma seccedilatildeo para demonstrar os detalhese formas de utilizaccedilatildeo das expressotildees Lambda que satildeo o foco dos objetivos destetrabalho

bull Capiacutetulo 4 Descreve a metodologia e processo utilizados para o desenvolvimentoe obtenccedilatildeo dos resultados deste trabalho O capiacutetulo desenvolve o contexto dasquestotildees de pesquisa e explica os motivos e processos de desenvolvimento das fer-ramentas utilizadas para minerar os dados aleacutem de determinar a classificaccedilatildeo dosresultados obtidos em grupos para facilitar a organizaccedilatildeo dos dados de forma queas perguntas sejam respondidas claramente

bull Capiacutetulo 5 Apresenta os resultados obtidos e de que forma eles ajudaram a respon-der as questotildees de pesquisa Eacute descrita uma anaacutelise de um projeto de cada categoriaespecificada no capiacutetulo anterior a fim de contextualizar cada tipo de resultado paraque o leitor entenda a forma que os projetos Java estatildeo lidando com as expressotildeesLambda

bull Capiacutetulo 6 Descreve as dificuldades e problemas obtidos durante o trabalho e deque forma eles influenciaram nos resultados Tambeacutem eacute apresentada uma seccedilatildeocontendo as ideias surgidas durante o desenvolvimento deste trabalho que ficarampara ser feitas no futuro devido agrave gama de informaccedilotildees que a mineraccedilatildeo dos dadostrouxe

4

Capiacutetulo 2

Evoluccedilatildeo e Mineraccedilatildeo deRepositoacuterios de Software

As linguagens de programaccedilatildeo estatildeo sempre evoluindo aumentando sua complexidade eexpressividade Da mesma forma aleacutem de se preocupar com dificuldades de estabelecercompatibilidade do software em relaccedilatildeo a tecnologias antigas desenvolvedores tambeacutemprecisam acompanhar essa evoluccedilatildeo das linguagens para que suas ferramentes natildeo setornem obsoletas [9] Isso agrega um grande desafio no desenvolvimento e evoluccedilatildeo desoftware

O conceito de evoluccedilatildeo de software amadureceu e se tornou um grande foco de pes-quisa Poreacutem nem sempre estudos de evoluccedilatildeo de software reconhecem a importacircncia daevoluccedilatildeo da linguagem de programaccedilatildeo no contexto do desenvolvimento de software [8]Quando um coacutedigo natildeo evolui junto com a linguagem com o objetivo de manter umacompatibilidade com versotildees anteriores sua capacidade de evoluccedilatildeo se torna limitada [9]

A refatoraccedilatildeo de coacutedigo que consiste em realizar mudanccedilas no coacutedigo fonte sem modi-ficar o comportamento observado do software [15] permite que a evoluccedilatildeo de linguagens eferramentas aconteccedilam mais naturalmente No entanto novos desafios surgem como porexemplo saber quando e como realizar a refatoraccedilatildeo de coacutedigo de forma eficiente e coesaDentre as teacutecnicas de pesquisa em engenharia de software para entender esse problematorna-se interessante explorar as teacutecnicas de mineraccedilatildeo de dados aplicados a repositoacuteriosde software com o objetivo de entender o relacionamento entre evoluccedilatildeo e refatoraccedilatildeo

Assim este capiacutetulo busca esclarecer conceitos e estrateacutegias de evoluccedilatildeo de softwaremineraccedilatildeo de repositoacuterios de software e o estado da arte sobre o assunto

5

21 Evoluccedilatildeo de Software

Durante o processo de produccedilatildeo e manutenccedilatildeo de software haacute a necessidade de diversastomadas de decisotildees sobre seu desenvolvimento como por exemplo decidir como melho-rar a qualidade do software Tais decisotildees precisam ser tomadas levando em consideraccedilatildeoo ambiente em que se estaacute inserido com novas tecnologias surgindo todos os dias fe-edback de usuaacuterios exigentes e concorrentes produzindo um software similar com ideiasinovadoras

Tudo isso acontece em um ritmo de constante mudanccedila e assim como diria Lehmaneacute imprescindiacutevel que software de sistemas sejam capazes de evoluir ou os mesmos correm orisco de sofrer uma morte prematura [16] fazendo assim da evoluccedilatildeo de software um con-ceito importante dentro do seu processo de desenvolvimento Essa evoluccedilatildeo deve ocorrerconsiderando o ambiente em que o software estaacute inserido o qual possui aspectos teacutecnicos esociais sua infraestrutura que pertence ao seu ambiente teacutecnico o qual sempre necessitamanutenccedilatildeo e ao mesmo tempo usuaacuterios que utilizam o software e estatildeo constantementeformando opiniotildees oferecendo feedback e na expectativa por novidades [7] Assim a me-dida que novas caracteriacutesticas satildeo desenvolvidas novas tecnologias de infraestrutura satildeonecessaacuterias novos requisitos satildeo adicionados e o sistema de software deve se adaptar aessas mudanccedilas

Com relaccedilatildeo aos aspectos sociais que envolvem a evoluccedilatildeo do software eacute importanteressaltar os conceitos baacutesicos de como essa evoluccedilatildeo acontece Durante um estudo empiacutericopioneiro na aacuterea de evoluccedilatildeo de software para sistemas de grande escala Lehman e seuscolaboradores formularam um conjunto de observaccedilotildees que hoje satildeo conhecidas como asleis da evoluccedilatildeo de software ou simplesmente Leis de Lehman [16] No geral as leis deevoluccedilatildeo de software podem ser descritas da seguinte forma [16]

1 Mudanccedila contiacutenua um sistema se tornaraacute progressivamente menos satisfatoacuteriopara seus usuaacuterios com o tempo a menos que se adapte continuamente agraves necessi-dades que surgiratildeo

2 Complexidade Crescente um sistema se tornaraacute cada vez mais complexo amenos que se trabalhe para explicitamente reduzir sua complexidade

3 Auto-regulaccedilatildeo o processo de evoluccedilatildeo de software eacute auto-regulatoacuterio no que dizrespeito agraves distribuiccedilotildees dos artefatos e produtos produzidos

4 Conservaccedilatildeo da estabilidade organizacional a taxa meacutedia de atividade globalefetiva em um sistema em evoluccedilatildeo natildeo muda com o tempo ou seja a meacutedia detrabalho e esforccedilo colocado em cada entrega do sistema permanece a mesma

6

5 Conservaccedilatildeo de familiaridade a quantidade de conteuacutedo novo em cada entregado sistema tende a se manter constante com o tempo

6 Crescimento contiacutenuo A quantidade de funcionalidades em um sistema cresceraacutecom o tempo com o objetivo de satisfazer seus usuaacuterios

7 Decliacutenio de qualidade Um sistema seraacute percebido com qualidade inferior como passar do tempo a menos que seu design tenha uma manutenccedilatildeo minuciosa e seadapte a novas restriccedilotildees

8 Sistema de Feedback Evoluir um sistema com sucesso requer reconhecer que oprocesso de desenvolvimento acontece em um sistema de feedback de vaacuterios ciclosagentes e niacuteveis

Os aspectos teacutecnicos que envolvem a evoluccedilatildeo de software levam em consideraccedilatildeo astecnologias utilizadas para o seu desenvolvimento desde a linguagem de programaccedilatildeo agravesmaacutequinas onde o software seraacute hospedado que sofrem atualizaccedilotildees recebem novas versotildeescom novas caracteriacutesticas implementadas

Um estudo realizado por Lavre mostra como a evoluccedilatildeo das linguagens de programa-ccedilatildeo no contexto da evoluccedilatildeo de software muitas vezes satildeo subestimadas uma vez quemuitos podem considerar em seus estudos a linguagem de computaccedilatildeo como um artefatoimutaacutevel [8] Por exemplo coloca-se muita ecircnfase e cuidado para realizar o versionamentode coacutedigo fonte de um software mas este pode ser tornar inutilizaacutevel futuramente se nin-gueacutem souber qual versatildeo de compilador determinada versatildeo de coacutedigo foi desenvolvida

Para natildeo se deixar estagnar linguagens de programaccedilatildeo precisam se adaptar e evoluirQuando uma linguagem de programaccedilatildeo atualiza softwares que eram antes consideradosatualizados podem se tornar rapidamente obsoletos E ao mesmo tempo que novascaracteriacutesticas satildeo adicionadas a linguagem precisa fornecer compatibilidade com versotildeesanteriores aumentando sua complexidade Desenvolvedores entatildeo encontram-se tambeacutemem um empasse buscando um equiliacutebrio entre manter a compatibilidade da ferramentacom versotildees anteriores da linguagem e atualizaacute-la para manter o software atualizado [9]

A estrateacutegia de refatoraccedilatildeo de coacutedigo pode ser uma opccedilatildeo que permite a linguageme o software co-evoluiacuterem com um menor grau de dificuldade [9] Refatoraccedilatildeo (do inglecircsrefactoring) eacute o processo de modificaccedilatildeo de um software com o objetivo de melhorar a es-trutura interna do mesmo sem alterar sua percepccedilatildeo externa Eacute uma maneira disciplinadade melhorar o design do coacutedigo apoacutes ele jaacute ter sido implementado Por exemplo dividiruma funcionalidade grande feita em apenas um bloco de coacutedigo em vaacuterios moacutedulos [15]

A refatoraccedilatildeo de coacutedigo pode ser um meio utilizado para evoluir o software adaptandoo coacutedigo com caracteriacutesticas novas introduzidas pela linguagem modificando o design dosistema sem comprometer sua integridade No entanto novos desafios surgem visto que

7

refatorar o coacutedigo fonte de um sistema de grande porte natildeo eacute uma tarefa faacutecil havendo anecessidade de ferramentas que possam automatizar o processo ou realizar um estudo paraentender como as novas caracteriacutesticas da linguagem podem ser utilizadas para substituirou melhorar funcionalidades obsoletas [9]

22 MSR Mineraccedilatildeo de dados e a Engenharia deSoftware

Com o objetivo de compreender prever e planejar os vaacuterios aspectos do desenvolvimentode um projeto em especial tudo que possa impactar na evoluccedilatildeo de software a teacutecnicade mineraccedilatildeo de dados tem sido bastante utilizada em engenharia de software [17]

O termo Mineraccedilatildeo de Repositoacuterios de Software (MSR) tem sido utilizado para descre-ver vaacuterias maneiras de se examinar repositoacuterios de software Um repositoacuterio de softwarepode ser considerado um artefato que eacute produzido e arquivado durante a evoluccedilatildeo desoftware [1] Estes responsoacuterios armazenam informaccedilotildees que podem fornecer todos osdetalhes de desenvolvimento do software provendo meios necessaacuterios para uma anaacuteliseaprofundada de evoluccedilatildeo de software

Repositoacuterios de software satildeo comumente utilizados para armazenar e acompanhar ohistoacuterico de desenvolvimento do software mas raramente usados para tomada de deci-sotildees em relaccedilatildeo ao projeto Assim pesquisadores de MSR buscam modificar a impressatildeode que tais repositoacuterios satildeo estaacuteticos que servem apenas para manutenccedilatildeo de registrostransformando-os em repositoacuterios ativos que podem auxiliar na tomada de decisatildeo em pro-jetos de software modernos atraveacutes da identificaccedilatildeo de padrotildees para realizar a propagaccedilatildeode mudanccedilas [18]

221 Classificaccedilatildeo

De acordo com Kagdi et al dentre as abordagens de MSR utilizadas atualmente eacute possiacuteveldescrevecirc-las para entatildeo comparaacute-las e possivelmente classificaacute-las levando em considera-ccedilatildeo uma taxonomia de quatro dimensotildees os repositoacuterios de software utilizados (fontes dedados) o propoacutesito do MSR a metodologia e a avaliaccedilatildeo da abordagem [1] como mostraa Figura 21 onde as taxonomias destacadas em amarelo satildeo as que prevaleceram poreacutemnatildeo exclusivamente na metodologia adotada por este trabalho

8

Figura 21 Taxonomia em camadas adaptada do trabalho de Kagdi et al [1]

Fontes de Dados

As fontes de informaccedilatildeo variam de acordo com a abordagem utilizada e dentre as informa-ccedilotildees mineradas em repositoacuterios de software inclui-se as seguintes categorias os artefatosde software e suas versotildees as diferenccedilas entre os artefatos de software e suas versotildees e osmetadados sobre as mudanccedilas no software

As fontes de dados podem ser melhor classificadas de acordo com Hassan et al [17]

bull Repositoacuterios de controle de Versatildeo estes repositoacuterios guardam o histoacuterico de desen-volvimento de um projeto armazenando todas as mudanccedilas no coacutedigo fonte assimcomo os metadados associados com cada mudanccedila Exemplos git SVN

bull Bug repositories Estes repositoacuterios rastreiam o histoacuterico de resoluccedilatildeo de bugs quesatildeo reportados por usuaacuterios e desenvolvedores Exemplos Bugzilla e Jira

9

bull Histoacuterico de Comunicaccedilatildeo (Archived communications) estes repositoacuterios rastreiamdiscussotildees sobre os vaacuterios aspectos de um projeto de software por sua vida uacutetil Porexemplo listas de e-mails

bull Deployment logs logs com informaccedilotildees do software gerados por ferramentas dedesenvolvimento

bull Repositoacuterios de software Repositoacuterios onde o coacutedigo fonte de vaacuterios projetos satildeoarmazenados como por exemplo Sourceforgenet

No contexto deste trabalho estes repositoacuterios consistem em fontes de coacutedigo armaze-nadas em sistemas de controle de versatildeo especificamente coacutedigos na plataforma Github

O propoacutesito

O propoacutesito da mineraccedilatildeo de repositoacuterios de software se resume nas perguntas de pes-quisa que podem ser respondidas utilizando mineraccedilatildeo Assim existem duas classes deperguntas de pesquisa para MSR [1]

A primeira eacute a pergunta de anaacutelise market-basket1 ldquoSe A acontece o que mais podeacontecerrdquo A resposta para este tipo de pergunta eacute um conjunto de regras descrevendotendecircncias de relacionamentos como por exemplo se A acontecer entatildeo B e C acontecemdurante um periacuteodo X

A segunda classe diz respeito agraves perguntas de prevalecircncia (Prevalence Questions -PQ) como por exemplo perguntas do tipo ldquoA funcionalidade Y foi modificadardquo quepossuem uma resposta booleana ou ldquoQuantas vezes esta funcionalidade Y foi modificadardquocontendo uma resposta quantitativa

As perguntas de pesquisa deste trabalho se encaixam majoritariamente na segundaclasse onde o objetivo traccedilado eacute respondido de forma quantitativa com algumas tentativasde classificaccedilatildeo de tipos de repositoacuterios como seraacute descrito nos capiacutetulos seguintes

A metodologia

A metodologia corresponde a maneira como as questotildees de MSR iratildeo ser respondidas evaacuterias abordagens estatildeo disponiacuteveis Poreacutem Kagdi indica duas estrateacutegias baacutesicas quepodem ser utilizadas

Primeiramente pode-se utilizar a mediccedilatildeo indireta e anaacutelise da evoluccedilatildeo do softwareEsta abordagem pode ser realizada da seguinte forma extrair e computar informaccedilotildeesde cada versatildeo de um software separadamente e em seguida individualmente comparar

1Anaacutelise Market-basket eacute uma teacutecnica de modelagem baseada na teoria de que se vocecirc comprar certostipos de produtos vocecirc haacute uma probabilidade maior (ou menor) de comprar outros tipos de produtos [19]

10

propriedades encontradas como por exemplo comparar duas versotildees distintas de umsoftware atraveacutes de um repositoacuterio github realizando uma investigaccedilatildeo de alto niacutevel noque diz respeito a evoluccedilatildeo do software [1]

A segunda perspectiva de metodologia que pode ser utilizada corresponde agrave mediccedilatildeodireta e anaacutelise da evoluccedilatildeo do software Ela diz respeito agraves investigaccedilotildees que estudamos mecanismos que leva um software a ser modificado de uma versatildeo para outra focandonas diferenccedilas especiacuteficas entre estas versotildees como por exemplo examinando mudanccedilasespeciacuteficas das classes arquivos funccedilotildees de cada parte do coacutedigo [1]

Assim eacute possiacutevel descrever explicitamente que este trabalho utiliza em sua maioriauma metodologia com mediccedilotildees diretas atraveacutes da anaacutelise estaacutetica de informaccedilotildees docoacutedigo fonte de diferente versotildees para analisar os diferentes padrotildees de desenvolvimentoem que expressotildees lambda (definidas no capiacutetulo seguinte) satildeo utilizadas

A Avaliaccedilatildeo

Por fim existem diversas formas para se avaliar o estudo realizado sempre levando emconsideraccedilatildeo a validade dos resultados obtidos Pode-se utilizar de meacutetricas para avaliar osdados considerando o quanto das informaccedilotildees obtidas satildeo relevantes Outra forma de seavaliar seria atraveacutes da utilizaccedilatildeo de modelos probabiliacutesticos seguindo uma abordagemde teoria da informaccedilatildeo Assim foram utilizadas determinadas meacutetricas quantitativaspara avaliar os resultados obtidos neste trabalho

23 Trabalhos Relacionados

Como ressaltado na introduccedilatildeo o foco deste trabalho encontra-se em utilizar teacutecnicas deMSR para caracterizar a adoccedilatildeo de expressotildees lambda em repositoacuterios Java Ao reali-zar um estudo sobre o estado da arte encontrou-se diversos trabalhos que utilizam deMSR para obter informaccedilotildees relevantes sobre repositoacuterios de software em diversos focose em especial trabalhos que investiguem repositoacuterios na linguagem Java Jaacute existemtambeacutem alguns trabalhos que apresentam ferramentas de refatoraccedilatildeo de coacutedigo para im-plementaccedilatildeo de expressotildees lambda com foco na evoluccedilatildeo do software Dentre os trabalhosencontrados mencionados destacam-se

bull Em um trabalho sobre utilizaccedilatildeo de refatoraccedilatildeo de coacutedigo para realizar a transiccedilatildeode coacutedigo Java para as novas caracteriacutesticas implementadas no Java 8 Gyori et alapresenta uma ferramenta que automatiza com sucesso o trabalho de conversatildeo decoacutedigo como Annonymous Inner Class para expressotildees lambda [12] O capiacutetulo aseguir descreve em detalhes estes conceitos

11

bull Regrowing a Language de Overbey apresenta um estudo sobre a importacircncia da co-evoluccedilatildeo entre a linguagem de programaccedilatildeo e os projetos de software focando naslinguagens Fortran e Java e provando como ferramentas de refatoraccedilatildeo de coacutedigoauxiliam para que o software consiga evoluir juntamente com sua linguagem deprogramaccedilatildeo [9]

bull O trabalho sobre a adoccedilatildeo de generics em coacutedigo Java feito por Parnin utiliza demineraccedilatildeo de dados para realizar uma investigaccedilatildeo empiacuterica avaliando projetos decoacutedigo aberto com o objetivo de observar como desenvolvedores destes projetos estatildeoutilizando generics em Java [20]

Os estudos mencionados focam em assuntos particulares pertinentes a este trabalhoem que de um lado tem-se trabalhos que mostram a necessidade de refatoraccedilatildeo de coacutedigopara evoluccedilatildeo de software e do outro tem-se trabalhos que mostram que eacute possiacutevel utilizarde MSR para entender melhor como a evoluccedilatildeo da linguagem de programaccedilatildeo Java temafetado projetos reais de coacutedigo aberto e como estes projetos estatildeo se adaptando a estasevoluccedilotildees

12

Capiacutetulo 3

Java SE 8 e JDK 8

Este trabalho tem como objetivo caracterizar a adoccedilatildeo de expressotildees Lambda em siste-mas Java que podem ser considerados legados pois foram concebidos em um momentoanterior a introduccedilatildeo dessa nova caracteriacutestica na linguagem Java Com o intuito de faci-litar o entendimento do leitor sobre tais construccedilotildees esse capiacutetulo apresenta informaccedilotildeeshistoacutericas referentes agrave linguagem Java desde sua criaccedilatildeo ateacute a sua ascensatildeo como umadas linguagens de programaccedilatildeo mais populares Aleacutem disso seratildeo apresentadas as novascaracteriacutesticas presentes na versatildeo Java SE 8 com destaque nas expressotildees Lambda e deque forma vieram para auxiliar no desenvolvimento de sistemas

31 Histoacuterico

Java eacute uma linguagem de programaccedilatildeo orientada a objetos para propoacutesitos gerais [21] Alinguagem nasceu com o nome de Oak no ano de 1991 com o foco em televisotildees digitais acabo mas devido agrave complexidade e poder da linguagem logo expandiu-se para os outrosdomiacutenios principalmente a Internet [22] Posteriormente a linguagem recebeu o nome deGreentalk devido agrave marca Oak jaacute ser registrada por outra empresa e o principal projeto daequipe se chamar Green Por fim o nome Java foi o mais votado pela equipe da Sun emuma reuniatildeo para decidir o mais raacutepido possiacutevel um nome definitivo para a linguagem [23]

Em 1995 em sua primeira versatildeo puacuteblica 10 a linguagem Java jaacute comeccedilava a terum crescimento em sua popularidade como Web Applet nos navegadores mais popularesfornecendo seguranccedila e rapidez nas plataformas mais utilizadas [24] A cada nova versatildeopublicada novas funcionalidades e plataformas eram adicionadas e tornavam a linguagemmais difundida no meio computacional fazendo com que em 2006 a linguagem fosse divi-dida em Java EE (foco em rede e serviccedilos web) Java ME (foco em sistemas embarcados)e Java SE (foco em desktops e servidores) [25]

13

Apoacutes anos de evoluccedilatildeo e aprimoramento atraveacutes de diversas versotildees como visto naTabela 31 hoje o Java se tornou uma das linguagens de programaccedilatildeo mais utilizadas nomundo estando em aproximadamente 15 das linhas de coacutedigo disponiacuteveis pela inter-net [11] A quantidade de plataformas suportadas pela linguagem e com o advento dosistema operacional Android sendo rodado na maior parte dos smartphones do mundoaleacutem da simplicidade em codificar no paradigma orientado a objetos foram os fatoresrelevantes para que a linguagem se popularizasse no mundo digital [26]

Tabela 31 As versotildees anteriores de java e principais caracteriacutesticasVersatildeo Principais caracteriacutesticasJava 10 JVM e JDKJava 2 Event Listeners

Kestrel (Java 3) HotSpot JVMMerlin (Java 4) Diversas novas APIs como Assertion e expressotildees regularesTiger (Java 5) Generics

Mustang (Java 6) Web ServicesDolphin (Java 7) Suporte a linguagens dinamicas

32 Princiacutepios

Com o foco em alcanccedilar a Web e participar mais ativamente do mercado virtual e e-Commerce foram projetados princiacutepios que permitissem com que a linguagem pudessealcanccedilar seus objetivos principais ao mesmo tempo que mantinha a facilidade e fami-liarizaccedilatildeo da linguagem a seus desenvolvedores [27] Dessa forma a equipe da Oracledeterminou cinco princiacutepios que caracterizariam o foco da linguagem Java

bull simples orientada a objeto e familiar projetada para ser orientada a objeto epermitir que seus desenvolvedores comecem a codificar rapidamente sem a necessi-dade de uma curva de aprendizagem acentuada

bull segura e robusta projetada para prover software confiaacutevel por meio de checagensa tempo de compilaccedilatildeo e execuccedilatildeo Haacute uma grande preocupaccedilatildeo com seguranccediladevido agrave larga utilizaccedilatildeo da linguagem em sistemas distribuiacutedos

bull de arquitetura neutra e portaacutevel projetada para ser independente de qualquerarquitetura bastando rodar a JVM dessa forma garantindo a portabilidade paravaacuterios ambientes e dispositivos

14

bull executada em alta performance projetada para fornecer a maior performancepossiacutevel em tempo de execuccedilatildeo com a utilizaccedilatildeo do garbage collector em uma threadde baixa prioridade

bull interpretada dinacircmica e threaded projetada para ser interpretada por qual-quer dispositivo que possua JVM desenvolvida garantindo um desenvolvimento raacute-pido e em ciclos O uso da classe Thread permite que a linguagem acompanhe atendecircncia do paralelismo Aleacutem disso a ligaccedilatildeo de classes eacute feita em tempo real esomente quando necessaacuteria tornando-a dinacircmica

33 Evoluccedilatildeo

A primeira versatildeo do Java 8 foi lanccedilada em 2014 [28] e apresentou diversas atualizaccedilotildeesespalhadas em categorias como linguagem seguranccedila Collections ferramentas deployentre outras Dentre a grande quantidade de mudanccedilas os destaques se encontraram nasnovas melhorias presentes na linguagem que afetaram de forma mais direta a maneiracom que os desenvolvedores passaram a tratar e organizar o coacutedigo fonte As atualizaccedilotildeesreferentes a linguagem descritas oficialmente pela Oracle [29] satildeo

1 Lambda Expressions ou apenas Expressotildees Lambda correspondem a uma novacaracteriacutestica que permite que uma pequena funcionalidade possa ser utilizada comoum argumento de um meacutetodo facilitando a escrita de accedilotildees que seratildeo feitas repetida-mente em uma Collection ou quando um processo se completa ou quando encontraum erro Eacute tambeacutem uma forma compacta de se escrever coacutedigo que previamenteera escrito com anonymous inner classes [29] A Listagem 31 mostra uma classehipoteacutetica Calculator cujo meacutetodo operateBinary() recebe como paracircmetro doisinteiros e um objeto da classe IntegerMath que representa a operaccedilatildeo que deveraacuteser realizada ou seja uma funcionalidade dinacircmica

1 pub l i c c l a s s Ca l cu la to r 2

3 i n t e r f a c e IntegerMath 4 i n t opera t i on ( i n t a i n t b) 5 6

7 pub l i c i n t operateBinary ( i n t a i n t b IntegerMath op ) 8 re turn op opera t i on (a b) 9

10

11 pub l i c s t a t i c void main ( St r ing a rgs ) 12

15

13 Calcu la to r myApp = new Ca lcu la to r ( ) 14 IntegerMath add i t i on = (a b) minusgt a + b 15 IntegerMath subt ra c t i on = (a b) minusgt a minus b 16 System out p r i n t l n ( 40 + 2 = +17 myApp operateBinary (40 2 add i t i on ) ) 18 System out p r i n t l n ( 20 minus 10 = +19 myApp operateBinary (20 10 sub t ra c t i on ) ) 20 21 22

Listagem 31 Exemplo de coacutedigo com o uso de Expressatildeo Lambda [30]

2 Method References Frequentemente expressotildees lambda criam meacutetodos anocircni-mos Algumas vezes poreacutem satildeo utilizadas para chamar um meacutetodo jaacute existentena classe Ao inveacutes de escrever a expressatildeo Lambda para esse caso pode-se optarpor utilizar um Method Reference que facilita a escrita e leitura desse uso de ex-pressatildeo Lambda [29] A Listagem 32 mostra um exemplo de um meacutetodo estaacuteticoque compara duas pessoas pelas suas idades e a Listagem 33 a utilizaccedilatildeo de MethodReference para aplicar a utilizaccedilatildeo desse meacutetodo em um array e reduzir a escrita deuma expressatildeo lambda a uma forma mais legiacutevel

1 pub l i c s t a t i c i n t compareByAge ( Person a Person b) 2 re turn a b i r thday compareTo (b b i r thday ) 3 4

Listagem 32 Exemplo de meacutetodo de uma classe Pessoa [31]

1 Arrays s o r t ( rosterAsArray Person compareByAge ) 2

Listagem 33 Exemplo de uso de Method Reference [31]

3 Default Methods satildeo meacutetodos com a palavra-chave default que servem para adi-cionar implementaccedilotildees de meacutetodos a uma interface de alguma biblioteca mantendoa compatibilidade binaacuteria com versotildees mais antigas dessa interface Tambeacutem pos-sibilita a implementaccedilatildeo de meacutetodos estaacuteticos em interfaces [29] A Listagem 34apresenta a inclusatildeo de um meacutetodo default na interface TimeClient

1 pub l i c i n t e r f a c e TimeClient 2 void setTime ( i n t hour i n t minute i n t second ) 3 void setDate ( i n t day i n t month i n t year ) 4 void setDateAndTime ( i n t day i n t month i n t year 5 i n t hour i n t minute i n t second )

16

6 LocalDateTime getLocalDateTime ( ) 7

8 s t a t i c ZoneId getZoneId ( S t r ing zoneStr ing ) 9 t ry

10 re turn ZoneId o f ( zoneStr ing ) 11 catch ( DateTimeException e ) 12 System e r r p r i n t l n ( I n v a l i d time zone + zoneStr ing

+13 us ing d e f a u l t time zone in s t ead ) 14 re turn ZoneId systemDefault ( ) 15 16 17

18 d e f a u l t ZonedDateTime getZonedDateTime ( St r ing zoneStr ing ) 19 re turn ZonedDateTime o f ( getLocalDateTime ( ) getZoneId (

zoneStr ing ) ) 20 21 22

Listagem 34 Exemplo de interface com um meacutetodo default [32]

4 Repeating Annotations permitem a implementaccedilatildeo e utilizaccedilatildeo de anotaccedilotildees deum mesmo tipo que podem ser utilizadas mais de uma vez para a mesma declara-ccedilatildeo [29] A Listagem 35 apresenta duas anotaccedilotildees iguais com paracircmetros diferentespermitindo uma customizaccedilatildeo maior na aplicaccedilatildeo de um tipo de anotaccedilatildeo

1 Schedule ( dayOfMonth= l a s t )2 Schedule (dayOfWeek= Fr i hour= 23 )3 pub l i c void doPeriodicCleanup ( ) 4

Listagem 35 Exemplo de Repeating Annotations [33]

5 Type Annotations permitem que anotaccedilotildees possam ser utilizadas em tipos aleacutemde declaraccedilotildees dessa forma pode-se garantir que um campo sempre atenda agraves suasexpectativas e evite testes desnecessaacuterios [29] A Listagem 36 mostra um exemplo derestriccedilatildeo a uma String que nunca poderaacute ser nula devido agrave anotaccedilatildeo de NonNull

1 NonNull S t r ing s t r

Listagem 36 Exemplo de Type Annotation garantindo que o campo nunca seja null [34]

17

34 Expressotildees Lambda

Uma das mudanccedilas mais interessantes implementadas no Java 8 foi a adiccedilatildeo de expressotildeeslambda As expressotildees lambda permitem que a linguagem Java possa atuar parcialmentecomo uma linguagem de programaccedilatildeo funcional onde comportamentos satildeo avaliados eaplicados diferentemente da programaccedilatildeo imperativa que foca na mudanccedila de estadosNa praacutetica um comportamento pode ser passado como paracircmetro de um meacutetodo atraveacutesde uma escrita mais reduzida e legiacutevel Os benefiacutecios de utilizar expressotildees lambda incluemuma melhora na legibilidade e organizaccedilatildeo de coacutedigo que antes era escrito com AnonymousInner Class aleacutem de permitir uma forma simples de utilizar comportamento paralelo como uso de Streams

341 Sintaxe

A sintaxe de uma expressatildeo lambda eacute dividida nas seguintes partes [30]

bull Uma lista de paracircmetros separados por viacutergulas

bull Um token representado por uma seta -gt

bull Um corpo que pode ser representado por uma expressatildeo uacutenica ou um bloco de coacutedigodentro de chaves

As Listagens 37 e 38 mostram duas formas diferentes de se aplicar expressotildees Lambdacom uma sintaxe similar A primeira aplica a expressatildeo diretamente apoacutes a seta utilizadanormalmente para trechos de coacutedigo pequenos e simples e a segunda utiliza-se de chavespara incorporar o coacutedigo e da palavra-chave return para especificar o retorno forma maisutilizada para uma quantidade maior de coacutedigo

1 p minusgt p getGender ( ) == Person Sex MALE2 ampamp p getAge ( ) gt= 183 ampamp p getAge ( ) lt= 25

Listagem 37 Exemplo de expressatildeo lambda com uma expressatildeo [30]

1 p minusgt 2 re turn p getGender ( ) == Person Sex MALE3 ampamp p getAge ( ) gt= 184 ampamp p getAge ( ) lt= 25 5

Listagem 38 Exemplo de expressatildeo lambda com um bloco de coacutedigo [30]

18

342 Principais formas de uso

Anonymous Inner Class

Antes do Java 8 a necessidade de passar funccedilotildees ou expressotildees como paracircmetro de algummeacutetodo era suprida atraveacutes de Anonymous Inner Classes A utilizaccedilatildeo desse tipo dedeclaraccedilatildeo junto com a anotaccedilatildeo de Override permite sobrescrever um meacutetodo de umainterface funcional e ao mesmo tempo passa-la como argumento para um meacutetodo Umaexpressatildeo lambda se comporta da mesma forma poreacutem a quantidade de coacutedigo escritopela Anonymous Inner Class eacute maior e pode dificultar a leitura de coacutedigo pois conteacutemmuita informaccedilatildeo natildeo utilizada para efetivo entendimento do que estaacute sendo feito naqueletrecho

A Listagem 39 apresenta a instanciaccedilatildeo da classe EventHandler internamente ao meacute-todo setOnAction() de forma que o desenvolvedor possa escrever o comportamento quedeseja passar como paracircmetro do meacutetodo atraveacutes da substituiccedilatildeo do meacutetodo handle()que jaacute existe pelo meacutetodo handle() criado e escrito pelo desenvolvedor

1 btn setOnAction (new EventHandlerltActionEvent gt() 2 Override3 pub l i c void handle ( ActionEvent event ) 4 System out p r i n t l n ( He l lo World ) 5 6 )

Listagem 39 Exemplo de uso de Anonymous Inner Class [35]

Interface funcional

Ao projetar um coacutedigo novo o desenvolvedor que optar por utilizar expressotildees lambdadeve iniciar com a criaccedilatildeo de uma interface funcional Esse tipo de interface possui umuacutenico meacutetodo abstrato permitindo que expressotildees lambda sejam usadas para sobrescrevero comportamento do meacutetodo abstrato Uma interface funcional pode possuir outros meacuteto-dos desde que sejam default Uma nova anotaccedilatildeo FunctionalInterface foi adicionadacom a atualizaccedilatildeo do Java 8 para conferir em tempo de compilaccedilatildeo se a interface satisfazos requisitos desse modelo de interface

A Listagem 310 apresenta um exemplo de interface funcional com o objetivo de permi-tir o uso de expressotildees lambda que utilizaratildeo de dois Double como paracircmetro e jaacute utilizada nova anotaccedilatildeo FunctionalInterface introduzida no Java 8

1 Funct iona l Inte r face2 pub l i c i n t e r f a c e DoubleOp 3 pub l i c Double apply ( Double a Double b)

19

4

Listagem 310 Exemplo de interface funcional

Dessa forma conforme as Listagens 311 e 312 o meacutetodo apply() pode tomar formade qualquer operaccedilatildeo entre dois Double que seraacute especificada quando a expressatildeo lambdafor montada dando o aspecto de linguagem funcional agrave linguagem e mais facilidade eliberdade ao desenvolvedor

1 pub l i c c l a s s Ca l cu la to r 2 pub l i c s t a t i c Double c a l c ( Double op1 Double op2 DoubleOp operator ) 3 re turn operator apply ( op1 op2 ) 4 5

Listagem 311 Exemplo de aplicaccedilatildeo da interface funcional

1 Double r e s u l t 1 = Ca lcu la to r c a l c (10d 50d ( a b ) minusgt a + b)

Listagem 312 Uso de expressatildeo lambda para o exemplo anterior

Collections

Dentre as atualizaccedilotildees de pacotes do Java 8 foi adicionado um meacutetodo stream() nainterface Collection Esse meacutetodo trata as Collection como streams o que significa queapesar de natildeo ser possiacutevel acessar elementos diretamente algumas novas manipulaccedilotildeessatildeo possiacuteveis Essas manipulaccedilotildees satildeo na verdade meacutetodos da interface Stream quepodem receber como paracircmetro uma expressatildeo lambda ou seja um comportamento a seraplicado agrave Collection Dentre os meacutetodos temos

bull filter() O meacutetodo filter() recebe uma expressatildeo lambda contendo uma condiccedilatildeopara filtragem da collection

bull map() O meacutetodo map() mapeia os elementos de uma Collection em outro objetocomo uma String A expressatildeo lambda passada por paracircmetro deve retornar o tipode objeto ao qual seraacute mapeado

bull forEach() O meacutetodo forEach() aplica uma operaccedilatildeo especiacutefica para cada ele-mento da Collection A expressatildeo lambda a ser passada deve conter a operaccedilatildeo aser realizada

bull min() e max() Os meacutetodos min() e max() retornam o elemento menor ou maiorda Collection dependendo da expressatildeo lambda passada como paracircmetro

20

A Listagem 313 demonstra como vaacuterias operaccedilotildees com uma Collection podem seraplicadas de uma vez de forma que lendo a expressatildeo lambda jaacute eacute possiacutevel saber oresultado da aplicaccedilatildeo do meacutetodo agrave Collection

1 r o s t e r2 stream ( )3 f i l t e r (4 p minusgt p getGender ( ) == Person Sex MALE5 ampamp p getAge ( ) gt= 186 ampamp p getAge ( ) lt= 25)7 map(p minusgt p getEmailAddress ( ) )8 forEach ( emai l minusgt System out p r i n t l n ( emai l ) )

Listagem 313 Exemplo de utilizaccedilatildeo de meacutetodos de stream com expressotildees lambda [30]

21

Capiacutetulo 4

Estudo e o Processo de Mineraccedilatildeo

A definiccedilatildeo da metodologia utilizada para realizaccedilatildeo deste trabalho eacute importante para queexista uma padronizaccedilatildeo e melhor entendimento de como os resultados foram obtidos paraque a replicaccedilatildeo do mesmo possa ser realizada em trabalhos futuros [36]

Figura 41 Processo utilizado para realizaccedilatildeo do estudo

O esquema representado na Figura 41 descreve o processo seguido para a realizaccedilatildeodeste trabalho que foi divido em trecircs grandes etapas a de planejamento definindo osobjetivos questotildees de pesquisa e meios de investigaccedilatildeo deste projeto a etapa de execuccedilatildeorealizando todo o procedimento metodoloacutegico definido para a coleta e refinamento de

22

dados e a etapa de avaliaccedilatildeo onde foram classificados e avaliados os dados coletadospara responder agraves questotildees de pesquisa

A seguir na primeira seccedilatildeo seratildeo apresentadas em detalhes as questotildees de pesquisa aserem respondidas Em seguida seraacute feito uma breve descriccedilatildeo da fonte de dados utilizada- especificamente os projetos utilizados como objetos de estudo deste trabalho e por fimtodo o restante da metodologia que foi de fato desenvolvida para obter os resultadosnecessaacuterios

41 Questotildees de Pesquisa

Com o objetivo de entender e caracterizar melhor o uso de expressotildees lambda foramdefinidas as seguintes questotildees de pesquisa a serem respondidas

bull PQ-1 Quando os projetos comeccedilaram a introduzir o uso de expressotildees lambda emseus coacutedigos e qual a meacutedia de expressotildees lambda por snapshots caso existam

bull PQ-2 Como as equipes de desenvolvimento estatildeo utilizando expressotildees lambdaatraveacutes de refatoraccedilatildeo de coacutedigo ou introduzindo apenas em coacutedigo novo

bull PQ-3 Quais satildeo os padrotildees tipicamente adotados para o uso de expressotildees lambda

A primeira pergunta de pesquisa gira em torno de como projetos populares open-sourceestatildeo se adaptando agrave introduccedilatildeo de expressotildees lambda em Java muitos projetos jaacute estatildeoutilizando as expressotildees lambda Se sim a partir de quando comeccedilaram a utilizaacute-lasdesde o iniacutecio da introduccedilatildeo das mesmas no Java 8 ou em um periacuteodo mais tardio Aleacutemdisso eacute interessante descobrir se a utilizaccedilatildeo dessa nova caracteriacutestica tem acontecido deforma expressiva ou natildeo

Em seguida para melhor entender a forma como as expressotildees lambda estatildeo sendointroduzidas em projetos eacute interessante investigar se as equipes de desenvolvimento estatildeose preocupando em refatorar coacutedigo com o objetivo de evoluir o software ou se estatildeoexperimentando utilizar expressotildees lambda apenas em coacutedigo novo introduzido

Como a introduccedilatildeo de novas funcionalidades em projetos open-source de grande escaladepende do objetivo do projeto e os padrotildees de projeto utilizados [37] espera-se obser-var diversas abordagens quanto a utilizaccedilatildeo de expressotildees lambda para entatildeo poderclassificar estes softwares quanto a abordagem utilizada

Eacute de grande importacircncia para este estudo conseguir identificar na praacutetica comoexpressotildees lambda estatildeo sendo tipicamente adotadas nestes projetos Assim a terceirapergunta de pesquisa busca identificar alguns exemplos de utilizaccedilatildeo atraveacutes da realizaccedilatildeode alguns estudos de caso

23

Eacute importante ressaltar que apesar de as expressotildees lambda serem uma alternativa aouso de AIC elas natildeo os substituem completamente Existem precondiccedilotildees para que umaAIC possa ser substituiacuteda por expressotildees lambda [12] descritas a seguir

bull AIC deve instanciar-se de uma interface

bull AIC natildeo deve possuir nenhum campo e declarar apenas um meacutetodo

bull AIC natildeo deve possuir uma referecircncia para this ou super

bull AIC natildeo deve declarar um meacutetodo recursivo

Para responder agrave primeira pergunta apenas dados gerais sobre todos os projetos seratildeonecessaacuterios ao passo que pelas perguntas 2 e 3 possuiacuterem uma natureza mais complexaseraacute necessaacuterio aleacutem de uma anaacutelise geral estatiacutestica a realizaccedilatildeo de alguns estudos decaso para obter resultados mais completos

42 Fonte de Dados e Objetos de Estudo

Para responder agraves perguntas de pesquisa estabelecidas foram selecionados os 99 projetosmais populares na linguagem Java dentro da plataforma github ateacute a data da coleta dosdados feita em Abril de 2017 Satildeo considerados populares os repositoacuterios que possuema maior quantidade possiacutevel de estrelas (stars) A decisatildeo de escolher os 99 projetos maispopulares foi por sua natureza imparcial e ao mesmo tempo para que se possa analisarprojetos que satildeo de familiaridade e conhecimento da comunidade do github e de domiacuteniopuacuteblico Os 99 projetos estatildeo listados no Anexo I

Para entender a transiccedilatildeo feita por esses projetos entre as versotildees anteriores do Java eo Java 8 com as expressotildees lambda eacute necessaacuterio analisar o coacutedigo de vaacuterias versotildees a fimde observar alguma mudanccedila para cada projeto Como satildeo 99 projetos e vaacuterios dessesprojetos possuem milhares de linhas de coacutedigo e commits seria impossiacutevel avaliar todosos commits Optou-se entatildeo por coletar snapshots mensais de cada projeto conformeprocedimento tambeacutem seguido anteriormente [38] Cada snapshots representa o estadodo projeto em um determinado mecircs e como criteacuterio de escolha padratildeo todos os snapshotsequivalem ao uacuteltimo commit realizado no determinado mecircs que este representa

O proacuteximo passo eacute determinar o periacuteodo de tempo em que esses snapshots seriamcoletados Como Java 8 (e consequentemente as expressotildees lambda) foi introduzidoapenas em meados de 2014 [28] coletar dados de projetos a partir de um periacuteodo muitoantes deste ano natildeo agregaria valor ao estudo em questatildeo Definiu-se entatildeo um periacuteodopara a coleta mensal desses snapshots atraveacutes dos anos Janeiro de 2013 um ano antesda introduccedilatildeo do Java 8 para que se pudesse identificar para todos os projetos o mecircs

24

exato em que expressotildees lambda foram introduzidas ateacute o mecircs da coleta de dados Abrilde 2017

Eacute importante ressaltar que a definiccedilatildeo dos meses foi definida do dia primeiro de ummecircs ao dia primeiro do proacuteximo mecircs e por consequecircncia alguns snapshots que deveriamrepresentar o final de determinado mecircs correspondem na verdade a commits realizadosno dia primeiro do mecircs seguinte Por exemplo pode existir casos em que o commit querepresente o mecircs de Marccedilo de 2016 seja na verdade o commit realizado no dia primeirode Abril de 2016 Isso se deve a natureza da forma como os resultados de log de commitssatildeo obtidos pelo git [39] Poreacutem isso natildeo interfere nas anaacutelises ou no propoacutesito destetrabalho uma vez que foram realizadas verificaccedilotildees e validaccedilotildees para que natildeo existamdatas repetidas (e consequentemente commits repetidos) por repositoacuterio

Neste trabalho o termo projeto e repositoacuterio foram utilizados de forma intercaladapara representar a mesma coisa o software desenvolvido que possui um repositoacuterio naplataforma github Os termos commit snapshops e versotildees tambeacutem representam a mesmacoisa uma vez que foi definido que seriam utilizados apenas um commit por mecircs pararepresentar um determinado snapshot ou versatildeo do repositoacuterio em questatildeo

Todos os 99 projetos seratildeo utilizados para a realizaccedilatildeo de uma anaacutelise geral de ca-racterizaccedilatildeo do uso de expressotildees lambda Para as anaacutelises aprofundadas foi feito umcriteacuterio de classificaccedilatildeo para que apenas alguns projetos possam ser analisados em niacutevelde coacutedigo como estudos de caso

Resumindo foram escolhidos os 99 projetos mais populares de Java no github cole-tando dados mensais de seus commits a partir do ano de 2013 ateacute a data da coleta dosdados lembrando que nem todos os projetos existem desde 2013 (projetos mais recentes)

43 Processo de Mineraccedilatildeo

A abordagem utilizada para coletar e analisar os 99 projetos escolhidos como mostra aFigura 42 foi realizada de forma automatizada utilizando scripts python e dois projetosdesenvolvidos em Java para a coleta e tratamento de dados como descrito a seguir

Primeiramente foi realizado uma coacutepia dos repositoacuterios atuais de todos os 99 projetosmais populares do github em Java Para automatizar o processo foi desenvolvido umscript em python que lista todos os projetos escolhidos clona todos os repositoacuterios emuma pasta na maacutequina local e cria um arquivo temporaacuterio com as informaccedilotildees do nomede cada repositoacuterio e seu caminho absoluto na maacutequina local

25

Figura 42 Metodologia implementada para coleta e tratamento de dados

Em seguida foi necessaacuterio realizar o checkout de todas as versotildees entre Janeiro de2013 a Abril de 2017 de cada projeto Por motivos de otimizaccedilatildeo de espaccedilo da maacutequinalocal e automatizaccedilatildeo no processo de checkout utilizou-se de um segundo script pythonque realizava as seguintes tarefas para cada mecircs em cada projeto verificar se dentreo mecircs estipulado houve algum commit para aquele projeto se sim pega-se o hash douacuteltimo commit do mecircs realiza o checkout conta-se a quantidade de linhas de coacutedigo emJava que o projeto tem utilizando a biblioteca cloc e armazena todas as informaccedilotildeespertinentes referentes a todos os projetos que naquele mecircs tiveram commits para que oprojeto static-analysis possa entatildeo ser executado sobre esses projetos naquele determinadomomento As informaccedilotildees coletadas que satildeo utilizadas pelo static-analysis correspondemao nome do projeto o hash do commit para aquela versatildeo a pasta onde o projeto estaacutearmazenado na maacutequina local a quantidade de linhas de coacutedigo Java do projeto e datareferente ao commit Essas informaccedilotildees satildeo pertinentes para que o projeto static-analysisconsiga funcionar de forma correta projeto este descrito em detalhes a seguir

431 static-analysis

O static-analysis foi um projeto desenvolvido anteriormente a este trabalho pelos alunosThiago Cavalcanti e Vinicius de Almeida cujo objetivo eacute realizar a anaacutelise estaacutetica de

26

coacutedigos-fonte Java e gerar arquivos de saiacuteda contendo informaccedilotildees de classes e meacutetodoscom suas devidas ocorrecircncias de caracteriacutesticas da linguagem [40]

A anaacutelise estaacutetica de coacutedigo consiste em analisar um coacutedigo-fonte sem a necessidadede executaacute-lo Esse tipo de anaacutelise eacute de extrema importacircncia para manter um coacutedigo dequalidade evitar futuras refatoraccedilotildees e obter informaccedilotildees estatiacutesticas de forma raacutepida epraacutetica [41]

Seguindo esse princiacutepio o static-analysis foi projetado para receber um arquivo deentrada csv seguindo o padratildeo

Tipo da Aplicaccedilatildeo Inicio do projeto Antes ou Apoacutes Java 5 Nome do ProjetoVersatildeo Caminho absolutoQuantidade de linhas de coacutedigo

Atraveacutes da informaccedilatildeo do caminho absoluto do projeto o static-analysis varre osdiretoacuterios em busca dos arquivos fonte java realiza o parse desses arquivos e utilizade Visitors para extrair as informaccedilotildees desejadas e exporta-las em arquivos csv Ouso de Visitors permite que sejam escolhidas as informaccedilotildees desejadas para a consultacomo expressotildees Lambda e AIC s aleacutem de possibilitar que sejam implementados novosVisitors conforme a linguagem evolua ou as necessidades mudem

Para este trabalho foram utilizados os Visitors de expressotildees Lambda map() filter()AICs e declaraccedilotildees de meacutetodos

432 BDAnalisador

Apoacutes obter todas as informaccedilotildees necessaacuterias geradas pelo static-analysis era preciso ma-nipular os dados de forma que facilitasse a coleta de dados para o estudo proposto Comovaacuterios arquivos em formato csv satildeo de difiacutecil manipulaccedilatildeo foi desenvolvido entatildeo umaferramenta chamada BDAnalisador Esta ferramenta eacute responsaacutevel por processar os arqui-vos em csv gerados pelo static-analysis e popular uma base de dados relacional MySQLcom as informaccedilotildees pertinentes a este estudo

O BDAnalisador foi desenvolvido com a intenccedilatildeo de tornar mais simples o trabalhocom os dados resultantes do static-analysis de forma que consultas em SQL pudessemser feitas a ponto de permitir a obtenccedilatildeo de resultados mais complexos Seguindo esseobjetivo o framework Hibernate foi escolhido como ferramenta para persistecircncia devidoa ser um framework jaacute consolidado no mercado e que de forma simples relaciona osobjetos Java ao banco de dados MySQL [42] A divisatildeo de classes foi projetada em quatroentidades Projeto Versao Classe e Metodo cada uma com seus respectivos camposcontendo as informaccedilotildees necessaacuterias para a pesquisa como pode ser visto na Figura 44Eacute importante ressaltar que a tabela de Versao guarda hashs de commits devido agrave escolhade utilizar commits para obter mais informaccedilatildeo de evoluccedilatildeo de coacutedigo em um menor

27

espaccedilo de tempo Aleacutem disso para este trabalho optou-se por persistir todos os meacutetodose classes de cada versatildeo sem se importar com a repeticcedilatildeo desses dados pois a hipoacutetesede haver grandes refatoraccedilotildees entre versotildees poderia comprometer a confiabilidade dasinformaccedilotildees

Figura 43 Diagrama de classes UML do BDAnalisador

Como visto na Figura 43 seguindo parcialmente a arquitetura MVC cada entidadepossui sua respectiva classe DAO(Data Access Object) para persistecircncia dos dados eapenas uma classe Controlador no projeto responsaacutevel pela manipulaccedilatildeo e parse dosdados dos arquivos csv gerados pelo static analysis para serem enviados agraves classes DAOO sistema inicia chamando o meacutetodo inicializar() da classe Controlador Esse meacutetodoeacute responsaacutevel por ler um arquivo de entrada csv que segue o mesmo modelo do arquivo dostatic-analysis citado na seccedilatildeo anterior O arquivo conteacutem os dados de todos os projetose suas respectivas versotildees dessa forma o meacutetodo instancia um objeto da classe Projetoe persiste o projeto no banco de dados Para cada versatildeo encontrada no arquivo deentrada o inicializar() aciona os meacutetodos responsaacuteveis por instanciar e preencher aslistas da classe Classe e Metodo Os meacutetodos responsaacuteveis por preencher as listas varremos arquivos csv gerados pelo static-analysis e fazem o parse das informaccedilotildees relevantescomo nomes dos meacutetodos e quantidades de lambdas para construir os objetos que seratildeogravados Ao final dos preenchimentos o objeto Versatildeo eacute instanciado e gravado no bancode dados atraveacutes de sua classe DAO ao mesmo tempo que grava suas respectivas Classese Metodos

28

Apoacutes vaacuterios testes e correccedilotildees de bugs o banco de dados se encontrava finalmente comas informaccedilotildees de 99 projetos Java open-source separados por um commit por mecircs desde2013 cada um com suas respectivas informaccedilotildees de classes meacutetodos e a quantidade deexpressotildees lambda filters e maps em cada meacutetodo Filter ou Filter pattern eacute o padratildeode projeto que tem como objetivo filtrar objetos de uma coleccedilatildeo (Collection) de acordocom algum criteacuterio Jaacute o map ou map pattern eacute um padratildeo que ldquomapeia os elementosde uma coleccedilatildeo aplicando uma funccedilatildeo a eles para uma nova coleccedilatildeo [43] A coleta deinformaccedilotildees sobre esses padrotildees podem ser uacuteteis para possiacuteveis anaacutelises de oportunidadesde uso de expressotildees lambda para refatoraccedilatildeo de coacutedigo

A Figura 44 mostra o esquema de como o banco de dados resultante foi gerado

Figura 44 Modelo relacional do banco de dados populado pelo BDAnalisador Imagemgerada com software DBeaver [2]

44 Classificaccedilatildeo e Anaacutelise

Com o banco de dados populado restam apenas as etapas de classificaccedilatildeo e anaacutelise pararesponder as questotildees de pesquisa propostas Para isso inicialmente houve uma tentativade se utilizar apenas queries SQL para analisar os dados de acordo com as informaccedilotildeesrelevantes Poreacutem devido ao fato de o banco de dados conter todas as informaccedilotildees detodos os projetos e todas as suas versotildees queries que possuem uma alta complexidadedemoravam muito tempo para retornar os dados

Assim com o objetivo de facilitar o trabalho alguns scripts python foram desenvolvi-dos para rodar as queries separadamente e individualmente para cada projeto de formaautomatizada a fim de melhorar o tempo de resposta para obtenccedilatildeo dos resultados

29

441 Meacutedia de Lambda

O primeiro script retorna a quantidade de expressotildees lambda (ou AICs) por n snapshotsque contenha expressotildees lambda O objetivo eacute ter uma visatildeo geral da meacutedia de expressotildeeslambda e AICs utilizadas por cada projeto e como nem todos os snapshots coletados decada projeto possuem expressotildees lambda e AICs apenas aqueles com alguma expressatildeolambda ou AIC satildeo incluiacutedos no caacutelculo da meacutedia

Mmedia =sumn qtdLambdai

n

442 Anaacutelise Temporal

O segundo script retorna para cada projeto a soma total da quantidade de expressotildeeslambda AIC map() e filter() no projeto inteiro para cada versatildeo Ou seja tem-seo total de cada uma das quatro propriedades selecionadas para cada mecircs do projetoobtendo assim uma visatildeo temporal de evoluccedilatildeo do uso das caracteriacutesticas descritas ATabela 41 ilustra parcialmente o resultado obtido para o projeto agera onde idVersaoeacute o identificador no banco de dados referente ao hash do commit mensal coletado qtd eacutea quantidade de cada uma das caracteriacutesticas escolhidas e a data do commit encontra-seno formato americano

Tabela 41 Informaccedilotildees mensais sobre o projeto ageraidVersao Data do Commit qtd lambda qtd AIC qtd maps qtd filter

823 512016 0 29 4 0755 612016 13 28 4 0686 6152016 13 29 4 0621 812016 13 29 4 0555 8162016 13 30 4 0485 922016 13 30 4 0422 10132016 14 30 4 0356 11282016 14 30 4 0295 12212016 21 30 5 0232 212017 21 30 5 0175 312017 21 30 5 0112 3312017 21 36 5 048 4242017 21 48 5 0

Os resultados obtidos com esta anaacutelise temporal permitiu a identificaccedilatildeo de padrotildees nautilizaccedilatildeo de expressotildees lambda em relaccedilatildeo a utilizaccedilatildeo de AIC por todos os projetos Foi

30

possiacutevel classificar todos os projetos em 6 grupos ilustrado na Figura 45 Primeiramenteseparou-se os projetos entre os que possuem expressotildees lambda e os que natildeo possuemDentre os que possuem identificou-se cinco categorias

1 Grupo 1 Quantidade de AICs e expressotildees lambda aumentam com o tempo pro-porcionalmente

2 Grupo 2 Quantidade de AICs diminui agrave medida que a quantidade de expressotildeeslambda aumentam e a quantidade de expressotildees lambda ultrapassa a quantidade deAIC em um determinado momento

3 Grupo 3 Quantidade de AICs diminui agrave medida que a quantidade de expressotildeeslambda aumentam mas a quantidade de AIC permanece superior agrave quantidade delambda

4 Grupo 4 Expressotildees lambda satildeo introduzidas e existem por um pequeno periacuteodode tempo mas satildeo completamente removidas posteriormente

5 Grupo 5 Quantidade de expressotildees lambda eacute constante e muito inferior compa-rado com a quantidade de AICs no projeto Foi determinado que para pertencera esta classificaccedilatildeo o projeto precisa ter uma razatildeo de meacutedia de expressotildees lamb-dasnapshot por meacutedia de AICsnapshot inferior a 020 Esse paracircmetro foi esta-belecido com o objetivo de definir um padratildeo para o que pode ser considerado umprojeto com poucas expressotildees lambda

Figura 45 Classificaccedilatildeo dos projetos

31

443 Refatoraccedilatildeo de Coacutedigo

O uacuteltimo script teve como objetivo realizar uma tentativa inicial de identificar refatoraccedilatildeode coacutedigo da seguinte maneira para todos os projetos que possuem expressotildees lambdaforam identificados o mecircs imediatamente antes da introduccedilatildeo de expressotildees lambda e omecircs seguinte onde houve a primeira ocorrecircncia de lambda no projeto Assim realizou-se uma anaacutelise do tamanho em quantidade de linhas de coacutedigo de todos os meacutetodosdo projeto que no mecircs seguinte tiveram introduccedilatildeo de lambda Em seguida fez-se umacomparaccedilatildeo com os mesmos meacutetodos em relaccedilatildeo ao mecircs anterior e assim foi possiacuteveldetectar quais meacutetodos tiveram a quantidade de linhas de coacutedigo reduzidas o que seriaum indicativo natildeo necessariamente exclusivo de que uma refatoraccedilatildeo de coacutedigo possa terocorrido

Sabe-se que este meacutetodo de detecccedilatildeo de refatoraccedilatildeo de coacutedigo possui suas limitaccedilotildeesuma vez que as comparaccedilotildees para saber se um meacutetodo existe em ambas versotildees eacute feitopuramente por comparaccedilatildeo de String (nome do meacutetodo) e a classe que este pertence

444 Casos de Uso

Os meacutetodos descritos acima ajudaram a identificar alguns padrotildees e facilitar a anaacutelise dosdados Poreacutem natildeo satildeo suficientes para que se possa responder agraves questotildees de pesquisaDessa forma apoacutes a identificaccedilatildeo dos grupos de classificaccedilatildeo para os projetos foramescolhidos um projeto de cada grupo (com exceccedilatildeo do grupo dos projetos sem expressotildeeslambda) para realizar um breve estudo de caso com o objetivo de identificar e caracterizarmelhor a adoccedilatildeo de expressotildees lambda Os projetos escolhidos foram agera vertxAndroid-CleanArchitecture RxJava e guava

32

Capiacutetulo 5

Resultados Obtidos e Anaacutelise

Neste capiacutetulo seratildeo apresentados os dados obtidos e anaacutelise com o objetivo de responderagraves questotildees de pesquisa propostas Como mencionado anteriormente as perguntas seratildeorespondidas de duas maneiras algumas com informaccedilotildees gerais sobre todos os projetose outras com breve estudos de caso envolvendo cinco projetos

51 Visatildeo Geral

Dentre os repositoacuterios coletados para a anaacutelise 74 (7474) natildeo utilizaram nenhumaexpressatildeo lambda no projeto durante todo o periacuteodo analisado (Janeiro de 2013 a Abrilde 2017) restando apenas 25 repositoacuterios (2525) com expressotildees lambda Eacute interessantedestacar que apesar de a quantidade de repositoacuterios que natildeo possuem expressotildees lambdaser relativamente expressiva muitos destes repositoacuterios satildeo de projetos em Java que umdia foram populares e atualmente natildeo estatildeo sendo mais desenvolvidos (por exemplo umaplicativo que soacute funciona para Android 23 atualmente descontinuado)

Levando em consideraccedilatildeo apenas os projetos que possuem expressotildees lambda exis-tem dois tipos de dados que podem ser analisados para responder agrave primeira questatildeo depesquisa atraveacutes dos dados obtidos pelo meacutetodo anteriormente mencionado como anaacutelisetemporal e a meacutedia de lambda por snapshot mencionados no capiacutetulo anterior

Com relaccedilatildeo ao ano em que a primeira ocorrecircncia foi encontrada 6 projetos introduzi-ram expressotildees lambda jaacute em 2014 8 comeccedilaram a utilizar em 2015 7 em 2016 e apenas4 tiveram a primeira ocorrecircncia de expressotildees lambda em 2017 Dessa forma percebe-seque os projetos estatildeo relativamente bem distribuiacutedos em grupos quanto ao ano em que seintroduziu expressotildees lambda

Pela meacutedia de lambda por snapshot (lambdasnapshot) a maioria (11 projetos) possuiuma quantidade expressiva acima de 100 lambdasnapshot (com 6 projetos entre 20 e 100lambdasnapshot e 8 projetos com menos de 20 lambdasnapshot) como apresentados no

33

graacutefico da Figura 51 Isso mostra que essa nova caracteriacutestica jaacute estaacute sendo bem utilizadanos projetos que comeccedilaram a migrar para a nova versatildeo do Java

Figura 51 Graacuteficos dos projetos separados por ano de introduccedilatildeo de expressotildees lambdae meacutedia de lambda por snapshot

Com isso pode-se observar que apesar de a quantidade de projetos que possuemexpressotildees lambda natildeo ser tatildeo alta eacute possiacutevel obter resultados expressivos uma vez quea quantidade dos projetos com lambda estatildeo bem dispersos quanto ao periacuteodo em quecomeccedilaram a adotar essa caracteriacutestica e a quantidade de expressotildees lambda por snapshot

511 Projetos Selecionados

Atraveacutes dos grupos de classificaccedilatildeo identificados pela anaacutelise temporal descritos na Figura45 cinco projetos foram selecionados para uma anaacutelise detalhada levando em consideraccedilatildeoo grupo em que eles pertencem Estes projetos seratildeo apresentados a seguir

512 agera

Agera eacute uma biblioteca Android que ajuda a introduzir programaccedilatildeo funcional reativa(functional reactive programming) em projetos Android Eacute um projeto recente lanccediladoem 2016 pela Google [44] e encontra-se no grupo dos projetos que introduziram expressotildeeslambda em 2016 no mesmo ano de seu lanccedilamento contendo uma meacutedia de expressotildeeslambda de 16 lambdasnapshot

Na classificaccedilatildeo estabelecida agera pertence ao Grupo 1 onde a quantidade de ex-pressotildees lambda no projeto com o tempo aumentam juntamente com a quantidade deAICs como mostra o graacutefico de anaacutelise temporal na Figura 52

34

Figura 52 Graacuteficos de anaacutelise temporal do projeto agera

513 vertx

Eclipse Vertx eacute um conjunto de ferramentas para criaccedilatildeo de reactive applications namaacutequina virtual Java (JVM) em grande escala [45] Seu primeiro lanccedilamento aconteceuem 2011 e a primeira ocorrecircncia de expressotildees lambda no projeto aconteceu em 2014 Esteprojeto possui uma meacutedia de 2867 lambdasnapshot e dentre os projetos consideradosneste trabalho eacute o que possui a maior quantidade de expressotildees lambda

Este projeto pertence ao Grupo 2 onde a quantidade de expressotildees lambda aumen-tou consideravelmente pelos meses ultrapassando a quantidade de AICs que diminuiudrasticamente como mostra a Figura 53

35

Figura 53 Graacuteficos de anaacutelise temporal do projeto Vertx

514 Android-CleanArchitecture

Apesar de ser uma amostra de projeto Android-CleanArchitecture que tem como objetivoconstruir aplicaccedilotildees Android utilizando clean architecture foi lanccedilado em 2014 mas semanteacutem sempre atualizado [46]

A introduccedilatildeo de expressotildees lambda que aconteceu no ano de 2015 se deu de formatiacutemida com uma meacutedia de 35 lambdasnapshot De qualquer forma este projeto conseguerepresentar com seu graacutefico de anaacutelise temporal o grupo 3 composto por projetos em quea quantidade de expressotildees lambda aumentou mas sem ultrapassar AICs que diminuiacuteramdemonstrado no graacutefico da Figura 54

36

Figura 54 Graacuteficos de anaacutelise temporal do projeto Android-CleanArchitecture

515 RxJava

Dentre os repositoacuterios estudados RxJava eacute considerado o mais popular Como umaimplementaccedilatildeo de Reactive Extensions para a JVM RxJava teve seu lanccedilamento dadoem 2013 [47] Expressotildees lambda apareceram pela primeira vez no ano de 2015 comuma meacutedia de 766 lambdasnapshot

Apesar de uma meacutedia relativamente alta o tempo de vida das expressotildees lambda nesteprojeto foi bem curto caracterizando assim projetos do grupo 4 houve a introduccedilatildeo dasexpressotildees lambda no projeto poreacutem houve a remoccedilatildeo completa de todas as expressotildeeslambda previamente introduzidas desaparecendo completamente do projeto ateacute a datada coleta de dados (Figura 55)

37

Figura 55 Graacuteficos de anaacutelise temporal do projeto RxJava

516 guava

Guava eacute um conjunto de bibliotecas para Java da Google lanccedilado em 2011 A atualizaccedilatildeodo coacutedigo do projeto para Java 8 aconteceu somente em 2016 e apesar do projeto conteruma meacutedia de 281 lambdasnapshot ele foi escolhido como representante dos projetosdo Grupo 5 (Figura 56) que possuem expressotildees lambda mas de forma natildeo expressiva osuficiente quando comparado com a quantidade de AIC pelo fato de sua razatildeo de meacutedia delambdasnapshot por meacutedia de AICsnapshot ser 004 Ou seja embora o projeto tenhaexpressotildees lambda estas satildeo consideradas muito poucas quando inseridas no contextogeral deste projeto que eacute considerado um projeto grande

38

Figura 56 Graacuteficos de anaacutelise temporal do projeto Guava

52 Refatoraccedilatildeo de Coacutedigo

Com o objetivo de caracterizar melhor como as expressotildees lambda estatildeo sendo utilizadaseacute interessante identificar se estas estatildeo sendo introduzidas atraveacutes de refatoraccedilatildeo de coacutedigoou em coacutedigo novo

Os projetos classificados como pertencentes ao Grupo 2 possuem em comum o fatode expressotildees lambda aumentarem a medida que AICs diminuem ultrapassando-as eessa caracteriacutestica em comum pode indicar que nestes projetos possivelmente houve re-fatoraccedilatildeo de coacutedigo visto que AIC sendo substituiacutedo por expressotildees lambda dentro dascondiccedilotildees determinadas eacute a maneira mais comum de se identificar refatoraccedilatildeo de coacute-digo para introduccedilatildeo de expressotildees lambda [12] Os projetos que compotildeem o grupo 2representam 44 de todos os projetos estudados que possuem expressotildees lambda o quepode ser um indicativo caso a hipoacutetese de refatoraccedilatildeo de coacutedigo seja positiva de quemuitos projetos que estatildeo adotando o Java 8 estatildeo se preocupando de alguma formacom refatoraccedilatildeo se coacutedigo Fazem parte desse grupo os seguintes projetos elasticsearchjava-design-patterns PocketHub presto RxJava-Android-Samples spark vertx zipkinjava8-tutorial dropwizard e material-dialogs

39

Outra maneira de verificar possiacuteveis indicadores de refatoraccedilatildeo de coacutedigo foi atraveacutesda anaacutelise dos tamanhos (em quantidade de linhas de coacutedigo) dos meacutetodos com expressotildeeslambda no mecircs em que se introduziu expressotildees lambda e um mecircs imediatamente antesdeste Essa anaacutelise mostra que dos 25 projetos com expressotildees lambda 12 (48) projetostiveram ao menos um meacutetodo em que houve uma diminuiccedilatildeo no tamanho o que podeser considerado um indicativo de refatoraccedilatildeo de coacutedigo A Figura 57 mostra todos osprojetos em relaccedilatildeo agrave quantidade total de meacutetodos que possuem lambda no primeiro mecircsde introduccedilatildeo do mesmo em vermelho comparado com a quantidade desses meacutetodos quetiveram uma diminuiccedilatildeo no tamanho quando comparados com o coacutedigo do mecircs anteriorem azul

Figura 57 Comparaccedilatildeo entre todos os projetos com expressatildeo lambda sobre refatoraccedilatildeode coacutedigo no mecircs de introduccedilatildeo da caracteriacutestica

Ainda observando a figura 57 com relaccedilatildeo aos projetos que natildeo tiveram nenhummeacutetodo com diminuiccedilatildeo de tamanho (barra azul) percebe-se que todos os 13 projetossequer tiveram uma quantidade significativa de meacutetodos que possuem expressotildees lambda(com o maior tendo apenas 5 meacutetodos) no mecircs de introduccedilatildeo da caracteriacutestica no projetoe ao mesmo tempo jaacute existiam no mecircs em que natildeo existia lambda no projeto Essa eacuteuma observaccedilatildeo importante porque projetos como vertx sendo este o que possui a maiormeacutedia de lambdasnapshot de todos os projetos e ao mesmo tempo tendo apenas trecircsmeacutetodos que continham expressotildees lambda no mecircs da introduccedilatildeo e que existiam no mecircs

40

anterior permitem inferir que todas as outras expressotildees lambda existentes no projetopara este determinado mecircs de introduccedilatildeo encontram-se em coacutedigo novo introduzido

Eacute importante ressaltar que somente essa anaacutelise natildeo eacute exclusivamente suficiente paradeterminar se estes projetos estatildeo realmente introduzindo lambda em coacutedigo novo ourealizando refatoraccedilatildeo uma vez que como a comparaccedilatildeo aconteceu apenas no mecircs deintroduccedilatildeo com o mecircs imediatamente anterior natildeo reflete todo o ciclo de vida do pro-jeto Por exemplo algumas equipes podem escolher refatorar o coacutedigo depois de umtempo de adaptaccedilatildeo apoacutes a transiccedilatildeo para a nova versatildeo da linguagem Assim paraobter uma melhor anaacutelise sobre refatoraccedilatildeo de coacutedigo ou natildeo feita nestes projetos aleacutemde outras anaacutelises referentes aos padrotildees tipicamente adotados para implementaccedilatildeo delambda nestes projetos seratildeo apresentados a seguir os estudos de caso dos cinco projetospreviamente selecionados

Outro ponto importante eacute o fato de que apesar das informaccedilotildees quanto agraves quantida-des de filter e map terem sido incluiacutedas inicialmente no trabalho para observar possiacuteveispadrotildees de refatoraccedilatildeo de coacutedigo percebeu-se que estas natildeo satildeo utilizadas de forma con-sideraacutevel pelos projetos estudados e para fins de anaacutelises generalizadas natildeo apresentaramtanta influecircncia na utilizaccedilatildeo de expressotildees lambda quanto a quantidade de AICs noprojeto

53 Estudos de Caso

Dentre os projetos analisados verificou-se que os projetos de pequeno e meacutedio porte op-taram por refatorar de uma vez seus coacutedigos para incluir expressotildees lambda em situaccedilotildeesem que se utilizava AICs anteriormente ou em alguns poucos casos de utilizaccedilatildeo deCollection Os projetos de grande porte natildeo apresentaram nenhuma refatoraccedilatildeo de coacute-digo ou uma refatoraccedilatildeo parcial gradativa provavelmente devido agrave grande quantidade dearquivos e coacutedigo que possuem o que pode tornar o trabalho de refatoraccedilatildeo extenso ecansativo

O projeto vertx que pertence ao grupo 2 dos projetos em que a quantidade de ex-pressotildees lambda aumentaram e as de AICs diminuiacuteram com lambda ultrapassando AICsexecutou inicialmente commits em maio de 2014 com adiccedilatildeo de coacutedigo novo utilizandoexpressotildees lambda e apoacutes um mecircs realizou um commit maior com a refatoraccedilatildeo de todasas AICs para expressotildees lambda Apoacutes a refatoraccedilatildeo o projeto se preocupou em mantera utilizaccedilatildeo de expressotildees lambda ao mesmo tempo que o uso de AICs se manteve apenasaos casos de classes com interfaces natildeo funcionais A Figura 58 apresenta uma parte docommit de refatoraccedilatildeo de coacutedigo que mostra em vermelho a parte eliminada do coacutedigo(AIC) e em verde o coacutedigo novo representando a substituiccedilatildeo por uma expressatildeo lambda

41

Figura 58 Commit de refatoraccedilatildeo de coacutedigo do projeto Vertx [3]

Alguns projetos ainda natildeo se preocuparam em refatorar o coacutedigo para o uso de ex-pressotildees lambda ateacute a data deste trabalho que eacute o caso do projeto guava que apresentouum commit em 03112016 com a atualizaccedilatildeo do projeto para Java 8 Mas a partir daatualizaccedilatildeo se preocupou em utilizar as expressotildees lambda apenas na implementaccedilatildeo decoacutedigo novo O cenaacuterio em que a refatoraccedilatildeo natildeo eacute prioridade ainda eacute a realidade de vaacuteriosprojetos de grande porte visto que os dados de projetos sem nenhuma expressatildeo lambdasatildeo o maior nuacutemero neste trabalho Poreacutem projetos que jaacute adotaram a utilizaccedilatildeo do Java8 tendem a mudar isso com o passar do tempo A Figura 59 apresenta em verde umaadiccedilatildeo de coacutedigo novo com expressatildeo lambda sem a eliminaccedilatildeo de algum coacutedigo anteriora esse que estaria em vermelho

42

Figura 59 Exemplo de um arquivo do commit de adiccedilatildeo de coacutedigo novo em Java 8 doprojeto Guava [4]

Na categoria de projetos em que os AICs e expressotildees lambda aumentam proporci-onalmente (grupo 1) o projeto agera realizou um commit em 19052016 com a adiccedilatildeoda biblioteca retrolambda como dependecircncia do projeto Essa biblioteca utilizada prin-cipalmente por projetos Android permite executar coacutedigo Java 8 contendo expressotildeeslambda em Java 5 6 e 7 [48] O commit tambeacutem apresenta refatoraccedilatildeo dos AICs ad-vindos de interfaces funcionais para expressotildees lambda Apesar de o projeto continuar autilizar as expressotildees lambda em seus commits posteriores o nuacutemero de AICs tambeacutemcontinuou a aumentar visualizando os commits posteriores notou-se que esses AICs satildeorelativos a interfaces natildeo funcionais ou seja que possuem mais de um meacutetodo O projetoAndroid-CleanArchitecture eacute similar ao agera pois tambeacutem optou pela instalaccedilatildeo da bi-blioteca retrolambda para uso de expressotildees lambda em seus coacutedigos e como tambeacutem eacuteum projeto de pequeno porte houve uma pequena refatoraccedilatildeo dos AICs A Figura 510mostra a parte do commit de refatoraccedilatildeo de coacutedigo em que o desenvolvedor adiciona abiblioteca retrolambda como dependecircncia

43

Figura 510 Commit de adiccedilatildeo da biblioteca Retrolambda no projeto Agera [5]

Outro caso interessante eacute o do projeto RxJava que em 2015 optou pela refatoraccedilatildeodo coacutedigo para a utilizaccedilatildeo de expressotildees lambda quase eliminando por completo o usode AICs mas que no ano seguinte reverteu os commits de forma que eliminasse comple-tamente o uso de expressotildees lambda para manter a retrocompatibilidade com o Java 6A Figura 511 demonstra uma parte do commit de reversatildeo do coacutedigo para Java 6 emque pode ser visto em vermelho o coacutedigo anterior com expressotildees lambda e o verde como novo coacutedigo utilizando AIC novamente

44

Figura 511 Commit de remoccedilatildeo de Lambdas e volta para o uso de AICs no projetoRXJava [6]

Essa preocupaccedilatildeo com retrocompatibilidade de coacutedigo pode ser um fator crucial nadecisatildeo das equipes de desenvolvimento na hora de decidir como fazer o software co-evoluircom a linguagem sem perder a compatibilidade com versotildees anteriores

45

Capiacutetulo 6

Consideraccedilotildees Finais

Este estudo permitiu entender melhor como projetos estatildeo realizando a migraccedilatildeo para oJava 8 em especial utilizando uma nova caracteriacutestica introduzida expressatildeo lambdaApesar de a maioria dos projetos populares considerados natildeo possuiacuterem nenhuma ocor-recircncia de expressotildees lambda os projetos que tinham expressotildees lambda foram suficientespara realizar um primeiro estudo de caracterizaccedilatildeo no uso desta caracteriacutestica e com osprojetos efetivamente utilizados para estudo foi possiacutevel agrupaacute-los quanto a maneira emque as expressotildees lambda estavam sendo utilizadas quando comparadas com AICs em 5grandes grupos quando AIC e lambda aumentam proporcionalmente quando AIC dimi-nui e lambda aumenta ultrapassando AIC quando AIC diminui mas continua superior aolambda crescente expressotildees lambda que foram introduzidas e retiradas completamentedo coacutedigo e expressotildees lambda que natildeo existem em quantidades expressivas

Foi possiacutevel entatildeo realizar um estudo aprofundado levando em consideraccedilatildeo as di-ferentes maneiras com que as expressotildees lambda foram adotadas nos projetos atraveacutes daescolha de um projeto que representasse cada grupo para anaacutelise Dentre os cinco projetosestudados foi possiacutevel observar alguns padrotildees tipicamente adotados por desenvolvedorespara implementar expressotildees lambda em seus projetos como a utilizaccedilatildeo da bibliotecas(retrolambda) que permitissem uma flexibilizaccedilatildeo na utilizaccedilatildeo de expressotildees lambda oucomo lambda eacute primariamente utilizada para substituir determinados AICs ou operaccedilotildeesem Collection

Aleacutem disso foi possiacutevel observar como a refatoraccedilatildeo de coacutedigo acontece em cada umdesses projetos Observou-se como projetos menores tendem a refatorar coacutedigo maisfacilmente ao passo que projetos maiores e mais complexos fazem menos refatoraccedilatildeo oudemoram mais entre o periacuteodo em que houve a primeira migraccedilatildeo de coacutedigo para a novaversatildeo da linguagem ateacute o periacuteodo em que realmente decidem refatorar coacutedigo Aleacutem dacomplexidade do projeto influenciar na decisatildeo de migrar o projeto para uma versatildeo maisrecente da linguagem a preocupaccedilatildeo com retrocompatibilidade com versotildees anteriores da

46

linguagem tambeacutem podem ser uma barreira para que projetos comecem a evoluir o coacutedigojuntamente com a evoluccedilatildeo da linguagem

Ainda assim foi possiacutevel observar que a preocupaccedilatildeo com a co-evoluccedilatildeo do software-linguagem existe entre os desenvolvedores de projetos mas a realizaccedilatildeo da migraccedilatildeo aindaacontece lentamente devido agrave diversos fatores que precisam ser levados em consideraccedilatildeopara a manutenccedilatildeo do projeto

Para trabalhos e contribuiccedilotildees futuras seria interessante desenvolver uma ferramentaque pudesse analisar diretamente no coacutedigo-fonte as oportunidades de aplicaccedilatildeo de ex-pressotildees lambda dessa forma poderiam ser analisadas as porcentagens de conversatildeo decoacutedigo para Java 8 e obter melhores conclusotildees sobre a importacircncia que os projetos estatildeodando para a evoluccedilatildeo de seus coacutedigos Outro fator interessante seria aplicar mais Visitorsagrave ferramenta static-analysis e fazer este mesmo estudo aplicado agrave outras caracteriacutesticasda linguagem

47

Referecircncias

[1] Kagdi Huzefa Michael L Collard e Jonathan I Maletic A survey and taxonomyof approaches for mining software repositories in the context of software evolution2007 ix 3 8 9 10 11

[2] DBeaver Dbeaver - features httpdbeaverjkissorgdocsfeatures ix 29

[3] Eclipse Vertx commit Java8-ify code httpsgithubcomeclipsevertxcommit93f95e9c77419f442a42fe711b6eeaef88192fd3 ix 42

[4] Google Guava commit Release java 8 changes to guava httpsgithubcomgoogleguavacommit73e382fa877f80994817a136b0adcc4365ccd904 ix 43

[5] Google Agera commit Collapsed testapp with retrolambda httpsgithubcomgoogleageracommit5e518b7b05f9e7a34a314945f68deff7b2c3e334 ix 44

[6] ReactiveX Rxjava commit 2x full jdk 6 compatible backport + includ-ing bugfixes up to today httpsgithubcomReactiveXRxJavacommit000a174d87a901135f9665d3b11f3627fd2dc4ed ix 45

[7] Godfrey M W e D M German The past present and future of software evolutionEm 2008 Frontiers of Maintenance paacuteginas 129ndash138 Sept 2008 1 6

[8] Favre J M Languages evolve too changing the software time scale Em Principles ofSoftware Evolution Eighth International Workshop on paacuteginas 33ndash42 IEEE 20051 5 7

[9] Overbey Jeffrey L e Ralph E Johnson Regrowing a language refactoring tools allowprogramming languages to evolve Em ACM SIGPLAN Notices volume 44 paacuteginas493ndash502 ACM 2009 1 5 7 8 12

[10] Grechanik Mark Collin McMillan Luca DeFerrari Marco Comi Stefano CrespiDenys Poshyvanyk Chen Fu Qing Xie e Carlo Ghezzi An empirical investiga-tion into a large-scale java open source code repository Em Proceedings of the2010 ACM-IEEE International Symposium on Empirical Software Engineering andMeasurement ESEM rsquo10 paacuteginas 111ndash1110 New York NY USA 2010 ACMISBN 978-1-4503-0039-1 httpdoiacmorg10114518527861852801 1

[11] TIOBE Tiobe httpswwwtiobecomtiobe-index 1 14

48

[12] Gyori Alex Lyle Franklin Danny Dig e Jan Lahoda Crossing the gap from im-perative to functional programming through refactoring Em Proceedings of the 20139th Joint Meeting on Foundations of Software Engineering ESECFSE 2013 paacute-ginas 543ndash553 New York NY USA 2013 ACM ISBN 978-1-4503-2237-9 httpdoiacmorg10114524914112491461 2 11 24 39

[13] OpenJDK State of the lambda httpcropenjdkjavanet~briangoetzlambdalambda-state-4html 2

[14] Han Jiawei Micheline Kamber e Jian Pei Data Mining Concepts and TechniquesMorgan Kaufmann Publishers Inc San Francisco CA USA 3rd ediccedilatildeo 2011ISBN 0123814790 9780123814791 3

[15] Fowler Martin e Kent Beck Refactoring improving the design of existing codeAddison-Wesley Professional 1999 5 7

[16] Lehman M M J F Ramil P D Wernick D E Perry e W M Turski Met-rics and laws of software evolution - the nineties view Em Proceedings of the4th International Symposium on Software Metrics METRICS rsquo97 paacuteginas 20ndashWashington DC USA 1997 IEEE Computer Society ISBN 0-8186-8093-8 httpdlacmorgcitationcfmid=823454823901 6

[17] Hassan Ahmed E e Tao Xie Software intelligence The future of mining softwareengineering data Em Proceedings of the FSESDP Workshop on Future of SoftwareEngineering Research FoSER rsquo10 paacuteginas 161ndash166 New York NY USA 2010ACM ISBN 978-1-4503-0427-6 httpdoiacmorg101145188236218823978 9

[18] Hassan Ahmed E The road ahead for mining software repositories Em Frontiers ofSoftware Maintenance 2008 FoSM 2008 paacuteginas 48ndash57 IEEE 2008 8

[19] Berry Michael J e Gordon Linoff Data Mining Techniques For Marketing Salesand Customer Support John Wiley amp Sons Inc New York NY USA 1997ISBN 0471179809 10

[20] Parnin Chris Christian Bird e Emerson Murphy-Hill Java generics adoption hownew features are introduced championed or ignored Em Proceedings of the 8thWorking Conference on Mining Software Repositories paacuteginas 3ndash12 ACM 2011 12

[21] Oracle The java language specification httpsdocsoraclecomjavasespecsjlsse8jls8pdf 13

[22] Oracle The history of java technology httpwwworaclecomtechnetworkjavajavaseoverviewjavahistory-index-198355html 13

[23] Murphy Kieron So why did they decide to call itjava httpwwwjavaworldcomarticle2077265core-javaso-why-did-they-decide-to-call-it-java-html 13

[24] McGraw Tata Object-oriented Programming with Java Essentials and ApplicationsHill Education 13

49

[25] Oracle Differences between java ee and java se httpdocsoraclecomjavaee6firstcupdocgkhoyhtml 13

[26] Lindsey Clark S The History of Java Cambridge 14

[27] Oracle The java language environment httpwwworaclecomtechnetworkjavaintro-141325html 14

[28] Oracle Jdk 8 httpopenjdkjavanetprojectsjdk8 15 24

[29] Oracle Enhancements in java se 8 httpdocsoraclecomjavase8docstechnotesguideslanguageenhancementshtmljavase8 15 16 17

[30] Oracle Lambda expressions httpdocsoraclecomjavasetutorialjavajavaOOlambdaexpressionshtml 16 18 21

[31] Oracle Method references httpdocsoraclecomjavasetutorialjavajavaOOmethodreferenceshtml 16

[32] Oracle Default methods httpdocsoraclecomjavasetutorialjavaIandIdefaultmethodshtml 17

[33] Oracle Repeating annotations httpdocsoraclecomjavasetutorialjavaannotationsrepeatinghtml 17

[34] Oracle Type annotations httpdocsoraclecomjavasetutorialjavaannotationstype_annotationshtml 17

[35] Oracle Anonymous inner classes httpsdocsoraclecomjavasetutorialjavajavaOOanonymousclasseshtml 19

[36] Kothari CR Research Methodology Methods and Techniques New Age Interna-tional (P) Limited 2004 ISBN 9788122415223 httpsbooksgooglecombrbooksid=8c6gkbKi-F4C 22

[37] Nakakoji Kumiyo Yasuhiro Yamamoto Yoshiyuki Nishinaka Kouichi Kishida eYunwen Ye Evolution patterns of open-source software systems and communitiesEm IWPSE rsquo02 Proceedings of the International Workshop on Principles of SoftwareEvolution paacuteginas 76ndash85 New York NY USA 2002 ACM Press ISBN 1581135459httpdxdoiorg101145512035512055 23

[38] Rahman Foyzur Christian Bird e Premkumar Devanbu Clones What is that smellEmpirical Software Engineering 17(4-5)503ndash530 2012 24

[39] Chacon Scott Pro Git Apress Berkely CA USA 1st ediccedilatildeo 2009ISBN 1430218339 9781430218333 25

[40] Cavalcanti Thiago Gomes e Viniacutecius Correa de Almeida Caracterizaccedilatildeo do uso deconstruccedilotildees da linguagem java em projetos open-source Publicaccedilatildeo online 2016httpbdmunbbrhandle1048315733 27

50

[41] Parr Terence Language Implementation Patterns Create Your Own Domain-Specific and General Programming Languages Pragmatic Bookshelf 1st ediccedilatildeo 2009ISBN 193435645X 9781934356456 27

[42] Janssen Thorben 5 reasons to use jpa hibernate Publicaccedilatildeo online httpswwwsitepointcom5-reasons-to-use-jpa-hibernate 27

[43] Franklin Lyle Alex Gyori Jan Lahoda e Danny Dig Lambdaficator From imperativeto functional programming through automated refactoring Em Proceedings of the2013 International Conference on Software Engineering ICSE rsquo13 paacuteginas 1287ndash1290 Piscataway NJ USA 2013 IEEE Press ISBN 978-1-4673-3076-3 httpdlacmorgcitationcfmid=24867882486986 29

[44] Google Agera httpsgithubcomgoogleagerawiki 34

[45] Eclipse Eclipse vertx httpvertxio 35

[46] Cejas Fernando Android cleanarchitecture httpsgithubcomandroid10Android-CleanArchitecture 36

[47] ReactiveX Rxjava httpsgithubcomReactiveXRxJava 37

[48] Luontola Esko Retrolambda httpsgithubcomorfjackalretrolambda 43

51

Anexo I

Projetos utilizados

fastjson

platform_frameworks_base

netty

material-dialogs

kotlin

okhttp

tinker

AndroidUtilCode

RxJava

spring-boot

java-design-patterns

elasticsearch

ExoPlayer

kafka

vertx

realm-java

guava

zipkin

bazel

stetho

Signal-Android

glide

agera

fresco

plaid

presto

libgdx

spark

52

disruptor

lottie-android

flexbox-layout

PocketHub

zxing

spring-framework

deeplearning4j

dropwizard

interviews

BaseRecyclerViewAdapterHelper

uCrop

DanmakuFlameMaster

lottie-react-native

android-UniversalMusicPlayer

AndroidInterview-Q-A

greenDAO

retrofit

MaterialDrawer

BottomBar

druid

MPAndroidChart

Hystrix

guice

recyclerview-animators

dubbo

androidannotations

RxJava-Android-Samples

PhotoView

clojure

CircleImageView

AndroidSwipeLayout

jedis

MaterialViewPager

butterknife

junit4

RxBinding

leakcanary

SimianArmy

picasso

UltimateRecyclerView

53

AndroidViewAnimations

AppIntro

FizzBuzzEnterpriseEdition

ion

cheesesquare

physical-web

RxAndroid

Android-CleanArchitecture

Calligraphy

Android-Bootstrap

iosched

Android_Data

MaterialDesignLibrary

ListViewAnimations

EventBus

java8-tutorial

AndroidSlidingUpPanel

dagger

okhttputils

logger

HomeMirror

Material-Animations

android-Ultra-Pull-To-Refresh

android-async-http

Android-ObservableScrollView

Android-Universal-Image-Loader

ActionBarSherlock

SlidingMenu

storm

PagerSlidingTabStrip

Android-PullToRefresh

54

  • Dedicatoacuteria
  • Agradecimentos
  • Resumo
  • Abstract
  • Introduccedilatildeo
    • Contexto
    • Objetivos
      • Objetivos Gerais
      • Objetivos Especiacuteficos
        • Metodologia
        • Organizaccedilatildeo do Trabalho
          • Evoluccedilatildeo e Mineraccedilatildeo de Repositoacuterios de Software
            • Evoluccedilatildeo de Software
            • MSR Mineraccedilatildeo de dados e a Engenharia de Software
              • Classificaccedilatildeo
                • Trabalhos Relacionados
                  • Java SE 8 e JDK 8
                    • Histoacuterico
                    • Princiacutepios
                    • Evoluccedilatildeo
                    • Expressotildees Lambda
                      • Sintaxe
                      • Principais formas de uso
                          • Estudo e o Processo de Mineraccedilatildeo
                            • Questotildees de Pesquisa
                            • Fonte de Dados e Objetos de Estudo
                            • Processo de Mineraccedilatildeo
                              • static-analysis
                              • BDAnalisador
                                • Classificaccedilatildeo e Anaacutelise
                                  • Meacutedia de Lambda
                                  • Anaacutelise Temporal
                                  • Refatoraccedilatildeo de Coacutedigo
                                  • Casos de Uso
                                      • Resultados Obtidos e Anaacutelise
                                        • Visatildeo Geral
                                          • Projetos Selecionados
                                          • agera
                                          • vertx
                                          • Android-CleanArchitecture
                                          • RxJava
                                          • guava
                                            • Refatoraccedilatildeo de Coacutedigo
                                            • Estudos de Caso
                                              • Consideraccedilotildees Finais
                                              • Referecircncias
                                              • Anexo
                                              • Projetos utilizados

projetos com foco em refatoraccedilatildeo de coacutedigo o que originou a necessidade deste estudoAssim para alcanccedilar o objetivo deste trabalho foram traccedilados em forma de questotildees depesquisa os objetivos especiacuteficos a serem alcanccedilados por este trabalho

bull Quando os projetos Java de coacutedigo aberto comeccedilaram a introduzir o uso de expres-sotildees lambda em seus coacutedigos e quatildeo significativo eacute esse uso

bull Como as equipes de desenvolvimento estatildeo utilizando expressotildees lambda atraveacutesde refatoraccedilatildeo de coacutedigo ou introduzindo apenas em coacutedigo novo

bull Quais satildeo os padrotildees tipicamente adotados para o uso de expressotildees lambda

13 Metodologia

Este trabalho foi desenvolvido utilizando uma abordagem de MSR que dentro da clas-sificaccedilatildeo de Kagdi et al [1] pode ser divido em quatro grandes etapas Primeiramentedefiniu-se a fonte de dados a ser utilizada e dentre as possibilidades encontradas na lite-ratura [14] optou-se por utilizar repositoacuterios de controle de versatildeo mais especificamenteo Github tendo como criteacuterio de seleccedilatildeo os 99 repositoacuterios Java mais populares na plata-forma Em seguida definiu-se o propoacutesito do estudo no caso os objetivos em forma deperguntas de pesquisa a serem respondidas

A terceira grande etapa foi a definiccedilatildeo do meacutetodo em si a forma como seria realizadoo estudo e este por sua vez constitui-se de download de todos os 99 repositoacuterios maispopulares realizaccedilatildeo de uma anaacutelise estaacutetica para coletar informaccedilotildees necessaacuterias de cadaprojeto por versatildeo e armazenamento de informaccedilotildees pertinentes em uma base de dados

A etapa final foi a realizaccedilatildeo da avaliaccedilatildeo dos dados obtidos atraveacutes de meacutetricas eanaacutelises quantitativas para melhor responder as questotildees de pesquisa aleacutem de estudos decaso feitos com cinco projetos escolhos de acordo com a maneira distinta em que estesfazem o uso de expressotildees lambda

14 Organizaccedilatildeo do Trabalho

Este trabalho se divide em seis capiacutetulos

bull Capiacutetulo 2 Apresenta um referencial teoacuterico sobre evoluccedilatildeo de software demons-trando as estrateacutegias utilizadas e a importacircncia da evoluccedilatildeo em um projeto de coacutedigoaberto aleacutem de enunciar as leis de evoluccedilatildeo de software de Lehman O capiacutetulo tam-beacutem apresenta o processo de mineraccedilatildeo de dados explicando cada uma das camadasda classificaccedilatildeo e demonstra trabalhos relacionados a esse toacutepico que serviram debase para este trabalho

3

bull Capiacutetulo 3 Traz um contexto histoacuterico e teacutecnico da linguagem Java necessaacuteriospara entender a importacircncia que as novas caracteriacutesticas adicionadas na versatildeo8 fornecem para os desenvolvedores de projetos determinados a manter o projetosempre evoluiacutedo Tambeacutem eacute apresentada uma seccedilatildeo para demonstrar os detalhese formas de utilizaccedilatildeo das expressotildees Lambda que satildeo o foco dos objetivos destetrabalho

bull Capiacutetulo 4 Descreve a metodologia e processo utilizados para o desenvolvimentoe obtenccedilatildeo dos resultados deste trabalho O capiacutetulo desenvolve o contexto dasquestotildees de pesquisa e explica os motivos e processos de desenvolvimento das fer-ramentas utilizadas para minerar os dados aleacutem de determinar a classificaccedilatildeo dosresultados obtidos em grupos para facilitar a organizaccedilatildeo dos dados de forma queas perguntas sejam respondidas claramente

bull Capiacutetulo 5 Apresenta os resultados obtidos e de que forma eles ajudaram a respon-der as questotildees de pesquisa Eacute descrita uma anaacutelise de um projeto de cada categoriaespecificada no capiacutetulo anterior a fim de contextualizar cada tipo de resultado paraque o leitor entenda a forma que os projetos Java estatildeo lidando com as expressotildeesLambda

bull Capiacutetulo 6 Descreve as dificuldades e problemas obtidos durante o trabalho e deque forma eles influenciaram nos resultados Tambeacutem eacute apresentada uma seccedilatildeocontendo as ideias surgidas durante o desenvolvimento deste trabalho que ficarampara ser feitas no futuro devido agrave gama de informaccedilotildees que a mineraccedilatildeo dos dadostrouxe

4

Capiacutetulo 2

Evoluccedilatildeo e Mineraccedilatildeo deRepositoacuterios de Software

As linguagens de programaccedilatildeo estatildeo sempre evoluindo aumentando sua complexidade eexpressividade Da mesma forma aleacutem de se preocupar com dificuldades de estabelecercompatibilidade do software em relaccedilatildeo a tecnologias antigas desenvolvedores tambeacutemprecisam acompanhar essa evoluccedilatildeo das linguagens para que suas ferramentes natildeo setornem obsoletas [9] Isso agrega um grande desafio no desenvolvimento e evoluccedilatildeo desoftware

O conceito de evoluccedilatildeo de software amadureceu e se tornou um grande foco de pes-quisa Poreacutem nem sempre estudos de evoluccedilatildeo de software reconhecem a importacircncia daevoluccedilatildeo da linguagem de programaccedilatildeo no contexto do desenvolvimento de software [8]Quando um coacutedigo natildeo evolui junto com a linguagem com o objetivo de manter umacompatibilidade com versotildees anteriores sua capacidade de evoluccedilatildeo se torna limitada [9]

A refatoraccedilatildeo de coacutedigo que consiste em realizar mudanccedilas no coacutedigo fonte sem modi-ficar o comportamento observado do software [15] permite que a evoluccedilatildeo de linguagens eferramentas aconteccedilam mais naturalmente No entanto novos desafios surgem como porexemplo saber quando e como realizar a refatoraccedilatildeo de coacutedigo de forma eficiente e coesaDentre as teacutecnicas de pesquisa em engenharia de software para entender esse problematorna-se interessante explorar as teacutecnicas de mineraccedilatildeo de dados aplicados a repositoacuteriosde software com o objetivo de entender o relacionamento entre evoluccedilatildeo e refatoraccedilatildeo

Assim este capiacutetulo busca esclarecer conceitos e estrateacutegias de evoluccedilatildeo de softwaremineraccedilatildeo de repositoacuterios de software e o estado da arte sobre o assunto

5

21 Evoluccedilatildeo de Software

Durante o processo de produccedilatildeo e manutenccedilatildeo de software haacute a necessidade de diversastomadas de decisotildees sobre seu desenvolvimento como por exemplo decidir como melho-rar a qualidade do software Tais decisotildees precisam ser tomadas levando em consideraccedilatildeoo ambiente em que se estaacute inserido com novas tecnologias surgindo todos os dias fe-edback de usuaacuterios exigentes e concorrentes produzindo um software similar com ideiasinovadoras

Tudo isso acontece em um ritmo de constante mudanccedila e assim como diria Lehmaneacute imprescindiacutevel que software de sistemas sejam capazes de evoluir ou os mesmos correm orisco de sofrer uma morte prematura [16] fazendo assim da evoluccedilatildeo de software um con-ceito importante dentro do seu processo de desenvolvimento Essa evoluccedilatildeo deve ocorrerconsiderando o ambiente em que o software estaacute inserido o qual possui aspectos teacutecnicos esociais sua infraestrutura que pertence ao seu ambiente teacutecnico o qual sempre necessitamanutenccedilatildeo e ao mesmo tempo usuaacuterios que utilizam o software e estatildeo constantementeformando opiniotildees oferecendo feedback e na expectativa por novidades [7] Assim a me-dida que novas caracteriacutesticas satildeo desenvolvidas novas tecnologias de infraestrutura satildeonecessaacuterias novos requisitos satildeo adicionados e o sistema de software deve se adaptar aessas mudanccedilas

Com relaccedilatildeo aos aspectos sociais que envolvem a evoluccedilatildeo do software eacute importanteressaltar os conceitos baacutesicos de como essa evoluccedilatildeo acontece Durante um estudo empiacutericopioneiro na aacuterea de evoluccedilatildeo de software para sistemas de grande escala Lehman e seuscolaboradores formularam um conjunto de observaccedilotildees que hoje satildeo conhecidas como asleis da evoluccedilatildeo de software ou simplesmente Leis de Lehman [16] No geral as leis deevoluccedilatildeo de software podem ser descritas da seguinte forma [16]

1 Mudanccedila contiacutenua um sistema se tornaraacute progressivamente menos satisfatoacuteriopara seus usuaacuterios com o tempo a menos que se adapte continuamente agraves necessi-dades que surgiratildeo

2 Complexidade Crescente um sistema se tornaraacute cada vez mais complexo amenos que se trabalhe para explicitamente reduzir sua complexidade

3 Auto-regulaccedilatildeo o processo de evoluccedilatildeo de software eacute auto-regulatoacuterio no que dizrespeito agraves distribuiccedilotildees dos artefatos e produtos produzidos

4 Conservaccedilatildeo da estabilidade organizacional a taxa meacutedia de atividade globalefetiva em um sistema em evoluccedilatildeo natildeo muda com o tempo ou seja a meacutedia detrabalho e esforccedilo colocado em cada entrega do sistema permanece a mesma

6

5 Conservaccedilatildeo de familiaridade a quantidade de conteuacutedo novo em cada entregado sistema tende a se manter constante com o tempo

6 Crescimento contiacutenuo A quantidade de funcionalidades em um sistema cresceraacutecom o tempo com o objetivo de satisfazer seus usuaacuterios

7 Decliacutenio de qualidade Um sistema seraacute percebido com qualidade inferior como passar do tempo a menos que seu design tenha uma manutenccedilatildeo minuciosa e seadapte a novas restriccedilotildees

8 Sistema de Feedback Evoluir um sistema com sucesso requer reconhecer que oprocesso de desenvolvimento acontece em um sistema de feedback de vaacuterios ciclosagentes e niacuteveis

Os aspectos teacutecnicos que envolvem a evoluccedilatildeo de software levam em consideraccedilatildeo astecnologias utilizadas para o seu desenvolvimento desde a linguagem de programaccedilatildeo agravesmaacutequinas onde o software seraacute hospedado que sofrem atualizaccedilotildees recebem novas versotildeescom novas caracteriacutesticas implementadas

Um estudo realizado por Lavre mostra como a evoluccedilatildeo das linguagens de programa-ccedilatildeo no contexto da evoluccedilatildeo de software muitas vezes satildeo subestimadas uma vez quemuitos podem considerar em seus estudos a linguagem de computaccedilatildeo como um artefatoimutaacutevel [8] Por exemplo coloca-se muita ecircnfase e cuidado para realizar o versionamentode coacutedigo fonte de um software mas este pode ser tornar inutilizaacutevel futuramente se nin-gueacutem souber qual versatildeo de compilador determinada versatildeo de coacutedigo foi desenvolvida

Para natildeo se deixar estagnar linguagens de programaccedilatildeo precisam se adaptar e evoluirQuando uma linguagem de programaccedilatildeo atualiza softwares que eram antes consideradosatualizados podem se tornar rapidamente obsoletos E ao mesmo tempo que novascaracteriacutesticas satildeo adicionadas a linguagem precisa fornecer compatibilidade com versotildeesanteriores aumentando sua complexidade Desenvolvedores entatildeo encontram-se tambeacutemem um empasse buscando um equiliacutebrio entre manter a compatibilidade da ferramentacom versotildees anteriores da linguagem e atualizaacute-la para manter o software atualizado [9]

A estrateacutegia de refatoraccedilatildeo de coacutedigo pode ser uma opccedilatildeo que permite a linguageme o software co-evoluiacuterem com um menor grau de dificuldade [9] Refatoraccedilatildeo (do inglecircsrefactoring) eacute o processo de modificaccedilatildeo de um software com o objetivo de melhorar a es-trutura interna do mesmo sem alterar sua percepccedilatildeo externa Eacute uma maneira disciplinadade melhorar o design do coacutedigo apoacutes ele jaacute ter sido implementado Por exemplo dividiruma funcionalidade grande feita em apenas um bloco de coacutedigo em vaacuterios moacutedulos [15]

A refatoraccedilatildeo de coacutedigo pode ser um meio utilizado para evoluir o software adaptandoo coacutedigo com caracteriacutesticas novas introduzidas pela linguagem modificando o design dosistema sem comprometer sua integridade No entanto novos desafios surgem visto que

7

refatorar o coacutedigo fonte de um sistema de grande porte natildeo eacute uma tarefa faacutecil havendo anecessidade de ferramentas que possam automatizar o processo ou realizar um estudo paraentender como as novas caracteriacutesticas da linguagem podem ser utilizadas para substituirou melhorar funcionalidades obsoletas [9]

22 MSR Mineraccedilatildeo de dados e a Engenharia deSoftware

Com o objetivo de compreender prever e planejar os vaacuterios aspectos do desenvolvimentode um projeto em especial tudo que possa impactar na evoluccedilatildeo de software a teacutecnicade mineraccedilatildeo de dados tem sido bastante utilizada em engenharia de software [17]

O termo Mineraccedilatildeo de Repositoacuterios de Software (MSR) tem sido utilizado para descre-ver vaacuterias maneiras de se examinar repositoacuterios de software Um repositoacuterio de softwarepode ser considerado um artefato que eacute produzido e arquivado durante a evoluccedilatildeo desoftware [1] Estes responsoacuterios armazenam informaccedilotildees que podem fornecer todos osdetalhes de desenvolvimento do software provendo meios necessaacuterios para uma anaacuteliseaprofundada de evoluccedilatildeo de software

Repositoacuterios de software satildeo comumente utilizados para armazenar e acompanhar ohistoacuterico de desenvolvimento do software mas raramente usados para tomada de deci-sotildees em relaccedilatildeo ao projeto Assim pesquisadores de MSR buscam modificar a impressatildeode que tais repositoacuterios satildeo estaacuteticos que servem apenas para manutenccedilatildeo de registrostransformando-os em repositoacuterios ativos que podem auxiliar na tomada de decisatildeo em pro-jetos de software modernos atraveacutes da identificaccedilatildeo de padrotildees para realizar a propagaccedilatildeode mudanccedilas [18]

221 Classificaccedilatildeo

De acordo com Kagdi et al dentre as abordagens de MSR utilizadas atualmente eacute possiacuteveldescrevecirc-las para entatildeo comparaacute-las e possivelmente classificaacute-las levando em considera-ccedilatildeo uma taxonomia de quatro dimensotildees os repositoacuterios de software utilizados (fontes dedados) o propoacutesito do MSR a metodologia e a avaliaccedilatildeo da abordagem [1] como mostraa Figura 21 onde as taxonomias destacadas em amarelo satildeo as que prevaleceram poreacutemnatildeo exclusivamente na metodologia adotada por este trabalho

8

Figura 21 Taxonomia em camadas adaptada do trabalho de Kagdi et al [1]

Fontes de Dados

As fontes de informaccedilatildeo variam de acordo com a abordagem utilizada e dentre as informa-ccedilotildees mineradas em repositoacuterios de software inclui-se as seguintes categorias os artefatosde software e suas versotildees as diferenccedilas entre os artefatos de software e suas versotildees e osmetadados sobre as mudanccedilas no software

As fontes de dados podem ser melhor classificadas de acordo com Hassan et al [17]

bull Repositoacuterios de controle de Versatildeo estes repositoacuterios guardam o histoacuterico de desen-volvimento de um projeto armazenando todas as mudanccedilas no coacutedigo fonte assimcomo os metadados associados com cada mudanccedila Exemplos git SVN

bull Bug repositories Estes repositoacuterios rastreiam o histoacuterico de resoluccedilatildeo de bugs quesatildeo reportados por usuaacuterios e desenvolvedores Exemplos Bugzilla e Jira

9

bull Histoacuterico de Comunicaccedilatildeo (Archived communications) estes repositoacuterios rastreiamdiscussotildees sobre os vaacuterios aspectos de um projeto de software por sua vida uacutetil Porexemplo listas de e-mails

bull Deployment logs logs com informaccedilotildees do software gerados por ferramentas dedesenvolvimento

bull Repositoacuterios de software Repositoacuterios onde o coacutedigo fonte de vaacuterios projetos satildeoarmazenados como por exemplo Sourceforgenet

No contexto deste trabalho estes repositoacuterios consistem em fontes de coacutedigo armaze-nadas em sistemas de controle de versatildeo especificamente coacutedigos na plataforma Github

O propoacutesito

O propoacutesito da mineraccedilatildeo de repositoacuterios de software se resume nas perguntas de pes-quisa que podem ser respondidas utilizando mineraccedilatildeo Assim existem duas classes deperguntas de pesquisa para MSR [1]

A primeira eacute a pergunta de anaacutelise market-basket1 ldquoSe A acontece o que mais podeacontecerrdquo A resposta para este tipo de pergunta eacute um conjunto de regras descrevendotendecircncias de relacionamentos como por exemplo se A acontecer entatildeo B e C acontecemdurante um periacuteodo X

A segunda classe diz respeito agraves perguntas de prevalecircncia (Prevalence Questions -PQ) como por exemplo perguntas do tipo ldquoA funcionalidade Y foi modificadardquo quepossuem uma resposta booleana ou ldquoQuantas vezes esta funcionalidade Y foi modificadardquocontendo uma resposta quantitativa

As perguntas de pesquisa deste trabalho se encaixam majoritariamente na segundaclasse onde o objetivo traccedilado eacute respondido de forma quantitativa com algumas tentativasde classificaccedilatildeo de tipos de repositoacuterios como seraacute descrito nos capiacutetulos seguintes

A metodologia

A metodologia corresponde a maneira como as questotildees de MSR iratildeo ser respondidas evaacuterias abordagens estatildeo disponiacuteveis Poreacutem Kagdi indica duas estrateacutegias baacutesicas quepodem ser utilizadas

Primeiramente pode-se utilizar a mediccedilatildeo indireta e anaacutelise da evoluccedilatildeo do softwareEsta abordagem pode ser realizada da seguinte forma extrair e computar informaccedilotildeesde cada versatildeo de um software separadamente e em seguida individualmente comparar

1Anaacutelise Market-basket eacute uma teacutecnica de modelagem baseada na teoria de que se vocecirc comprar certostipos de produtos vocecirc haacute uma probabilidade maior (ou menor) de comprar outros tipos de produtos [19]

10

propriedades encontradas como por exemplo comparar duas versotildees distintas de umsoftware atraveacutes de um repositoacuterio github realizando uma investigaccedilatildeo de alto niacutevel noque diz respeito a evoluccedilatildeo do software [1]

A segunda perspectiva de metodologia que pode ser utilizada corresponde agrave mediccedilatildeodireta e anaacutelise da evoluccedilatildeo do software Ela diz respeito agraves investigaccedilotildees que estudamos mecanismos que leva um software a ser modificado de uma versatildeo para outra focandonas diferenccedilas especiacuteficas entre estas versotildees como por exemplo examinando mudanccedilasespeciacuteficas das classes arquivos funccedilotildees de cada parte do coacutedigo [1]

Assim eacute possiacutevel descrever explicitamente que este trabalho utiliza em sua maioriauma metodologia com mediccedilotildees diretas atraveacutes da anaacutelise estaacutetica de informaccedilotildees docoacutedigo fonte de diferente versotildees para analisar os diferentes padrotildees de desenvolvimentoem que expressotildees lambda (definidas no capiacutetulo seguinte) satildeo utilizadas

A Avaliaccedilatildeo

Por fim existem diversas formas para se avaliar o estudo realizado sempre levando emconsideraccedilatildeo a validade dos resultados obtidos Pode-se utilizar de meacutetricas para avaliar osdados considerando o quanto das informaccedilotildees obtidas satildeo relevantes Outra forma de seavaliar seria atraveacutes da utilizaccedilatildeo de modelos probabiliacutesticos seguindo uma abordagemde teoria da informaccedilatildeo Assim foram utilizadas determinadas meacutetricas quantitativaspara avaliar os resultados obtidos neste trabalho

23 Trabalhos Relacionados

Como ressaltado na introduccedilatildeo o foco deste trabalho encontra-se em utilizar teacutecnicas deMSR para caracterizar a adoccedilatildeo de expressotildees lambda em repositoacuterios Java Ao reali-zar um estudo sobre o estado da arte encontrou-se diversos trabalhos que utilizam deMSR para obter informaccedilotildees relevantes sobre repositoacuterios de software em diversos focose em especial trabalhos que investiguem repositoacuterios na linguagem Java Jaacute existemtambeacutem alguns trabalhos que apresentam ferramentas de refatoraccedilatildeo de coacutedigo para im-plementaccedilatildeo de expressotildees lambda com foco na evoluccedilatildeo do software Dentre os trabalhosencontrados mencionados destacam-se

bull Em um trabalho sobre utilizaccedilatildeo de refatoraccedilatildeo de coacutedigo para realizar a transiccedilatildeode coacutedigo Java para as novas caracteriacutesticas implementadas no Java 8 Gyori et alapresenta uma ferramenta que automatiza com sucesso o trabalho de conversatildeo decoacutedigo como Annonymous Inner Class para expressotildees lambda [12] O capiacutetulo aseguir descreve em detalhes estes conceitos

11

bull Regrowing a Language de Overbey apresenta um estudo sobre a importacircncia da co-evoluccedilatildeo entre a linguagem de programaccedilatildeo e os projetos de software focando naslinguagens Fortran e Java e provando como ferramentas de refatoraccedilatildeo de coacutedigoauxiliam para que o software consiga evoluir juntamente com sua linguagem deprogramaccedilatildeo [9]

bull O trabalho sobre a adoccedilatildeo de generics em coacutedigo Java feito por Parnin utiliza demineraccedilatildeo de dados para realizar uma investigaccedilatildeo empiacuterica avaliando projetos decoacutedigo aberto com o objetivo de observar como desenvolvedores destes projetos estatildeoutilizando generics em Java [20]

Os estudos mencionados focam em assuntos particulares pertinentes a este trabalhoem que de um lado tem-se trabalhos que mostram a necessidade de refatoraccedilatildeo de coacutedigopara evoluccedilatildeo de software e do outro tem-se trabalhos que mostram que eacute possiacutevel utilizarde MSR para entender melhor como a evoluccedilatildeo da linguagem de programaccedilatildeo Java temafetado projetos reais de coacutedigo aberto e como estes projetos estatildeo se adaptando a estasevoluccedilotildees

12

Capiacutetulo 3

Java SE 8 e JDK 8

Este trabalho tem como objetivo caracterizar a adoccedilatildeo de expressotildees Lambda em siste-mas Java que podem ser considerados legados pois foram concebidos em um momentoanterior a introduccedilatildeo dessa nova caracteriacutestica na linguagem Java Com o intuito de faci-litar o entendimento do leitor sobre tais construccedilotildees esse capiacutetulo apresenta informaccedilotildeeshistoacutericas referentes agrave linguagem Java desde sua criaccedilatildeo ateacute a sua ascensatildeo como umadas linguagens de programaccedilatildeo mais populares Aleacutem disso seratildeo apresentadas as novascaracteriacutesticas presentes na versatildeo Java SE 8 com destaque nas expressotildees Lambda e deque forma vieram para auxiliar no desenvolvimento de sistemas

31 Histoacuterico

Java eacute uma linguagem de programaccedilatildeo orientada a objetos para propoacutesitos gerais [21] Alinguagem nasceu com o nome de Oak no ano de 1991 com o foco em televisotildees digitais acabo mas devido agrave complexidade e poder da linguagem logo expandiu-se para os outrosdomiacutenios principalmente a Internet [22] Posteriormente a linguagem recebeu o nome deGreentalk devido agrave marca Oak jaacute ser registrada por outra empresa e o principal projeto daequipe se chamar Green Por fim o nome Java foi o mais votado pela equipe da Sun emuma reuniatildeo para decidir o mais raacutepido possiacutevel um nome definitivo para a linguagem [23]

Em 1995 em sua primeira versatildeo puacuteblica 10 a linguagem Java jaacute comeccedilava a terum crescimento em sua popularidade como Web Applet nos navegadores mais popularesfornecendo seguranccedila e rapidez nas plataformas mais utilizadas [24] A cada nova versatildeopublicada novas funcionalidades e plataformas eram adicionadas e tornavam a linguagemmais difundida no meio computacional fazendo com que em 2006 a linguagem fosse divi-dida em Java EE (foco em rede e serviccedilos web) Java ME (foco em sistemas embarcados)e Java SE (foco em desktops e servidores) [25]

13

Apoacutes anos de evoluccedilatildeo e aprimoramento atraveacutes de diversas versotildees como visto naTabela 31 hoje o Java se tornou uma das linguagens de programaccedilatildeo mais utilizadas nomundo estando em aproximadamente 15 das linhas de coacutedigo disponiacuteveis pela inter-net [11] A quantidade de plataformas suportadas pela linguagem e com o advento dosistema operacional Android sendo rodado na maior parte dos smartphones do mundoaleacutem da simplicidade em codificar no paradigma orientado a objetos foram os fatoresrelevantes para que a linguagem se popularizasse no mundo digital [26]

Tabela 31 As versotildees anteriores de java e principais caracteriacutesticasVersatildeo Principais caracteriacutesticasJava 10 JVM e JDKJava 2 Event Listeners

Kestrel (Java 3) HotSpot JVMMerlin (Java 4) Diversas novas APIs como Assertion e expressotildees regularesTiger (Java 5) Generics

Mustang (Java 6) Web ServicesDolphin (Java 7) Suporte a linguagens dinamicas

32 Princiacutepios

Com o foco em alcanccedilar a Web e participar mais ativamente do mercado virtual e e-Commerce foram projetados princiacutepios que permitissem com que a linguagem pudessealcanccedilar seus objetivos principais ao mesmo tempo que mantinha a facilidade e fami-liarizaccedilatildeo da linguagem a seus desenvolvedores [27] Dessa forma a equipe da Oracledeterminou cinco princiacutepios que caracterizariam o foco da linguagem Java

bull simples orientada a objeto e familiar projetada para ser orientada a objeto epermitir que seus desenvolvedores comecem a codificar rapidamente sem a necessi-dade de uma curva de aprendizagem acentuada

bull segura e robusta projetada para prover software confiaacutevel por meio de checagensa tempo de compilaccedilatildeo e execuccedilatildeo Haacute uma grande preocupaccedilatildeo com seguranccediladevido agrave larga utilizaccedilatildeo da linguagem em sistemas distribuiacutedos

bull de arquitetura neutra e portaacutevel projetada para ser independente de qualquerarquitetura bastando rodar a JVM dessa forma garantindo a portabilidade paravaacuterios ambientes e dispositivos

14

bull executada em alta performance projetada para fornecer a maior performancepossiacutevel em tempo de execuccedilatildeo com a utilizaccedilatildeo do garbage collector em uma threadde baixa prioridade

bull interpretada dinacircmica e threaded projetada para ser interpretada por qual-quer dispositivo que possua JVM desenvolvida garantindo um desenvolvimento raacute-pido e em ciclos O uso da classe Thread permite que a linguagem acompanhe atendecircncia do paralelismo Aleacutem disso a ligaccedilatildeo de classes eacute feita em tempo real esomente quando necessaacuteria tornando-a dinacircmica

33 Evoluccedilatildeo

A primeira versatildeo do Java 8 foi lanccedilada em 2014 [28] e apresentou diversas atualizaccedilotildeesespalhadas em categorias como linguagem seguranccedila Collections ferramentas deployentre outras Dentre a grande quantidade de mudanccedilas os destaques se encontraram nasnovas melhorias presentes na linguagem que afetaram de forma mais direta a maneiracom que os desenvolvedores passaram a tratar e organizar o coacutedigo fonte As atualizaccedilotildeesreferentes a linguagem descritas oficialmente pela Oracle [29] satildeo

1 Lambda Expressions ou apenas Expressotildees Lambda correspondem a uma novacaracteriacutestica que permite que uma pequena funcionalidade possa ser utilizada comoum argumento de um meacutetodo facilitando a escrita de accedilotildees que seratildeo feitas repetida-mente em uma Collection ou quando um processo se completa ou quando encontraum erro Eacute tambeacutem uma forma compacta de se escrever coacutedigo que previamenteera escrito com anonymous inner classes [29] A Listagem 31 mostra uma classehipoteacutetica Calculator cujo meacutetodo operateBinary() recebe como paracircmetro doisinteiros e um objeto da classe IntegerMath que representa a operaccedilatildeo que deveraacuteser realizada ou seja uma funcionalidade dinacircmica

1 pub l i c c l a s s Ca l cu la to r 2

3 i n t e r f a c e IntegerMath 4 i n t opera t i on ( i n t a i n t b) 5 6

7 pub l i c i n t operateBinary ( i n t a i n t b IntegerMath op ) 8 re turn op opera t i on (a b) 9

10

11 pub l i c s t a t i c void main ( St r ing a rgs ) 12

15

13 Calcu la to r myApp = new Ca lcu la to r ( ) 14 IntegerMath add i t i on = (a b) minusgt a + b 15 IntegerMath subt ra c t i on = (a b) minusgt a minus b 16 System out p r i n t l n ( 40 + 2 = +17 myApp operateBinary (40 2 add i t i on ) ) 18 System out p r i n t l n ( 20 minus 10 = +19 myApp operateBinary (20 10 sub t ra c t i on ) ) 20 21 22

Listagem 31 Exemplo de coacutedigo com o uso de Expressatildeo Lambda [30]

2 Method References Frequentemente expressotildees lambda criam meacutetodos anocircni-mos Algumas vezes poreacutem satildeo utilizadas para chamar um meacutetodo jaacute existentena classe Ao inveacutes de escrever a expressatildeo Lambda para esse caso pode-se optarpor utilizar um Method Reference que facilita a escrita e leitura desse uso de ex-pressatildeo Lambda [29] A Listagem 32 mostra um exemplo de um meacutetodo estaacuteticoque compara duas pessoas pelas suas idades e a Listagem 33 a utilizaccedilatildeo de MethodReference para aplicar a utilizaccedilatildeo desse meacutetodo em um array e reduzir a escrita deuma expressatildeo lambda a uma forma mais legiacutevel

1 pub l i c s t a t i c i n t compareByAge ( Person a Person b) 2 re turn a b i r thday compareTo (b b i r thday ) 3 4

Listagem 32 Exemplo de meacutetodo de uma classe Pessoa [31]

1 Arrays s o r t ( rosterAsArray Person compareByAge ) 2

Listagem 33 Exemplo de uso de Method Reference [31]

3 Default Methods satildeo meacutetodos com a palavra-chave default que servem para adi-cionar implementaccedilotildees de meacutetodos a uma interface de alguma biblioteca mantendoa compatibilidade binaacuteria com versotildees mais antigas dessa interface Tambeacutem pos-sibilita a implementaccedilatildeo de meacutetodos estaacuteticos em interfaces [29] A Listagem 34apresenta a inclusatildeo de um meacutetodo default na interface TimeClient

1 pub l i c i n t e r f a c e TimeClient 2 void setTime ( i n t hour i n t minute i n t second ) 3 void setDate ( i n t day i n t month i n t year ) 4 void setDateAndTime ( i n t day i n t month i n t year 5 i n t hour i n t minute i n t second )

16

6 LocalDateTime getLocalDateTime ( ) 7

8 s t a t i c ZoneId getZoneId ( S t r ing zoneStr ing ) 9 t ry

10 re turn ZoneId o f ( zoneStr ing ) 11 catch ( DateTimeException e ) 12 System e r r p r i n t l n ( I n v a l i d time zone + zoneStr ing

+13 us ing d e f a u l t time zone in s t ead ) 14 re turn ZoneId systemDefault ( ) 15 16 17

18 d e f a u l t ZonedDateTime getZonedDateTime ( St r ing zoneStr ing ) 19 re turn ZonedDateTime o f ( getLocalDateTime ( ) getZoneId (

zoneStr ing ) ) 20 21 22

Listagem 34 Exemplo de interface com um meacutetodo default [32]

4 Repeating Annotations permitem a implementaccedilatildeo e utilizaccedilatildeo de anotaccedilotildees deum mesmo tipo que podem ser utilizadas mais de uma vez para a mesma declara-ccedilatildeo [29] A Listagem 35 apresenta duas anotaccedilotildees iguais com paracircmetros diferentespermitindo uma customizaccedilatildeo maior na aplicaccedilatildeo de um tipo de anotaccedilatildeo

1 Schedule ( dayOfMonth= l a s t )2 Schedule (dayOfWeek= Fr i hour= 23 )3 pub l i c void doPeriodicCleanup ( ) 4

Listagem 35 Exemplo de Repeating Annotations [33]

5 Type Annotations permitem que anotaccedilotildees possam ser utilizadas em tipos aleacutemde declaraccedilotildees dessa forma pode-se garantir que um campo sempre atenda agraves suasexpectativas e evite testes desnecessaacuterios [29] A Listagem 36 mostra um exemplo derestriccedilatildeo a uma String que nunca poderaacute ser nula devido agrave anotaccedilatildeo de NonNull

1 NonNull S t r ing s t r

Listagem 36 Exemplo de Type Annotation garantindo que o campo nunca seja null [34]

17

34 Expressotildees Lambda

Uma das mudanccedilas mais interessantes implementadas no Java 8 foi a adiccedilatildeo de expressotildeeslambda As expressotildees lambda permitem que a linguagem Java possa atuar parcialmentecomo uma linguagem de programaccedilatildeo funcional onde comportamentos satildeo avaliados eaplicados diferentemente da programaccedilatildeo imperativa que foca na mudanccedila de estadosNa praacutetica um comportamento pode ser passado como paracircmetro de um meacutetodo atraveacutesde uma escrita mais reduzida e legiacutevel Os benefiacutecios de utilizar expressotildees lambda incluemuma melhora na legibilidade e organizaccedilatildeo de coacutedigo que antes era escrito com AnonymousInner Class aleacutem de permitir uma forma simples de utilizar comportamento paralelo como uso de Streams

341 Sintaxe

A sintaxe de uma expressatildeo lambda eacute dividida nas seguintes partes [30]

bull Uma lista de paracircmetros separados por viacutergulas

bull Um token representado por uma seta -gt

bull Um corpo que pode ser representado por uma expressatildeo uacutenica ou um bloco de coacutedigodentro de chaves

As Listagens 37 e 38 mostram duas formas diferentes de se aplicar expressotildees Lambdacom uma sintaxe similar A primeira aplica a expressatildeo diretamente apoacutes a seta utilizadanormalmente para trechos de coacutedigo pequenos e simples e a segunda utiliza-se de chavespara incorporar o coacutedigo e da palavra-chave return para especificar o retorno forma maisutilizada para uma quantidade maior de coacutedigo

1 p minusgt p getGender ( ) == Person Sex MALE2 ampamp p getAge ( ) gt= 183 ampamp p getAge ( ) lt= 25

Listagem 37 Exemplo de expressatildeo lambda com uma expressatildeo [30]

1 p minusgt 2 re turn p getGender ( ) == Person Sex MALE3 ampamp p getAge ( ) gt= 184 ampamp p getAge ( ) lt= 25 5

Listagem 38 Exemplo de expressatildeo lambda com um bloco de coacutedigo [30]

18

342 Principais formas de uso

Anonymous Inner Class

Antes do Java 8 a necessidade de passar funccedilotildees ou expressotildees como paracircmetro de algummeacutetodo era suprida atraveacutes de Anonymous Inner Classes A utilizaccedilatildeo desse tipo dedeclaraccedilatildeo junto com a anotaccedilatildeo de Override permite sobrescrever um meacutetodo de umainterface funcional e ao mesmo tempo passa-la como argumento para um meacutetodo Umaexpressatildeo lambda se comporta da mesma forma poreacutem a quantidade de coacutedigo escritopela Anonymous Inner Class eacute maior e pode dificultar a leitura de coacutedigo pois conteacutemmuita informaccedilatildeo natildeo utilizada para efetivo entendimento do que estaacute sendo feito naqueletrecho

A Listagem 39 apresenta a instanciaccedilatildeo da classe EventHandler internamente ao meacute-todo setOnAction() de forma que o desenvolvedor possa escrever o comportamento quedeseja passar como paracircmetro do meacutetodo atraveacutes da substituiccedilatildeo do meacutetodo handle()que jaacute existe pelo meacutetodo handle() criado e escrito pelo desenvolvedor

1 btn setOnAction (new EventHandlerltActionEvent gt() 2 Override3 pub l i c void handle ( ActionEvent event ) 4 System out p r i n t l n ( He l lo World ) 5 6 )

Listagem 39 Exemplo de uso de Anonymous Inner Class [35]

Interface funcional

Ao projetar um coacutedigo novo o desenvolvedor que optar por utilizar expressotildees lambdadeve iniciar com a criaccedilatildeo de uma interface funcional Esse tipo de interface possui umuacutenico meacutetodo abstrato permitindo que expressotildees lambda sejam usadas para sobrescrevero comportamento do meacutetodo abstrato Uma interface funcional pode possuir outros meacuteto-dos desde que sejam default Uma nova anotaccedilatildeo FunctionalInterface foi adicionadacom a atualizaccedilatildeo do Java 8 para conferir em tempo de compilaccedilatildeo se a interface satisfazos requisitos desse modelo de interface

A Listagem 310 apresenta um exemplo de interface funcional com o objetivo de permi-tir o uso de expressotildees lambda que utilizaratildeo de dois Double como paracircmetro e jaacute utilizada nova anotaccedilatildeo FunctionalInterface introduzida no Java 8

1 Funct iona l Inte r face2 pub l i c i n t e r f a c e DoubleOp 3 pub l i c Double apply ( Double a Double b)

19

4

Listagem 310 Exemplo de interface funcional

Dessa forma conforme as Listagens 311 e 312 o meacutetodo apply() pode tomar formade qualquer operaccedilatildeo entre dois Double que seraacute especificada quando a expressatildeo lambdafor montada dando o aspecto de linguagem funcional agrave linguagem e mais facilidade eliberdade ao desenvolvedor

1 pub l i c c l a s s Ca l cu la to r 2 pub l i c s t a t i c Double c a l c ( Double op1 Double op2 DoubleOp operator ) 3 re turn operator apply ( op1 op2 ) 4 5

Listagem 311 Exemplo de aplicaccedilatildeo da interface funcional

1 Double r e s u l t 1 = Ca lcu la to r c a l c (10d 50d ( a b ) minusgt a + b)

Listagem 312 Uso de expressatildeo lambda para o exemplo anterior

Collections

Dentre as atualizaccedilotildees de pacotes do Java 8 foi adicionado um meacutetodo stream() nainterface Collection Esse meacutetodo trata as Collection como streams o que significa queapesar de natildeo ser possiacutevel acessar elementos diretamente algumas novas manipulaccedilotildeessatildeo possiacuteveis Essas manipulaccedilotildees satildeo na verdade meacutetodos da interface Stream quepodem receber como paracircmetro uma expressatildeo lambda ou seja um comportamento a seraplicado agrave Collection Dentre os meacutetodos temos

bull filter() O meacutetodo filter() recebe uma expressatildeo lambda contendo uma condiccedilatildeopara filtragem da collection

bull map() O meacutetodo map() mapeia os elementos de uma Collection em outro objetocomo uma String A expressatildeo lambda passada por paracircmetro deve retornar o tipode objeto ao qual seraacute mapeado

bull forEach() O meacutetodo forEach() aplica uma operaccedilatildeo especiacutefica para cada ele-mento da Collection A expressatildeo lambda a ser passada deve conter a operaccedilatildeo aser realizada

bull min() e max() Os meacutetodos min() e max() retornam o elemento menor ou maiorda Collection dependendo da expressatildeo lambda passada como paracircmetro

20

A Listagem 313 demonstra como vaacuterias operaccedilotildees com uma Collection podem seraplicadas de uma vez de forma que lendo a expressatildeo lambda jaacute eacute possiacutevel saber oresultado da aplicaccedilatildeo do meacutetodo agrave Collection

1 r o s t e r2 stream ( )3 f i l t e r (4 p minusgt p getGender ( ) == Person Sex MALE5 ampamp p getAge ( ) gt= 186 ampamp p getAge ( ) lt= 25)7 map(p minusgt p getEmailAddress ( ) )8 forEach ( emai l minusgt System out p r i n t l n ( emai l ) )

Listagem 313 Exemplo de utilizaccedilatildeo de meacutetodos de stream com expressotildees lambda [30]

21

Capiacutetulo 4

Estudo e o Processo de Mineraccedilatildeo

A definiccedilatildeo da metodologia utilizada para realizaccedilatildeo deste trabalho eacute importante para queexista uma padronizaccedilatildeo e melhor entendimento de como os resultados foram obtidos paraque a replicaccedilatildeo do mesmo possa ser realizada em trabalhos futuros [36]

Figura 41 Processo utilizado para realizaccedilatildeo do estudo

O esquema representado na Figura 41 descreve o processo seguido para a realizaccedilatildeodeste trabalho que foi divido em trecircs grandes etapas a de planejamento definindo osobjetivos questotildees de pesquisa e meios de investigaccedilatildeo deste projeto a etapa de execuccedilatildeorealizando todo o procedimento metodoloacutegico definido para a coleta e refinamento de

22

dados e a etapa de avaliaccedilatildeo onde foram classificados e avaliados os dados coletadospara responder agraves questotildees de pesquisa

A seguir na primeira seccedilatildeo seratildeo apresentadas em detalhes as questotildees de pesquisa aserem respondidas Em seguida seraacute feito uma breve descriccedilatildeo da fonte de dados utilizada- especificamente os projetos utilizados como objetos de estudo deste trabalho e por fimtodo o restante da metodologia que foi de fato desenvolvida para obter os resultadosnecessaacuterios

41 Questotildees de Pesquisa

Com o objetivo de entender e caracterizar melhor o uso de expressotildees lambda foramdefinidas as seguintes questotildees de pesquisa a serem respondidas

bull PQ-1 Quando os projetos comeccedilaram a introduzir o uso de expressotildees lambda emseus coacutedigos e qual a meacutedia de expressotildees lambda por snapshots caso existam

bull PQ-2 Como as equipes de desenvolvimento estatildeo utilizando expressotildees lambdaatraveacutes de refatoraccedilatildeo de coacutedigo ou introduzindo apenas em coacutedigo novo

bull PQ-3 Quais satildeo os padrotildees tipicamente adotados para o uso de expressotildees lambda

A primeira pergunta de pesquisa gira em torno de como projetos populares open-sourceestatildeo se adaptando agrave introduccedilatildeo de expressotildees lambda em Java muitos projetos jaacute estatildeoutilizando as expressotildees lambda Se sim a partir de quando comeccedilaram a utilizaacute-lasdesde o iniacutecio da introduccedilatildeo das mesmas no Java 8 ou em um periacuteodo mais tardio Aleacutemdisso eacute interessante descobrir se a utilizaccedilatildeo dessa nova caracteriacutestica tem acontecido deforma expressiva ou natildeo

Em seguida para melhor entender a forma como as expressotildees lambda estatildeo sendointroduzidas em projetos eacute interessante investigar se as equipes de desenvolvimento estatildeose preocupando em refatorar coacutedigo com o objetivo de evoluir o software ou se estatildeoexperimentando utilizar expressotildees lambda apenas em coacutedigo novo introduzido

Como a introduccedilatildeo de novas funcionalidades em projetos open-source de grande escaladepende do objetivo do projeto e os padrotildees de projeto utilizados [37] espera-se obser-var diversas abordagens quanto a utilizaccedilatildeo de expressotildees lambda para entatildeo poderclassificar estes softwares quanto a abordagem utilizada

Eacute de grande importacircncia para este estudo conseguir identificar na praacutetica comoexpressotildees lambda estatildeo sendo tipicamente adotadas nestes projetos Assim a terceirapergunta de pesquisa busca identificar alguns exemplos de utilizaccedilatildeo atraveacutes da realizaccedilatildeode alguns estudos de caso

23

Eacute importante ressaltar que apesar de as expressotildees lambda serem uma alternativa aouso de AIC elas natildeo os substituem completamente Existem precondiccedilotildees para que umaAIC possa ser substituiacuteda por expressotildees lambda [12] descritas a seguir

bull AIC deve instanciar-se de uma interface

bull AIC natildeo deve possuir nenhum campo e declarar apenas um meacutetodo

bull AIC natildeo deve possuir uma referecircncia para this ou super

bull AIC natildeo deve declarar um meacutetodo recursivo

Para responder agrave primeira pergunta apenas dados gerais sobre todos os projetos seratildeonecessaacuterios ao passo que pelas perguntas 2 e 3 possuiacuterem uma natureza mais complexaseraacute necessaacuterio aleacutem de uma anaacutelise geral estatiacutestica a realizaccedilatildeo de alguns estudos decaso para obter resultados mais completos

42 Fonte de Dados e Objetos de Estudo

Para responder agraves perguntas de pesquisa estabelecidas foram selecionados os 99 projetosmais populares na linguagem Java dentro da plataforma github ateacute a data da coleta dosdados feita em Abril de 2017 Satildeo considerados populares os repositoacuterios que possuema maior quantidade possiacutevel de estrelas (stars) A decisatildeo de escolher os 99 projetos maispopulares foi por sua natureza imparcial e ao mesmo tempo para que se possa analisarprojetos que satildeo de familiaridade e conhecimento da comunidade do github e de domiacuteniopuacuteblico Os 99 projetos estatildeo listados no Anexo I

Para entender a transiccedilatildeo feita por esses projetos entre as versotildees anteriores do Java eo Java 8 com as expressotildees lambda eacute necessaacuterio analisar o coacutedigo de vaacuterias versotildees a fimde observar alguma mudanccedila para cada projeto Como satildeo 99 projetos e vaacuterios dessesprojetos possuem milhares de linhas de coacutedigo e commits seria impossiacutevel avaliar todosos commits Optou-se entatildeo por coletar snapshots mensais de cada projeto conformeprocedimento tambeacutem seguido anteriormente [38] Cada snapshots representa o estadodo projeto em um determinado mecircs e como criteacuterio de escolha padratildeo todos os snapshotsequivalem ao uacuteltimo commit realizado no determinado mecircs que este representa

O proacuteximo passo eacute determinar o periacuteodo de tempo em que esses snapshots seriamcoletados Como Java 8 (e consequentemente as expressotildees lambda) foi introduzidoapenas em meados de 2014 [28] coletar dados de projetos a partir de um periacuteodo muitoantes deste ano natildeo agregaria valor ao estudo em questatildeo Definiu-se entatildeo um periacuteodopara a coleta mensal desses snapshots atraveacutes dos anos Janeiro de 2013 um ano antesda introduccedilatildeo do Java 8 para que se pudesse identificar para todos os projetos o mecircs

24

exato em que expressotildees lambda foram introduzidas ateacute o mecircs da coleta de dados Abrilde 2017

Eacute importante ressaltar que a definiccedilatildeo dos meses foi definida do dia primeiro de ummecircs ao dia primeiro do proacuteximo mecircs e por consequecircncia alguns snapshots que deveriamrepresentar o final de determinado mecircs correspondem na verdade a commits realizadosno dia primeiro do mecircs seguinte Por exemplo pode existir casos em que o commit querepresente o mecircs de Marccedilo de 2016 seja na verdade o commit realizado no dia primeirode Abril de 2016 Isso se deve a natureza da forma como os resultados de log de commitssatildeo obtidos pelo git [39] Poreacutem isso natildeo interfere nas anaacutelises ou no propoacutesito destetrabalho uma vez que foram realizadas verificaccedilotildees e validaccedilotildees para que natildeo existamdatas repetidas (e consequentemente commits repetidos) por repositoacuterio

Neste trabalho o termo projeto e repositoacuterio foram utilizados de forma intercaladapara representar a mesma coisa o software desenvolvido que possui um repositoacuterio naplataforma github Os termos commit snapshops e versotildees tambeacutem representam a mesmacoisa uma vez que foi definido que seriam utilizados apenas um commit por mecircs pararepresentar um determinado snapshot ou versatildeo do repositoacuterio em questatildeo

Todos os 99 projetos seratildeo utilizados para a realizaccedilatildeo de uma anaacutelise geral de ca-racterizaccedilatildeo do uso de expressotildees lambda Para as anaacutelises aprofundadas foi feito umcriteacuterio de classificaccedilatildeo para que apenas alguns projetos possam ser analisados em niacutevelde coacutedigo como estudos de caso

Resumindo foram escolhidos os 99 projetos mais populares de Java no github cole-tando dados mensais de seus commits a partir do ano de 2013 ateacute a data da coleta dosdados lembrando que nem todos os projetos existem desde 2013 (projetos mais recentes)

43 Processo de Mineraccedilatildeo

A abordagem utilizada para coletar e analisar os 99 projetos escolhidos como mostra aFigura 42 foi realizada de forma automatizada utilizando scripts python e dois projetosdesenvolvidos em Java para a coleta e tratamento de dados como descrito a seguir

Primeiramente foi realizado uma coacutepia dos repositoacuterios atuais de todos os 99 projetosmais populares do github em Java Para automatizar o processo foi desenvolvido umscript em python que lista todos os projetos escolhidos clona todos os repositoacuterios emuma pasta na maacutequina local e cria um arquivo temporaacuterio com as informaccedilotildees do nomede cada repositoacuterio e seu caminho absoluto na maacutequina local

25

Figura 42 Metodologia implementada para coleta e tratamento de dados

Em seguida foi necessaacuterio realizar o checkout de todas as versotildees entre Janeiro de2013 a Abril de 2017 de cada projeto Por motivos de otimizaccedilatildeo de espaccedilo da maacutequinalocal e automatizaccedilatildeo no processo de checkout utilizou-se de um segundo script pythonque realizava as seguintes tarefas para cada mecircs em cada projeto verificar se dentreo mecircs estipulado houve algum commit para aquele projeto se sim pega-se o hash douacuteltimo commit do mecircs realiza o checkout conta-se a quantidade de linhas de coacutedigo emJava que o projeto tem utilizando a biblioteca cloc e armazena todas as informaccedilotildeespertinentes referentes a todos os projetos que naquele mecircs tiveram commits para que oprojeto static-analysis possa entatildeo ser executado sobre esses projetos naquele determinadomomento As informaccedilotildees coletadas que satildeo utilizadas pelo static-analysis correspondemao nome do projeto o hash do commit para aquela versatildeo a pasta onde o projeto estaacutearmazenado na maacutequina local a quantidade de linhas de coacutedigo Java do projeto e datareferente ao commit Essas informaccedilotildees satildeo pertinentes para que o projeto static-analysisconsiga funcionar de forma correta projeto este descrito em detalhes a seguir

431 static-analysis

O static-analysis foi um projeto desenvolvido anteriormente a este trabalho pelos alunosThiago Cavalcanti e Vinicius de Almeida cujo objetivo eacute realizar a anaacutelise estaacutetica de

26

coacutedigos-fonte Java e gerar arquivos de saiacuteda contendo informaccedilotildees de classes e meacutetodoscom suas devidas ocorrecircncias de caracteriacutesticas da linguagem [40]

A anaacutelise estaacutetica de coacutedigo consiste em analisar um coacutedigo-fonte sem a necessidadede executaacute-lo Esse tipo de anaacutelise eacute de extrema importacircncia para manter um coacutedigo dequalidade evitar futuras refatoraccedilotildees e obter informaccedilotildees estatiacutesticas de forma raacutepida epraacutetica [41]

Seguindo esse princiacutepio o static-analysis foi projetado para receber um arquivo deentrada csv seguindo o padratildeo

Tipo da Aplicaccedilatildeo Inicio do projeto Antes ou Apoacutes Java 5 Nome do ProjetoVersatildeo Caminho absolutoQuantidade de linhas de coacutedigo

Atraveacutes da informaccedilatildeo do caminho absoluto do projeto o static-analysis varre osdiretoacuterios em busca dos arquivos fonte java realiza o parse desses arquivos e utilizade Visitors para extrair as informaccedilotildees desejadas e exporta-las em arquivos csv Ouso de Visitors permite que sejam escolhidas as informaccedilotildees desejadas para a consultacomo expressotildees Lambda e AIC s aleacutem de possibilitar que sejam implementados novosVisitors conforme a linguagem evolua ou as necessidades mudem

Para este trabalho foram utilizados os Visitors de expressotildees Lambda map() filter()AICs e declaraccedilotildees de meacutetodos

432 BDAnalisador

Apoacutes obter todas as informaccedilotildees necessaacuterias geradas pelo static-analysis era preciso ma-nipular os dados de forma que facilitasse a coleta de dados para o estudo proposto Comovaacuterios arquivos em formato csv satildeo de difiacutecil manipulaccedilatildeo foi desenvolvido entatildeo umaferramenta chamada BDAnalisador Esta ferramenta eacute responsaacutevel por processar os arqui-vos em csv gerados pelo static-analysis e popular uma base de dados relacional MySQLcom as informaccedilotildees pertinentes a este estudo

O BDAnalisador foi desenvolvido com a intenccedilatildeo de tornar mais simples o trabalhocom os dados resultantes do static-analysis de forma que consultas em SQL pudessemser feitas a ponto de permitir a obtenccedilatildeo de resultados mais complexos Seguindo esseobjetivo o framework Hibernate foi escolhido como ferramenta para persistecircncia devidoa ser um framework jaacute consolidado no mercado e que de forma simples relaciona osobjetos Java ao banco de dados MySQL [42] A divisatildeo de classes foi projetada em quatroentidades Projeto Versao Classe e Metodo cada uma com seus respectivos camposcontendo as informaccedilotildees necessaacuterias para a pesquisa como pode ser visto na Figura 44Eacute importante ressaltar que a tabela de Versao guarda hashs de commits devido agrave escolhade utilizar commits para obter mais informaccedilatildeo de evoluccedilatildeo de coacutedigo em um menor

27

espaccedilo de tempo Aleacutem disso para este trabalho optou-se por persistir todos os meacutetodose classes de cada versatildeo sem se importar com a repeticcedilatildeo desses dados pois a hipoacutetesede haver grandes refatoraccedilotildees entre versotildees poderia comprometer a confiabilidade dasinformaccedilotildees

Figura 43 Diagrama de classes UML do BDAnalisador

Como visto na Figura 43 seguindo parcialmente a arquitetura MVC cada entidadepossui sua respectiva classe DAO(Data Access Object) para persistecircncia dos dados eapenas uma classe Controlador no projeto responsaacutevel pela manipulaccedilatildeo e parse dosdados dos arquivos csv gerados pelo static analysis para serem enviados agraves classes DAOO sistema inicia chamando o meacutetodo inicializar() da classe Controlador Esse meacutetodoeacute responsaacutevel por ler um arquivo de entrada csv que segue o mesmo modelo do arquivo dostatic-analysis citado na seccedilatildeo anterior O arquivo conteacutem os dados de todos os projetose suas respectivas versotildees dessa forma o meacutetodo instancia um objeto da classe Projetoe persiste o projeto no banco de dados Para cada versatildeo encontrada no arquivo deentrada o inicializar() aciona os meacutetodos responsaacuteveis por instanciar e preencher aslistas da classe Classe e Metodo Os meacutetodos responsaacuteveis por preencher as listas varremos arquivos csv gerados pelo static-analysis e fazem o parse das informaccedilotildees relevantescomo nomes dos meacutetodos e quantidades de lambdas para construir os objetos que seratildeogravados Ao final dos preenchimentos o objeto Versatildeo eacute instanciado e gravado no bancode dados atraveacutes de sua classe DAO ao mesmo tempo que grava suas respectivas Classese Metodos

28

Apoacutes vaacuterios testes e correccedilotildees de bugs o banco de dados se encontrava finalmente comas informaccedilotildees de 99 projetos Java open-source separados por um commit por mecircs desde2013 cada um com suas respectivas informaccedilotildees de classes meacutetodos e a quantidade deexpressotildees lambda filters e maps em cada meacutetodo Filter ou Filter pattern eacute o padratildeode projeto que tem como objetivo filtrar objetos de uma coleccedilatildeo (Collection) de acordocom algum criteacuterio Jaacute o map ou map pattern eacute um padratildeo que ldquomapeia os elementosde uma coleccedilatildeo aplicando uma funccedilatildeo a eles para uma nova coleccedilatildeo [43] A coleta deinformaccedilotildees sobre esses padrotildees podem ser uacuteteis para possiacuteveis anaacutelises de oportunidadesde uso de expressotildees lambda para refatoraccedilatildeo de coacutedigo

A Figura 44 mostra o esquema de como o banco de dados resultante foi gerado

Figura 44 Modelo relacional do banco de dados populado pelo BDAnalisador Imagemgerada com software DBeaver [2]

44 Classificaccedilatildeo e Anaacutelise

Com o banco de dados populado restam apenas as etapas de classificaccedilatildeo e anaacutelise pararesponder as questotildees de pesquisa propostas Para isso inicialmente houve uma tentativade se utilizar apenas queries SQL para analisar os dados de acordo com as informaccedilotildeesrelevantes Poreacutem devido ao fato de o banco de dados conter todas as informaccedilotildees detodos os projetos e todas as suas versotildees queries que possuem uma alta complexidadedemoravam muito tempo para retornar os dados

Assim com o objetivo de facilitar o trabalho alguns scripts python foram desenvolvi-dos para rodar as queries separadamente e individualmente para cada projeto de formaautomatizada a fim de melhorar o tempo de resposta para obtenccedilatildeo dos resultados

29

441 Meacutedia de Lambda

O primeiro script retorna a quantidade de expressotildees lambda (ou AICs) por n snapshotsque contenha expressotildees lambda O objetivo eacute ter uma visatildeo geral da meacutedia de expressotildeeslambda e AICs utilizadas por cada projeto e como nem todos os snapshots coletados decada projeto possuem expressotildees lambda e AICs apenas aqueles com alguma expressatildeolambda ou AIC satildeo incluiacutedos no caacutelculo da meacutedia

Mmedia =sumn qtdLambdai

n

442 Anaacutelise Temporal

O segundo script retorna para cada projeto a soma total da quantidade de expressotildeeslambda AIC map() e filter() no projeto inteiro para cada versatildeo Ou seja tem-seo total de cada uma das quatro propriedades selecionadas para cada mecircs do projetoobtendo assim uma visatildeo temporal de evoluccedilatildeo do uso das caracteriacutesticas descritas ATabela 41 ilustra parcialmente o resultado obtido para o projeto agera onde idVersaoeacute o identificador no banco de dados referente ao hash do commit mensal coletado qtd eacutea quantidade de cada uma das caracteriacutesticas escolhidas e a data do commit encontra-seno formato americano

Tabela 41 Informaccedilotildees mensais sobre o projeto ageraidVersao Data do Commit qtd lambda qtd AIC qtd maps qtd filter

823 512016 0 29 4 0755 612016 13 28 4 0686 6152016 13 29 4 0621 812016 13 29 4 0555 8162016 13 30 4 0485 922016 13 30 4 0422 10132016 14 30 4 0356 11282016 14 30 4 0295 12212016 21 30 5 0232 212017 21 30 5 0175 312017 21 30 5 0112 3312017 21 36 5 048 4242017 21 48 5 0

Os resultados obtidos com esta anaacutelise temporal permitiu a identificaccedilatildeo de padrotildees nautilizaccedilatildeo de expressotildees lambda em relaccedilatildeo a utilizaccedilatildeo de AIC por todos os projetos Foi

30

possiacutevel classificar todos os projetos em 6 grupos ilustrado na Figura 45 Primeiramenteseparou-se os projetos entre os que possuem expressotildees lambda e os que natildeo possuemDentre os que possuem identificou-se cinco categorias

1 Grupo 1 Quantidade de AICs e expressotildees lambda aumentam com o tempo pro-porcionalmente

2 Grupo 2 Quantidade de AICs diminui agrave medida que a quantidade de expressotildeeslambda aumentam e a quantidade de expressotildees lambda ultrapassa a quantidade deAIC em um determinado momento

3 Grupo 3 Quantidade de AICs diminui agrave medida que a quantidade de expressotildeeslambda aumentam mas a quantidade de AIC permanece superior agrave quantidade delambda

4 Grupo 4 Expressotildees lambda satildeo introduzidas e existem por um pequeno periacuteodode tempo mas satildeo completamente removidas posteriormente

5 Grupo 5 Quantidade de expressotildees lambda eacute constante e muito inferior compa-rado com a quantidade de AICs no projeto Foi determinado que para pertencera esta classificaccedilatildeo o projeto precisa ter uma razatildeo de meacutedia de expressotildees lamb-dasnapshot por meacutedia de AICsnapshot inferior a 020 Esse paracircmetro foi esta-belecido com o objetivo de definir um padratildeo para o que pode ser considerado umprojeto com poucas expressotildees lambda

Figura 45 Classificaccedilatildeo dos projetos

31

443 Refatoraccedilatildeo de Coacutedigo

O uacuteltimo script teve como objetivo realizar uma tentativa inicial de identificar refatoraccedilatildeode coacutedigo da seguinte maneira para todos os projetos que possuem expressotildees lambdaforam identificados o mecircs imediatamente antes da introduccedilatildeo de expressotildees lambda e omecircs seguinte onde houve a primeira ocorrecircncia de lambda no projeto Assim realizou-se uma anaacutelise do tamanho em quantidade de linhas de coacutedigo de todos os meacutetodosdo projeto que no mecircs seguinte tiveram introduccedilatildeo de lambda Em seguida fez-se umacomparaccedilatildeo com os mesmos meacutetodos em relaccedilatildeo ao mecircs anterior e assim foi possiacuteveldetectar quais meacutetodos tiveram a quantidade de linhas de coacutedigo reduzidas o que seriaum indicativo natildeo necessariamente exclusivo de que uma refatoraccedilatildeo de coacutedigo possa terocorrido

Sabe-se que este meacutetodo de detecccedilatildeo de refatoraccedilatildeo de coacutedigo possui suas limitaccedilotildeesuma vez que as comparaccedilotildees para saber se um meacutetodo existe em ambas versotildees eacute feitopuramente por comparaccedilatildeo de String (nome do meacutetodo) e a classe que este pertence

444 Casos de Uso

Os meacutetodos descritos acima ajudaram a identificar alguns padrotildees e facilitar a anaacutelise dosdados Poreacutem natildeo satildeo suficientes para que se possa responder agraves questotildees de pesquisaDessa forma apoacutes a identificaccedilatildeo dos grupos de classificaccedilatildeo para os projetos foramescolhidos um projeto de cada grupo (com exceccedilatildeo do grupo dos projetos sem expressotildeeslambda) para realizar um breve estudo de caso com o objetivo de identificar e caracterizarmelhor a adoccedilatildeo de expressotildees lambda Os projetos escolhidos foram agera vertxAndroid-CleanArchitecture RxJava e guava

32

Capiacutetulo 5

Resultados Obtidos e Anaacutelise

Neste capiacutetulo seratildeo apresentados os dados obtidos e anaacutelise com o objetivo de responderagraves questotildees de pesquisa propostas Como mencionado anteriormente as perguntas seratildeorespondidas de duas maneiras algumas com informaccedilotildees gerais sobre todos os projetose outras com breve estudos de caso envolvendo cinco projetos

51 Visatildeo Geral

Dentre os repositoacuterios coletados para a anaacutelise 74 (7474) natildeo utilizaram nenhumaexpressatildeo lambda no projeto durante todo o periacuteodo analisado (Janeiro de 2013 a Abrilde 2017) restando apenas 25 repositoacuterios (2525) com expressotildees lambda Eacute interessantedestacar que apesar de a quantidade de repositoacuterios que natildeo possuem expressotildees lambdaser relativamente expressiva muitos destes repositoacuterios satildeo de projetos em Java que umdia foram populares e atualmente natildeo estatildeo sendo mais desenvolvidos (por exemplo umaplicativo que soacute funciona para Android 23 atualmente descontinuado)

Levando em consideraccedilatildeo apenas os projetos que possuem expressotildees lambda exis-tem dois tipos de dados que podem ser analisados para responder agrave primeira questatildeo depesquisa atraveacutes dos dados obtidos pelo meacutetodo anteriormente mencionado como anaacutelisetemporal e a meacutedia de lambda por snapshot mencionados no capiacutetulo anterior

Com relaccedilatildeo ao ano em que a primeira ocorrecircncia foi encontrada 6 projetos introduzi-ram expressotildees lambda jaacute em 2014 8 comeccedilaram a utilizar em 2015 7 em 2016 e apenas4 tiveram a primeira ocorrecircncia de expressotildees lambda em 2017 Dessa forma percebe-seque os projetos estatildeo relativamente bem distribuiacutedos em grupos quanto ao ano em que seintroduziu expressotildees lambda

Pela meacutedia de lambda por snapshot (lambdasnapshot) a maioria (11 projetos) possuiuma quantidade expressiva acima de 100 lambdasnapshot (com 6 projetos entre 20 e 100lambdasnapshot e 8 projetos com menos de 20 lambdasnapshot) como apresentados no

33

graacutefico da Figura 51 Isso mostra que essa nova caracteriacutestica jaacute estaacute sendo bem utilizadanos projetos que comeccedilaram a migrar para a nova versatildeo do Java

Figura 51 Graacuteficos dos projetos separados por ano de introduccedilatildeo de expressotildees lambdae meacutedia de lambda por snapshot

Com isso pode-se observar que apesar de a quantidade de projetos que possuemexpressotildees lambda natildeo ser tatildeo alta eacute possiacutevel obter resultados expressivos uma vez quea quantidade dos projetos com lambda estatildeo bem dispersos quanto ao periacuteodo em quecomeccedilaram a adotar essa caracteriacutestica e a quantidade de expressotildees lambda por snapshot

511 Projetos Selecionados

Atraveacutes dos grupos de classificaccedilatildeo identificados pela anaacutelise temporal descritos na Figura45 cinco projetos foram selecionados para uma anaacutelise detalhada levando em consideraccedilatildeoo grupo em que eles pertencem Estes projetos seratildeo apresentados a seguir

512 agera

Agera eacute uma biblioteca Android que ajuda a introduzir programaccedilatildeo funcional reativa(functional reactive programming) em projetos Android Eacute um projeto recente lanccediladoem 2016 pela Google [44] e encontra-se no grupo dos projetos que introduziram expressotildeeslambda em 2016 no mesmo ano de seu lanccedilamento contendo uma meacutedia de expressotildeeslambda de 16 lambdasnapshot

Na classificaccedilatildeo estabelecida agera pertence ao Grupo 1 onde a quantidade de ex-pressotildees lambda no projeto com o tempo aumentam juntamente com a quantidade deAICs como mostra o graacutefico de anaacutelise temporal na Figura 52

34

Figura 52 Graacuteficos de anaacutelise temporal do projeto agera

513 vertx

Eclipse Vertx eacute um conjunto de ferramentas para criaccedilatildeo de reactive applications namaacutequina virtual Java (JVM) em grande escala [45] Seu primeiro lanccedilamento aconteceuem 2011 e a primeira ocorrecircncia de expressotildees lambda no projeto aconteceu em 2014 Esteprojeto possui uma meacutedia de 2867 lambdasnapshot e dentre os projetos consideradosneste trabalho eacute o que possui a maior quantidade de expressotildees lambda

Este projeto pertence ao Grupo 2 onde a quantidade de expressotildees lambda aumen-tou consideravelmente pelos meses ultrapassando a quantidade de AICs que diminuiudrasticamente como mostra a Figura 53

35

Figura 53 Graacuteficos de anaacutelise temporal do projeto Vertx

514 Android-CleanArchitecture

Apesar de ser uma amostra de projeto Android-CleanArchitecture que tem como objetivoconstruir aplicaccedilotildees Android utilizando clean architecture foi lanccedilado em 2014 mas semanteacutem sempre atualizado [46]

A introduccedilatildeo de expressotildees lambda que aconteceu no ano de 2015 se deu de formatiacutemida com uma meacutedia de 35 lambdasnapshot De qualquer forma este projeto conseguerepresentar com seu graacutefico de anaacutelise temporal o grupo 3 composto por projetos em quea quantidade de expressotildees lambda aumentou mas sem ultrapassar AICs que diminuiacuteramdemonstrado no graacutefico da Figura 54

36

Figura 54 Graacuteficos de anaacutelise temporal do projeto Android-CleanArchitecture

515 RxJava

Dentre os repositoacuterios estudados RxJava eacute considerado o mais popular Como umaimplementaccedilatildeo de Reactive Extensions para a JVM RxJava teve seu lanccedilamento dadoem 2013 [47] Expressotildees lambda apareceram pela primeira vez no ano de 2015 comuma meacutedia de 766 lambdasnapshot

Apesar de uma meacutedia relativamente alta o tempo de vida das expressotildees lambda nesteprojeto foi bem curto caracterizando assim projetos do grupo 4 houve a introduccedilatildeo dasexpressotildees lambda no projeto poreacutem houve a remoccedilatildeo completa de todas as expressotildeeslambda previamente introduzidas desaparecendo completamente do projeto ateacute a datada coleta de dados (Figura 55)

37

Figura 55 Graacuteficos de anaacutelise temporal do projeto RxJava

516 guava

Guava eacute um conjunto de bibliotecas para Java da Google lanccedilado em 2011 A atualizaccedilatildeodo coacutedigo do projeto para Java 8 aconteceu somente em 2016 e apesar do projeto conteruma meacutedia de 281 lambdasnapshot ele foi escolhido como representante dos projetosdo Grupo 5 (Figura 56) que possuem expressotildees lambda mas de forma natildeo expressiva osuficiente quando comparado com a quantidade de AIC pelo fato de sua razatildeo de meacutedia delambdasnapshot por meacutedia de AICsnapshot ser 004 Ou seja embora o projeto tenhaexpressotildees lambda estas satildeo consideradas muito poucas quando inseridas no contextogeral deste projeto que eacute considerado um projeto grande

38

Figura 56 Graacuteficos de anaacutelise temporal do projeto Guava

52 Refatoraccedilatildeo de Coacutedigo

Com o objetivo de caracterizar melhor como as expressotildees lambda estatildeo sendo utilizadaseacute interessante identificar se estas estatildeo sendo introduzidas atraveacutes de refatoraccedilatildeo de coacutedigoou em coacutedigo novo

Os projetos classificados como pertencentes ao Grupo 2 possuem em comum o fatode expressotildees lambda aumentarem a medida que AICs diminuem ultrapassando-as eessa caracteriacutestica em comum pode indicar que nestes projetos possivelmente houve re-fatoraccedilatildeo de coacutedigo visto que AIC sendo substituiacutedo por expressotildees lambda dentro dascondiccedilotildees determinadas eacute a maneira mais comum de se identificar refatoraccedilatildeo de coacute-digo para introduccedilatildeo de expressotildees lambda [12] Os projetos que compotildeem o grupo 2representam 44 de todos os projetos estudados que possuem expressotildees lambda o quepode ser um indicativo caso a hipoacutetese de refatoraccedilatildeo de coacutedigo seja positiva de quemuitos projetos que estatildeo adotando o Java 8 estatildeo se preocupando de alguma formacom refatoraccedilatildeo se coacutedigo Fazem parte desse grupo os seguintes projetos elasticsearchjava-design-patterns PocketHub presto RxJava-Android-Samples spark vertx zipkinjava8-tutorial dropwizard e material-dialogs

39

Outra maneira de verificar possiacuteveis indicadores de refatoraccedilatildeo de coacutedigo foi atraveacutesda anaacutelise dos tamanhos (em quantidade de linhas de coacutedigo) dos meacutetodos com expressotildeeslambda no mecircs em que se introduziu expressotildees lambda e um mecircs imediatamente antesdeste Essa anaacutelise mostra que dos 25 projetos com expressotildees lambda 12 (48) projetostiveram ao menos um meacutetodo em que houve uma diminuiccedilatildeo no tamanho o que podeser considerado um indicativo de refatoraccedilatildeo de coacutedigo A Figura 57 mostra todos osprojetos em relaccedilatildeo agrave quantidade total de meacutetodos que possuem lambda no primeiro mecircsde introduccedilatildeo do mesmo em vermelho comparado com a quantidade desses meacutetodos quetiveram uma diminuiccedilatildeo no tamanho quando comparados com o coacutedigo do mecircs anteriorem azul

Figura 57 Comparaccedilatildeo entre todos os projetos com expressatildeo lambda sobre refatoraccedilatildeode coacutedigo no mecircs de introduccedilatildeo da caracteriacutestica

Ainda observando a figura 57 com relaccedilatildeo aos projetos que natildeo tiveram nenhummeacutetodo com diminuiccedilatildeo de tamanho (barra azul) percebe-se que todos os 13 projetossequer tiveram uma quantidade significativa de meacutetodos que possuem expressotildees lambda(com o maior tendo apenas 5 meacutetodos) no mecircs de introduccedilatildeo da caracteriacutestica no projetoe ao mesmo tempo jaacute existiam no mecircs em que natildeo existia lambda no projeto Essa eacuteuma observaccedilatildeo importante porque projetos como vertx sendo este o que possui a maiormeacutedia de lambdasnapshot de todos os projetos e ao mesmo tempo tendo apenas trecircsmeacutetodos que continham expressotildees lambda no mecircs da introduccedilatildeo e que existiam no mecircs

40

anterior permitem inferir que todas as outras expressotildees lambda existentes no projetopara este determinado mecircs de introduccedilatildeo encontram-se em coacutedigo novo introduzido

Eacute importante ressaltar que somente essa anaacutelise natildeo eacute exclusivamente suficiente paradeterminar se estes projetos estatildeo realmente introduzindo lambda em coacutedigo novo ourealizando refatoraccedilatildeo uma vez que como a comparaccedilatildeo aconteceu apenas no mecircs deintroduccedilatildeo com o mecircs imediatamente anterior natildeo reflete todo o ciclo de vida do pro-jeto Por exemplo algumas equipes podem escolher refatorar o coacutedigo depois de umtempo de adaptaccedilatildeo apoacutes a transiccedilatildeo para a nova versatildeo da linguagem Assim paraobter uma melhor anaacutelise sobre refatoraccedilatildeo de coacutedigo ou natildeo feita nestes projetos aleacutemde outras anaacutelises referentes aos padrotildees tipicamente adotados para implementaccedilatildeo delambda nestes projetos seratildeo apresentados a seguir os estudos de caso dos cinco projetospreviamente selecionados

Outro ponto importante eacute o fato de que apesar das informaccedilotildees quanto agraves quantida-des de filter e map terem sido incluiacutedas inicialmente no trabalho para observar possiacuteveispadrotildees de refatoraccedilatildeo de coacutedigo percebeu-se que estas natildeo satildeo utilizadas de forma con-sideraacutevel pelos projetos estudados e para fins de anaacutelises generalizadas natildeo apresentaramtanta influecircncia na utilizaccedilatildeo de expressotildees lambda quanto a quantidade de AICs noprojeto

53 Estudos de Caso

Dentre os projetos analisados verificou-se que os projetos de pequeno e meacutedio porte op-taram por refatorar de uma vez seus coacutedigos para incluir expressotildees lambda em situaccedilotildeesem que se utilizava AICs anteriormente ou em alguns poucos casos de utilizaccedilatildeo deCollection Os projetos de grande porte natildeo apresentaram nenhuma refatoraccedilatildeo de coacute-digo ou uma refatoraccedilatildeo parcial gradativa provavelmente devido agrave grande quantidade dearquivos e coacutedigo que possuem o que pode tornar o trabalho de refatoraccedilatildeo extenso ecansativo

O projeto vertx que pertence ao grupo 2 dos projetos em que a quantidade de ex-pressotildees lambda aumentaram e as de AICs diminuiacuteram com lambda ultrapassando AICsexecutou inicialmente commits em maio de 2014 com adiccedilatildeo de coacutedigo novo utilizandoexpressotildees lambda e apoacutes um mecircs realizou um commit maior com a refatoraccedilatildeo de todasas AICs para expressotildees lambda Apoacutes a refatoraccedilatildeo o projeto se preocupou em mantera utilizaccedilatildeo de expressotildees lambda ao mesmo tempo que o uso de AICs se manteve apenasaos casos de classes com interfaces natildeo funcionais A Figura 58 apresenta uma parte docommit de refatoraccedilatildeo de coacutedigo que mostra em vermelho a parte eliminada do coacutedigo(AIC) e em verde o coacutedigo novo representando a substituiccedilatildeo por uma expressatildeo lambda

41

Figura 58 Commit de refatoraccedilatildeo de coacutedigo do projeto Vertx [3]

Alguns projetos ainda natildeo se preocuparam em refatorar o coacutedigo para o uso de ex-pressotildees lambda ateacute a data deste trabalho que eacute o caso do projeto guava que apresentouum commit em 03112016 com a atualizaccedilatildeo do projeto para Java 8 Mas a partir daatualizaccedilatildeo se preocupou em utilizar as expressotildees lambda apenas na implementaccedilatildeo decoacutedigo novo O cenaacuterio em que a refatoraccedilatildeo natildeo eacute prioridade ainda eacute a realidade de vaacuteriosprojetos de grande porte visto que os dados de projetos sem nenhuma expressatildeo lambdasatildeo o maior nuacutemero neste trabalho Poreacutem projetos que jaacute adotaram a utilizaccedilatildeo do Java8 tendem a mudar isso com o passar do tempo A Figura 59 apresenta em verde umaadiccedilatildeo de coacutedigo novo com expressatildeo lambda sem a eliminaccedilatildeo de algum coacutedigo anteriora esse que estaria em vermelho

42

Figura 59 Exemplo de um arquivo do commit de adiccedilatildeo de coacutedigo novo em Java 8 doprojeto Guava [4]

Na categoria de projetos em que os AICs e expressotildees lambda aumentam proporci-onalmente (grupo 1) o projeto agera realizou um commit em 19052016 com a adiccedilatildeoda biblioteca retrolambda como dependecircncia do projeto Essa biblioteca utilizada prin-cipalmente por projetos Android permite executar coacutedigo Java 8 contendo expressotildeeslambda em Java 5 6 e 7 [48] O commit tambeacutem apresenta refatoraccedilatildeo dos AICs ad-vindos de interfaces funcionais para expressotildees lambda Apesar de o projeto continuar autilizar as expressotildees lambda em seus commits posteriores o nuacutemero de AICs tambeacutemcontinuou a aumentar visualizando os commits posteriores notou-se que esses AICs satildeorelativos a interfaces natildeo funcionais ou seja que possuem mais de um meacutetodo O projetoAndroid-CleanArchitecture eacute similar ao agera pois tambeacutem optou pela instalaccedilatildeo da bi-blioteca retrolambda para uso de expressotildees lambda em seus coacutedigos e como tambeacutem eacuteum projeto de pequeno porte houve uma pequena refatoraccedilatildeo dos AICs A Figura 510mostra a parte do commit de refatoraccedilatildeo de coacutedigo em que o desenvolvedor adiciona abiblioteca retrolambda como dependecircncia

43

Figura 510 Commit de adiccedilatildeo da biblioteca Retrolambda no projeto Agera [5]

Outro caso interessante eacute o do projeto RxJava que em 2015 optou pela refatoraccedilatildeodo coacutedigo para a utilizaccedilatildeo de expressotildees lambda quase eliminando por completo o usode AICs mas que no ano seguinte reverteu os commits de forma que eliminasse comple-tamente o uso de expressotildees lambda para manter a retrocompatibilidade com o Java 6A Figura 511 demonstra uma parte do commit de reversatildeo do coacutedigo para Java 6 emque pode ser visto em vermelho o coacutedigo anterior com expressotildees lambda e o verde como novo coacutedigo utilizando AIC novamente

44

Figura 511 Commit de remoccedilatildeo de Lambdas e volta para o uso de AICs no projetoRXJava [6]

Essa preocupaccedilatildeo com retrocompatibilidade de coacutedigo pode ser um fator crucial nadecisatildeo das equipes de desenvolvimento na hora de decidir como fazer o software co-evoluircom a linguagem sem perder a compatibilidade com versotildees anteriores

45

Capiacutetulo 6

Consideraccedilotildees Finais

Este estudo permitiu entender melhor como projetos estatildeo realizando a migraccedilatildeo para oJava 8 em especial utilizando uma nova caracteriacutestica introduzida expressatildeo lambdaApesar de a maioria dos projetos populares considerados natildeo possuiacuterem nenhuma ocor-recircncia de expressotildees lambda os projetos que tinham expressotildees lambda foram suficientespara realizar um primeiro estudo de caracterizaccedilatildeo no uso desta caracteriacutestica e com osprojetos efetivamente utilizados para estudo foi possiacutevel agrupaacute-los quanto a maneira emque as expressotildees lambda estavam sendo utilizadas quando comparadas com AICs em 5grandes grupos quando AIC e lambda aumentam proporcionalmente quando AIC dimi-nui e lambda aumenta ultrapassando AIC quando AIC diminui mas continua superior aolambda crescente expressotildees lambda que foram introduzidas e retiradas completamentedo coacutedigo e expressotildees lambda que natildeo existem em quantidades expressivas

Foi possiacutevel entatildeo realizar um estudo aprofundado levando em consideraccedilatildeo as di-ferentes maneiras com que as expressotildees lambda foram adotadas nos projetos atraveacutes daescolha de um projeto que representasse cada grupo para anaacutelise Dentre os cinco projetosestudados foi possiacutevel observar alguns padrotildees tipicamente adotados por desenvolvedorespara implementar expressotildees lambda em seus projetos como a utilizaccedilatildeo da bibliotecas(retrolambda) que permitissem uma flexibilizaccedilatildeo na utilizaccedilatildeo de expressotildees lambda oucomo lambda eacute primariamente utilizada para substituir determinados AICs ou operaccedilotildeesem Collection

Aleacutem disso foi possiacutevel observar como a refatoraccedilatildeo de coacutedigo acontece em cada umdesses projetos Observou-se como projetos menores tendem a refatorar coacutedigo maisfacilmente ao passo que projetos maiores e mais complexos fazem menos refatoraccedilatildeo oudemoram mais entre o periacuteodo em que houve a primeira migraccedilatildeo de coacutedigo para a novaversatildeo da linguagem ateacute o periacuteodo em que realmente decidem refatorar coacutedigo Aleacutem dacomplexidade do projeto influenciar na decisatildeo de migrar o projeto para uma versatildeo maisrecente da linguagem a preocupaccedilatildeo com retrocompatibilidade com versotildees anteriores da

46

linguagem tambeacutem podem ser uma barreira para que projetos comecem a evoluir o coacutedigojuntamente com a evoluccedilatildeo da linguagem

Ainda assim foi possiacutevel observar que a preocupaccedilatildeo com a co-evoluccedilatildeo do software-linguagem existe entre os desenvolvedores de projetos mas a realizaccedilatildeo da migraccedilatildeo aindaacontece lentamente devido agrave diversos fatores que precisam ser levados em consideraccedilatildeopara a manutenccedilatildeo do projeto

Para trabalhos e contribuiccedilotildees futuras seria interessante desenvolver uma ferramentaque pudesse analisar diretamente no coacutedigo-fonte as oportunidades de aplicaccedilatildeo de ex-pressotildees lambda dessa forma poderiam ser analisadas as porcentagens de conversatildeo decoacutedigo para Java 8 e obter melhores conclusotildees sobre a importacircncia que os projetos estatildeodando para a evoluccedilatildeo de seus coacutedigos Outro fator interessante seria aplicar mais Visitorsagrave ferramenta static-analysis e fazer este mesmo estudo aplicado agrave outras caracteriacutesticasda linguagem

47

Referecircncias

[1] Kagdi Huzefa Michael L Collard e Jonathan I Maletic A survey and taxonomyof approaches for mining software repositories in the context of software evolution2007 ix 3 8 9 10 11

[2] DBeaver Dbeaver - features httpdbeaverjkissorgdocsfeatures ix 29

[3] Eclipse Vertx commit Java8-ify code httpsgithubcomeclipsevertxcommit93f95e9c77419f442a42fe711b6eeaef88192fd3 ix 42

[4] Google Guava commit Release java 8 changes to guava httpsgithubcomgoogleguavacommit73e382fa877f80994817a136b0adcc4365ccd904 ix 43

[5] Google Agera commit Collapsed testapp with retrolambda httpsgithubcomgoogleageracommit5e518b7b05f9e7a34a314945f68deff7b2c3e334 ix 44

[6] ReactiveX Rxjava commit 2x full jdk 6 compatible backport + includ-ing bugfixes up to today httpsgithubcomReactiveXRxJavacommit000a174d87a901135f9665d3b11f3627fd2dc4ed ix 45

[7] Godfrey M W e D M German The past present and future of software evolutionEm 2008 Frontiers of Maintenance paacuteginas 129ndash138 Sept 2008 1 6

[8] Favre J M Languages evolve too changing the software time scale Em Principles ofSoftware Evolution Eighth International Workshop on paacuteginas 33ndash42 IEEE 20051 5 7

[9] Overbey Jeffrey L e Ralph E Johnson Regrowing a language refactoring tools allowprogramming languages to evolve Em ACM SIGPLAN Notices volume 44 paacuteginas493ndash502 ACM 2009 1 5 7 8 12

[10] Grechanik Mark Collin McMillan Luca DeFerrari Marco Comi Stefano CrespiDenys Poshyvanyk Chen Fu Qing Xie e Carlo Ghezzi An empirical investiga-tion into a large-scale java open source code repository Em Proceedings of the2010 ACM-IEEE International Symposium on Empirical Software Engineering andMeasurement ESEM rsquo10 paacuteginas 111ndash1110 New York NY USA 2010 ACMISBN 978-1-4503-0039-1 httpdoiacmorg10114518527861852801 1

[11] TIOBE Tiobe httpswwwtiobecomtiobe-index 1 14

48

[12] Gyori Alex Lyle Franklin Danny Dig e Jan Lahoda Crossing the gap from im-perative to functional programming through refactoring Em Proceedings of the 20139th Joint Meeting on Foundations of Software Engineering ESECFSE 2013 paacute-ginas 543ndash553 New York NY USA 2013 ACM ISBN 978-1-4503-2237-9 httpdoiacmorg10114524914112491461 2 11 24 39

[13] OpenJDK State of the lambda httpcropenjdkjavanet~briangoetzlambdalambda-state-4html 2

[14] Han Jiawei Micheline Kamber e Jian Pei Data Mining Concepts and TechniquesMorgan Kaufmann Publishers Inc San Francisco CA USA 3rd ediccedilatildeo 2011ISBN 0123814790 9780123814791 3

[15] Fowler Martin e Kent Beck Refactoring improving the design of existing codeAddison-Wesley Professional 1999 5 7

[16] Lehman M M J F Ramil P D Wernick D E Perry e W M Turski Met-rics and laws of software evolution - the nineties view Em Proceedings of the4th International Symposium on Software Metrics METRICS rsquo97 paacuteginas 20ndashWashington DC USA 1997 IEEE Computer Society ISBN 0-8186-8093-8 httpdlacmorgcitationcfmid=823454823901 6

[17] Hassan Ahmed E e Tao Xie Software intelligence The future of mining softwareengineering data Em Proceedings of the FSESDP Workshop on Future of SoftwareEngineering Research FoSER rsquo10 paacuteginas 161ndash166 New York NY USA 2010ACM ISBN 978-1-4503-0427-6 httpdoiacmorg101145188236218823978 9

[18] Hassan Ahmed E The road ahead for mining software repositories Em Frontiers ofSoftware Maintenance 2008 FoSM 2008 paacuteginas 48ndash57 IEEE 2008 8

[19] Berry Michael J e Gordon Linoff Data Mining Techniques For Marketing Salesand Customer Support John Wiley amp Sons Inc New York NY USA 1997ISBN 0471179809 10

[20] Parnin Chris Christian Bird e Emerson Murphy-Hill Java generics adoption hownew features are introduced championed or ignored Em Proceedings of the 8thWorking Conference on Mining Software Repositories paacuteginas 3ndash12 ACM 2011 12

[21] Oracle The java language specification httpsdocsoraclecomjavasespecsjlsse8jls8pdf 13

[22] Oracle The history of java technology httpwwworaclecomtechnetworkjavajavaseoverviewjavahistory-index-198355html 13

[23] Murphy Kieron So why did they decide to call itjava httpwwwjavaworldcomarticle2077265core-javaso-why-did-they-decide-to-call-it-java-html 13

[24] McGraw Tata Object-oriented Programming with Java Essentials and ApplicationsHill Education 13

49

[25] Oracle Differences between java ee and java se httpdocsoraclecomjavaee6firstcupdocgkhoyhtml 13

[26] Lindsey Clark S The History of Java Cambridge 14

[27] Oracle The java language environment httpwwworaclecomtechnetworkjavaintro-141325html 14

[28] Oracle Jdk 8 httpopenjdkjavanetprojectsjdk8 15 24

[29] Oracle Enhancements in java se 8 httpdocsoraclecomjavase8docstechnotesguideslanguageenhancementshtmljavase8 15 16 17

[30] Oracle Lambda expressions httpdocsoraclecomjavasetutorialjavajavaOOlambdaexpressionshtml 16 18 21

[31] Oracle Method references httpdocsoraclecomjavasetutorialjavajavaOOmethodreferenceshtml 16

[32] Oracle Default methods httpdocsoraclecomjavasetutorialjavaIandIdefaultmethodshtml 17

[33] Oracle Repeating annotations httpdocsoraclecomjavasetutorialjavaannotationsrepeatinghtml 17

[34] Oracle Type annotations httpdocsoraclecomjavasetutorialjavaannotationstype_annotationshtml 17

[35] Oracle Anonymous inner classes httpsdocsoraclecomjavasetutorialjavajavaOOanonymousclasseshtml 19

[36] Kothari CR Research Methodology Methods and Techniques New Age Interna-tional (P) Limited 2004 ISBN 9788122415223 httpsbooksgooglecombrbooksid=8c6gkbKi-F4C 22

[37] Nakakoji Kumiyo Yasuhiro Yamamoto Yoshiyuki Nishinaka Kouichi Kishida eYunwen Ye Evolution patterns of open-source software systems and communitiesEm IWPSE rsquo02 Proceedings of the International Workshop on Principles of SoftwareEvolution paacuteginas 76ndash85 New York NY USA 2002 ACM Press ISBN 1581135459httpdxdoiorg101145512035512055 23

[38] Rahman Foyzur Christian Bird e Premkumar Devanbu Clones What is that smellEmpirical Software Engineering 17(4-5)503ndash530 2012 24

[39] Chacon Scott Pro Git Apress Berkely CA USA 1st ediccedilatildeo 2009ISBN 1430218339 9781430218333 25

[40] Cavalcanti Thiago Gomes e Viniacutecius Correa de Almeida Caracterizaccedilatildeo do uso deconstruccedilotildees da linguagem java em projetos open-source Publicaccedilatildeo online 2016httpbdmunbbrhandle1048315733 27

50

[41] Parr Terence Language Implementation Patterns Create Your Own Domain-Specific and General Programming Languages Pragmatic Bookshelf 1st ediccedilatildeo 2009ISBN 193435645X 9781934356456 27

[42] Janssen Thorben 5 reasons to use jpa hibernate Publicaccedilatildeo online httpswwwsitepointcom5-reasons-to-use-jpa-hibernate 27

[43] Franklin Lyle Alex Gyori Jan Lahoda e Danny Dig Lambdaficator From imperativeto functional programming through automated refactoring Em Proceedings of the2013 International Conference on Software Engineering ICSE rsquo13 paacuteginas 1287ndash1290 Piscataway NJ USA 2013 IEEE Press ISBN 978-1-4673-3076-3 httpdlacmorgcitationcfmid=24867882486986 29

[44] Google Agera httpsgithubcomgoogleagerawiki 34

[45] Eclipse Eclipse vertx httpvertxio 35

[46] Cejas Fernando Android cleanarchitecture httpsgithubcomandroid10Android-CleanArchitecture 36

[47] ReactiveX Rxjava httpsgithubcomReactiveXRxJava 37

[48] Luontola Esko Retrolambda httpsgithubcomorfjackalretrolambda 43

51

Anexo I

Projetos utilizados

fastjson

platform_frameworks_base

netty

material-dialogs

kotlin

okhttp

tinker

AndroidUtilCode

RxJava

spring-boot

java-design-patterns

elasticsearch

ExoPlayer

kafka

vertx

realm-java

guava

zipkin

bazel

stetho

Signal-Android

glide

agera

fresco

plaid

presto

libgdx

spark

52

disruptor

lottie-android

flexbox-layout

PocketHub

zxing

spring-framework

deeplearning4j

dropwizard

interviews

BaseRecyclerViewAdapterHelper

uCrop

DanmakuFlameMaster

lottie-react-native

android-UniversalMusicPlayer

AndroidInterview-Q-A

greenDAO

retrofit

MaterialDrawer

BottomBar

druid

MPAndroidChart

Hystrix

guice

recyclerview-animators

dubbo

androidannotations

RxJava-Android-Samples

PhotoView

clojure

CircleImageView

AndroidSwipeLayout

jedis

MaterialViewPager

butterknife

junit4

RxBinding

leakcanary

SimianArmy

picasso

UltimateRecyclerView

53

AndroidViewAnimations

AppIntro

FizzBuzzEnterpriseEdition

ion

cheesesquare

physical-web

RxAndroid

Android-CleanArchitecture

Calligraphy

Android-Bootstrap

iosched

Android_Data

MaterialDesignLibrary

ListViewAnimations

EventBus

java8-tutorial

AndroidSlidingUpPanel

dagger

okhttputils

logger

HomeMirror

Material-Animations

android-Ultra-Pull-To-Refresh

android-async-http

Android-ObservableScrollView

Android-Universal-Image-Loader

ActionBarSherlock

SlidingMenu

storm

PagerSlidingTabStrip

Android-PullToRefresh

54

  • Dedicatoacuteria
  • Agradecimentos
  • Resumo
  • Abstract
  • Introduccedilatildeo
    • Contexto
    • Objetivos
      • Objetivos Gerais
      • Objetivos Especiacuteficos
        • Metodologia
        • Organizaccedilatildeo do Trabalho
          • Evoluccedilatildeo e Mineraccedilatildeo de Repositoacuterios de Software
            • Evoluccedilatildeo de Software
            • MSR Mineraccedilatildeo de dados e a Engenharia de Software
              • Classificaccedilatildeo
                • Trabalhos Relacionados
                  • Java SE 8 e JDK 8
                    • Histoacuterico
                    • Princiacutepios
                    • Evoluccedilatildeo
                    • Expressotildees Lambda
                      • Sintaxe
                      • Principais formas de uso
                          • Estudo e o Processo de Mineraccedilatildeo
                            • Questotildees de Pesquisa
                            • Fonte de Dados e Objetos de Estudo
                            • Processo de Mineraccedilatildeo
                              • static-analysis
                              • BDAnalisador
                                • Classificaccedilatildeo e Anaacutelise
                                  • Meacutedia de Lambda
                                  • Anaacutelise Temporal
                                  • Refatoraccedilatildeo de Coacutedigo
                                  • Casos de Uso
                                      • Resultados Obtidos e Anaacutelise
                                        • Visatildeo Geral
                                          • Projetos Selecionados
                                          • agera
                                          • vertx
                                          • Android-CleanArchitecture
                                          • RxJava
                                          • guava
                                            • Refatoraccedilatildeo de Coacutedigo
                                            • Estudos de Caso
                                              • Consideraccedilotildees Finais
                                              • Referecircncias
                                              • Anexo
                                              • Projetos utilizados

bull Capiacutetulo 3 Traz um contexto histoacuterico e teacutecnico da linguagem Java necessaacuteriospara entender a importacircncia que as novas caracteriacutesticas adicionadas na versatildeo8 fornecem para os desenvolvedores de projetos determinados a manter o projetosempre evoluiacutedo Tambeacutem eacute apresentada uma seccedilatildeo para demonstrar os detalhese formas de utilizaccedilatildeo das expressotildees Lambda que satildeo o foco dos objetivos destetrabalho

bull Capiacutetulo 4 Descreve a metodologia e processo utilizados para o desenvolvimentoe obtenccedilatildeo dos resultados deste trabalho O capiacutetulo desenvolve o contexto dasquestotildees de pesquisa e explica os motivos e processos de desenvolvimento das fer-ramentas utilizadas para minerar os dados aleacutem de determinar a classificaccedilatildeo dosresultados obtidos em grupos para facilitar a organizaccedilatildeo dos dados de forma queas perguntas sejam respondidas claramente

bull Capiacutetulo 5 Apresenta os resultados obtidos e de que forma eles ajudaram a respon-der as questotildees de pesquisa Eacute descrita uma anaacutelise de um projeto de cada categoriaespecificada no capiacutetulo anterior a fim de contextualizar cada tipo de resultado paraque o leitor entenda a forma que os projetos Java estatildeo lidando com as expressotildeesLambda

bull Capiacutetulo 6 Descreve as dificuldades e problemas obtidos durante o trabalho e deque forma eles influenciaram nos resultados Tambeacutem eacute apresentada uma seccedilatildeocontendo as ideias surgidas durante o desenvolvimento deste trabalho que ficarampara ser feitas no futuro devido agrave gama de informaccedilotildees que a mineraccedilatildeo dos dadostrouxe

4

Capiacutetulo 2

Evoluccedilatildeo e Mineraccedilatildeo deRepositoacuterios de Software

As linguagens de programaccedilatildeo estatildeo sempre evoluindo aumentando sua complexidade eexpressividade Da mesma forma aleacutem de se preocupar com dificuldades de estabelecercompatibilidade do software em relaccedilatildeo a tecnologias antigas desenvolvedores tambeacutemprecisam acompanhar essa evoluccedilatildeo das linguagens para que suas ferramentes natildeo setornem obsoletas [9] Isso agrega um grande desafio no desenvolvimento e evoluccedilatildeo desoftware

O conceito de evoluccedilatildeo de software amadureceu e se tornou um grande foco de pes-quisa Poreacutem nem sempre estudos de evoluccedilatildeo de software reconhecem a importacircncia daevoluccedilatildeo da linguagem de programaccedilatildeo no contexto do desenvolvimento de software [8]Quando um coacutedigo natildeo evolui junto com a linguagem com o objetivo de manter umacompatibilidade com versotildees anteriores sua capacidade de evoluccedilatildeo se torna limitada [9]

A refatoraccedilatildeo de coacutedigo que consiste em realizar mudanccedilas no coacutedigo fonte sem modi-ficar o comportamento observado do software [15] permite que a evoluccedilatildeo de linguagens eferramentas aconteccedilam mais naturalmente No entanto novos desafios surgem como porexemplo saber quando e como realizar a refatoraccedilatildeo de coacutedigo de forma eficiente e coesaDentre as teacutecnicas de pesquisa em engenharia de software para entender esse problematorna-se interessante explorar as teacutecnicas de mineraccedilatildeo de dados aplicados a repositoacuteriosde software com o objetivo de entender o relacionamento entre evoluccedilatildeo e refatoraccedilatildeo

Assim este capiacutetulo busca esclarecer conceitos e estrateacutegias de evoluccedilatildeo de softwaremineraccedilatildeo de repositoacuterios de software e o estado da arte sobre o assunto

5

21 Evoluccedilatildeo de Software

Durante o processo de produccedilatildeo e manutenccedilatildeo de software haacute a necessidade de diversastomadas de decisotildees sobre seu desenvolvimento como por exemplo decidir como melho-rar a qualidade do software Tais decisotildees precisam ser tomadas levando em consideraccedilatildeoo ambiente em que se estaacute inserido com novas tecnologias surgindo todos os dias fe-edback de usuaacuterios exigentes e concorrentes produzindo um software similar com ideiasinovadoras

Tudo isso acontece em um ritmo de constante mudanccedila e assim como diria Lehmaneacute imprescindiacutevel que software de sistemas sejam capazes de evoluir ou os mesmos correm orisco de sofrer uma morte prematura [16] fazendo assim da evoluccedilatildeo de software um con-ceito importante dentro do seu processo de desenvolvimento Essa evoluccedilatildeo deve ocorrerconsiderando o ambiente em que o software estaacute inserido o qual possui aspectos teacutecnicos esociais sua infraestrutura que pertence ao seu ambiente teacutecnico o qual sempre necessitamanutenccedilatildeo e ao mesmo tempo usuaacuterios que utilizam o software e estatildeo constantementeformando opiniotildees oferecendo feedback e na expectativa por novidades [7] Assim a me-dida que novas caracteriacutesticas satildeo desenvolvidas novas tecnologias de infraestrutura satildeonecessaacuterias novos requisitos satildeo adicionados e o sistema de software deve se adaptar aessas mudanccedilas

Com relaccedilatildeo aos aspectos sociais que envolvem a evoluccedilatildeo do software eacute importanteressaltar os conceitos baacutesicos de como essa evoluccedilatildeo acontece Durante um estudo empiacutericopioneiro na aacuterea de evoluccedilatildeo de software para sistemas de grande escala Lehman e seuscolaboradores formularam um conjunto de observaccedilotildees que hoje satildeo conhecidas como asleis da evoluccedilatildeo de software ou simplesmente Leis de Lehman [16] No geral as leis deevoluccedilatildeo de software podem ser descritas da seguinte forma [16]

1 Mudanccedila contiacutenua um sistema se tornaraacute progressivamente menos satisfatoacuteriopara seus usuaacuterios com o tempo a menos que se adapte continuamente agraves necessi-dades que surgiratildeo

2 Complexidade Crescente um sistema se tornaraacute cada vez mais complexo amenos que se trabalhe para explicitamente reduzir sua complexidade

3 Auto-regulaccedilatildeo o processo de evoluccedilatildeo de software eacute auto-regulatoacuterio no que dizrespeito agraves distribuiccedilotildees dos artefatos e produtos produzidos

4 Conservaccedilatildeo da estabilidade organizacional a taxa meacutedia de atividade globalefetiva em um sistema em evoluccedilatildeo natildeo muda com o tempo ou seja a meacutedia detrabalho e esforccedilo colocado em cada entrega do sistema permanece a mesma

6

5 Conservaccedilatildeo de familiaridade a quantidade de conteuacutedo novo em cada entregado sistema tende a se manter constante com o tempo

6 Crescimento contiacutenuo A quantidade de funcionalidades em um sistema cresceraacutecom o tempo com o objetivo de satisfazer seus usuaacuterios

7 Decliacutenio de qualidade Um sistema seraacute percebido com qualidade inferior como passar do tempo a menos que seu design tenha uma manutenccedilatildeo minuciosa e seadapte a novas restriccedilotildees

8 Sistema de Feedback Evoluir um sistema com sucesso requer reconhecer que oprocesso de desenvolvimento acontece em um sistema de feedback de vaacuterios ciclosagentes e niacuteveis

Os aspectos teacutecnicos que envolvem a evoluccedilatildeo de software levam em consideraccedilatildeo astecnologias utilizadas para o seu desenvolvimento desde a linguagem de programaccedilatildeo agravesmaacutequinas onde o software seraacute hospedado que sofrem atualizaccedilotildees recebem novas versotildeescom novas caracteriacutesticas implementadas

Um estudo realizado por Lavre mostra como a evoluccedilatildeo das linguagens de programa-ccedilatildeo no contexto da evoluccedilatildeo de software muitas vezes satildeo subestimadas uma vez quemuitos podem considerar em seus estudos a linguagem de computaccedilatildeo como um artefatoimutaacutevel [8] Por exemplo coloca-se muita ecircnfase e cuidado para realizar o versionamentode coacutedigo fonte de um software mas este pode ser tornar inutilizaacutevel futuramente se nin-gueacutem souber qual versatildeo de compilador determinada versatildeo de coacutedigo foi desenvolvida

Para natildeo se deixar estagnar linguagens de programaccedilatildeo precisam se adaptar e evoluirQuando uma linguagem de programaccedilatildeo atualiza softwares que eram antes consideradosatualizados podem se tornar rapidamente obsoletos E ao mesmo tempo que novascaracteriacutesticas satildeo adicionadas a linguagem precisa fornecer compatibilidade com versotildeesanteriores aumentando sua complexidade Desenvolvedores entatildeo encontram-se tambeacutemem um empasse buscando um equiliacutebrio entre manter a compatibilidade da ferramentacom versotildees anteriores da linguagem e atualizaacute-la para manter o software atualizado [9]

A estrateacutegia de refatoraccedilatildeo de coacutedigo pode ser uma opccedilatildeo que permite a linguageme o software co-evoluiacuterem com um menor grau de dificuldade [9] Refatoraccedilatildeo (do inglecircsrefactoring) eacute o processo de modificaccedilatildeo de um software com o objetivo de melhorar a es-trutura interna do mesmo sem alterar sua percepccedilatildeo externa Eacute uma maneira disciplinadade melhorar o design do coacutedigo apoacutes ele jaacute ter sido implementado Por exemplo dividiruma funcionalidade grande feita em apenas um bloco de coacutedigo em vaacuterios moacutedulos [15]

A refatoraccedilatildeo de coacutedigo pode ser um meio utilizado para evoluir o software adaptandoo coacutedigo com caracteriacutesticas novas introduzidas pela linguagem modificando o design dosistema sem comprometer sua integridade No entanto novos desafios surgem visto que

7

refatorar o coacutedigo fonte de um sistema de grande porte natildeo eacute uma tarefa faacutecil havendo anecessidade de ferramentas que possam automatizar o processo ou realizar um estudo paraentender como as novas caracteriacutesticas da linguagem podem ser utilizadas para substituirou melhorar funcionalidades obsoletas [9]

22 MSR Mineraccedilatildeo de dados e a Engenharia deSoftware

Com o objetivo de compreender prever e planejar os vaacuterios aspectos do desenvolvimentode um projeto em especial tudo que possa impactar na evoluccedilatildeo de software a teacutecnicade mineraccedilatildeo de dados tem sido bastante utilizada em engenharia de software [17]

O termo Mineraccedilatildeo de Repositoacuterios de Software (MSR) tem sido utilizado para descre-ver vaacuterias maneiras de se examinar repositoacuterios de software Um repositoacuterio de softwarepode ser considerado um artefato que eacute produzido e arquivado durante a evoluccedilatildeo desoftware [1] Estes responsoacuterios armazenam informaccedilotildees que podem fornecer todos osdetalhes de desenvolvimento do software provendo meios necessaacuterios para uma anaacuteliseaprofundada de evoluccedilatildeo de software

Repositoacuterios de software satildeo comumente utilizados para armazenar e acompanhar ohistoacuterico de desenvolvimento do software mas raramente usados para tomada de deci-sotildees em relaccedilatildeo ao projeto Assim pesquisadores de MSR buscam modificar a impressatildeode que tais repositoacuterios satildeo estaacuteticos que servem apenas para manutenccedilatildeo de registrostransformando-os em repositoacuterios ativos que podem auxiliar na tomada de decisatildeo em pro-jetos de software modernos atraveacutes da identificaccedilatildeo de padrotildees para realizar a propagaccedilatildeode mudanccedilas [18]

221 Classificaccedilatildeo

De acordo com Kagdi et al dentre as abordagens de MSR utilizadas atualmente eacute possiacuteveldescrevecirc-las para entatildeo comparaacute-las e possivelmente classificaacute-las levando em considera-ccedilatildeo uma taxonomia de quatro dimensotildees os repositoacuterios de software utilizados (fontes dedados) o propoacutesito do MSR a metodologia e a avaliaccedilatildeo da abordagem [1] como mostraa Figura 21 onde as taxonomias destacadas em amarelo satildeo as que prevaleceram poreacutemnatildeo exclusivamente na metodologia adotada por este trabalho

8

Figura 21 Taxonomia em camadas adaptada do trabalho de Kagdi et al [1]

Fontes de Dados

As fontes de informaccedilatildeo variam de acordo com a abordagem utilizada e dentre as informa-ccedilotildees mineradas em repositoacuterios de software inclui-se as seguintes categorias os artefatosde software e suas versotildees as diferenccedilas entre os artefatos de software e suas versotildees e osmetadados sobre as mudanccedilas no software

As fontes de dados podem ser melhor classificadas de acordo com Hassan et al [17]

bull Repositoacuterios de controle de Versatildeo estes repositoacuterios guardam o histoacuterico de desen-volvimento de um projeto armazenando todas as mudanccedilas no coacutedigo fonte assimcomo os metadados associados com cada mudanccedila Exemplos git SVN

bull Bug repositories Estes repositoacuterios rastreiam o histoacuterico de resoluccedilatildeo de bugs quesatildeo reportados por usuaacuterios e desenvolvedores Exemplos Bugzilla e Jira

9

bull Histoacuterico de Comunicaccedilatildeo (Archived communications) estes repositoacuterios rastreiamdiscussotildees sobre os vaacuterios aspectos de um projeto de software por sua vida uacutetil Porexemplo listas de e-mails

bull Deployment logs logs com informaccedilotildees do software gerados por ferramentas dedesenvolvimento

bull Repositoacuterios de software Repositoacuterios onde o coacutedigo fonte de vaacuterios projetos satildeoarmazenados como por exemplo Sourceforgenet

No contexto deste trabalho estes repositoacuterios consistem em fontes de coacutedigo armaze-nadas em sistemas de controle de versatildeo especificamente coacutedigos na plataforma Github

O propoacutesito

O propoacutesito da mineraccedilatildeo de repositoacuterios de software se resume nas perguntas de pes-quisa que podem ser respondidas utilizando mineraccedilatildeo Assim existem duas classes deperguntas de pesquisa para MSR [1]

A primeira eacute a pergunta de anaacutelise market-basket1 ldquoSe A acontece o que mais podeacontecerrdquo A resposta para este tipo de pergunta eacute um conjunto de regras descrevendotendecircncias de relacionamentos como por exemplo se A acontecer entatildeo B e C acontecemdurante um periacuteodo X

A segunda classe diz respeito agraves perguntas de prevalecircncia (Prevalence Questions -PQ) como por exemplo perguntas do tipo ldquoA funcionalidade Y foi modificadardquo quepossuem uma resposta booleana ou ldquoQuantas vezes esta funcionalidade Y foi modificadardquocontendo uma resposta quantitativa

As perguntas de pesquisa deste trabalho se encaixam majoritariamente na segundaclasse onde o objetivo traccedilado eacute respondido de forma quantitativa com algumas tentativasde classificaccedilatildeo de tipos de repositoacuterios como seraacute descrito nos capiacutetulos seguintes

A metodologia

A metodologia corresponde a maneira como as questotildees de MSR iratildeo ser respondidas evaacuterias abordagens estatildeo disponiacuteveis Poreacutem Kagdi indica duas estrateacutegias baacutesicas quepodem ser utilizadas

Primeiramente pode-se utilizar a mediccedilatildeo indireta e anaacutelise da evoluccedilatildeo do softwareEsta abordagem pode ser realizada da seguinte forma extrair e computar informaccedilotildeesde cada versatildeo de um software separadamente e em seguida individualmente comparar

1Anaacutelise Market-basket eacute uma teacutecnica de modelagem baseada na teoria de que se vocecirc comprar certostipos de produtos vocecirc haacute uma probabilidade maior (ou menor) de comprar outros tipos de produtos [19]

10

propriedades encontradas como por exemplo comparar duas versotildees distintas de umsoftware atraveacutes de um repositoacuterio github realizando uma investigaccedilatildeo de alto niacutevel noque diz respeito a evoluccedilatildeo do software [1]

A segunda perspectiva de metodologia que pode ser utilizada corresponde agrave mediccedilatildeodireta e anaacutelise da evoluccedilatildeo do software Ela diz respeito agraves investigaccedilotildees que estudamos mecanismos que leva um software a ser modificado de uma versatildeo para outra focandonas diferenccedilas especiacuteficas entre estas versotildees como por exemplo examinando mudanccedilasespeciacuteficas das classes arquivos funccedilotildees de cada parte do coacutedigo [1]

Assim eacute possiacutevel descrever explicitamente que este trabalho utiliza em sua maioriauma metodologia com mediccedilotildees diretas atraveacutes da anaacutelise estaacutetica de informaccedilotildees docoacutedigo fonte de diferente versotildees para analisar os diferentes padrotildees de desenvolvimentoem que expressotildees lambda (definidas no capiacutetulo seguinte) satildeo utilizadas

A Avaliaccedilatildeo

Por fim existem diversas formas para se avaliar o estudo realizado sempre levando emconsideraccedilatildeo a validade dos resultados obtidos Pode-se utilizar de meacutetricas para avaliar osdados considerando o quanto das informaccedilotildees obtidas satildeo relevantes Outra forma de seavaliar seria atraveacutes da utilizaccedilatildeo de modelos probabiliacutesticos seguindo uma abordagemde teoria da informaccedilatildeo Assim foram utilizadas determinadas meacutetricas quantitativaspara avaliar os resultados obtidos neste trabalho

23 Trabalhos Relacionados

Como ressaltado na introduccedilatildeo o foco deste trabalho encontra-se em utilizar teacutecnicas deMSR para caracterizar a adoccedilatildeo de expressotildees lambda em repositoacuterios Java Ao reali-zar um estudo sobre o estado da arte encontrou-se diversos trabalhos que utilizam deMSR para obter informaccedilotildees relevantes sobre repositoacuterios de software em diversos focose em especial trabalhos que investiguem repositoacuterios na linguagem Java Jaacute existemtambeacutem alguns trabalhos que apresentam ferramentas de refatoraccedilatildeo de coacutedigo para im-plementaccedilatildeo de expressotildees lambda com foco na evoluccedilatildeo do software Dentre os trabalhosencontrados mencionados destacam-se

bull Em um trabalho sobre utilizaccedilatildeo de refatoraccedilatildeo de coacutedigo para realizar a transiccedilatildeode coacutedigo Java para as novas caracteriacutesticas implementadas no Java 8 Gyori et alapresenta uma ferramenta que automatiza com sucesso o trabalho de conversatildeo decoacutedigo como Annonymous Inner Class para expressotildees lambda [12] O capiacutetulo aseguir descreve em detalhes estes conceitos

11

bull Regrowing a Language de Overbey apresenta um estudo sobre a importacircncia da co-evoluccedilatildeo entre a linguagem de programaccedilatildeo e os projetos de software focando naslinguagens Fortran e Java e provando como ferramentas de refatoraccedilatildeo de coacutedigoauxiliam para que o software consiga evoluir juntamente com sua linguagem deprogramaccedilatildeo [9]

bull O trabalho sobre a adoccedilatildeo de generics em coacutedigo Java feito por Parnin utiliza demineraccedilatildeo de dados para realizar uma investigaccedilatildeo empiacuterica avaliando projetos decoacutedigo aberto com o objetivo de observar como desenvolvedores destes projetos estatildeoutilizando generics em Java [20]

Os estudos mencionados focam em assuntos particulares pertinentes a este trabalhoem que de um lado tem-se trabalhos que mostram a necessidade de refatoraccedilatildeo de coacutedigopara evoluccedilatildeo de software e do outro tem-se trabalhos que mostram que eacute possiacutevel utilizarde MSR para entender melhor como a evoluccedilatildeo da linguagem de programaccedilatildeo Java temafetado projetos reais de coacutedigo aberto e como estes projetos estatildeo se adaptando a estasevoluccedilotildees

12

Capiacutetulo 3

Java SE 8 e JDK 8

Este trabalho tem como objetivo caracterizar a adoccedilatildeo de expressotildees Lambda em siste-mas Java que podem ser considerados legados pois foram concebidos em um momentoanterior a introduccedilatildeo dessa nova caracteriacutestica na linguagem Java Com o intuito de faci-litar o entendimento do leitor sobre tais construccedilotildees esse capiacutetulo apresenta informaccedilotildeeshistoacutericas referentes agrave linguagem Java desde sua criaccedilatildeo ateacute a sua ascensatildeo como umadas linguagens de programaccedilatildeo mais populares Aleacutem disso seratildeo apresentadas as novascaracteriacutesticas presentes na versatildeo Java SE 8 com destaque nas expressotildees Lambda e deque forma vieram para auxiliar no desenvolvimento de sistemas

31 Histoacuterico

Java eacute uma linguagem de programaccedilatildeo orientada a objetos para propoacutesitos gerais [21] Alinguagem nasceu com o nome de Oak no ano de 1991 com o foco em televisotildees digitais acabo mas devido agrave complexidade e poder da linguagem logo expandiu-se para os outrosdomiacutenios principalmente a Internet [22] Posteriormente a linguagem recebeu o nome deGreentalk devido agrave marca Oak jaacute ser registrada por outra empresa e o principal projeto daequipe se chamar Green Por fim o nome Java foi o mais votado pela equipe da Sun emuma reuniatildeo para decidir o mais raacutepido possiacutevel um nome definitivo para a linguagem [23]

Em 1995 em sua primeira versatildeo puacuteblica 10 a linguagem Java jaacute comeccedilava a terum crescimento em sua popularidade como Web Applet nos navegadores mais popularesfornecendo seguranccedila e rapidez nas plataformas mais utilizadas [24] A cada nova versatildeopublicada novas funcionalidades e plataformas eram adicionadas e tornavam a linguagemmais difundida no meio computacional fazendo com que em 2006 a linguagem fosse divi-dida em Java EE (foco em rede e serviccedilos web) Java ME (foco em sistemas embarcados)e Java SE (foco em desktops e servidores) [25]

13

Apoacutes anos de evoluccedilatildeo e aprimoramento atraveacutes de diversas versotildees como visto naTabela 31 hoje o Java se tornou uma das linguagens de programaccedilatildeo mais utilizadas nomundo estando em aproximadamente 15 das linhas de coacutedigo disponiacuteveis pela inter-net [11] A quantidade de plataformas suportadas pela linguagem e com o advento dosistema operacional Android sendo rodado na maior parte dos smartphones do mundoaleacutem da simplicidade em codificar no paradigma orientado a objetos foram os fatoresrelevantes para que a linguagem se popularizasse no mundo digital [26]

Tabela 31 As versotildees anteriores de java e principais caracteriacutesticasVersatildeo Principais caracteriacutesticasJava 10 JVM e JDKJava 2 Event Listeners

Kestrel (Java 3) HotSpot JVMMerlin (Java 4) Diversas novas APIs como Assertion e expressotildees regularesTiger (Java 5) Generics

Mustang (Java 6) Web ServicesDolphin (Java 7) Suporte a linguagens dinamicas

32 Princiacutepios

Com o foco em alcanccedilar a Web e participar mais ativamente do mercado virtual e e-Commerce foram projetados princiacutepios que permitissem com que a linguagem pudessealcanccedilar seus objetivos principais ao mesmo tempo que mantinha a facilidade e fami-liarizaccedilatildeo da linguagem a seus desenvolvedores [27] Dessa forma a equipe da Oracledeterminou cinco princiacutepios que caracterizariam o foco da linguagem Java

bull simples orientada a objeto e familiar projetada para ser orientada a objeto epermitir que seus desenvolvedores comecem a codificar rapidamente sem a necessi-dade de uma curva de aprendizagem acentuada

bull segura e robusta projetada para prover software confiaacutevel por meio de checagensa tempo de compilaccedilatildeo e execuccedilatildeo Haacute uma grande preocupaccedilatildeo com seguranccediladevido agrave larga utilizaccedilatildeo da linguagem em sistemas distribuiacutedos

bull de arquitetura neutra e portaacutevel projetada para ser independente de qualquerarquitetura bastando rodar a JVM dessa forma garantindo a portabilidade paravaacuterios ambientes e dispositivos

14

bull executada em alta performance projetada para fornecer a maior performancepossiacutevel em tempo de execuccedilatildeo com a utilizaccedilatildeo do garbage collector em uma threadde baixa prioridade

bull interpretada dinacircmica e threaded projetada para ser interpretada por qual-quer dispositivo que possua JVM desenvolvida garantindo um desenvolvimento raacute-pido e em ciclos O uso da classe Thread permite que a linguagem acompanhe atendecircncia do paralelismo Aleacutem disso a ligaccedilatildeo de classes eacute feita em tempo real esomente quando necessaacuteria tornando-a dinacircmica

33 Evoluccedilatildeo

A primeira versatildeo do Java 8 foi lanccedilada em 2014 [28] e apresentou diversas atualizaccedilotildeesespalhadas em categorias como linguagem seguranccedila Collections ferramentas deployentre outras Dentre a grande quantidade de mudanccedilas os destaques se encontraram nasnovas melhorias presentes na linguagem que afetaram de forma mais direta a maneiracom que os desenvolvedores passaram a tratar e organizar o coacutedigo fonte As atualizaccedilotildeesreferentes a linguagem descritas oficialmente pela Oracle [29] satildeo

1 Lambda Expressions ou apenas Expressotildees Lambda correspondem a uma novacaracteriacutestica que permite que uma pequena funcionalidade possa ser utilizada comoum argumento de um meacutetodo facilitando a escrita de accedilotildees que seratildeo feitas repetida-mente em uma Collection ou quando um processo se completa ou quando encontraum erro Eacute tambeacutem uma forma compacta de se escrever coacutedigo que previamenteera escrito com anonymous inner classes [29] A Listagem 31 mostra uma classehipoteacutetica Calculator cujo meacutetodo operateBinary() recebe como paracircmetro doisinteiros e um objeto da classe IntegerMath que representa a operaccedilatildeo que deveraacuteser realizada ou seja uma funcionalidade dinacircmica

1 pub l i c c l a s s Ca l cu la to r 2

3 i n t e r f a c e IntegerMath 4 i n t opera t i on ( i n t a i n t b) 5 6

7 pub l i c i n t operateBinary ( i n t a i n t b IntegerMath op ) 8 re turn op opera t i on (a b) 9

10

11 pub l i c s t a t i c void main ( St r ing a rgs ) 12

15

13 Calcu la to r myApp = new Ca lcu la to r ( ) 14 IntegerMath add i t i on = (a b) minusgt a + b 15 IntegerMath subt ra c t i on = (a b) minusgt a minus b 16 System out p r i n t l n ( 40 + 2 = +17 myApp operateBinary (40 2 add i t i on ) ) 18 System out p r i n t l n ( 20 minus 10 = +19 myApp operateBinary (20 10 sub t ra c t i on ) ) 20 21 22

Listagem 31 Exemplo de coacutedigo com o uso de Expressatildeo Lambda [30]

2 Method References Frequentemente expressotildees lambda criam meacutetodos anocircni-mos Algumas vezes poreacutem satildeo utilizadas para chamar um meacutetodo jaacute existentena classe Ao inveacutes de escrever a expressatildeo Lambda para esse caso pode-se optarpor utilizar um Method Reference que facilita a escrita e leitura desse uso de ex-pressatildeo Lambda [29] A Listagem 32 mostra um exemplo de um meacutetodo estaacuteticoque compara duas pessoas pelas suas idades e a Listagem 33 a utilizaccedilatildeo de MethodReference para aplicar a utilizaccedilatildeo desse meacutetodo em um array e reduzir a escrita deuma expressatildeo lambda a uma forma mais legiacutevel

1 pub l i c s t a t i c i n t compareByAge ( Person a Person b) 2 re turn a b i r thday compareTo (b b i r thday ) 3 4

Listagem 32 Exemplo de meacutetodo de uma classe Pessoa [31]

1 Arrays s o r t ( rosterAsArray Person compareByAge ) 2

Listagem 33 Exemplo de uso de Method Reference [31]

3 Default Methods satildeo meacutetodos com a palavra-chave default que servem para adi-cionar implementaccedilotildees de meacutetodos a uma interface de alguma biblioteca mantendoa compatibilidade binaacuteria com versotildees mais antigas dessa interface Tambeacutem pos-sibilita a implementaccedilatildeo de meacutetodos estaacuteticos em interfaces [29] A Listagem 34apresenta a inclusatildeo de um meacutetodo default na interface TimeClient

1 pub l i c i n t e r f a c e TimeClient 2 void setTime ( i n t hour i n t minute i n t second ) 3 void setDate ( i n t day i n t month i n t year ) 4 void setDateAndTime ( i n t day i n t month i n t year 5 i n t hour i n t minute i n t second )

16

6 LocalDateTime getLocalDateTime ( ) 7

8 s t a t i c ZoneId getZoneId ( S t r ing zoneStr ing ) 9 t ry

10 re turn ZoneId o f ( zoneStr ing ) 11 catch ( DateTimeException e ) 12 System e r r p r i n t l n ( I n v a l i d time zone + zoneStr ing

+13 us ing d e f a u l t time zone in s t ead ) 14 re turn ZoneId systemDefault ( ) 15 16 17

18 d e f a u l t ZonedDateTime getZonedDateTime ( St r ing zoneStr ing ) 19 re turn ZonedDateTime o f ( getLocalDateTime ( ) getZoneId (

zoneStr ing ) ) 20 21 22

Listagem 34 Exemplo de interface com um meacutetodo default [32]

4 Repeating Annotations permitem a implementaccedilatildeo e utilizaccedilatildeo de anotaccedilotildees deum mesmo tipo que podem ser utilizadas mais de uma vez para a mesma declara-ccedilatildeo [29] A Listagem 35 apresenta duas anotaccedilotildees iguais com paracircmetros diferentespermitindo uma customizaccedilatildeo maior na aplicaccedilatildeo de um tipo de anotaccedilatildeo

1 Schedule ( dayOfMonth= l a s t )2 Schedule (dayOfWeek= Fr i hour= 23 )3 pub l i c void doPeriodicCleanup ( ) 4

Listagem 35 Exemplo de Repeating Annotations [33]

5 Type Annotations permitem que anotaccedilotildees possam ser utilizadas em tipos aleacutemde declaraccedilotildees dessa forma pode-se garantir que um campo sempre atenda agraves suasexpectativas e evite testes desnecessaacuterios [29] A Listagem 36 mostra um exemplo derestriccedilatildeo a uma String que nunca poderaacute ser nula devido agrave anotaccedilatildeo de NonNull

1 NonNull S t r ing s t r

Listagem 36 Exemplo de Type Annotation garantindo que o campo nunca seja null [34]

17

34 Expressotildees Lambda

Uma das mudanccedilas mais interessantes implementadas no Java 8 foi a adiccedilatildeo de expressotildeeslambda As expressotildees lambda permitem que a linguagem Java possa atuar parcialmentecomo uma linguagem de programaccedilatildeo funcional onde comportamentos satildeo avaliados eaplicados diferentemente da programaccedilatildeo imperativa que foca na mudanccedila de estadosNa praacutetica um comportamento pode ser passado como paracircmetro de um meacutetodo atraveacutesde uma escrita mais reduzida e legiacutevel Os benefiacutecios de utilizar expressotildees lambda incluemuma melhora na legibilidade e organizaccedilatildeo de coacutedigo que antes era escrito com AnonymousInner Class aleacutem de permitir uma forma simples de utilizar comportamento paralelo como uso de Streams

341 Sintaxe

A sintaxe de uma expressatildeo lambda eacute dividida nas seguintes partes [30]

bull Uma lista de paracircmetros separados por viacutergulas

bull Um token representado por uma seta -gt

bull Um corpo que pode ser representado por uma expressatildeo uacutenica ou um bloco de coacutedigodentro de chaves

As Listagens 37 e 38 mostram duas formas diferentes de se aplicar expressotildees Lambdacom uma sintaxe similar A primeira aplica a expressatildeo diretamente apoacutes a seta utilizadanormalmente para trechos de coacutedigo pequenos e simples e a segunda utiliza-se de chavespara incorporar o coacutedigo e da palavra-chave return para especificar o retorno forma maisutilizada para uma quantidade maior de coacutedigo

1 p minusgt p getGender ( ) == Person Sex MALE2 ampamp p getAge ( ) gt= 183 ampamp p getAge ( ) lt= 25

Listagem 37 Exemplo de expressatildeo lambda com uma expressatildeo [30]

1 p minusgt 2 re turn p getGender ( ) == Person Sex MALE3 ampamp p getAge ( ) gt= 184 ampamp p getAge ( ) lt= 25 5

Listagem 38 Exemplo de expressatildeo lambda com um bloco de coacutedigo [30]

18

342 Principais formas de uso

Anonymous Inner Class

Antes do Java 8 a necessidade de passar funccedilotildees ou expressotildees como paracircmetro de algummeacutetodo era suprida atraveacutes de Anonymous Inner Classes A utilizaccedilatildeo desse tipo dedeclaraccedilatildeo junto com a anotaccedilatildeo de Override permite sobrescrever um meacutetodo de umainterface funcional e ao mesmo tempo passa-la como argumento para um meacutetodo Umaexpressatildeo lambda se comporta da mesma forma poreacutem a quantidade de coacutedigo escritopela Anonymous Inner Class eacute maior e pode dificultar a leitura de coacutedigo pois conteacutemmuita informaccedilatildeo natildeo utilizada para efetivo entendimento do que estaacute sendo feito naqueletrecho

A Listagem 39 apresenta a instanciaccedilatildeo da classe EventHandler internamente ao meacute-todo setOnAction() de forma que o desenvolvedor possa escrever o comportamento quedeseja passar como paracircmetro do meacutetodo atraveacutes da substituiccedilatildeo do meacutetodo handle()que jaacute existe pelo meacutetodo handle() criado e escrito pelo desenvolvedor

1 btn setOnAction (new EventHandlerltActionEvent gt() 2 Override3 pub l i c void handle ( ActionEvent event ) 4 System out p r i n t l n ( He l lo World ) 5 6 )

Listagem 39 Exemplo de uso de Anonymous Inner Class [35]

Interface funcional

Ao projetar um coacutedigo novo o desenvolvedor que optar por utilizar expressotildees lambdadeve iniciar com a criaccedilatildeo de uma interface funcional Esse tipo de interface possui umuacutenico meacutetodo abstrato permitindo que expressotildees lambda sejam usadas para sobrescrevero comportamento do meacutetodo abstrato Uma interface funcional pode possuir outros meacuteto-dos desde que sejam default Uma nova anotaccedilatildeo FunctionalInterface foi adicionadacom a atualizaccedilatildeo do Java 8 para conferir em tempo de compilaccedilatildeo se a interface satisfazos requisitos desse modelo de interface

A Listagem 310 apresenta um exemplo de interface funcional com o objetivo de permi-tir o uso de expressotildees lambda que utilizaratildeo de dois Double como paracircmetro e jaacute utilizada nova anotaccedilatildeo FunctionalInterface introduzida no Java 8

1 Funct iona l Inte r face2 pub l i c i n t e r f a c e DoubleOp 3 pub l i c Double apply ( Double a Double b)

19

4

Listagem 310 Exemplo de interface funcional

Dessa forma conforme as Listagens 311 e 312 o meacutetodo apply() pode tomar formade qualquer operaccedilatildeo entre dois Double que seraacute especificada quando a expressatildeo lambdafor montada dando o aspecto de linguagem funcional agrave linguagem e mais facilidade eliberdade ao desenvolvedor

1 pub l i c c l a s s Ca l cu la to r 2 pub l i c s t a t i c Double c a l c ( Double op1 Double op2 DoubleOp operator ) 3 re turn operator apply ( op1 op2 ) 4 5

Listagem 311 Exemplo de aplicaccedilatildeo da interface funcional

1 Double r e s u l t 1 = Ca lcu la to r c a l c (10d 50d ( a b ) minusgt a + b)

Listagem 312 Uso de expressatildeo lambda para o exemplo anterior

Collections

Dentre as atualizaccedilotildees de pacotes do Java 8 foi adicionado um meacutetodo stream() nainterface Collection Esse meacutetodo trata as Collection como streams o que significa queapesar de natildeo ser possiacutevel acessar elementos diretamente algumas novas manipulaccedilotildeessatildeo possiacuteveis Essas manipulaccedilotildees satildeo na verdade meacutetodos da interface Stream quepodem receber como paracircmetro uma expressatildeo lambda ou seja um comportamento a seraplicado agrave Collection Dentre os meacutetodos temos

bull filter() O meacutetodo filter() recebe uma expressatildeo lambda contendo uma condiccedilatildeopara filtragem da collection

bull map() O meacutetodo map() mapeia os elementos de uma Collection em outro objetocomo uma String A expressatildeo lambda passada por paracircmetro deve retornar o tipode objeto ao qual seraacute mapeado

bull forEach() O meacutetodo forEach() aplica uma operaccedilatildeo especiacutefica para cada ele-mento da Collection A expressatildeo lambda a ser passada deve conter a operaccedilatildeo aser realizada

bull min() e max() Os meacutetodos min() e max() retornam o elemento menor ou maiorda Collection dependendo da expressatildeo lambda passada como paracircmetro

20

A Listagem 313 demonstra como vaacuterias operaccedilotildees com uma Collection podem seraplicadas de uma vez de forma que lendo a expressatildeo lambda jaacute eacute possiacutevel saber oresultado da aplicaccedilatildeo do meacutetodo agrave Collection

1 r o s t e r2 stream ( )3 f i l t e r (4 p minusgt p getGender ( ) == Person Sex MALE5 ampamp p getAge ( ) gt= 186 ampamp p getAge ( ) lt= 25)7 map(p minusgt p getEmailAddress ( ) )8 forEach ( emai l minusgt System out p r i n t l n ( emai l ) )

Listagem 313 Exemplo de utilizaccedilatildeo de meacutetodos de stream com expressotildees lambda [30]

21

Capiacutetulo 4

Estudo e o Processo de Mineraccedilatildeo

A definiccedilatildeo da metodologia utilizada para realizaccedilatildeo deste trabalho eacute importante para queexista uma padronizaccedilatildeo e melhor entendimento de como os resultados foram obtidos paraque a replicaccedilatildeo do mesmo possa ser realizada em trabalhos futuros [36]

Figura 41 Processo utilizado para realizaccedilatildeo do estudo

O esquema representado na Figura 41 descreve o processo seguido para a realizaccedilatildeodeste trabalho que foi divido em trecircs grandes etapas a de planejamento definindo osobjetivos questotildees de pesquisa e meios de investigaccedilatildeo deste projeto a etapa de execuccedilatildeorealizando todo o procedimento metodoloacutegico definido para a coleta e refinamento de

22

dados e a etapa de avaliaccedilatildeo onde foram classificados e avaliados os dados coletadospara responder agraves questotildees de pesquisa

A seguir na primeira seccedilatildeo seratildeo apresentadas em detalhes as questotildees de pesquisa aserem respondidas Em seguida seraacute feito uma breve descriccedilatildeo da fonte de dados utilizada- especificamente os projetos utilizados como objetos de estudo deste trabalho e por fimtodo o restante da metodologia que foi de fato desenvolvida para obter os resultadosnecessaacuterios

41 Questotildees de Pesquisa

Com o objetivo de entender e caracterizar melhor o uso de expressotildees lambda foramdefinidas as seguintes questotildees de pesquisa a serem respondidas

bull PQ-1 Quando os projetos comeccedilaram a introduzir o uso de expressotildees lambda emseus coacutedigos e qual a meacutedia de expressotildees lambda por snapshots caso existam

bull PQ-2 Como as equipes de desenvolvimento estatildeo utilizando expressotildees lambdaatraveacutes de refatoraccedilatildeo de coacutedigo ou introduzindo apenas em coacutedigo novo

bull PQ-3 Quais satildeo os padrotildees tipicamente adotados para o uso de expressotildees lambda

A primeira pergunta de pesquisa gira em torno de como projetos populares open-sourceestatildeo se adaptando agrave introduccedilatildeo de expressotildees lambda em Java muitos projetos jaacute estatildeoutilizando as expressotildees lambda Se sim a partir de quando comeccedilaram a utilizaacute-lasdesde o iniacutecio da introduccedilatildeo das mesmas no Java 8 ou em um periacuteodo mais tardio Aleacutemdisso eacute interessante descobrir se a utilizaccedilatildeo dessa nova caracteriacutestica tem acontecido deforma expressiva ou natildeo

Em seguida para melhor entender a forma como as expressotildees lambda estatildeo sendointroduzidas em projetos eacute interessante investigar se as equipes de desenvolvimento estatildeose preocupando em refatorar coacutedigo com o objetivo de evoluir o software ou se estatildeoexperimentando utilizar expressotildees lambda apenas em coacutedigo novo introduzido

Como a introduccedilatildeo de novas funcionalidades em projetos open-source de grande escaladepende do objetivo do projeto e os padrotildees de projeto utilizados [37] espera-se obser-var diversas abordagens quanto a utilizaccedilatildeo de expressotildees lambda para entatildeo poderclassificar estes softwares quanto a abordagem utilizada

Eacute de grande importacircncia para este estudo conseguir identificar na praacutetica comoexpressotildees lambda estatildeo sendo tipicamente adotadas nestes projetos Assim a terceirapergunta de pesquisa busca identificar alguns exemplos de utilizaccedilatildeo atraveacutes da realizaccedilatildeode alguns estudos de caso

23

Eacute importante ressaltar que apesar de as expressotildees lambda serem uma alternativa aouso de AIC elas natildeo os substituem completamente Existem precondiccedilotildees para que umaAIC possa ser substituiacuteda por expressotildees lambda [12] descritas a seguir

bull AIC deve instanciar-se de uma interface

bull AIC natildeo deve possuir nenhum campo e declarar apenas um meacutetodo

bull AIC natildeo deve possuir uma referecircncia para this ou super

bull AIC natildeo deve declarar um meacutetodo recursivo

Para responder agrave primeira pergunta apenas dados gerais sobre todos os projetos seratildeonecessaacuterios ao passo que pelas perguntas 2 e 3 possuiacuterem uma natureza mais complexaseraacute necessaacuterio aleacutem de uma anaacutelise geral estatiacutestica a realizaccedilatildeo de alguns estudos decaso para obter resultados mais completos

42 Fonte de Dados e Objetos de Estudo

Para responder agraves perguntas de pesquisa estabelecidas foram selecionados os 99 projetosmais populares na linguagem Java dentro da plataforma github ateacute a data da coleta dosdados feita em Abril de 2017 Satildeo considerados populares os repositoacuterios que possuema maior quantidade possiacutevel de estrelas (stars) A decisatildeo de escolher os 99 projetos maispopulares foi por sua natureza imparcial e ao mesmo tempo para que se possa analisarprojetos que satildeo de familiaridade e conhecimento da comunidade do github e de domiacuteniopuacuteblico Os 99 projetos estatildeo listados no Anexo I

Para entender a transiccedilatildeo feita por esses projetos entre as versotildees anteriores do Java eo Java 8 com as expressotildees lambda eacute necessaacuterio analisar o coacutedigo de vaacuterias versotildees a fimde observar alguma mudanccedila para cada projeto Como satildeo 99 projetos e vaacuterios dessesprojetos possuem milhares de linhas de coacutedigo e commits seria impossiacutevel avaliar todosos commits Optou-se entatildeo por coletar snapshots mensais de cada projeto conformeprocedimento tambeacutem seguido anteriormente [38] Cada snapshots representa o estadodo projeto em um determinado mecircs e como criteacuterio de escolha padratildeo todos os snapshotsequivalem ao uacuteltimo commit realizado no determinado mecircs que este representa

O proacuteximo passo eacute determinar o periacuteodo de tempo em que esses snapshots seriamcoletados Como Java 8 (e consequentemente as expressotildees lambda) foi introduzidoapenas em meados de 2014 [28] coletar dados de projetos a partir de um periacuteodo muitoantes deste ano natildeo agregaria valor ao estudo em questatildeo Definiu-se entatildeo um periacuteodopara a coleta mensal desses snapshots atraveacutes dos anos Janeiro de 2013 um ano antesda introduccedilatildeo do Java 8 para que se pudesse identificar para todos os projetos o mecircs

24

exato em que expressotildees lambda foram introduzidas ateacute o mecircs da coleta de dados Abrilde 2017

Eacute importante ressaltar que a definiccedilatildeo dos meses foi definida do dia primeiro de ummecircs ao dia primeiro do proacuteximo mecircs e por consequecircncia alguns snapshots que deveriamrepresentar o final de determinado mecircs correspondem na verdade a commits realizadosno dia primeiro do mecircs seguinte Por exemplo pode existir casos em que o commit querepresente o mecircs de Marccedilo de 2016 seja na verdade o commit realizado no dia primeirode Abril de 2016 Isso se deve a natureza da forma como os resultados de log de commitssatildeo obtidos pelo git [39] Poreacutem isso natildeo interfere nas anaacutelises ou no propoacutesito destetrabalho uma vez que foram realizadas verificaccedilotildees e validaccedilotildees para que natildeo existamdatas repetidas (e consequentemente commits repetidos) por repositoacuterio

Neste trabalho o termo projeto e repositoacuterio foram utilizados de forma intercaladapara representar a mesma coisa o software desenvolvido que possui um repositoacuterio naplataforma github Os termos commit snapshops e versotildees tambeacutem representam a mesmacoisa uma vez que foi definido que seriam utilizados apenas um commit por mecircs pararepresentar um determinado snapshot ou versatildeo do repositoacuterio em questatildeo

Todos os 99 projetos seratildeo utilizados para a realizaccedilatildeo de uma anaacutelise geral de ca-racterizaccedilatildeo do uso de expressotildees lambda Para as anaacutelises aprofundadas foi feito umcriteacuterio de classificaccedilatildeo para que apenas alguns projetos possam ser analisados em niacutevelde coacutedigo como estudos de caso

Resumindo foram escolhidos os 99 projetos mais populares de Java no github cole-tando dados mensais de seus commits a partir do ano de 2013 ateacute a data da coleta dosdados lembrando que nem todos os projetos existem desde 2013 (projetos mais recentes)

43 Processo de Mineraccedilatildeo

A abordagem utilizada para coletar e analisar os 99 projetos escolhidos como mostra aFigura 42 foi realizada de forma automatizada utilizando scripts python e dois projetosdesenvolvidos em Java para a coleta e tratamento de dados como descrito a seguir

Primeiramente foi realizado uma coacutepia dos repositoacuterios atuais de todos os 99 projetosmais populares do github em Java Para automatizar o processo foi desenvolvido umscript em python que lista todos os projetos escolhidos clona todos os repositoacuterios emuma pasta na maacutequina local e cria um arquivo temporaacuterio com as informaccedilotildees do nomede cada repositoacuterio e seu caminho absoluto na maacutequina local

25

Figura 42 Metodologia implementada para coleta e tratamento de dados

Em seguida foi necessaacuterio realizar o checkout de todas as versotildees entre Janeiro de2013 a Abril de 2017 de cada projeto Por motivos de otimizaccedilatildeo de espaccedilo da maacutequinalocal e automatizaccedilatildeo no processo de checkout utilizou-se de um segundo script pythonque realizava as seguintes tarefas para cada mecircs em cada projeto verificar se dentreo mecircs estipulado houve algum commit para aquele projeto se sim pega-se o hash douacuteltimo commit do mecircs realiza o checkout conta-se a quantidade de linhas de coacutedigo emJava que o projeto tem utilizando a biblioteca cloc e armazena todas as informaccedilotildeespertinentes referentes a todos os projetos que naquele mecircs tiveram commits para que oprojeto static-analysis possa entatildeo ser executado sobre esses projetos naquele determinadomomento As informaccedilotildees coletadas que satildeo utilizadas pelo static-analysis correspondemao nome do projeto o hash do commit para aquela versatildeo a pasta onde o projeto estaacutearmazenado na maacutequina local a quantidade de linhas de coacutedigo Java do projeto e datareferente ao commit Essas informaccedilotildees satildeo pertinentes para que o projeto static-analysisconsiga funcionar de forma correta projeto este descrito em detalhes a seguir

431 static-analysis

O static-analysis foi um projeto desenvolvido anteriormente a este trabalho pelos alunosThiago Cavalcanti e Vinicius de Almeida cujo objetivo eacute realizar a anaacutelise estaacutetica de

26

coacutedigos-fonte Java e gerar arquivos de saiacuteda contendo informaccedilotildees de classes e meacutetodoscom suas devidas ocorrecircncias de caracteriacutesticas da linguagem [40]

A anaacutelise estaacutetica de coacutedigo consiste em analisar um coacutedigo-fonte sem a necessidadede executaacute-lo Esse tipo de anaacutelise eacute de extrema importacircncia para manter um coacutedigo dequalidade evitar futuras refatoraccedilotildees e obter informaccedilotildees estatiacutesticas de forma raacutepida epraacutetica [41]

Seguindo esse princiacutepio o static-analysis foi projetado para receber um arquivo deentrada csv seguindo o padratildeo

Tipo da Aplicaccedilatildeo Inicio do projeto Antes ou Apoacutes Java 5 Nome do ProjetoVersatildeo Caminho absolutoQuantidade de linhas de coacutedigo

Atraveacutes da informaccedilatildeo do caminho absoluto do projeto o static-analysis varre osdiretoacuterios em busca dos arquivos fonte java realiza o parse desses arquivos e utilizade Visitors para extrair as informaccedilotildees desejadas e exporta-las em arquivos csv Ouso de Visitors permite que sejam escolhidas as informaccedilotildees desejadas para a consultacomo expressotildees Lambda e AIC s aleacutem de possibilitar que sejam implementados novosVisitors conforme a linguagem evolua ou as necessidades mudem

Para este trabalho foram utilizados os Visitors de expressotildees Lambda map() filter()AICs e declaraccedilotildees de meacutetodos

432 BDAnalisador

Apoacutes obter todas as informaccedilotildees necessaacuterias geradas pelo static-analysis era preciso ma-nipular os dados de forma que facilitasse a coleta de dados para o estudo proposto Comovaacuterios arquivos em formato csv satildeo de difiacutecil manipulaccedilatildeo foi desenvolvido entatildeo umaferramenta chamada BDAnalisador Esta ferramenta eacute responsaacutevel por processar os arqui-vos em csv gerados pelo static-analysis e popular uma base de dados relacional MySQLcom as informaccedilotildees pertinentes a este estudo

O BDAnalisador foi desenvolvido com a intenccedilatildeo de tornar mais simples o trabalhocom os dados resultantes do static-analysis de forma que consultas em SQL pudessemser feitas a ponto de permitir a obtenccedilatildeo de resultados mais complexos Seguindo esseobjetivo o framework Hibernate foi escolhido como ferramenta para persistecircncia devidoa ser um framework jaacute consolidado no mercado e que de forma simples relaciona osobjetos Java ao banco de dados MySQL [42] A divisatildeo de classes foi projetada em quatroentidades Projeto Versao Classe e Metodo cada uma com seus respectivos camposcontendo as informaccedilotildees necessaacuterias para a pesquisa como pode ser visto na Figura 44Eacute importante ressaltar que a tabela de Versao guarda hashs de commits devido agrave escolhade utilizar commits para obter mais informaccedilatildeo de evoluccedilatildeo de coacutedigo em um menor

27

espaccedilo de tempo Aleacutem disso para este trabalho optou-se por persistir todos os meacutetodose classes de cada versatildeo sem se importar com a repeticcedilatildeo desses dados pois a hipoacutetesede haver grandes refatoraccedilotildees entre versotildees poderia comprometer a confiabilidade dasinformaccedilotildees

Figura 43 Diagrama de classes UML do BDAnalisador

Como visto na Figura 43 seguindo parcialmente a arquitetura MVC cada entidadepossui sua respectiva classe DAO(Data Access Object) para persistecircncia dos dados eapenas uma classe Controlador no projeto responsaacutevel pela manipulaccedilatildeo e parse dosdados dos arquivos csv gerados pelo static analysis para serem enviados agraves classes DAOO sistema inicia chamando o meacutetodo inicializar() da classe Controlador Esse meacutetodoeacute responsaacutevel por ler um arquivo de entrada csv que segue o mesmo modelo do arquivo dostatic-analysis citado na seccedilatildeo anterior O arquivo conteacutem os dados de todos os projetose suas respectivas versotildees dessa forma o meacutetodo instancia um objeto da classe Projetoe persiste o projeto no banco de dados Para cada versatildeo encontrada no arquivo deentrada o inicializar() aciona os meacutetodos responsaacuteveis por instanciar e preencher aslistas da classe Classe e Metodo Os meacutetodos responsaacuteveis por preencher as listas varremos arquivos csv gerados pelo static-analysis e fazem o parse das informaccedilotildees relevantescomo nomes dos meacutetodos e quantidades de lambdas para construir os objetos que seratildeogravados Ao final dos preenchimentos o objeto Versatildeo eacute instanciado e gravado no bancode dados atraveacutes de sua classe DAO ao mesmo tempo que grava suas respectivas Classese Metodos

28

Apoacutes vaacuterios testes e correccedilotildees de bugs o banco de dados se encontrava finalmente comas informaccedilotildees de 99 projetos Java open-source separados por um commit por mecircs desde2013 cada um com suas respectivas informaccedilotildees de classes meacutetodos e a quantidade deexpressotildees lambda filters e maps em cada meacutetodo Filter ou Filter pattern eacute o padratildeode projeto que tem como objetivo filtrar objetos de uma coleccedilatildeo (Collection) de acordocom algum criteacuterio Jaacute o map ou map pattern eacute um padratildeo que ldquomapeia os elementosde uma coleccedilatildeo aplicando uma funccedilatildeo a eles para uma nova coleccedilatildeo [43] A coleta deinformaccedilotildees sobre esses padrotildees podem ser uacuteteis para possiacuteveis anaacutelises de oportunidadesde uso de expressotildees lambda para refatoraccedilatildeo de coacutedigo

A Figura 44 mostra o esquema de como o banco de dados resultante foi gerado

Figura 44 Modelo relacional do banco de dados populado pelo BDAnalisador Imagemgerada com software DBeaver [2]

44 Classificaccedilatildeo e Anaacutelise

Com o banco de dados populado restam apenas as etapas de classificaccedilatildeo e anaacutelise pararesponder as questotildees de pesquisa propostas Para isso inicialmente houve uma tentativade se utilizar apenas queries SQL para analisar os dados de acordo com as informaccedilotildeesrelevantes Poreacutem devido ao fato de o banco de dados conter todas as informaccedilotildees detodos os projetos e todas as suas versotildees queries que possuem uma alta complexidadedemoravam muito tempo para retornar os dados

Assim com o objetivo de facilitar o trabalho alguns scripts python foram desenvolvi-dos para rodar as queries separadamente e individualmente para cada projeto de formaautomatizada a fim de melhorar o tempo de resposta para obtenccedilatildeo dos resultados

29

441 Meacutedia de Lambda

O primeiro script retorna a quantidade de expressotildees lambda (ou AICs) por n snapshotsque contenha expressotildees lambda O objetivo eacute ter uma visatildeo geral da meacutedia de expressotildeeslambda e AICs utilizadas por cada projeto e como nem todos os snapshots coletados decada projeto possuem expressotildees lambda e AICs apenas aqueles com alguma expressatildeolambda ou AIC satildeo incluiacutedos no caacutelculo da meacutedia

Mmedia =sumn qtdLambdai

n

442 Anaacutelise Temporal

O segundo script retorna para cada projeto a soma total da quantidade de expressotildeeslambda AIC map() e filter() no projeto inteiro para cada versatildeo Ou seja tem-seo total de cada uma das quatro propriedades selecionadas para cada mecircs do projetoobtendo assim uma visatildeo temporal de evoluccedilatildeo do uso das caracteriacutesticas descritas ATabela 41 ilustra parcialmente o resultado obtido para o projeto agera onde idVersaoeacute o identificador no banco de dados referente ao hash do commit mensal coletado qtd eacutea quantidade de cada uma das caracteriacutesticas escolhidas e a data do commit encontra-seno formato americano

Tabela 41 Informaccedilotildees mensais sobre o projeto ageraidVersao Data do Commit qtd lambda qtd AIC qtd maps qtd filter

823 512016 0 29 4 0755 612016 13 28 4 0686 6152016 13 29 4 0621 812016 13 29 4 0555 8162016 13 30 4 0485 922016 13 30 4 0422 10132016 14 30 4 0356 11282016 14 30 4 0295 12212016 21 30 5 0232 212017 21 30 5 0175 312017 21 30 5 0112 3312017 21 36 5 048 4242017 21 48 5 0

Os resultados obtidos com esta anaacutelise temporal permitiu a identificaccedilatildeo de padrotildees nautilizaccedilatildeo de expressotildees lambda em relaccedilatildeo a utilizaccedilatildeo de AIC por todos os projetos Foi

30

possiacutevel classificar todos os projetos em 6 grupos ilustrado na Figura 45 Primeiramenteseparou-se os projetos entre os que possuem expressotildees lambda e os que natildeo possuemDentre os que possuem identificou-se cinco categorias

1 Grupo 1 Quantidade de AICs e expressotildees lambda aumentam com o tempo pro-porcionalmente

2 Grupo 2 Quantidade de AICs diminui agrave medida que a quantidade de expressotildeeslambda aumentam e a quantidade de expressotildees lambda ultrapassa a quantidade deAIC em um determinado momento

3 Grupo 3 Quantidade de AICs diminui agrave medida que a quantidade de expressotildeeslambda aumentam mas a quantidade de AIC permanece superior agrave quantidade delambda

4 Grupo 4 Expressotildees lambda satildeo introduzidas e existem por um pequeno periacuteodode tempo mas satildeo completamente removidas posteriormente

5 Grupo 5 Quantidade de expressotildees lambda eacute constante e muito inferior compa-rado com a quantidade de AICs no projeto Foi determinado que para pertencera esta classificaccedilatildeo o projeto precisa ter uma razatildeo de meacutedia de expressotildees lamb-dasnapshot por meacutedia de AICsnapshot inferior a 020 Esse paracircmetro foi esta-belecido com o objetivo de definir um padratildeo para o que pode ser considerado umprojeto com poucas expressotildees lambda

Figura 45 Classificaccedilatildeo dos projetos

31

443 Refatoraccedilatildeo de Coacutedigo

O uacuteltimo script teve como objetivo realizar uma tentativa inicial de identificar refatoraccedilatildeode coacutedigo da seguinte maneira para todos os projetos que possuem expressotildees lambdaforam identificados o mecircs imediatamente antes da introduccedilatildeo de expressotildees lambda e omecircs seguinte onde houve a primeira ocorrecircncia de lambda no projeto Assim realizou-se uma anaacutelise do tamanho em quantidade de linhas de coacutedigo de todos os meacutetodosdo projeto que no mecircs seguinte tiveram introduccedilatildeo de lambda Em seguida fez-se umacomparaccedilatildeo com os mesmos meacutetodos em relaccedilatildeo ao mecircs anterior e assim foi possiacuteveldetectar quais meacutetodos tiveram a quantidade de linhas de coacutedigo reduzidas o que seriaum indicativo natildeo necessariamente exclusivo de que uma refatoraccedilatildeo de coacutedigo possa terocorrido

Sabe-se que este meacutetodo de detecccedilatildeo de refatoraccedilatildeo de coacutedigo possui suas limitaccedilotildeesuma vez que as comparaccedilotildees para saber se um meacutetodo existe em ambas versotildees eacute feitopuramente por comparaccedilatildeo de String (nome do meacutetodo) e a classe que este pertence

444 Casos de Uso

Os meacutetodos descritos acima ajudaram a identificar alguns padrotildees e facilitar a anaacutelise dosdados Poreacutem natildeo satildeo suficientes para que se possa responder agraves questotildees de pesquisaDessa forma apoacutes a identificaccedilatildeo dos grupos de classificaccedilatildeo para os projetos foramescolhidos um projeto de cada grupo (com exceccedilatildeo do grupo dos projetos sem expressotildeeslambda) para realizar um breve estudo de caso com o objetivo de identificar e caracterizarmelhor a adoccedilatildeo de expressotildees lambda Os projetos escolhidos foram agera vertxAndroid-CleanArchitecture RxJava e guava

32

Capiacutetulo 5

Resultados Obtidos e Anaacutelise

Neste capiacutetulo seratildeo apresentados os dados obtidos e anaacutelise com o objetivo de responderagraves questotildees de pesquisa propostas Como mencionado anteriormente as perguntas seratildeorespondidas de duas maneiras algumas com informaccedilotildees gerais sobre todos os projetose outras com breve estudos de caso envolvendo cinco projetos

51 Visatildeo Geral

Dentre os repositoacuterios coletados para a anaacutelise 74 (7474) natildeo utilizaram nenhumaexpressatildeo lambda no projeto durante todo o periacuteodo analisado (Janeiro de 2013 a Abrilde 2017) restando apenas 25 repositoacuterios (2525) com expressotildees lambda Eacute interessantedestacar que apesar de a quantidade de repositoacuterios que natildeo possuem expressotildees lambdaser relativamente expressiva muitos destes repositoacuterios satildeo de projetos em Java que umdia foram populares e atualmente natildeo estatildeo sendo mais desenvolvidos (por exemplo umaplicativo que soacute funciona para Android 23 atualmente descontinuado)

Levando em consideraccedilatildeo apenas os projetos que possuem expressotildees lambda exis-tem dois tipos de dados que podem ser analisados para responder agrave primeira questatildeo depesquisa atraveacutes dos dados obtidos pelo meacutetodo anteriormente mencionado como anaacutelisetemporal e a meacutedia de lambda por snapshot mencionados no capiacutetulo anterior

Com relaccedilatildeo ao ano em que a primeira ocorrecircncia foi encontrada 6 projetos introduzi-ram expressotildees lambda jaacute em 2014 8 comeccedilaram a utilizar em 2015 7 em 2016 e apenas4 tiveram a primeira ocorrecircncia de expressotildees lambda em 2017 Dessa forma percebe-seque os projetos estatildeo relativamente bem distribuiacutedos em grupos quanto ao ano em que seintroduziu expressotildees lambda

Pela meacutedia de lambda por snapshot (lambdasnapshot) a maioria (11 projetos) possuiuma quantidade expressiva acima de 100 lambdasnapshot (com 6 projetos entre 20 e 100lambdasnapshot e 8 projetos com menos de 20 lambdasnapshot) como apresentados no

33

graacutefico da Figura 51 Isso mostra que essa nova caracteriacutestica jaacute estaacute sendo bem utilizadanos projetos que comeccedilaram a migrar para a nova versatildeo do Java

Figura 51 Graacuteficos dos projetos separados por ano de introduccedilatildeo de expressotildees lambdae meacutedia de lambda por snapshot

Com isso pode-se observar que apesar de a quantidade de projetos que possuemexpressotildees lambda natildeo ser tatildeo alta eacute possiacutevel obter resultados expressivos uma vez quea quantidade dos projetos com lambda estatildeo bem dispersos quanto ao periacuteodo em quecomeccedilaram a adotar essa caracteriacutestica e a quantidade de expressotildees lambda por snapshot

511 Projetos Selecionados

Atraveacutes dos grupos de classificaccedilatildeo identificados pela anaacutelise temporal descritos na Figura45 cinco projetos foram selecionados para uma anaacutelise detalhada levando em consideraccedilatildeoo grupo em que eles pertencem Estes projetos seratildeo apresentados a seguir

512 agera

Agera eacute uma biblioteca Android que ajuda a introduzir programaccedilatildeo funcional reativa(functional reactive programming) em projetos Android Eacute um projeto recente lanccediladoem 2016 pela Google [44] e encontra-se no grupo dos projetos que introduziram expressotildeeslambda em 2016 no mesmo ano de seu lanccedilamento contendo uma meacutedia de expressotildeeslambda de 16 lambdasnapshot

Na classificaccedilatildeo estabelecida agera pertence ao Grupo 1 onde a quantidade de ex-pressotildees lambda no projeto com o tempo aumentam juntamente com a quantidade deAICs como mostra o graacutefico de anaacutelise temporal na Figura 52

34

Figura 52 Graacuteficos de anaacutelise temporal do projeto agera

513 vertx

Eclipse Vertx eacute um conjunto de ferramentas para criaccedilatildeo de reactive applications namaacutequina virtual Java (JVM) em grande escala [45] Seu primeiro lanccedilamento aconteceuem 2011 e a primeira ocorrecircncia de expressotildees lambda no projeto aconteceu em 2014 Esteprojeto possui uma meacutedia de 2867 lambdasnapshot e dentre os projetos consideradosneste trabalho eacute o que possui a maior quantidade de expressotildees lambda

Este projeto pertence ao Grupo 2 onde a quantidade de expressotildees lambda aumen-tou consideravelmente pelos meses ultrapassando a quantidade de AICs que diminuiudrasticamente como mostra a Figura 53

35

Figura 53 Graacuteficos de anaacutelise temporal do projeto Vertx

514 Android-CleanArchitecture

Apesar de ser uma amostra de projeto Android-CleanArchitecture que tem como objetivoconstruir aplicaccedilotildees Android utilizando clean architecture foi lanccedilado em 2014 mas semanteacutem sempre atualizado [46]

A introduccedilatildeo de expressotildees lambda que aconteceu no ano de 2015 se deu de formatiacutemida com uma meacutedia de 35 lambdasnapshot De qualquer forma este projeto conseguerepresentar com seu graacutefico de anaacutelise temporal o grupo 3 composto por projetos em quea quantidade de expressotildees lambda aumentou mas sem ultrapassar AICs que diminuiacuteramdemonstrado no graacutefico da Figura 54

36

Figura 54 Graacuteficos de anaacutelise temporal do projeto Android-CleanArchitecture

515 RxJava

Dentre os repositoacuterios estudados RxJava eacute considerado o mais popular Como umaimplementaccedilatildeo de Reactive Extensions para a JVM RxJava teve seu lanccedilamento dadoem 2013 [47] Expressotildees lambda apareceram pela primeira vez no ano de 2015 comuma meacutedia de 766 lambdasnapshot

Apesar de uma meacutedia relativamente alta o tempo de vida das expressotildees lambda nesteprojeto foi bem curto caracterizando assim projetos do grupo 4 houve a introduccedilatildeo dasexpressotildees lambda no projeto poreacutem houve a remoccedilatildeo completa de todas as expressotildeeslambda previamente introduzidas desaparecendo completamente do projeto ateacute a datada coleta de dados (Figura 55)

37

Figura 55 Graacuteficos de anaacutelise temporal do projeto RxJava

516 guava

Guava eacute um conjunto de bibliotecas para Java da Google lanccedilado em 2011 A atualizaccedilatildeodo coacutedigo do projeto para Java 8 aconteceu somente em 2016 e apesar do projeto conteruma meacutedia de 281 lambdasnapshot ele foi escolhido como representante dos projetosdo Grupo 5 (Figura 56) que possuem expressotildees lambda mas de forma natildeo expressiva osuficiente quando comparado com a quantidade de AIC pelo fato de sua razatildeo de meacutedia delambdasnapshot por meacutedia de AICsnapshot ser 004 Ou seja embora o projeto tenhaexpressotildees lambda estas satildeo consideradas muito poucas quando inseridas no contextogeral deste projeto que eacute considerado um projeto grande

38

Figura 56 Graacuteficos de anaacutelise temporal do projeto Guava

52 Refatoraccedilatildeo de Coacutedigo

Com o objetivo de caracterizar melhor como as expressotildees lambda estatildeo sendo utilizadaseacute interessante identificar se estas estatildeo sendo introduzidas atraveacutes de refatoraccedilatildeo de coacutedigoou em coacutedigo novo

Os projetos classificados como pertencentes ao Grupo 2 possuem em comum o fatode expressotildees lambda aumentarem a medida que AICs diminuem ultrapassando-as eessa caracteriacutestica em comum pode indicar que nestes projetos possivelmente houve re-fatoraccedilatildeo de coacutedigo visto que AIC sendo substituiacutedo por expressotildees lambda dentro dascondiccedilotildees determinadas eacute a maneira mais comum de se identificar refatoraccedilatildeo de coacute-digo para introduccedilatildeo de expressotildees lambda [12] Os projetos que compotildeem o grupo 2representam 44 de todos os projetos estudados que possuem expressotildees lambda o quepode ser um indicativo caso a hipoacutetese de refatoraccedilatildeo de coacutedigo seja positiva de quemuitos projetos que estatildeo adotando o Java 8 estatildeo se preocupando de alguma formacom refatoraccedilatildeo se coacutedigo Fazem parte desse grupo os seguintes projetos elasticsearchjava-design-patterns PocketHub presto RxJava-Android-Samples spark vertx zipkinjava8-tutorial dropwizard e material-dialogs

39

Outra maneira de verificar possiacuteveis indicadores de refatoraccedilatildeo de coacutedigo foi atraveacutesda anaacutelise dos tamanhos (em quantidade de linhas de coacutedigo) dos meacutetodos com expressotildeeslambda no mecircs em que se introduziu expressotildees lambda e um mecircs imediatamente antesdeste Essa anaacutelise mostra que dos 25 projetos com expressotildees lambda 12 (48) projetostiveram ao menos um meacutetodo em que houve uma diminuiccedilatildeo no tamanho o que podeser considerado um indicativo de refatoraccedilatildeo de coacutedigo A Figura 57 mostra todos osprojetos em relaccedilatildeo agrave quantidade total de meacutetodos que possuem lambda no primeiro mecircsde introduccedilatildeo do mesmo em vermelho comparado com a quantidade desses meacutetodos quetiveram uma diminuiccedilatildeo no tamanho quando comparados com o coacutedigo do mecircs anteriorem azul

Figura 57 Comparaccedilatildeo entre todos os projetos com expressatildeo lambda sobre refatoraccedilatildeode coacutedigo no mecircs de introduccedilatildeo da caracteriacutestica

Ainda observando a figura 57 com relaccedilatildeo aos projetos que natildeo tiveram nenhummeacutetodo com diminuiccedilatildeo de tamanho (barra azul) percebe-se que todos os 13 projetossequer tiveram uma quantidade significativa de meacutetodos que possuem expressotildees lambda(com o maior tendo apenas 5 meacutetodos) no mecircs de introduccedilatildeo da caracteriacutestica no projetoe ao mesmo tempo jaacute existiam no mecircs em que natildeo existia lambda no projeto Essa eacuteuma observaccedilatildeo importante porque projetos como vertx sendo este o que possui a maiormeacutedia de lambdasnapshot de todos os projetos e ao mesmo tempo tendo apenas trecircsmeacutetodos que continham expressotildees lambda no mecircs da introduccedilatildeo e que existiam no mecircs

40

anterior permitem inferir que todas as outras expressotildees lambda existentes no projetopara este determinado mecircs de introduccedilatildeo encontram-se em coacutedigo novo introduzido

Eacute importante ressaltar que somente essa anaacutelise natildeo eacute exclusivamente suficiente paradeterminar se estes projetos estatildeo realmente introduzindo lambda em coacutedigo novo ourealizando refatoraccedilatildeo uma vez que como a comparaccedilatildeo aconteceu apenas no mecircs deintroduccedilatildeo com o mecircs imediatamente anterior natildeo reflete todo o ciclo de vida do pro-jeto Por exemplo algumas equipes podem escolher refatorar o coacutedigo depois de umtempo de adaptaccedilatildeo apoacutes a transiccedilatildeo para a nova versatildeo da linguagem Assim paraobter uma melhor anaacutelise sobre refatoraccedilatildeo de coacutedigo ou natildeo feita nestes projetos aleacutemde outras anaacutelises referentes aos padrotildees tipicamente adotados para implementaccedilatildeo delambda nestes projetos seratildeo apresentados a seguir os estudos de caso dos cinco projetospreviamente selecionados

Outro ponto importante eacute o fato de que apesar das informaccedilotildees quanto agraves quantida-des de filter e map terem sido incluiacutedas inicialmente no trabalho para observar possiacuteveispadrotildees de refatoraccedilatildeo de coacutedigo percebeu-se que estas natildeo satildeo utilizadas de forma con-sideraacutevel pelos projetos estudados e para fins de anaacutelises generalizadas natildeo apresentaramtanta influecircncia na utilizaccedilatildeo de expressotildees lambda quanto a quantidade de AICs noprojeto

53 Estudos de Caso

Dentre os projetos analisados verificou-se que os projetos de pequeno e meacutedio porte op-taram por refatorar de uma vez seus coacutedigos para incluir expressotildees lambda em situaccedilotildeesem que se utilizava AICs anteriormente ou em alguns poucos casos de utilizaccedilatildeo deCollection Os projetos de grande porte natildeo apresentaram nenhuma refatoraccedilatildeo de coacute-digo ou uma refatoraccedilatildeo parcial gradativa provavelmente devido agrave grande quantidade dearquivos e coacutedigo que possuem o que pode tornar o trabalho de refatoraccedilatildeo extenso ecansativo

O projeto vertx que pertence ao grupo 2 dos projetos em que a quantidade de ex-pressotildees lambda aumentaram e as de AICs diminuiacuteram com lambda ultrapassando AICsexecutou inicialmente commits em maio de 2014 com adiccedilatildeo de coacutedigo novo utilizandoexpressotildees lambda e apoacutes um mecircs realizou um commit maior com a refatoraccedilatildeo de todasas AICs para expressotildees lambda Apoacutes a refatoraccedilatildeo o projeto se preocupou em mantera utilizaccedilatildeo de expressotildees lambda ao mesmo tempo que o uso de AICs se manteve apenasaos casos de classes com interfaces natildeo funcionais A Figura 58 apresenta uma parte docommit de refatoraccedilatildeo de coacutedigo que mostra em vermelho a parte eliminada do coacutedigo(AIC) e em verde o coacutedigo novo representando a substituiccedilatildeo por uma expressatildeo lambda

41

Figura 58 Commit de refatoraccedilatildeo de coacutedigo do projeto Vertx [3]

Alguns projetos ainda natildeo se preocuparam em refatorar o coacutedigo para o uso de ex-pressotildees lambda ateacute a data deste trabalho que eacute o caso do projeto guava que apresentouum commit em 03112016 com a atualizaccedilatildeo do projeto para Java 8 Mas a partir daatualizaccedilatildeo se preocupou em utilizar as expressotildees lambda apenas na implementaccedilatildeo decoacutedigo novo O cenaacuterio em que a refatoraccedilatildeo natildeo eacute prioridade ainda eacute a realidade de vaacuteriosprojetos de grande porte visto que os dados de projetos sem nenhuma expressatildeo lambdasatildeo o maior nuacutemero neste trabalho Poreacutem projetos que jaacute adotaram a utilizaccedilatildeo do Java8 tendem a mudar isso com o passar do tempo A Figura 59 apresenta em verde umaadiccedilatildeo de coacutedigo novo com expressatildeo lambda sem a eliminaccedilatildeo de algum coacutedigo anteriora esse que estaria em vermelho

42

Figura 59 Exemplo de um arquivo do commit de adiccedilatildeo de coacutedigo novo em Java 8 doprojeto Guava [4]

Na categoria de projetos em que os AICs e expressotildees lambda aumentam proporci-onalmente (grupo 1) o projeto agera realizou um commit em 19052016 com a adiccedilatildeoda biblioteca retrolambda como dependecircncia do projeto Essa biblioteca utilizada prin-cipalmente por projetos Android permite executar coacutedigo Java 8 contendo expressotildeeslambda em Java 5 6 e 7 [48] O commit tambeacutem apresenta refatoraccedilatildeo dos AICs ad-vindos de interfaces funcionais para expressotildees lambda Apesar de o projeto continuar autilizar as expressotildees lambda em seus commits posteriores o nuacutemero de AICs tambeacutemcontinuou a aumentar visualizando os commits posteriores notou-se que esses AICs satildeorelativos a interfaces natildeo funcionais ou seja que possuem mais de um meacutetodo O projetoAndroid-CleanArchitecture eacute similar ao agera pois tambeacutem optou pela instalaccedilatildeo da bi-blioteca retrolambda para uso de expressotildees lambda em seus coacutedigos e como tambeacutem eacuteum projeto de pequeno porte houve uma pequena refatoraccedilatildeo dos AICs A Figura 510mostra a parte do commit de refatoraccedilatildeo de coacutedigo em que o desenvolvedor adiciona abiblioteca retrolambda como dependecircncia

43

Figura 510 Commit de adiccedilatildeo da biblioteca Retrolambda no projeto Agera [5]

Outro caso interessante eacute o do projeto RxJava que em 2015 optou pela refatoraccedilatildeodo coacutedigo para a utilizaccedilatildeo de expressotildees lambda quase eliminando por completo o usode AICs mas que no ano seguinte reverteu os commits de forma que eliminasse comple-tamente o uso de expressotildees lambda para manter a retrocompatibilidade com o Java 6A Figura 511 demonstra uma parte do commit de reversatildeo do coacutedigo para Java 6 emque pode ser visto em vermelho o coacutedigo anterior com expressotildees lambda e o verde como novo coacutedigo utilizando AIC novamente

44

Figura 511 Commit de remoccedilatildeo de Lambdas e volta para o uso de AICs no projetoRXJava [6]

Essa preocupaccedilatildeo com retrocompatibilidade de coacutedigo pode ser um fator crucial nadecisatildeo das equipes de desenvolvimento na hora de decidir como fazer o software co-evoluircom a linguagem sem perder a compatibilidade com versotildees anteriores

45

Capiacutetulo 6

Consideraccedilotildees Finais

Este estudo permitiu entender melhor como projetos estatildeo realizando a migraccedilatildeo para oJava 8 em especial utilizando uma nova caracteriacutestica introduzida expressatildeo lambdaApesar de a maioria dos projetos populares considerados natildeo possuiacuterem nenhuma ocor-recircncia de expressotildees lambda os projetos que tinham expressotildees lambda foram suficientespara realizar um primeiro estudo de caracterizaccedilatildeo no uso desta caracteriacutestica e com osprojetos efetivamente utilizados para estudo foi possiacutevel agrupaacute-los quanto a maneira emque as expressotildees lambda estavam sendo utilizadas quando comparadas com AICs em 5grandes grupos quando AIC e lambda aumentam proporcionalmente quando AIC dimi-nui e lambda aumenta ultrapassando AIC quando AIC diminui mas continua superior aolambda crescente expressotildees lambda que foram introduzidas e retiradas completamentedo coacutedigo e expressotildees lambda que natildeo existem em quantidades expressivas

Foi possiacutevel entatildeo realizar um estudo aprofundado levando em consideraccedilatildeo as di-ferentes maneiras com que as expressotildees lambda foram adotadas nos projetos atraveacutes daescolha de um projeto que representasse cada grupo para anaacutelise Dentre os cinco projetosestudados foi possiacutevel observar alguns padrotildees tipicamente adotados por desenvolvedorespara implementar expressotildees lambda em seus projetos como a utilizaccedilatildeo da bibliotecas(retrolambda) que permitissem uma flexibilizaccedilatildeo na utilizaccedilatildeo de expressotildees lambda oucomo lambda eacute primariamente utilizada para substituir determinados AICs ou operaccedilotildeesem Collection

Aleacutem disso foi possiacutevel observar como a refatoraccedilatildeo de coacutedigo acontece em cada umdesses projetos Observou-se como projetos menores tendem a refatorar coacutedigo maisfacilmente ao passo que projetos maiores e mais complexos fazem menos refatoraccedilatildeo oudemoram mais entre o periacuteodo em que houve a primeira migraccedilatildeo de coacutedigo para a novaversatildeo da linguagem ateacute o periacuteodo em que realmente decidem refatorar coacutedigo Aleacutem dacomplexidade do projeto influenciar na decisatildeo de migrar o projeto para uma versatildeo maisrecente da linguagem a preocupaccedilatildeo com retrocompatibilidade com versotildees anteriores da

46

linguagem tambeacutem podem ser uma barreira para que projetos comecem a evoluir o coacutedigojuntamente com a evoluccedilatildeo da linguagem

Ainda assim foi possiacutevel observar que a preocupaccedilatildeo com a co-evoluccedilatildeo do software-linguagem existe entre os desenvolvedores de projetos mas a realizaccedilatildeo da migraccedilatildeo aindaacontece lentamente devido agrave diversos fatores que precisam ser levados em consideraccedilatildeopara a manutenccedilatildeo do projeto

Para trabalhos e contribuiccedilotildees futuras seria interessante desenvolver uma ferramentaque pudesse analisar diretamente no coacutedigo-fonte as oportunidades de aplicaccedilatildeo de ex-pressotildees lambda dessa forma poderiam ser analisadas as porcentagens de conversatildeo decoacutedigo para Java 8 e obter melhores conclusotildees sobre a importacircncia que os projetos estatildeodando para a evoluccedilatildeo de seus coacutedigos Outro fator interessante seria aplicar mais Visitorsagrave ferramenta static-analysis e fazer este mesmo estudo aplicado agrave outras caracteriacutesticasda linguagem

47

Referecircncias

[1] Kagdi Huzefa Michael L Collard e Jonathan I Maletic A survey and taxonomyof approaches for mining software repositories in the context of software evolution2007 ix 3 8 9 10 11

[2] DBeaver Dbeaver - features httpdbeaverjkissorgdocsfeatures ix 29

[3] Eclipse Vertx commit Java8-ify code httpsgithubcomeclipsevertxcommit93f95e9c77419f442a42fe711b6eeaef88192fd3 ix 42

[4] Google Guava commit Release java 8 changes to guava httpsgithubcomgoogleguavacommit73e382fa877f80994817a136b0adcc4365ccd904 ix 43

[5] Google Agera commit Collapsed testapp with retrolambda httpsgithubcomgoogleageracommit5e518b7b05f9e7a34a314945f68deff7b2c3e334 ix 44

[6] ReactiveX Rxjava commit 2x full jdk 6 compatible backport + includ-ing bugfixes up to today httpsgithubcomReactiveXRxJavacommit000a174d87a901135f9665d3b11f3627fd2dc4ed ix 45

[7] Godfrey M W e D M German The past present and future of software evolutionEm 2008 Frontiers of Maintenance paacuteginas 129ndash138 Sept 2008 1 6

[8] Favre J M Languages evolve too changing the software time scale Em Principles ofSoftware Evolution Eighth International Workshop on paacuteginas 33ndash42 IEEE 20051 5 7

[9] Overbey Jeffrey L e Ralph E Johnson Regrowing a language refactoring tools allowprogramming languages to evolve Em ACM SIGPLAN Notices volume 44 paacuteginas493ndash502 ACM 2009 1 5 7 8 12

[10] Grechanik Mark Collin McMillan Luca DeFerrari Marco Comi Stefano CrespiDenys Poshyvanyk Chen Fu Qing Xie e Carlo Ghezzi An empirical investiga-tion into a large-scale java open source code repository Em Proceedings of the2010 ACM-IEEE International Symposium on Empirical Software Engineering andMeasurement ESEM rsquo10 paacuteginas 111ndash1110 New York NY USA 2010 ACMISBN 978-1-4503-0039-1 httpdoiacmorg10114518527861852801 1

[11] TIOBE Tiobe httpswwwtiobecomtiobe-index 1 14

48

[12] Gyori Alex Lyle Franklin Danny Dig e Jan Lahoda Crossing the gap from im-perative to functional programming through refactoring Em Proceedings of the 20139th Joint Meeting on Foundations of Software Engineering ESECFSE 2013 paacute-ginas 543ndash553 New York NY USA 2013 ACM ISBN 978-1-4503-2237-9 httpdoiacmorg10114524914112491461 2 11 24 39

[13] OpenJDK State of the lambda httpcropenjdkjavanet~briangoetzlambdalambda-state-4html 2

[14] Han Jiawei Micheline Kamber e Jian Pei Data Mining Concepts and TechniquesMorgan Kaufmann Publishers Inc San Francisco CA USA 3rd ediccedilatildeo 2011ISBN 0123814790 9780123814791 3

[15] Fowler Martin e Kent Beck Refactoring improving the design of existing codeAddison-Wesley Professional 1999 5 7

[16] Lehman M M J F Ramil P D Wernick D E Perry e W M Turski Met-rics and laws of software evolution - the nineties view Em Proceedings of the4th International Symposium on Software Metrics METRICS rsquo97 paacuteginas 20ndashWashington DC USA 1997 IEEE Computer Society ISBN 0-8186-8093-8 httpdlacmorgcitationcfmid=823454823901 6

[17] Hassan Ahmed E e Tao Xie Software intelligence The future of mining softwareengineering data Em Proceedings of the FSESDP Workshop on Future of SoftwareEngineering Research FoSER rsquo10 paacuteginas 161ndash166 New York NY USA 2010ACM ISBN 978-1-4503-0427-6 httpdoiacmorg101145188236218823978 9

[18] Hassan Ahmed E The road ahead for mining software repositories Em Frontiers ofSoftware Maintenance 2008 FoSM 2008 paacuteginas 48ndash57 IEEE 2008 8

[19] Berry Michael J e Gordon Linoff Data Mining Techniques For Marketing Salesand Customer Support John Wiley amp Sons Inc New York NY USA 1997ISBN 0471179809 10

[20] Parnin Chris Christian Bird e Emerson Murphy-Hill Java generics adoption hownew features are introduced championed or ignored Em Proceedings of the 8thWorking Conference on Mining Software Repositories paacuteginas 3ndash12 ACM 2011 12

[21] Oracle The java language specification httpsdocsoraclecomjavasespecsjlsse8jls8pdf 13

[22] Oracle The history of java technology httpwwworaclecomtechnetworkjavajavaseoverviewjavahistory-index-198355html 13

[23] Murphy Kieron So why did they decide to call itjava httpwwwjavaworldcomarticle2077265core-javaso-why-did-they-decide-to-call-it-java-html 13

[24] McGraw Tata Object-oriented Programming with Java Essentials and ApplicationsHill Education 13

49

[25] Oracle Differences between java ee and java se httpdocsoraclecomjavaee6firstcupdocgkhoyhtml 13

[26] Lindsey Clark S The History of Java Cambridge 14

[27] Oracle The java language environment httpwwworaclecomtechnetworkjavaintro-141325html 14

[28] Oracle Jdk 8 httpopenjdkjavanetprojectsjdk8 15 24

[29] Oracle Enhancements in java se 8 httpdocsoraclecomjavase8docstechnotesguideslanguageenhancementshtmljavase8 15 16 17

[30] Oracle Lambda expressions httpdocsoraclecomjavasetutorialjavajavaOOlambdaexpressionshtml 16 18 21

[31] Oracle Method references httpdocsoraclecomjavasetutorialjavajavaOOmethodreferenceshtml 16

[32] Oracle Default methods httpdocsoraclecomjavasetutorialjavaIandIdefaultmethodshtml 17

[33] Oracle Repeating annotations httpdocsoraclecomjavasetutorialjavaannotationsrepeatinghtml 17

[34] Oracle Type annotations httpdocsoraclecomjavasetutorialjavaannotationstype_annotationshtml 17

[35] Oracle Anonymous inner classes httpsdocsoraclecomjavasetutorialjavajavaOOanonymousclasseshtml 19

[36] Kothari CR Research Methodology Methods and Techniques New Age Interna-tional (P) Limited 2004 ISBN 9788122415223 httpsbooksgooglecombrbooksid=8c6gkbKi-F4C 22

[37] Nakakoji Kumiyo Yasuhiro Yamamoto Yoshiyuki Nishinaka Kouichi Kishida eYunwen Ye Evolution patterns of open-source software systems and communitiesEm IWPSE rsquo02 Proceedings of the International Workshop on Principles of SoftwareEvolution paacuteginas 76ndash85 New York NY USA 2002 ACM Press ISBN 1581135459httpdxdoiorg101145512035512055 23

[38] Rahman Foyzur Christian Bird e Premkumar Devanbu Clones What is that smellEmpirical Software Engineering 17(4-5)503ndash530 2012 24

[39] Chacon Scott Pro Git Apress Berkely CA USA 1st ediccedilatildeo 2009ISBN 1430218339 9781430218333 25

[40] Cavalcanti Thiago Gomes e Viniacutecius Correa de Almeida Caracterizaccedilatildeo do uso deconstruccedilotildees da linguagem java em projetos open-source Publicaccedilatildeo online 2016httpbdmunbbrhandle1048315733 27

50

[41] Parr Terence Language Implementation Patterns Create Your Own Domain-Specific and General Programming Languages Pragmatic Bookshelf 1st ediccedilatildeo 2009ISBN 193435645X 9781934356456 27

[42] Janssen Thorben 5 reasons to use jpa hibernate Publicaccedilatildeo online httpswwwsitepointcom5-reasons-to-use-jpa-hibernate 27

[43] Franklin Lyle Alex Gyori Jan Lahoda e Danny Dig Lambdaficator From imperativeto functional programming through automated refactoring Em Proceedings of the2013 International Conference on Software Engineering ICSE rsquo13 paacuteginas 1287ndash1290 Piscataway NJ USA 2013 IEEE Press ISBN 978-1-4673-3076-3 httpdlacmorgcitationcfmid=24867882486986 29

[44] Google Agera httpsgithubcomgoogleagerawiki 34

[45] Eclipse Eclipse vertx httpvertxio 35

[46] Cejas Fernando Android cleanarchitecture httpsgithubcomandroid10Android-CleanArchitecture 36

[47] ReactiveX Rxjava httpsgithubcomReactiveXRxJava 37

[48] Luontola Esko Retrolambda httpsgithubcomorfjackalretrolambda 43

51

Anexo I

Projetos utilizados

fastjson

platform_frameworks_base

netty

material-dialogs

kotlin

okhttp

tinker

AndroidUtilCode

RxJava

spring-boot

java-design-patterns

elasticsearch

ExoPlayer

kafka

vertx

realm-java

guava

zipkin

bazel

stetho

Signal-Android

glide

agera

fresco

plaid

presto

libgdx

spark

52

disruptor

lottie-android

flexbox-layout

PocketHub

zxing

spring-framework

deeplearning4j

dropwizard

interviews

BaseRecyclerViewAdapterHelper

uCrop

DanmakuFlameMaster

lottie-react-native

android-UniversalMusicPlayer

AndroidInterview-Q-A

greenDAO

retrofit

MaterialDrawer

BottomBar

druid

MPAndroidChart

Hystrix

guice

recyclerview-animators

dubbo

androidannotations

RxJava-Android-Samples

PhotoView

clojure

CircleImageView

AndroidSwipeLayout

jedis

MaterialViewPager

butterknife

junit4

RxBinding

leakcanary

SimianArmy

picasso

UltimateRecyclerView

53

AndroidViewAnimations

AppIntro

FizzBuzzEnterpriseEdition

ion

cheesesquare

physical-web

RxAndroid

Android-CleanArchitecture

Calligraphy

Android-Bootstrap

iosched

Android_Data

MaterialDesignLibrary

ListViewAnimations

EventBus

java8-tutorial

AndroidSlidingUpPanel

dagger

okhttputils

logger

HomeMirror

Material-Animations

android-Ultra-Pull-To-Refresh

android-async-http

Android-ObservableScrollView

Android-Universal-Image-Loader

ActionBarSherlock

SlidingMenu

storm

PagerSlidingTabStrip

Android-PullToRefresh

54

  • Dedicatoacuteria
  • Agradecimentos
  • Resumo
  • Abstract
  • Introduccedilatildeo
    • Contexto
    • Objetivos
      • Objetivos Gerais
      • Objetivos Especiacuteficos
        • Metodologia
        • Organizaccedilatildeo do Trabalho
          • Evoluccedilatildeo e Mineraccedilatildeo de Repositoacuterios de Software
            • Evoluccedilatildeo de Software
            • MSR Mineraccedilatildeo de dados e a Engenharia de Software
              • Classificaccedilatildeo
                • Trabalhos Relacionados
                  • Java SE 8 e JDK 8
                    • Histoacuterico
                    • Princiacutepios
                    • Evoluccedilatildeo
                    • Expressotildees Lambda
                      • Sintaxe
                      • Principais formas de uso
                          • Estudo e o Processo de Mineraccedilatildeo
                            • Questotildees de Pesquisa
                            • Fonte de Dados e Objetos de Estudo
                            • Processo de Mineraccedilatildeo
                              • static-analysis
                              • BDAnalisador
                                • Classificaccedilatildeo e Anaacutelise
                                  • Meacutedia de Lambda
                                  • Anaacutelise Temporal
                                  • Refatoraccedilatildeo de Coacutedigo
                                  • Casos de Uso
                                      • Resultados Obtidos e Anaacutelise
                                        • Visatildeo Geral
                                          • Projetos Selecionados
                                          • agera
                                          • vertx
                                          • Android-CleanArchitecture
                                          • RxJava
                                          • guava
                                            • Refatoraccedilatildeo de Coacutedigo
                                            • Estudos de Caso
                                              • Consideraccedilotildees Finais
                                              • Referecircncias
                                              • Anexo
                                              • Projetos utilizados

Capiacutetulo 2

Evoluccedilatildeo e Mineraccedilatildeo deRepositoacuterios de Software

As linguagens de programaccedilatildeo estatildeo sempre evoluindo aumentando sua complexidade eexpressividade Da mesma forma aleacutem de se preocupar com dificuldades de estabelecercompatibilidade do software em relaccedilatildeo a tecnologias antigas desenvolvedores tambeacutemprecisam acompanhar essa evoluccedilatildeo das linguagens para que suas ferramentes natildeo setornem obsoletas [9] Isso agrega um grande desafio no desenvolvimento e evoluccedilatildeo desoftware

O conceito de evoluccedilatildeo de software amadureceu e se tornou um grande foco de pes-quisa Poreacutem nem sempre estudos de evoluccedilatildeo de software reconhecem a importacircncia daevoluccedilatildeo da linguagem de programaccedilatildeo no contexto do desenvolvimento de software [8]Quando um coacutedigo natildeo evolui junto com a linguagem com o objetivo de manter umacompatibilidade com versotildees anteriores sua capacidade de evoluccedilatildeo se torna limitada [9]

A refatoraccedilatildeo de coacutedigo que consiste em realizar mudanccedilas no coacutedigo fonte sem modi-ficar o comportamento observado do software [15] permite que a evoluccedilatildeo de linguagens eferramentas aconteccedilam mais naturalmente No entanto novos desafios surgem como porexemplo saber quando e como realizar a refatoraccedilatildeo de coacutedigo de forma eficiente e coesaDentre as teacutecnicas de pesquisa em engenharia de software para entender esse problematorna-se interessante explorar as teacutecnicas de mineraccedilatildeo de dados aplicados a repositoacuteriosde software com o objetivo de entender o relacionamento entre evoluccedilatildeo e refatoraccedilatildeo

Assim este capiacutetulo busca esclarecer conceitos e estrateacutegias de evoluccedilatildeo de softwaremineraccedilatildeo de repositoacuterios de software e o estado da arte sobre o assunto

5

21 Evoluccedilatildeo de Software

Durante o processo de produccedilatildeo e manutenccedilatildeo de software haacute a necessidade de diversastomadas de decisotildees sobre seu desenvolvimento como por exemplo decidir como melho-rar a qualidade do software Tais decisotildees precisam ser tomadas levando em consideraccedilatildeoo ambiente em que se estaacute inserido com novas tecnologias surgindo todos os dias fe-edback de usuaacuterios exigentes e concorrentes produzindo um software similar com ideiasinovadoras

Tudo isso acontece em um ritmo de constante mudanccedila e assim como diria Lehmaneacute imprescindiacutevel que software de sistemas sejam capazes de evoluir ou os mesmos correm orisco de sofrer uma morte prematura [16] fazendo assim da evoluccedilatildeo de software um con-ceito importante dentro do seu processo de desenvolvimento Essa evoluccedilatildeo deve ocorrerconsiderando o ambiente em que o software estaacute inserido o qual possui aspectos teacutecnicos esociais sua infraestrutura que pertence ao seu ambiente teacutecnico o qual sempre necessitamanutenccedilatildeo e ao mesmo tempo usuaacuterios que utilizam o software e estatildeo constantementeformando opiniotildees oferecendo feedback e na expectativa por novidades [7] Assim a me-dida que novas caracteriacutesticas satildeo desenvolvidas novas tecnologias de infraestrutura satildeonecessaacuterias novos requisitos satildeo adicionados e o sistema de software deve se adaptar aessas mudanccedilas

Com relaccedilatildeo aos aspectos sociais que envolvem a evoluccedilatildeo do software eacute importanteressaltar os conceitos baacutesicos de como essa evoluccedilatildeo acontece Durante um estudo empiacutericopioneiro na aacuterea de evoluccedilatildeo de software para sistemas de grande escala Lehman e seuscolaboradores formularam um conjunto de observaccedilotildees que hoje satildeo conhecidas como asleis da evoluccedilatildeo de software ou simplesmente Leis de Lehman [16] No geral as leis deevoluccedilatildeo de software podem ser descritas da seguinte forma [16]

1 Mudanccedila contiacutenua um sistema se tornaraacute progressivamente menos satisfatoacuteriopara seus usuaacuterios com o tempo a menos que se adapte continuamente agraves necessi-dades que surgiratildeo

2 Complexidade Crescente um sistema se tornaraacute cada vez mais complexo amenos que se trabalhe para explicitamente reduzir sua complexidade

3 Auto-regulaccedilatildeo o processo de evoluccedilatildeo de software eacute auto-regulatoacuterio no que dizrespeito agraves distribuiccedilotildees dos artefatos e produtos produzidos

4 Conservaccedilatildeo da estabilidade organizacional a taxa meacutedia de atividade globalefetiva em um sistema em evoluccedilatildeo natildeo muda com o tempo ou seja a meacutedia detrabalho e esforccedilo colocado em cada entrega do sistema permanece a mesma

6

5 Conservaccedilatildeo de familiaridade a quantidade de conteuacutedo novo em cada entregado sistema tende a se manter constante com o tempo

6 Crescimento contiacutenuo A quantidade de funcionalidades em um sistema cresceraacutecom o tempo com o objetivo de satisfazer seus usuaacuterios

7 Decliacutenio de qualidade Um sistema seraacute percebido com qualidade inferior como passar do tempo a menos que seu design tenha uma manutenccedilatildeo minuciosa e seadapte a novas restriccedilotildees

8 Sistema de Feedback Evoluir um sistema com sucesso requer reconhecer que oprocesso de desenvolvimento acontece em um sistema de feedback de vaacuterios ciclosagentes e niacuteveis

Os aspectos teacutecnicos que envolvem a evoluccedilatildeo de software levam em consideraccedilatildeo astecnologias utilizadas para o seu desenvolvimento desde a linguagem de programaccedilatildeo agravesmaacutequinas onde o software seraacute hospedado que sofrem atualizaccedilotildees recebem novas versotildeescom novas caracteriacutesticas implementadas

Um estudo realizado por Lavre mostra como a evoluccedilatildeo das linguagens de programa-ccedilatildeo no contexto da evoluccedilatildeo de software muitas vezes satildeo subestimadas uma vez quemuitos podem considerar em seus estudos a linguagem de computaccedilatildeo como um artefatoimutaacutevel [8] Por exemplo coloca-se muita ecircnfase e cuidado para realizar o versionamentode coacutedigo fonte de um software mas este pode ser tornar inutilizaacutevel futuramente se nin-gueacutem souber qual versatildeo de compilador determinada versatildeo de coacutedigo foi desenvolvida

Para natildeo se deixar estagnar linguagens de programaccedilatildeo precisam se adaptar e evoluirQuando uma linguagem de programaccedilatildeo atualiza softwares que eram antes consideradosatualizados podem se tornar rapidamente obsoletos E ao mesmo tempo que novascaracteriacutesticas satildeo adicionadas a linguagem precisa fornecer compatibilidade com versotildeesanteriores aumentando sua complexidade Desenvolvedores entatildeo encontram-se tambeacutemem um empasse buscando um equiliacutebrio entre manter a compatibilidade da ferramentacom versotildees anteriores da linguagem e atualizaacute-la para manter o software atualizado [9]

A estrateacutegia de refatoraccedilatildeo de coacutedigo pode ser uma opccedilatildeo que permite a linguageme o software co-evoluiacuterem com um menor grau de dificuldade [9] Refatoraccedilatildeo (do inglecircsrefactoring) eacute o processo de modificaccedilatildeo de um software com o objetivo de melhorar a es-trutura interna do mesmo sem alterar sua percepccedilatildeo externa Eacute uma maneira disciplinadade melhorar o design do coacutedigo apoacutes ele jaacute ter sido implementado Por exemplo dividiruma funcionalidade grande feita em apenas um bloco de coacutedigo em vaacuterios moacutedulos [15]

A refatoraccedilatildeo de coacutedigo pode ser um meio utilizado para evoluir o software adaptandoo coacutedigo com caracteriacutesticas novas introduzidas pela linguagem modificando o design dosistema sem comprometer sua integridade No entanto novos desafios surgem visto que

7

refatorar o coacutedigo fonte de um sistema de grande porte natildeo eacute uma tarefa faacutecil havendo anecessidade de ferramentas que possam automatizar o processo ou realizar um estudo paraentender como as novas caracteriacutesticas da linguagem podem ser utilizadas para substituirou melhorar funcionalidades obsoletas [9]

22 MSR Mineraccedilatildeo de dados e a Engenharia deSoftware

Com o objetivo de compreender prever e planejar os vaacuterios aspectos do desenvolvimentode um projeto em especial tudo que possa impactar na evoluccedilatildeo de software a teacutecnicade mineraccedilatildeo de dados tem sido bastante utilizada em engenharia de software [17]

O termo Mineraccedilatildeo de Repositoacuterios de Software (MSR) tem sido utilizado para descre-ver vaacuterias maneiras de se examinar repositoacuterios de software Um repositoacuterio de softwarepode ser considerado um artefato que eacute produzido e arquivado durante a evoluccedilatildeo desoftware [1] Estes responsoacuterios armazenam informaccedilotildees que podem fornecer todos osdetalhes de desenvolvimento do software provendo meios necessaacuterios para uma anaacuteliseaprofundada de evoluccedilatildeo de software

Repositoacuterios de software satildeo comumente utilizados para armazenar e acompanhar ohistoacuterico de desenvolvimento do software mas raramente usados para tomada de deci-sotildees em relaccedilatildeo ao projeto Assim pesquisadores de MSR buscam modificar a impressatildeode que tais repositoacuterios satildeo estaacuteticos que servem apenas para manutenccedilatildeo de registrostransformando-os em repositoacuterios ativos que podem auxiliar na tomada de decisatildeo em pro-jetos de software modernos atraveacutes da identificaccedilatildeo de padrotildees para realizar a propagaccedilatildeode mudanccedilas [18]

221 Classificaccedilatildeo

De acordo com Kagdi et al dentre as abordagens de MSR utilizadas atualmente eacute possiacuteveldescrevecirc-las para entatildeo comparaacute-las e possivelmente classificaacute-las levando em considera-ccedilatildeo uma taxonomia de quatro dimensotildees os repositoacuterios de software utilizados (fontes dedados) o propoacutesito do MSR a metodologia e a avaliaccedilatildeo da abordagem [1] como mostraa Figura 21 onde as taxonomias destacadas em amarelo satildeo as que prevaleceram poreacutemnatildeo exclusivamente na metodologia adotada por este trabalho

8

Figura 21 Taxonomia em camadas adaptada do trabalho de Kagdi et al [1]

Fontes de Dados

As fontes de informaccedilatildeo variam de acordo com a abordagem utilizada e dentre as informa-ccedilotildees mineradas em repositoacuterios de software inclui-se as seguintes categorias os artefatosde software e suas versotildees as diferenccedilas entre os artefatos de software e suas versotildees e osmetadados sobre as mudanccedilas no software

As fontes de dados podem ser melhor classificadas de acordo com Hassan et al [17]

bull Repositoacuterios de controle de Versatildeo estes repositoacuterios guardam o histoacuterico de desen-volvimento de um projeto armazenando todas as mudanccedilas no coacutedigo fonte assimcomo os metadados associados com cada mudanccedila Exemplos git SVN

bull Bug repositories Estes repositoacuterios rastreiam o histoacuterico de resoluccedilatildeo de bugs quesatildeo reportados por usuaacuterios e desenvolvedores Exemplos Bugzilla e Jira

9

bull Histoacuterico de Comunicaccedilatildeo (Archived communications) estes repositoacuterios rastreiamdiscussotildees sobre os vaacuterios aspectos de um projeto de software por sua vida uacutetil Porexemplo listas de e-mails

bull Deployment logs logs com informaccedilotildees do software gerados por ferramentas dedesenvolvimento

bull Repositoacuterios de software Repositoacuterios onde o coacutedigo fonte de vaacuterios projetos satildeoarmazenados como por exemplo Sourceforgenet

No contexto deste trabalho estes repositoacuterios consistem em fontes de coacutedigo armaze-nadas em sistemas de controle de versatildeo especificamente coacutedigos na plataforma Github

O propoacutesito

O propoacutesito da mineraccedilatildeo de repositoacuterios de software se resume nas perguntas de pes-quisa que podem ser respondidas utilizando mineraccedilatildeo Assim existem duas classes deperguntas de pesquisa para MSR [1]

A primeira eacute a pergunta de anaacutelise market-basket1 ldquoSe A acontece o que mais podeacontecerrdquo A resposta para este tipo de pergunta eacute um conjunto de regras descrevendotendecircncias de relacionamentos como por exemplo se A acontecer entatildeo B e C acontecemdurante um periacuteodo X

A segunda classe diz respeito agraves perguntas de prevalecircncia (Prevalence Questions -PQ) como por exemplo perguntas do tipo ldquoA funcionalidade Y foi modificadardquo quepossuem uma resposta booleana ou ldquoQuantas vezes esta funcionalidade Y foi modificadardquocontendo uma resposta quantitativa

As perguntas de pesquisa deste trabalho se encaixam majoritariamente na segundaclasse onde o objetivo traccedilado eacute respondido de forma quantitativa com algumas tentativasde classificaccedilatildeo de tipos de repositoacuterios como seraacute descrito nos capiacutetulos seguintes

A metodologia

A metodologia corresponde a maneira como as questotildees de MSR iratildeo ser respondidas evaacuterias abordagens estatildeo disponiacuteveis Poreacutem Kagdi indica duas estrateacutegias baacutesicas quepodem ser utilizadas

Primeiramente pode-se utilizar a mediccedilatildeo indireta e anaacutelise da evoluccedilatildeo do softwareEsta abordagem pode ser realizada da seguinte forma extrair e computar informaccedilotildeesde cada versatildeo de um software separadamente e em seguida individualmente comparar

1Anaacutelise Market-basket eacute uma teacutecnica de modelagem baseada na teoria de que se vocecirc comprar certostipos de produtos vocecirc haacute uma probabilidade maior (ou menor) de comprar outros tipos de produtos [19]

10

propriedades encontradas como por exemplo comparar duas versotildees distintas de umsoftware atraveacutes de um repositoacuterio github realizando uma investigaccedilatildeo de alto niacutevel noque diz respeito a evoluccedilatildeo do software [1]

A segunda perspectiva de metodologia que pode ser utilizada corresponde agrave mediccedilatildeodireta e anaacutelise da evoluccedilatildeo do software Ela diz respeito agraves investigaccedilotildees que estudamos mecanismos que leva um software a ser modificado de uma versatildeo para outra focandonas diferenccedilas especiacuteficas entre estas versotildees como por exemplo examinando mudanccedilasespeciacuteficas das classes arquivos funccedilotildees de cada parte do coacutedigo [1]

Assim eacute possiacutevel descrever explicitamente que este trabalho utiliza em sua maioriauma metodologia com mediccedilotildees diretas atraveacutes da anaacutelise estaacutetica de informaccedilotildees docoacutedigo fonte de diferente versotildees para analisar os diferentes padrotildees de desenvolvimentoem que expressotildees lambda (definidas no capiacutetulo seguinte) satildeo utilizadas

A Avaliaccedilatildeo

Por fim existem diversas formas para se avaliar o estudo realizado sempre levando emconsideraccedilatildeo a validade dos resultados obtidos Pode-se utilizar de meacutetricas para avaliar osdados considerando o quanto das informaccedilotildees obtidas satildeo relevantes Outra forma de seavaliar seria atraveacutes da utilizaccedilatildeo de modelos probabiliacutesticos seguindo uma abordagemde teoria da informaccedilatildeo Assim foram utilizadas determinadas meacutetricas quantitativaspara avaliar os resultados obtidos neste trabalho

23 Trabalhos Relacionados

Como ressaltado na introduccedilatildeo o foco deste trabalho encontra-se em utilizar teacutecnicas deMSR para caracterizar a adoccedilatildeo de expressotildees lambda em repositoacuterios Java Ao reali-zar um estudo sobre o estado da arte encontrou-se diversos trabalhos que utilizam deMSR para obter informaccedilotildees relevantes sobre repositoacuterios de software em diversos focose em especial trabalhos que investiguem repositoacuterios na linguagem Java Jaacute existemtambeacutem alguns trabalhos que apresentam ferramentas de refatoraccedilatildeo de coacutedigo para im-plementaccedilatildeo de expressotildees lambda com foco na evoluccedilatildeo do software Dentre os trabalhosencontrados mencionados destacam-se

bull Em um trabalho sobre utilizaccedilatildeo de refatoraccedilatildeo de coacutedigo para realizar a transiccedilatildeode coacutedigo Java para as novas caracteriacutesticas implementadas no Java 8 Gyori et alapresenta uma ferramenta que automatiza com sucesso o trabalho de conversatildeo decoacutedigo como Annonymous Inner Class para expressotildees lambda [12] O capiacutetulo aseguir descreve em detalhes estes conceitos

11

bull Regrowing a Language de Overbey apresenta um estudo sobre a importacircncia da co-evoluccedilatildeo entre a linguagem de programaccedilatildeo e os projetos de software focando naslinguagens Fortran e Java e provando como ferramentas de refatoraccedilatildeo de coacutedigoauxiliam para que o software consiga evoluir juntamente com sua linguagem deprogramaccedilatildeo [9]

bull O trabalho sobre a adoccedilatildeo de generics em coacutedigo Java feito por Parnin utiliza demineraccedilatildeo de dados para realizar uma investigaccedilatildeo empiacuterica avaliando projetos decoacutedigo aberto com o objetivo de observar como desenvolvedores destes projetos estatildeoutilizando generics em Java [20]

Os estudos mencionados focam em assuntos particulares pertinentes a este trabalhoem que de um lado tem-se trabalhos que mostram a necessidade de refatoraccedilatildeo de coacutedigopara evoluccedilatildeo de software e do outro tem-se trabalhos que mostram que eacute possiacutevel utilizarde MSR para entender melhor como a evoluccedilatildeo da linguagem de programaccedilatildeo Java temafetado projetos reais de coacutedigo aberto e como estes projetos estatildeo se adaptando a estasevoluccedilotildees

12

Capiacutetulo 3

Java SE 8 e JDK 8

Este trabalho tem como objetivo caracterizar a adoccedilatildeo de expressotildees Lambda em siste-mas Java que podem ser considerados legados pois foram concebidos em um momentoanterior a introduccedilatildeo dessa nova caracteriacutestica na linguagem Java Com o intuito de faci-litar o entendimento do leitor sobre tais construccedilotildees esse capiacutetulo apresenta informaccedilotildeeshistoacutericas referentes agrave linguagem Java desde sua criaccedilatildeo ateacute a sua ascensatildeo como umadas linguagens de programaccedilatildeo mais populares Aleacutem disso seratildeo apresentadas as novascaracteriacutesticas presentes na versatildeo Java SE 8 com destaque nas expressotildees Lambda e deque forma vieram para auxiliar no desenvolvimento de sistemas

31 Histoacuterico

Java eacute uma linguagem de programaccedilatildeo orientada a objetos para propoacutesitos gerais [21] Alinguagem nasceu com o nome de Oak no ano de 1991 com o foco em televisotildees digitais acabo mas devido agrave complexidade e poder da linguagem logo expandiu-se para os outrosdomiacutenios principalmente a Internet [22] Posteriormente a linguagem recebeu o nome deGreentalk devido agrave marca Oak jaacute ser registrada por outra empresa e o principal projeto daequipe se chamar Green Por fim o nome Java foi o mais votado pela equipe da Sun emuma reuniatildeo para decidir o mais raacutepido possiacutevel um nome definitivo para a linguagem [23]

Em 1995 em sua primeira versatildeo puacuteblica 10 a linguagem Java jaacute comeccedilava a terum crescimento em sua popularidade como Web Applet nos navegadores mais popularesfornecendo seguranccedila e rapidez nas plataformas mais utilizadas [24] A cada nova versatildeopublicada novas funcionalidades e plataformas eram adicionadas e tornavam a linguagemmais difundida no meio computacional fazendo com que em 2006 a linguagem fosse divi-dida em Java EE (foco em rede e serviccedilos web) Java ME (foco em sistemas embarcados)e Java SE (foco em desktops e servidores) [25]

13

Apoacutes anos de evoluccedilatildeo e aprimoramento atraveacutes de diversas versotildees como visto naTabela 31 hoje o Java se tornou uma das linguagens de programaccedilatildeo mais utilizadas nomundo estando em aproximadamente 15 das linhas de coacutedigo disponiacuteveis pela inter-net [11] A quantidade de plataformas suportadas pela linguagem e com o advento dosistema operacional Android sendo rodado na maior parte dos smartphones do mundoaleacutem da simplicidade em codificar no paradigma orientado a objetos foram os fatoresrelevantes para que a linguagem se popularizasse no mundo digital [26]

Tabela 31 As versotildees anteriores de java e principais caracteriacutesticasVersatildeo Principais caracteriacutesticasJava 10 JVM e JDKJava 2 Event Listeners

Kestrel (Java 3) HotSpot JVMMerlin (Java 4) Diversas novas APIs como Assertion e expressotildees regularesTiger (Java 5) Generics

Mustang (Java 6) Web ServicesDolphin (Java 7) Suporte a linguagens dinamicas

32 Princiacutepios

Com o foco em alcanccedilar a Web e participar mais ativamente do mercado virtual e e-Commerce foram projetados princiacutepios que permitissem com que a linguagem pudessealcanccedilar seus objetivos principais ao mesmo tempo que mantinha a facilidade e fami-liarizaccedilatildeo da linguagem a seus desenvolvedores [27] Dessa forma a equipe da Oracledeterminou cinco princiacutepios que caracterizariam o foco da linguagem Java

bull simples orientada a objeto e familiar projetada para ser orientada a objeto epermitir que seus desenvolvedores comecem a codificar rapidamente sem a necessi-dade de uma curva de aprendizagem acentuada

bull segura e robusta projetada para prover software confiaacutevel por meio de checagensa tempo de compilaccedilatildeo e execuccedilatildeo Haacute uma grande preocupaccedilatildeo com seguranccediladevido agrave larga utilizaccedilatildeo da linguagem em sistemas distribuiacutedos

bull de arquitetura neutra e portaacutevel projetada para ser independente de qualquerarquitetura bastando rodar a JVM dessa forma garantindo a portabilidade paravaacuterios ambientes e dispositivos

14

bull executada em alta performance projetada para fornecer a maior performancepossiacutevel em tempo de execuccedilatildeo com a utilizaccedilatildeo do garbage collector em uma threadde baixa prioridade

bull interpretada dinacircmica e threaded projetada para ser interpretada por qual-quer dispositivo que possua JVM desenvolvida garantindo um desenvolvimento raacute-pido e em ciclos O uso da classe Thread permite que a linguagem acompanhe atendecircncia do paralelismo Aleacutem disso a ligaccedilatildeo de classes eacute feita em tempo real esomente quando necessaacuteria tornando-a dinacircmica

33 Evoluccedilatildeo

A primeira versatildeo do Java 8 foi lanccedilada em 2014 [28] e apresentou diversas atualizaccedilotildeesespalhadas em categorias como linguagem seguranccedila Collections ferramentas deployentre outras Dentre a grande quantidade de mudanccedilas os destaques se encontraram nasnovas melhorias presentes na linguagem que afetaram de forma mais direta a maneiracom que os desenvolvedores passaram a tratar e organizar o coacutedigo fonte As atualizaccedilotildeesreferentes a linguagem descritas oficialmente pela Oracle [29] satildeo

1 Lambda Expressions ou apenas Expressotildees Lambda correspondem a uma novacaracteriacutestica que permite que uma pequena funcionalidade possa ser utilizada comoum argumento de um meacutetodo facilitando a escrita de accedilotildees que seratildeo feitas repetida-mente em uma Collection ou quando um processo se completa ou quando encontraum erro Eacute tambeacutem uma forma compacta de se escrever coacutedigo que previamenteera escrito com anonymous inner classes [29] A Listagem 31 mostra uma classehipoteacutetica Calculator cujo meacutetodo operateBinary() recebe como paracircmetro doisinteiros e um objeto da classe IntegerMath que representa a operaccedilatildeo que deveraacuteser realizada ou seja uma funcionalidade dinacircmica

1 pub l i c c l a s s Ca l cu la to r 2

3 i n t e r f a c e IntegerMath 4 i n t opera t i on ( i n t a i n t b) 5 6

7 pub l i c i n t operateBinary ( i n t a i n t b IntegerMath op ) 8 re turn op opera t i on (a b) 9

10

11 pub l i c s t a t i c void main ( St r ing a rgs ) 12

15

13 Calcu la to r myApp = new Ca lcu la to r ( ) 14 IntegerMath add i t i on = (a b) minusgt a + b 15 IntegerMath subt ra c t i on = (a b) minusgt a minus b 16 System out p r i n t l n ( 40 + 2 = +17 myApp operateBinary (40 2 add i t i on ) ) 18 System out p r i n t l n ( 20 minus 10 = +19 myApp operateBinary (20 10 sub t ra c t i on ) ) 20 21 22

Listagem 31 Exemplo de coacutedigo com o uso de Expressatildeo Lambda [30]

2 Method References Frequentemente expressotildees lambda criam meacutetodos anocircni-mos Algumas vezes poreacutem satildeo utilizadas para chamar um meacutetodo jaacute existentena classe Ao inveacutes de escrever a expressatildeo Lambda para esse caso pode-se optarpor utilizar um Method Reference que facilita a escrita e leitura desse uso de ex-pressatildeo Lambda [29] A Listagem 32 mostra um exemplo de um meacutetodo estaacuteticoque compara duas pessoas pelas suas idades e a Listagem 33 a utilizaccedilatildeo de MethodReference para aplicar a utilizaccedilatildeo desse meacutetodo em um array e reduzir a escrita deuma expressatildeo lambda a uma forma mais legiacutevel

1 pub l i c s t a t i c i n t compareByAge ( Person a Person b) 2 re turn a b i r thday compareTo (b b i r thday ) 3 4

Listagem 32 Exemplo de meacutetodo de uma classe Pessoa [31]

1 Arrays s o r t ( rosterAsArray Person compareByAge ) 2

Listagem 33 Exemplo de uso de Method Reference [31]

3 Default Methods satildeo meacutetodos com a palavra-chave default que servem para adi-cionar implementaccedilotildees de meacutetodos a uma interface de alguma biblioteca mantendoa compatibilidade binaacuteria com versotildees mais antigas dessa interface Tambeacutem pos-sibilita a implementaccedilatildeo de meacutetodos estaacuteticos em interfaces [29] A Listagem 34apresenta a inclusatildeo de um meacutetodo default na interface TimeClient

1 pub l i c i n t e r f a c e TimeClient 2 void setTime ( i n t hour i n t minute i n t second ) 3 void setDate ( i n t day i n t month i n t year ) 4 void setDateAndTime ( i n t day i n t month i n t year 5 i n t hour i n t minute i n t second )

16

6 LocalDateTime getLocalDateTime ( ) 7

8 s t a t i c ZoneId getZoneId ( S t r ing zoneStr ing ) 9 t ry

10 re turn ZoneId o f ( zoneStr ing ) 11 catch ( DateTimeException e ) 12 System e r r p r i n t l n ( I n v a l i d time zone + zoneStr ing

+13 us ing d e f a u l t time zone in s t ead ) 14 re turn ZoneId systemDefault ( ) 15 16 17

18 d e f a u l t ZonedDateTime getZonedDateTime ( St r ing zoneStr ing ) 19 re turn ZonedDateTime o f ( getLocalDateTime ( ) getZoneId (

zoneStr ing ) ) 20 21 22

Listagem 34 Exemplo de interface com um meacutetodo default [32]

4 Repeating Annotations permitem a implementaccedilatildeo e utilizaccedilatildeo de anotaccedilotildees deum mesmo tipo que podem ser utilizadas mais de uma vez para a mesma declara-ccedilatildeo [29] A Listagem 35 apresenta duas anotaccedilotildees iguais com paracircmetros diferentespermitindo uma customizaccedilatildeo maior na aplicaccedilatildeo de um tipo de anotaccedilatildeo

1 Schedule ( dayOfMonth= l a s t )2 Schedule (dayOfWeek= Fr i hour= 23 )3 pub l i c void doPeriodicCleanup ( ) 4

Listagem 35 Exemplo de Repeating Annotations [33]

5 Type Annotations permitem que anotaccedilotildees possam ser utilizadas em tipos aleacutemde declaraccedilotildees dessa forma pode-se garantir que um campo sempre atenda agraves suasexpectativas e evite testes desnecessaacuterios [29] A Listagem 36 mostra um exemplo derestriccedilatildeo a uma String que nunca poderaacute ser nula devido agrave anotaccedilatildeo de NonNull

1 NonNull S t r ing s t r

Listagem 36 Exemplo de Type Annotation garantindo que o campo nunca seja null [34]

17

34 Expressotildees Lambda

Uma das mudanccedilas mais interessantes implementadas no Java 8 foi a adiccedilatildeo de expressotildeeslambda As expressotildees lambda permitem que a linguagem Java possa atuar parcialmentecomo uma linguagem de programaccedilatildeo funcional onde comportamentos satildeo avaliados eaplicados diferentemente da programaccedilatildeo imperativa que foca na mudanccedila de estadosNa praacutetica um comportamento pode ser passado como paracircmetro de um meacutetodo atraveacutesde uma escrita mais reduzida e legiacutevel Os benefiacutecios de utilizar expressotildees lambda incluemuma melhora na legibilidade e organizaccedilatildeo de coacutedigo que antes era escrito com AnonymousInner Class aleacutem de permitir uma forma simples de utilizar comportamento paralelo como uso de Streams

341 Sintaxe

A sintaxe de uma expressatildeo lambda eacute dividida nas seguintes partes [30]

bull Uma lista de paracircmetros separados por viacutergulas

bull Um token representado por uma seta -gt

bull Um corpo que pode ser representado por uma expressatildeo uacutenica ou um bloco de coacutedigodentro de chaves

As Listagens 37 e 38 mostram duas formas diferentes de se aplicar expressotildees Lambdacom uma sintaxe similar A primeira aplica a expressatildeo diretamente apoacutes a seta utilizadanormalmente para trechos de coacutedigo pequenos e simples e a segunda utiliza-se de chavespara incorporar o coacutedigo e da palavra-chave return para especificar o retorno forma maisutilizada para uma quantidade maior de coacutedigo

1 p minusgt p getGender ( ) == Person Sex MALE2 ampamp p getAge ( ) gt= 183 ampamp p getAge ( ) lt= 25

Listagem 37 Exemplo de expressatildeo lambda com uma expressatildeo [30]

1 p minusgt 2 re turn p getGender ( ) == Person Sex MALE3 ampamp p getAge ( ) gt= 184 ampamp p getAge ( ) lt= 25 5

Listagem 38 Exemplo de expressatildeo lambda com um bloco de coacutedigo [30]

18

342 Principais formas de uso

Anonymous Inner Class

Antes do Java 8 a necessidade de passar funccedilotildees ou expressotildees como paracircmetro de algummeacutetodo era suprida atraveacutes de Anonymous Inner Classes A utilizaccedilatildeo desse tipo dedeclaraccedilatildeo junto com a anotaccedilatildeo de Override permite sobrescrever um meacutetodo de umainterface funcional e ao mesmo tempo passa-la como argumento para um meacutetodo Umaexpressatildeo lambda se comporta da mesma forma poreacutem a quantidade de coacutedigo escritopela Anonymous Inner Class eacute maior e pode dificultar a leitura de coacutedigo pois conteacutemmuita informaccedilatildeo natildeo utilizada para efetivo entendimento do que estaacute sendo feito naqueletrecho

A Listagem 39 apresenta a instanciaccedilatildeo da classe EventHandler internamente ao meacute-todo setOnAction() de forma que o desenvolvedor possa escrever o comportamento quedeseja passar como paracircmetro do meacutetodo atraveacutes da substituiccedilatildeo do meacutetodo handle()que jaacute existe pelo meacutetodo handle() criado e escrito pelo desenvolvedor

1 btn setOnAction (new EventHandlerltActionEvent gt() 2 Override3 pub l i c void handle ( ActionEvent event ) 4 System out p r i n t l n ( He l lo World ) 5 6 )

Listagem 39 Exemplo de uso de Anonymous Inner Class [35]

Interface funcional

Ao projetar um coacutedigo novo o desenvolvedor que optar por utilizar expressotildees lambdadeve iniciar com a criaccedilatildeo de uma interface funcional Esse tipo de interface possui umuacutenico meacutetodo abstrato permitindo que expressotildees lambda sejam usadas para sobrescrevero comportamento do meacutetodo abstrato Uma interface funcional pode possuir outros meacuteto-dos desde que sejam default Uma nova anotaccedilatildeo FunctionalInterface foi adicionadacom a atualizaccedilatildeo do Java 8 para conferir em tempo de compilaccedilatildeo se a interface satisfazos requisitos desse modelo de interface

A Listagem 310 apresenta um exemplo de interface funcional com o objetivo de permi-tir o uso de expressotildees lambda que utilizaratildeo de dois Double como paracircmetro e jaacute utilizada nova anotaccedilatildeo FunctionalInterface introduzida no Java 8

1 Funct iona l Inte r face2 pub l i c i n t e r f a c e DoubleOp 3 pub l i c Double apply ( Double a Double b)

19

4

Listagem 310 Exemplo de interface funcional

Dessa forma conforme as Listagens 311 e 312 o meacutetodo apply() pode tomar formade qualquer operaccedilatildeo entre dois Double que seraacute especificada quando a expressatildeo lambdafor montada dando o aspecto de linguagem funcional agrave linguagem e mais facilidade eliberdade ao desenvolvedor

1 pub l i c c l a s s Ca l cu la to r 2 pub l i c s t a t i c Double c a l c ( Double op1 Double op2 DoubleOp operator ) 3 re turn operator apply ( op1 op2 ) 4 5

Listagem 311 Exemplo de aplicaccedilatildeo da interface funcional

1 Double r e s u l t 1 = Ca lcu la to r c a l c (10d 50d ( a b ) minusgt a + b)

Listagem 312 Uso de expressatildeo lambda para o exemplo anterior

Collections

Dentre as atualizaccedilotildees de pacotes do Java 8 foi adicionado um meacutetodo stream() nainterface Collection Esse meacutetodo trata as Collection como streams o que significa queapesar de natildeo ser possiacutevel acessar elementos diretamente algumas novas manipulaccedilotildeessatildeo possiacuteveis Essas manipulaccedilotildees satildeo na verdade meacutetodos da interface Stream quepodem receber como paracircmetro uma expressatildeo lambda ou seja um comportamento a seraplicado agrave Collection Dentre os meacutetodos temos

bull filter() O meacutetodo filter() recebe uma expressatildeo lambda contendo uma condiccedilatildeopara filtragem da collection

bull map() O meacutetodo map() mapeia os elementos de uma Collection em outro objetocomo uma String A expressatildeo lambda passada por paracircmetro deve retornar o tipode objeto ao qual seraacute mapeado

bull forEach() O meacutetodo forEach() aplica uma operaccedilatildeo especiacutefica para cada ele-mento da Collection A expressatildeo lambda a ser passada deve conter a operaccedilatildeo aser realizada

bull min() e max() Os meacutetodos min() e max() retornam o elemento menor ou maiorda Collection dependendo da expressatildeo lambda passada como paracircmetro

20

A Listagem 313 demonstra como vaacuterias operaccedilotildees com uma Collection podem seraplicadas de uma vez de forma que lendo a expressatildeo lambda jaacute eacute possiacutevel saber oresultado da aplicaccedilatildeo do meacutetodo agrave Collection

1 r o s t e r2 stream ( )3 f i l t e r (4 p minusgt p getGender ( ) == Person Sex MALE5 ampamp p getAge ( ) gt= 186 ampamp p getAge ( ) lt= 25)7 map(p minusgt p getEmailAddress ( ) )8 forEach ( emai l minusgt System out p r i n t l n ( emai l ) )

Listagem 313 Exemplo de utilizaccedilatildeo de meacutetodos de stream com expressotildees lambda [30]

21

Capiacutetulo 4

Estudo e o Processo de Mineraccedilatildeo

A definiccedilatildeo da metodologia utilizada para realizaccedilatildeo deste trabalho eacute importante para queexista uma padronizaccedilatildeo e melhor entendimento de como os resultados foram obtidos paraque a replicaccedilatildeo do mesmo possa ser realizada em trabalhos futuros [36]

Figura 41 Processo utilizado para realizaccedilatildeo do estudo

O esquema representado na Figura 41 descreve o processo seguido para a realizaccedilatildeodeste trabalho que foi divido em trecircs grandes etapas a de planejamento definindo osobjetivos questotildees de pesquisa e meios de investigaccedilatildeo deste projeto a etapa de execuccedilatildeorealizando todo o procedimento metodoloacutegico definido para a coleta e refinamento de

22

dados e a etapa de avaliaccedilatildeo onde foram classificados e avaliados os dados coletadospara responder agraves questotildees de pesquisa

A seguir na primeira seccedilatildeo seratildeo apresentadas em detalhes as questotildees de pesquisa aserem respondidas Em seguida seraacute feito uma breve descriccedilatildeo da fonte de dados utilizada- especificamente os projetos utilizados como objetos de estudo deste trabalho e por fimtodo o restante da metodologia que foi de fato desenvolvida para obter os resultadosnecessaacuterios

41 Questotildees de Pesquisa

Com o objetivo de entender e caracterizar melhor o uso de expressotildees lambda foramdefinidas as seguintes questotildees de pesquisa a serem respondidas

bull PQ-1 Quando os projetos comeccedilaram a introduzir o uso de expressotildees lambda emseus coacutedigos e qual a meacutedia de expressotildees lambda por snapshots caso existam

bull PQ-2 Como as equipes de desenvolvimento estatildeo utilizando expressotildees lambdaatraveacutes de refatoraccedilatildeo de coacutedigo ou introduzindo apenas em coacutedigo novo

bull PQ-3 Quais satildeo os padrotildees tipicamente adotados para o uso de expressotildees lambda

A primeira pergunta de pesquisa gira em torno de como projetos populares open-sourceestatildeo se adaptando agrave introduccedilatildeo de expressotildees lambda em Java muitos projetos jaacute estatildeoutilizando as expressotildees lambda Se sim a partir de quando comeccedilaram a utilizaacute-lasdesde o iniacutecio da introduccedilatildeo das mesmas no Java 8 ou em um periacuteodo mais tardio Aleacutemdisso eacute interessante descobrir se a utilizaccedilatildeo dessa nova caracteriacutestica tem acontecido deforma expressiva ou natildeo

Em seguida para melhor entender a forma como as expressotildees lambda estatildeo sendointroduzidas em projetos eacute interessante investigar se as equipes de desenvolvimento estatildeose preocupando em refatorar coacutedigo com o objetivo de evoluir o software ou se estatildeoexperimentando utilizar expressotildees lambda apenas em coacutedigo novo introduzido

Como a introduccedilatildeo de novas funcionalidades em projetos open-source de grande escaladepende do objetivo do projeto e os padrotildees de projeto utilizados [37] espera-se obser-var diversas abordagens quanto a utilizaccedilatildeo de expressotildees lambda para entatildeo poderclassificar estes softwares quanto a abordagem utilizada

Eacute de grande importacircncia para este estudo conseguir identificar na praacutetica comoexpressotildees lambda estatildeo sendo tipicamente adotadas nestes projetos Assim a terceirapergunta de pesquisa busca identificar alguns exemplos de utilizaccedilatildeo atraveacutes da realizaccedilatildeode alguns estudos de caso

23

Eacute importante ressaltar que apesar de as expressotildees lambda serem uma alternativa aouso de AIC elas natildeo os substituem completamente Existem precondiccedilotildees para que umaAIC possa ser substituiacuteda por expressotildees lambda [12] descritas a seguir

bull AIC deve instanciar-se de uma interface

bull AIC natildeo deve possuir nenhum campo e declarar apenas um meacutetodo

bull AIC natildeo deve possuir uma referecircncia para this ou super

bull AIC natildeo deve declarar um meacutetodo recursivo

Para responder agrave primeira pergunta apenas dados gerais sobre todos os projetos seratildeonecessaacuterios ao passo que pelas perguntas 2 e 3 possuiacuterem uma natureza mais complexaseraacute necessaacuterio aleacutem de uma anaacutelise geral estatiacutestica a realizaccedilatildeo de alguns estudos decaso para obter resultados mais completos

42 Fonte de Dados e Objetos de Estudo

Para responder agraves perguntas de pesquisa estabelecidas foram selecionados os 99 projetosmais populares na linguagem Java dentro da plataforma github ateacute a data da coleta dosdados feita em Abril de 2017 Satildeo considerados populares os repositoacuterios que possuema maior quantidade possiacutevel de estrelas (stars) A decisatildeo de escolher os 99 projetos maispopulares foi por sua natureza imparcial e ao mesmo tempo para que se possa analisarprojetos que satildeo de familiaridade e conhecimento da comunidade do github e de domiacuteniopuacuteblico Os 99 projetos estatildeo listados no Anexo I

Para entender a transiccedilatildeo feita por esses projetos entre as versotildees anteriores do Java eo Java 8 com as expressotildees lambda eacute necessaacuterio analisar o coacutedigo de vaacuterias versotildees a fimde observar alguma mudanccedila para cada projeto Como satildeo 99 projetos e vaacuterios dessesprojetos possuem milhares de linhas de coacutedigo e commits seria impossiacutevel avaliar todosos commits Optou-se entatildeo por coletar snapshots mensais de cada projeto conformeprocedimento tambeacutem seguido anteriormente [38] Cada snapshots representa o estadodo projeto em um determinado mecircs e como criteacuterio de escolha padratildeo todos os snapshotsequivalem ao uacuteltimo commit realizado no determinado mecircs que este representa

O proacuteximo passo eacute determinar o periacuteodo de tempo em que esses snapshots seriamcoletados Como Java 8 (e consequentemente as expressotildees lambda) foi introduzidoapenas em meados de 2014 [28] coletar dados de projetos a partir de um periacuteodo muitoantes deste ano natildeo agregaria valor ao estudo em questatildeo Definiu-se entatildeo um periacuteodopara a coleta mensal desses snapshots atraveacutes dos anos Janeiro de 2013 um ano antesda introduccedilatildeo do Java 8 para que se pudesse identificar para todos os projetos o mecircs

24

exato em que expressotildees lambda foram introduzidas ateacute o mecircs da coleta de dados Abrilde 2017

Eacute importante ressaltar que a definiccedilatildeo dos meses foi definida do dia primeiro de ummecircs ao dia primeiro do proacuteximo mecircs e por consequecircncia alguns snapshots que deveriamrepresentar o final de determinado mecircs correspondem na verdade a commits realizadosno dia primeiro do mecircs seguinte Por exemplo pode existir casos em que o commit querepresente o mecircs de Marccedilo de 2016 seja na verdade o commit realizado no dia primeirode Abril de 2016 Isso se deve a natureza da forma como os resultados de log de commitssatildeo obtidos pelo git [39] Poreacutem isso natildeo interfere nas anaacutelises ou no propoacutesito destetrabalho uma vez que foram realizadas verificaccedilotildees e validaccedilotildees para que natildeo existamdatas repetidas (e consequentemente commits repetidos) por repositoacuterio

Neste trabalho o termo projeto e repositoacuterio foram utilizados de forma intercaladapara representar a mesma coisa o software desenvolvido que possui um repositoacuterio naplataforma github Os termos commit snapshops e versotildees tambeacutem representam a mesmacoisa uma vez que foi definido que seriam utilizados apenas um commit por mecircs pararepresentar um determinado snapshot ou versatildeo do repositoacuterio em questatildeo

Todos os 99 projetos seratildeo utilizados para a realizaccedilatildeo de uma anaacutelise geral de ca-racterizaccedilatildeo do uso de expressotildees lambda Para as anaacutelises aprofundadas foi feito umcriteacuterio de classificaccedilatildeo para que apenas alguns projetos possam ser analisados em niacutevelde coacutedigo como estudos de caso

Resumindo foram escolhidos os 99 projetos mais populares de Java no github cole-tando dados mensais de seus commits a partir do ano de 2013 ateacute a data da coleta dosdados lembrando que nem todos os projetos existem desde 2013 (projetos mais recentes)

43 Processo de Mineraccedilatildeo

A abordagem utilizada para coletar e analisar os 99 projetos escolhidos como mostra aFigura 42 foi realizada de forma automatizada utilizando scripts python e dois projetosdesenvolvidos em Java para a coleta e tratamento de dados como descrito a seguir

Primeiramente foi realizado uma coacutepia dos repositoacuterios atuais de todos os 99 projetosmais populares do github em Java Para automatizar o processo foi desenvolvido umscript em python que lista todos os projetos escolhidos clona todos os repositoacuterios emuma pasta na maacutequina local e cria um arquivo temporaacuterio com as informaccedilotildees do nomede cada repositoacuterio e seu caminho absoluto na maacutequina local

25

Figura 42 Metodologia implementada para coleta e tratamento de dados

Em seguida foi necessaacuterio realizar o checkout de todas as versotildees entre Janeiro de2013 a Abril de 2017 de cada projeto Por motivos de otimizaccedilatildeo de espaccedilo da maacutequinalocal e automatizaccedilatildeo no processo de checkout utilizou-se de um segundo script pythonque realizava as seguintes tarefas para cada mecircs em cada projeto verificar se dentreo mecircs estipulado houve algum commit para aquele projeto se sim pega-se o hash douacuteltimo commit do mecircs realiza o checkout conta-se a quantidade de linhas de coacutedigo emJava que o projeto tem utilizando a biblioteca cloc e armazena todas as informaccedilotildeespertinentes referentes a todos os projetos que naquele mecircs tiveram commits para que oprojeto static-analysis possa entatildeo ser executado sobre esses projetos naquele determinadomomento As informaccedilotildees coletadas que satildeo utilizadas pelo static-analysis correspondemao nome do projeto o hash do commit para aquela versatildeo a pasta onde o projeto estaacutearmazenado na maacutequina local a quantidade de linhas de coacutedigo Java do projeto e datareferente ao commit Essas informaccedilotildees satildeo pertinentes para que o projeto static-analysisconsiga funcionar de forma correta projeto este descrito em detalhes a seguir

431 static-analysis

O static-analysis foi um projeto desenvolvido anteriormente a este trabalho pelos alunosThiago Cavalcanti e Vinicius de Almeida cujo objetivo eacute realizar a anaacutelise estaacutetica de

26

coacutedigos-fonte Java e gerar arquivos de saiacuteda contendo informaccedilotildees de classes e meacutetodoscom suas devidas ocorrecircncias de caracteriacutesticas da linguagem [40]

A anaacutelise estaacutetica de coacutedigo consiste em analisar um coacutedigo-fonte sem a necessidadede executaacute-lo Esse tipo de anaacutelise eacute de extrema importacircncia para manter um coacutedigo dequalidade evitar futuras refatoraccedilotildees e obter informaccedilotildees estatiacutesticas de forma raacutepida epraacutetica [41]

Seguindo esse princiacutepio o static-analysis foi projetado para receber um arquivo deentrada csv seguindo o padratildeo

Tipo da Aplicaccedilatildeo Inicio do projeto Antes ou Apoacutes Java 5 Nome do ProjetoVersatildeo Caminho absolutoQuantidade de linhas de coacutedigo

Atraveacutes da informaccedilatildeo do caminho absoluto do projeto o static-analysis varre osdiretoacuterios em busca dos arquivos fonte java realiza o parse desses arquivos e utilizade Visitors para extrair as informaccedilotildees desejadas e exporta-las em arquivos csv Ouso de Visitors permite que sejam escolhidas as informaccedilotildees desejadas para a consultacomo expressotildees Lambda e AIC s aleacutem de possibilitar que sejam implementados novosVisitors conforme a linguagem evolua ou as necessidades mudem

Para este trabalho foram utilizados os Visitors de expressotildees Lambda map() filter()AICs e declaraccedilotildees de meacutetodos

432 BDAnalisador

Apoacutes obter todas as informaccedilotildees necessaacuterias geradas pelo static-analysis era preciso ma-nipular os dados de forma que facilitasse a coleta de dados para o estudo proposto Comovaacuterios arquivos em formato csv satildeo de difiacutecil manipulaccedilatildeo foi desenvolvido entatildeo umaferramenta chamada BDAnalisador Esta ferramenta eacute responsaacutevel por processar os arqui-vos em csv gerados pelo static-analysis e popular uma base de dados relacional MySQLcom as informaccedilotildees pertinentes a este estudo

O BDAnalisador foi desenvolvido com a intenccedilatildeo de tornar mais simples o trabalhocom os dados resultantes do static-analysis de forma que consultas em SQL pudessemser feitas a ponto de permitir a obtenccedilatildeo de resultados mais complexos Seguindo esseobjetivo o framework Hibernate foi escolhido como ferramenta para persistecircncia devidoa ser um framework jaacute consolidado no mercado e que de forma simples relaciona osobjetos Java ao banco de dados MySQL [42] A divisatildeo de classes foi projetada em quatroentidades Projeto Versao Classe e Metodo cada uma com seus respectivos camposcontendo as informaccedilotildees necessaacuterias para a pesquisa como pode ser visto na Figura 44Eacute importante ressaltar que a tabela de Versao guarda hashs de commits devido agrave escolhade utilizar commits para obter mais informaccedilatildeo de evoluccedilatildeo de coacutedigo em um menor

27

espaccedilo de tempo Aleacutem disso para este trabalho optou-se por persistir todos os meacutetodose classes de cada versatildeo sem se importar com a repeticcedilatildeo desses dados pois a hipoacutetesede haver grandes refatoraccedilotildees entre versotildees poderia comprometer a confiabilidade dasinformaccedilotildees

Figura 43 Diagrama de classes UML do BDAnalisador

Como visto na Figura 43 seguindo parcialmente a arquitetura MVC cada entidadepossui sua respectiva classe DAO(Data Access Object) para persistecircncia dos dados eapenas uma classe Controlador no projeto responsaacutevel pela manipulaccedilatildeo e parse dosdados dos arquivos csv gerados pelo static analysis para serem enviados agraves classes DAOO sistema inicia chamando o meacutetodo inicializar() da classe Controlador Esse meacutetodoeacute responsaacutevel por ler um arquivo de entrada csv que segue o mesmo modelo do arquivo dostatic-analysis citado na seccedilatildeo anterior O arquivo conteacutem os dados de todos os projetose suas respectivas versotildees dessa forma o meacutetodo instancia um objeto da classe Projetoe persiste o projeto no banco de dados Para cada versatildeo encontrada no arquivo deentrada o inicializar() aciona os meacutetodos responsaacuteveis por instanciar e preencher aslistas da classe Classe e Metodo Os meacutetodos responsaacuteveis por preencher as listas varremos arquivos csv gerados pelo static-analysis e fazem o parse das informaccedilotildees relevantescomo nomes dos meacutetodos e quantidades de lambdas para construir os objetos que seratildeogravados Ao final dos preenchimentos o objeto Versatildeo eacute instanciado e gravado no bancode dados atraveacutes de sua classe DAO ao mesmo tempo que grava suas respectivas Classese Metodos

28

Apoacutes vaacuterios testes e correccedilotildees de bugs o banco de dados se encontrava finalmente comas informaccedilotildees de 99 projetos Java open-source separados por um commit por mecircs desde2013 cada um com suas respectivas informaccedilotildees de classes meacutetodos e a quantidade deexpressotildees lambda filters e maps em cada meacutetodo Filter ou Filter pattern eacute o padratildeode projeto que tem como objetivo filtrar objetos de uma coleccedilatildeo (Collection) de acordocom algum criteacuterio Jaacute o map ou map pattern eacute um padratildeo que ldquomapeia os elementosde uma coleccedilatildeo aplicando uma funccedilatildeo a eles para uma nova coleccedilatildeo [43] A coleta deinformaccedilotildees sobre esses padrotildees podem ser uacuteteis para possiacuteveis anaacutelises de oportunidadesde uso de expressotildees lambda para refatoraccedilatildeo de coacutedigo

A Figura 44 mostra o esquema de como o banco de dados resultante foi gerado

Figura 44 Modelo relacional do banco de dados populado pelo BDAnalisador Imagemgerada com software DBeaver [2]

44 Classificaccedilatildeo e Anaacutelise

Com o banco de dados populado restam apenas as etapas de classificaccedilatildeo e anaacutelise pararesponder as questotildees de pesquisa propostas Para isso inicialmente houve uma tentativade se utilizar apenas queries SQL para analisar os dados de acordo com as informaccedilotildeesrelevantes Poreacutem devido ao fato de o banco de dados conter todas as informaccedilotildees detodos os projetos e todas as suas versotildees queries que possuem uma alta complexidadedemoravam muito tempo para retornar os dados

Assim com o objetivo de facilitar o trabalho alguns scripts python foram desenvolvi-dos para rodar as queries separadamente e individualmente para cada projeto de formaautomatizada a fim de melhorar o tempo de resposta para obtenccedilatildeo dos resultados

29

441 Meacutedia de Lambda

O primeiro script retorna a quantidade de expressotildees lambda (ou AICs) por n snapshotsque contenha expressotildees lambda O objetivo eacute ter uma visatildeo geral da meacutedia de expressotildeeslambda e AICs utilizadas por cada projeto e como nem todos os snapshots coletados decada projeto possuem expressotildees lambda e AICs apenas aqueles com alguma expressatildeolambda ou AIC satildeo incluiacutedos no caacutelculo da meacutedia

Mmedia =sumn qtdLambdai

n

442 Anaacutelise Temporal

O segundo script retorna para cada projeto a soma total da quantidade de expressotildeeslambda AIC map() e filter() no projeto inteiro para cada versatildeo Ou seja tem-seo total de cada uma das quatro propriedades selecionadas para cada mecircs do projetoobtendo assim uma visatildeo temporal de evoluccedilatildeo do uso das caracteriacutesticas descritas ATabela 41 ilustra parcialmente o resultado obtido para o projeto agera onde idVersaoeacute o identificador no banco de dados referente ao hash do commit mensal coletado qtd eacutea quantidade de cada uma das caracteriacutesticas escolhidas e a data do commit encontra-seno formato americano

Tabela 41 Informaccedilotildees mensais sobre o projeto ageraidVersao Data do Commit qtd lambda qtd AIC qtd maps qtd filter

823 512016 0 29 4 0755 612016 13 28 4 0686 6152016 13 29 4 0621 812016 13 29 4 0555 8162016 13 30 4 0485 922016 13 30 4 0422 10132016 14 30 4 0356 11282016 14 30 4 0295 12212016 21 30 5 0232 212017 21 30 5 0175 312017 21 30 5 0112 3312017 21 36 5 048 4242017 21 48 5 0

Os resultados obtidos com esta anaacutelise temporal permitiu a identificaccedilatildeo de padrotildees nautilizaccedilatildeo de expressotildees lambda em relaccedilatildeo a utilizaccedilatildeo de AIC por todos os projetos Foi

30

possiacutevel classificar todos os projetos em 6 grupos ilustrado na Figura 45 Primeiramenteseparou-se os projetos entre os que possuem expressotildees lambda e os que natildeo possuemDentre os que possuem identificou-se cinco categorias

1 Grupo 1 Quantidade de AICs e expressotildees lambda aumentam com o tempo pro-porcionalmente

2 Grupo 2 Quantidade de AICs diminui agrave medida que a quantidade de expressotildeeslambda aumentam e a quantidade de expressotildees lambda ultrapassa a quantidade deAIC em um determinado momento

3 Grupo 3 Quantidade de AICs diminui agrave medida que a quantidade de expressotildeeslambda aumentam mas a quantidade de AIC permanece superior agrave quantidade delambda

4 Grupo 4 Expressotildees lambda satildeo introduzidas e existem por um pequeno periacuteodode tempo mas satildeo completamente removidas posteriormente

5 Grupo 5 Quantidade de expressotildees lambda eacute constante e muito inferior compa-rado com a quantidade de AICs no projeto Foi determinado que para pertencera esta classificaccedilatildeo o projeto precisa ter uma razatildeo de meacutedia de expressotildees lamb-dasnapshot por meacutedia de AICsnapshot inferior a 020 Esse paracircmetro foi esta-belecido com o objetivo de definir um padratildeo para o que pode ser considerado umprojeto com poucas expressotildees lambda

Figura 45 Classificaccedilatildeo dos projetos

31

443 Refatoraccedilatildeo de Coacutedigo

O uacuteltimo script teve como objetivo realizar uma tentativa inicial de identificar refatoraccedilatildeode coacutedigo da seguinte maneira para todos os projetos que possuem expressotildees lambdaforam identificados o mecircs imediatamente antes da introduccedilatildeo de expressotildees lambda e omecircs seguinte onde houve a primeira ocorrecircncia de lambda no projeto Assim realizou-se uma anaacutelise do tamanho em quantidade de linhas de coacutedigo de todos os meacutetodosdo projeto que no mecircs seguinte tiveram introduccedilatildeo de lambda Em seguida fez-se umacomparaccedilatildeo com os mesmos meacutetodos em relaccedilatildeo ao mecircs anterior e assim foi possiacuteveldetectar quais meacutetodos tiveram a quantidade de linhas de coacutedigo reduzidas o que seriaum indicativo natildeo necessariamente exclusivo de que uma refatoraccedilatildeo de coacutedigo possa terocorrido

Sabe-se que este meacutetodo de detecccedilatildeo de refatoraccedilatildeo de coacutedigo possui suas limitaccedilotildeesuma vez que as comparaccedilotildees para saber se um meacutetodo existe em ambas versotildees eacute feitopuramente por comparaccedilatildeo de String (nome do meacutetodo) e a classe que este pertence

444 Casos de Uso

Os meacutetodos descritos acima ajudaram a identificar alguns padrotildees e facilitar a anaacutelise dosdados Poreacutem natildeo satildeo suficientes para que se possa responder agraves questotildees de pesquisaDessa forma apoacutes a identificaccedilatildeo dos grupos de classificaccedilatildeo para os projetos foramescolhidos um projeto de cada grupo (com exceccedilatildeo do grupo dos projetos sem expressotildeeslambda) para realizar um breve estudo de caso com o objetivo de identificar e caracterizarmelhor a adoccedilatildeo de expressotildees lambda Os projetos escolhidos foram agera vertxAndroid-CleanArchitecture RxJava e guava

32

Capiacutetulo 5

Resultados Obtidos e Anaacutelise

Neste capiacutetulo seratildeo apresentados os dados obtidos e anaacutelise com o objetivo de responderagraves questotildees de pesquisa propostas Como mencionado anteriormente as perguntas seratildeorespondidas de duas maneiras algumas com informaccedilotildees gerais sobre todos os projetose outras com breve estudos de caso envolvendo cinco projetos

51 Visatildeo Geral

Dentre os repositoacuterios coletados para a anaacutelise 74 (7474) natildeo utilizaram nenhumaexpressatildeo lambda no projeto durante todo o periacuteodo analisado (Janeiro de 2013 a Abrilde 2017) restando apenas 25 repositoacuterios (2525) com expressotildees lambda Eacute interessantedestacar que apesar de a quantidade de repositoacuterios que natildeo possuem expressotildees lambdaser relativamente expressiva muitos destes repositoacuterios satildeo de projetos em Java que umdia foram populares e atualmente natildeo estatildeo sendo mais desenvolvidos (por exemplo umaplicativo que soacute funciona para Android 23 atualmente descontinuado)

Levando em consideraccedilatildeo apenas os projetos que possuem expressotildees lambda exis-tem dois tipos de dados que podem ser analisados para responder agrave primeira questatildeo depesquisa atraveacutes dos dados obtidos pelo meacutetodo anteriormente mencionado como anaacutelisetemporal e a meacutedia de lambda por snapshot mencionados no capiacutetulo anterior

Com relaccedilatildeo ao ano em que a primeira ocorrecircncia foi encontrada 6 projetos introduzi-ram expressotildees lambda jaacute em 2014 8 comeccedilaram a utilizar em 2015 7 em 2016 e apenas4 tiveram a primeira ocorrecircncia de expressotildees lambda em 2017 Dessa forma percebe-seque os projetos estatildeo relativamente bem distribuiacutedos em grupos quanto ao ano em que seintroduziu expressotildees lambda

Pela meacutedia de lambda por snapshot (lambdasnapshot) a maioria (11 projetos) possuiuma quantidade expressiva acima de 100 lambdasnapshot (com 6 projetos entre 20 e 100lambdasnapshot e 8 projetos com menos de 20 lambdasnapshot) como apresentados no

33

graacutefico da Figura 51 Isso mostra que essa nova caracteriacutestica jaacute estaacute sendo bem utilizadanos projetos que comeccedilaram a migrar para a nova versatildeo do Java

Figura 51 Graacuteficos dos projetos separados por ano de introduccedilatildeo de expressotildees lambdae meacutedia de lambda por snapshot

Com isso pode-se observar que apesar de a quantidade de projetos que possuemexpressotildees lambda natildeo ser tatildeo alta eacute possiacutevel obter resultados expressivos uma vez quea quantidade dos projetos com lambda estatildeo bem dispersos quanto ao periacuteodo em quecomeccedilaram a adotar essa caracteriacutestica e a quantidade de expressotildees lambda por snapshot

511 Projetos Selecionados

Atraveacutes dos grupos de classificaccedilatildeo identificados pela anaacutelise temporal descritos na Figura45 cinco projetos foram selecionados para uma anaacutelise detalhada levando em consideraccedilatildeoo grupo em que eles pertencem Estes projetos seratildeo apresentados a seguir

512 agera

Agera eacute uma biblioteca Android que ajuda a introduzir programaccedilatildeo funcional reativa(functional reactive programming) em projetos Android Eacute um projeto recente lanccediladoem 2016 pela Google [44] e encontra-se no grupo dos projetos que introduziram expressotildeeslambda em 2016 no mesmo ano de seu lanccedilamento contendo uma meacutedia de expressotildeeslambda de 16 lambdasnapshot

Na classificaccedilatildeo estabelecida agera pertence ao Grupo 1 onde a quantidade de ex-pressotildees lambda no projeto com o tempo aumentam juntamente com a quantidade deAICs como mostra o graacutefico de anaacutelise temporal na Figura 52

34

Figura 52 Graacuteficos de anaacutelise temporal do projeto agera

513 vertx

Eclipse Vertx eacute um conjunto de ferramentas para criaccedilatildeo de reactive applications namaacutequina virtual Java (JVM) em grande escala [45] Seu primeiro lanccedilamento aconteceuem 2011 e a primeira ocorrecircncia de expressotildees lambda no projeto aconteceu em 2014 Esteprojeto possui uma meacutedia de 2867 lambdasnapshot e dentre os projetos consideradosneste trabalho eacute o que possui a maior quantidade de expressotildees lambda

Este projeto pertence ao Grupo 2 onde a quantidade de expressotildees lambda aumen-tou consideravelmente pelos meses ultrapassando a quantidade de AICs que diminuiudrasticamente como mostra a Figura 53

35

Figura 53 Graacuteficos de anaacutelise temporal do projeto Vertx

514 Android-CleanArchitecture

Apesar de ser uma amostra de projeto Android-CleanArchitecture que tem como objetivoconstruir aplicaccedilotildees Android utilizando clean architecture foi lanccedilado em 2014 mas semanteacutem sempre atualizado [46]

A introduccedilatildeo de expressotildees lambda que aconteceu no ano de 2015 se deu de formatiacutemida com uma meacutedia de 35 lambdasnapshot De qualquer forma este projeto conseguerepresentar com seu graacutefico de anaacutelise temporal o grupo 3 composto por projetos em quea quantidade de expressotildees lambda aumentou mas sem ultrapassar AICs que diminuiacuteramdemonstrado no graacutefico da Figura 54

36

Figura 54 Graacuteficos de anaacutelise temporal do projeto Android-CleanArchitecture

515 RxJava

Dentre os repositoacuterios estudados RxJava eacute considerado o mais popular Como umaimplementaccedilatildeo de Reactive Extensions para a JVM RxJava teve seu lanccedilamento dadoem 2013 [47] Expressotildees lambda apareceram pela primeira vez no ano de 2015 comuma meacutedia de 766 lambdasnapshot

Apesar de uma meacutedia relativamente alta o tempo de vida das expressotildees lambda nesteprojeto foi bem curto caracterizando assim projetos do grupo 4 houve a introduccedilatildeo dasexpressotildees lambda no projeto poreacutem houve a remoccedilatildeo completa de todas as expressotildeeslambda previamente introduzidas desaparecendo completamente do projeto ateacute a datada coleta de dados (Figura 55)

37

Figura 55 Graacuteficos de anaacutelise temporal do projeto RxJava

516 guava

Guava eacute um conjunto de bibliotecas para Java da Google lanccedilado em 2011 A atualizaccedilatildeodo coacutedigo do projeto para Java 8 aconteceu somente em 2016 e apesar do projeto conteruma meacutedia de 281 lambdasnapshot ele foi escolhido como representante dos projetosdo Grupo 5 (Figura 56) que possuem expressotildees lambda mas de forma natildeo expressiva osuficiente quando comparado com a quantidade de AIC pelo fato de sua razatildeo de meacutedia delambdasnapshot por meacutedia de AICsnapshot ser 004 Ou seja embora o projeto tenhaexpressotildees lambda estas satildeo consideradas muito poucas quando inseridas no contextogeral deste projeto que eacute considerado um projeto grande

38

Figura 56 Graacuteficos de anaacutelise temporal do projeto Guava

52 Refatoraccedilatildeo de Coacutedigo

Com o objetivo de caracterizar melhor como as expressotildees lambda estatildeo sendo utilizadaseacute interessante identificar se estas estatildeo sendo introduzidas atraveacutes de refatoraccedilatildeo de coacutedigoou em coacutedigo novo

Os projetos classificados como pertencentes ao Grupo 2 possuem em comum o fatode expressotildees lambda aumentarem a medida que AICs diminuem ultrapassando-as eessa caracteriacutestica em comum pode indicar que nestes projetos possivelmente houve re-fatoraccedilatildeo de coacutedigo visto que AIC sendo substituiacutedo por expressotildees lambda dentro dascondiccedilotildees determinadas eacute a maneira mais comum de se identificar refatoraccedilatildeo de coacute-digo para introduccedilatildeo de expressotildees lambda [12] Os projetos que compotildeem o grupo 2representam 44 de todos os projetos estudados que possuem expressotildees lambda o quepode ser um indicativo caso a hipoacutetese de refatoraccedilatildeo de coacutedigo seja positiva de quemuitos projetos que estatildeo adotando o Java 8 estatildeo se preocupando de alguma formacom refatoraccedilatildeo se coacutedigo Fazem parte desse grupo os seguintes projetos elasticsearchjava-design-patterns PocketHub presto RxJava-Android-Samples spark vertx zipkinjava8-tutorial dropwizard e material-dialogs

39

Outra maneira de verificar possiacuteveis indicadores de refatoraccedilatildeo de coacutedigo foi atraveacutesda anaacutelise dos tamanhos (em quantidade de linhas de coacutedigo) dos meacutetodos com expressotildeeslambda no mecircs em que se introduziu expressotildees lambda e um mecircs imediatamente antesdeste Essa anaacutelise mostra que dos 25 projetos com expressotildees lambda 12 (48) projetostiveram ao menos um meacutetodo em que houve uma diminuiccedilatildeo no tamanho o que podeser considerado um indicativo de refatoraccedilatildeo de coacutedigo A Figura 57 mostra todos osprojetos em relaccedilatildeo agrave quantidade total de meacutetodos que possuem lambda no primeiro mecircsde introduccedilatildeo do mesmo em vermelho comparado com a quantidade desses meacutetodos quetiveram uma diminuiccedilatildeo no tamanho quando comparados com o coacutedigo do mecircs anteriorem azul

Figura 57 Comparaccedilatildeo entre todos os projetos com expressatildeo lambda sobre refatoraccedilatildeode coacutedigo no mecircs de introduccedilatildeo da caracteriacutestica

Ainda observando a figura 57 com relaccedilatildeo aos projetos que natildeo tiveram nenhummeacutetodo com diminuiccedilatildeo de tamanho (barra azul) percebe-se que todos os 13 projetossequer tiveram uma quantidade significativa de meacutetodos que possuem expressotildees lambda(com o maior tendo apenas 5 meacutetodos) no mecircs de introduccedilatildeo da caracteriacutestica no projetoe ao mesmo tempo jaacute existiam no mecircs em que natildeo existia lambda no projeto Essa eacuteuma observaccedilatildeo importante porque projetos como vertx sendo este o que possui a maiormeacutedia de lambdasnapshot de todos os projetos e ao mesmo tempo tendo apenas trecircsmeacutetodos que continham expressotildees lambda no mecircs da introduccedilatildeo e que existiam no mecircs

40

anterior permitem inferir que todas as outras expressotildees lambda existentes no projetopara este determinado mecircs de introduccedilatildeo encontram-se em coacutedigo novo introduzido

Eacute importante ressaltar que somente essa anaacutelise natildeo eacute exclusivamente suficiente paradeterminar se estes projetos estatildeo realmente introduzindo lambda em coacutedigo novo ourealizando refatoraccedilatildeo uma vez que como a comparaccedilatildeo aconteceu apenas no mecircs deintroduccedilatildeo com o mecircs imediatamente anterior natildeo reflete todo o ciclo de vida do pro-jeto Por exemplo algumas equipes podem escolher refatorar o coacutedigo depois de umtempo de adaptaccedilatildeo apoacutes a transiccedilatildeo para a nova versatildeo da linguagem Assim paraobter uma melhor anaacutelise sobre refatoraccedilatildeo de coacutedigo ou natildeo feita nestes projetos aleacutemde outras anaacutelises referentes aos padrotildees tipicamente adotados para implementaccedilatildeo delambda nestes projetos seratildeo apresentados a seguir os estudos de caso dos cinco projetospreviamente selecionados

Outro ponto importante eacute o fato de que apesar das informaccedilotildees quanto agraves quantida-des de filter e map terem sido incluiacutedas inicialmente no trabalho para observar possiacuteveispadrotildees de refatoraccedilatildeo de coacutedigo percebeu-se que estas natildeo satildeo utilizadas de forma con-sideraacutevel pelos projetos estudados e para fins de anaacutelises generalizadas natildeo apresentaramtanta influecircncia na utilizaccedilatildeo de expressotildees lambda quanto a quantidade de AICs noprojeto

53 Estudos de Caso

Dentre os projetos analisados verificou-se que os projetos de pequeno e meacutedio porte op-taram por refatorar de uma vez seus coacutedigos para incluir expressotildees lambda em situaccedilotildeesem que se utilizava AICs anteriormente ou em alguns poucos casos de utilizaccedilatildeo deCollection Os projetos de grande porte natildeo apresentaram nenhuma refatoraccedilatildeo de coacute-digo ou uma refatoraccedilatildeo parcial gradativa provavelmente devido agrave grande quantidade dearquivos e coacutedigo que possuem o que pode tornar o trabalho de refatoraccedilatildeo extenso ecansativo

O projeto vertx que pertence ao grupo 2 dos projetos em que a quantidade de ex-pressotildees lambda aumentaram e as de AICs diminuiacuteram com lambda ultrapassando AICsexecutou inicialmente commits em maio de 2014 com adiccedilatildeo de coacutedigo novo utilizandoexpressotildees lambda e apoacutes um mecircs realizou um commit maior com a refatoraccedilatildeo de todasas AICs para expressotildees lambda Apoacutes a refatoraccedilatildeo o projeto se preocupou em mantera utilizaccedilatildeo de expressotildees lambda ao mesmo tempo que o uso de AICs se manteve apenasaos casos de classes com interfaces natildeo funcionais A Figura 58 apresenta uma parte docommit de refatoraccedilatildeo de coacutedigo que mostra em vermelho a parte eliminada do coacutedigo(AIC) e em verde o coacutedigo novo representando a substituiccedilatildeo por uma expressatildeo lambda

41

Figura 58 Commit de refatoraccedilatildeo de coacutedigo do projeto Vertx [3]

Alguns projetos ainda natildeo se preocuparam em refatorar o coacutedigo para o uso de ex-pressotildees lambda ateacute a data deste trabalho que eacute o caso do projeto guava que apresentouum commit em 03112016 com a atualizaccedilatildeo do projeto para Java 8 Mas a partir daatualizaccedilatildeo se preocupou em utilizar as expressotildees lambda apenas na implementaccedilatildeo decoacutedigo novo O cenaacuterio em que a refatoraccedilatildeo natildeo eacute prioridade ainda eacute a realidade de vaacuteriosprojetos de grande porte visto que os dados de projetos sem nenhuma expressatildeo lambdasatildeo o maior nuacutemero neste trabalho Poreacutem projetos que jaacute adotaram a utilizaccedilatildeo do Java8 tendem a mudar isso com o passar do tempo A Figura 59 apresenta em verde umaadiccedilatildeo de coacutedigo novo com expressatildeo lambda sem a eliminaccedilatildeo de algum coacutedigo anteriora esse que estaria em vermelho

42

Figura 59 Exemplo de um arquivo do commit de adiccedilatildeo de coacutedigo novo em Java 8 doprojeto Guava [4]

Na categoria de projetos em que os AICs e expressotildees lambda aumentam proporci-onalmente (grupo 1) o projeto agera realizou um commit em 19052016 com a adiccedilatildeoda biblioteca retrolambda como dependecircncia do projeto Essa biblioteca utilizada prin-cipalmente por projetos Android permite executar coacutedigo Java 8 contendo expressotildeeslambda em Java 5 6 e 7 [48] O commit tambeacutem apresenta refatoraccedilatildeo dos AICs ad-vindos de interfaces funcionais para expressotildees lambda Apesar de o projeto continuar autilizar as expressotildees lambda em seus commits posteriores o nuacutemero de AICs tambeacutemcontinuou a aumentar visualizando os commits posteriores notou-se que esses AICs satildeorelativos a interfaces natildeo funcionais ou seja que possuem mais de um meacutetodo O projetoAndroid-CleanArchitecture eacute similar ao agera pois tambeacutem optou pela instalaccedilatildeo da bi-blioteca retrolambda para uso de expressotildees lambda em seus coacutedigos e como tambeacutem eacuteum projeto de pequeno porte houve uma pequena refatoraccedilatildeo dos AICs A Figura 510mostra a parte do commit de refatoraccedilatildeo de coacutedigo em que o desenvolvedor adiciona abiblioteca retrolambda como dependecircncia

43

Figura 510 Commit de adiccedilatildeo da biblioteca Retrolambda no projeto Agera [5]

Outro caso interessante eacute o do projeto RxJava que em 2015 optou pela refatoraccedilatildeodo coacutedigo para a utilizaccedilatildeo de expressotildees lambda quase eliminando por completo o usode AICs mas que no ano seguinte reverteu os commits de forma que eliminasse comple-tamente o uso de expressotildees lambda para manter a retrocompatibilidade com o Java 6A Figura 511 demonstra uma parte do commit de reversatildeo do coacutedigo para Java 6 emque pode ser visto em vermelho o coacutedigo anterior com expressotildees lambda e o verde como novo coacutedigo utilizando AIC novamente

44

Figura 511 Commit de remoccedilatildeo de Lambdas e volta para o uso de AICs no projetoRXJava [6]

Essa preocupaccedilatildeo com retrocompatibilidade de coacutedigo pode ser um fator crucial nadecisatildeo das equipes de desenvolvimento na hora de decidir como fazer o software co-evoluircom a linguagem sem perder a compatibilidade com versotildees anteriores

45

Capiacutetulo 6

Consideraccedilotildees Finais

Este estudo permitiu entender melhor como projetos estatildeo realizando a migraccedilatildeo para oJava 8 em especial utilizando uma nova caracteriacutestica introduzida expressatildeo lambdaApesar de a maioria dos projetos populares considerados natildeo possuiacuterem nenhuma ocor-recircncia de expressotildees lambda os projetos que tinham expressotildees lambda foram suficientespara realizar um primeiro estudo de caracterizaccedilatildeo no uso desta caracteriacutestica e com osprojetos efetivamente utilizados para estudo foi possiacutevel agrupaacute-los quanto a maneira emque as expressotildees lambda estavam sendo utilizadas quando comparadas com AICs em 5grandes grupos quando AIC e lambda aumentam proporcionalmente quando AIC dimi-nui e lambda aumenta ultrapassando AIC quando AIC diminui mas continua superior aolambda crescente expressotildees lambda que foram introduzidas e retiradas completamentedo coacutedigo e expressotildees lambda que natildeo existem em quantidades expressivas

Foi possiacutevel entatildeo realizar um estudo aprofundado levando em consideraccedilatildeo as di-ferentes maneiras com que as expressotildees lambda foram adotadas nos projetos atraveacutes daescolha de um projeto que representasse cada grupo para anaacutelise Dentre os cinco projetosestudados foi possiacutevel observar alguns padrotildees tipicamente adotados por desenvolvedorespara implementar expressotildees lambda em seus projetos como a utilizaccedilatildeo da bibliotecas(retrolambda) que permitissem uma flexibilizaccedilatildeo na utilizaccedilatildeo de expressotildees lambda oucomo lambda eacute primariamente utilizada para substituir determinados AICs ou operaccedilotildeesem Collection

Aleacutem disso foi possiacutevel observar como a refatoraccedilatildeo de coacutedigo acontece em cada umdesses projetos Observou-se como projetos menores tendem a refatorar coacutedigo maisfacilmente ao passo que projetos maiores e mais complexos fazem menos refatoraccedilatildeo oudemoram mais entre o periacuteodo em que houve a primeira migraccedilatildeo de coacutedigo para a novaversatildeo da linguagem ateacute o periacuteodo em que realmente decidem refatorar coacutedigo Aleacutem dacomplexidade do projeto influenciar na decisatildeo de migrar o projeto para uma versatildeo maisrecente da linguagem a preocupaccedilatildeo com retrocompatibilidade com versotildees anteriores da

46

linguagem tambeacutem podem ser uma barreira para que projetos comecem a evoluir o coacutedigojuntamente com a evoluccedilatildeo da linguagem

Ainda assim foi possiacutevel observar que a preocupaccedilatildeo com a co-evoluccedilatildeo do software-linguagem existe entre os desenvolvedores de projetos mas a realizaccedilatildeo da migraccedilatildeo aindaacontece lentamente devido agrave diversos fatores que precisam ser levados em consideraccedilatildeopara a manutenccedilatildeo do projeto

Para trabalhos e contribuiccedilotildees futuras seria interessante desenvolver uma ferramentaque pudesse analisar diretamente no coacutedigo-fonte as oportunidades de aplicaccedilatildeo de ex-pressotildees lambda dessa forma poderiam ser analisadas as porcentagens de conversatildeo decoacutedigo para Java 8 e obter melhores conclusotildees sobre a importacircncia que os projetos estatildeodando para a evoluccedilatildeo de seus coacutedigos Outro fator interessante seria aplicar mais Visitorsagrave ferramenta static-analysis e fazer este mesmo estudo aplicado agrave outras caracteriacutesticasda linguagem

47

Referecircncias

[1] Kagdi Huzefa Michael L Collard e Jonathan I Maletic A survey and taxonomyof approaches for mining software repositories in the context of software evolution2007 ix 3 8 9 10 11

[2] DBeaver Dbeaver - features httpdbeaverjkissorgdocsfeatures ix 29

[3] Eclipse Vertx commit Java8-ify code httpsgithubcomeclipsevertxcommit93f95e9c77419f442a42fe711b6eeaef88192fd3 ix 42

[4] Google Guava commit Release java 8 changes to guava httpsgithubcomgoogleguavacommit73e382fa877f80994817a136b0adcc4365ccd904 ix 43

[5] Google Agera commit Collapsed testapp with retrolambda httpsgithubcomgoogleageracommit5e518b7b05f9e7a34a314945f68deff7b2c3e334 ix 44

[6] ReactiveX Rxjava commit 2x full jdk 6 compatible backport + includ-ing bugfixes up to today httpsgithubcomReactiveXRxJavacommit000a174d87a901135f9665d3b11f3627fd2dc4ed ix 45

[7] Godfrey M W e D M German The past present and future of software evolutionEm 2008 Frontiers of Maintenance paacuteginas 129ndash138 Sept 2008 1 6

[8] Favre J M Languages evolve too changing the software time scale Em Principles ofSoftware Evolution Eighth International Workshop on paacuteginas 33ndash42 IEEE 20051 5 7

[9] Overbey Jeffrey L e Ralph E Johnson Regrowing a language refactoring tools allowprogramming languages to evolve Em ACM SIGPLAN Notices volume 44 paacuteginas493ndash502 ACM 2009 1 5 7 8 12

[10] Grechanik Mark Collin McMillan Luca DeFerrari Marco Comi Stefano CrespiDenys Poshyvanyk Chen Fu Qing Xie e Carlo Ghezzi An empirical investiga-tion into a large-scale java open source code repository Em Proceedings of the2010 ACM-IEEE International Symposium on Empirical Software Engineering andMeasurement ESEM rsquo10 paacuteginas 111ndash1110 New York NY USA 2010 ACMISBN 978-1-4503-0039-1 httpdoiacmorg10114518527861852801 1

[11] TIOBE Tiobe httpswwwtiobecomtiobe-index 1 14

48

[12] Gyori Alex Lyle Franklin Danny Dig e Jan Lahoda Crossing the gap from im-perative to functional programming through refactoring Em Proceedings of the 20139th Joint Meeting on Foundations of Software Engineering ESECFSE 2013 paacute-ginas 543ndash553 New York NY USA 2013 ACM ISBN 978-1-4503-2237-9 httpdoiacmorg10114524914112491461 2 11 24 39

[13] OpenJDK State of the lambda httpcropenjdkjavanet~briangoetzlambdalambda-state-4html 2

[14] Han Jiawei Micheline Kamber e Jian Pei Data Mining Concepts and TechniquesMorgan Kaufmann Publishers Inc San Francisco CA USA 3rd ediccedilatildeo 2011ISBN 0123814790 9780123814791 3

[15] Fowler Martin e Kent Beck Refactoring improving the design of existing codeAddison-Wesley Professional 1999 5 7

[16] Lehman M M J F Ramil P D Wernick D E Perry e W M Turski Met-rics and laws of software evolution - the nineties view Em Proceedings of the4th International Symposium on Software Metrics METRICS rsquo97 paacuteginas 20ndashWashington DC USA 1997 IEEE Computer Society ISBN 0-8186-8093-8 httpdlacmorgcitationcfmid=823454823901 6

[17] Hassan Ahmed E e Tao Xie Software intelligence The future of mining softwareengineering data Em Proceedings of the FSESDP Workshop on Future of SoftwareEngineering Research FoSER rsquo10 paacuteginas 161ndash166 New York NY USA 2010ACM ISBN 978-1-4503-0427-6 httpdoiacmorg101145188236218823978 9

[18] Hassan Ahmed E The road ahead for mining software repositories Em Frontiers ofSoftware Maintenance 2008 FoSM 2008 paacuteginas 48ndash57 IEEE 2008 8

[19] Berry Michael J e Gordon Linoff Data Mining Techniques For Marketing Salesand Customer Support John Wiley amp Sons Inc New York NY USA 1997ISBN 0471179809 10

[20] Parnin Chris Christian Bird e Emerson Murphy-Hill Java generics adoption hownew features are introduced championed or ignored Em Proceedings of the 8thWorking Conference on Mining Software Repositories paacuteginas 3ndash12 ACM 2011 12

[21] Oracle The java language specification httpsdocsoraclecomjavasespecsjlsse8jls8pdf 13

[22] Oracle The history of java technology httpwwworaclecomtechnetworkjavajavaseoverviewjavahistory-index-198355html 13

[23] Murphy Kieron So why did they decide to call itjava httpwwwjavaworldcomarticle2077265core-javaso-why-did-they-decide-to-call-it-java-html 13

[24] McGraw Tata Object-oriented Programming with Java Essentials and ApplicationsHill Education 13

49

[25] Oracle Differences between java ee and java se httpdocsoraclecomjavaee6firstcupdocgkhoyhtml 13

[26] Lindsey Clark S The History of Java Cambridge 14

[27] Oracle The java language environment httpwwworaclecomtechnetworkjavaintro-141325html 14

[28] Oracle Jdk 8 httpopenjdkjavanetprojectsjdk8 15 24

[29] Oracle Enhancements in java se 8 httpdocsoraclecomjavase8docstechnotesguideslanguageenhancementshtmljavase8 15 16 17

[30] Oracle Lambda expressions httpdocsoraclecomjavasetutorialjavajavaOOlambdaexpressionshtml 16 18 21

[31] Oracle Method references httpdocsoraclecomjavasetutorialjavajavaOOmethodreferenceshtml 16

[32] Oracle Default methods httpdocsoraclecomjavasetutorialjavaIandIdefaultmethodshtml 17

[33] Oracle Repeating annotations httpdocsoraclecomjavasetutorialjavaannotationsrepeatinghtml 17

[34] Oracle Type annotations httpdocsoraclecomjavasetutorialjavaannotationstype_annotationshtml 17

[35] Oracle Anonymous inner classes httpsdocsoraclecomjavasetutorialjavajavaOOanonymousclasseshtml 19

[36] Kothari CR Research Methodology Methods and Techniques New Age Interna-tional (P) Limited 2004 ISBN 9788122415223 httpsbooksgooglecombrbooksid=8c6gkbKi-F4C 22

[37] Nakakoji Kumiyo Yasuhiro Yamamoto Yoshiyuki Nishinaka Kouichi Kishida eYunwen Ye Evolution patterns of open-source software systems and communitiesEm IWPSE rsquo02 Proceedings of the International Workshop on Principles of SoftwareEvolution paacuteginas 76ndash85 New York NY USA 2002 ACM Press ISBN 1581135459httpdxdoiorg101145512035512055 23

[38] Rahman Foyzur Christian Bird e Premkumar Devanbu Clones What is that smellEmpirical Software Engineering 17(4-5)503ndash530 2012 24

[39] Chacon Scott Pro Git Apress Berkely CA USA 1st ediccedilatildeo 2009ISBN 1430218339 9781430218333 25

[40] Cavalcanti Thiago Gomes e Viniacutecius Correa de Almeida Caracterizaccedilatildeo do uso deconstruccedilotildees da linguagem java em projetos open-source Publicaccedilatildeo online 2016httpbdmunbbrhandle1048315733 27

50

[41] Parr Terence Language Implementation Patterns Create Your Own Domain-Specific and General Programming Languages Pragmatic Bookshelf 1st ediccedilatildeo 2009ISBN 193435645X 9781934356456 27

[42] Janssen Thorben 5 reasons to use jpa hibernate Publicaccedilatildeo online httpswwwsitepointcom5-reasons-to-use-jpa-hibernate 27

[43] Franklin Lyle Alex Gyori Jan Lahoda e Danny Dig Lambdaficator From imperativeto functional programming through automated refactoring Em Proceedings of the2013 International Conference on Software Engineering ICSE rsquo13 paacuteginas 1287ndash1290 Piscataway NJ USA 2013 IEEE Press ISBN 978-1-4673-3076-3 httpdlacmorgcitationcfmid=24867882486986 29

[44] Google Agera httpsgithubcomgoogleagerawiki 34

[45] Eclipse Eclipse vertx httpvertxio 35

[46] Cejas Fernando Android cleanarchitecture httpsgithubcomandroid10Android-CleanArchitecture 36

[47] ReactiveX Rxjava httpsgithubcomReactiveXRxJava 37

[48] Luontola Esko Retrolambda httpsgithubcomorfjackalretrolambda 43

51

Anexo I

Projetos utilizados

fastjson

platform_frameworks_base

netty

material-dialogs

kotlin

okhttp

tinker

AndroidUtilCode

RxJava

spring-boot

java-design-patterns

elasticsearch

ExoPlayer

kafka

vertx

realm-java

guava

zipkin

bazel

stetho

Signal-Android

glide

agera

fresco

plaid

presto

libgdx

spark

52

disruptor

lottie-android

flexbox-layout

PocketHub

zxing

spring-framework

deeplearning4j

dropwizard

interviews

BaseRecyclerViewAdapterHelper

uCrop

DanmakuFlameMaster

lottie-react-native

android-UniversalMusicPlayer

AndroidInterview-Q-A

greenDAO

retrofit

MaterialDrawer

BottomBar

druid

MPAndroidChart

Hystrix

guice

recyclerview-animators

dubbo

androidannotations

RxJava-Android-Samples

PhotoView

clojure

CircleImageView

AndroidSwipeLayout

jedis

MaterialViewPager

butterknife

junit4

RxBinding

leakcanary

SimianArmy

picasso

UltimateRecyclerView

53

AndroidViewAnimations

AppIntro

FizzBuzzEnterpriseEdition

ion

cheesesquare

physical-web

RxAndroid

Android-CleanArchitecture

Calligraphy

Android-Bootstrap

iosched

Android_Data

MaterialDesignLibrary

ListViewAnimations

EventBus

java8-tutorial

AndroidSlidingUpPanel

dagger

okhttputils

logger

HomeMirror

Material-Animations

android-Ultra-Pull-To-Refresh

android-async-http

Android-ObservableScrollView

Android-Universal-Image-Loader

ActionBarSherlock

SlidingMenu

storm

PagerSlidingTabStrip

Android-PullToRefresh

54

  • Dedicatoacuteria
  • Agradecimentos
  • Resumo
  • Abstract
  • Introduccedilatildeo
    • Contexto
    • Objetivos
      • Objetivos Gerais
      • Objetivos Especiacuteficos
        • Metodologia
        • Organizaccedilatildeo do Trabalho
          • Evoluccedilatildeo e Mineraccedilatildeo de Repositoacuterios de Software
            • Evoluccedilatildeo de Software
            • MSR Mineraccedilatildeo de dados e a Engenharia de Software
              • Classificaccedilatildeo
                • Trabalhos Relacionados
                  • Java SE 8 e JDK 8
                    • Histoacuterico
                    • Princiacutepios
                    • Evoluccedilatildeo
                    • Expressotildees Lambda
                      • Sintaxe
                      • Principais formas de uso
                          • Estudo e o Processo de Mineraccedilatildeo
                            • Questotildees de Pesquisa
                            • Fonte de Dados e Objetos de Estudo
                            • Processo de Mineraccedilatildeo
                              • static-analysis
                              • BDAnalisador
                                • Classificaccedilatildeo e Anaacutelise
                                  • Meacutedia de Lambda
                                  • Anaacutelise Temporal
                                  • Refatoraccedilatildeo de Coacutedigo
                                  • Casos de Uso
                                      • Resultados Obtidos e Anaacutelise
                                        • Visatildeo Geral
                                          • Projetos Selecionados
                                          • agera
                                          • vertx
                                          • Android-CleanArchitecture
                                          • RxJava
                                          • guava
                                            • Refatoraccedilatildeo de Coacutedigo
                                            • Estudos de Caso
                                              • Consideraccedilotildees Finais
                                              • Referecircncias
                                              • Anexo
                                              • Projetos utilizados

21 Evoluccedilatildeo de Software

Durante o processo de produccedilatildeo e manutenccedilatildeo de software haacute a necessidade de diversastomadas de decisotildees sobre seu desenvolvimento como por exemplo decidir como melho-rar a qualidade do software Tais decisotildees precisam ser tomadas levando em consideraccedilatildeoo ambiente em que se estaacute inserido com novas tecnologias surgindo todos os dias fe-edback de usuaacuterios exigentes e concorrentes produzindo um software similar com ideiasinovadoras

Tudo isso acontece em um ritmo de constante mudanccedila e assim como diria Lehmaneacute imprescindiacutevel que software de sistemas sejam capazes de evoluir ou os mesmos correm orisco de sofrer uma morte prematura [16] fazendo assim da evoluccedilatildeo de software um con-ceito importante dentro do seu processo de desenvolvimento Essa evoluccedilatildeo deve ocorrerconsiderando o ambiente em que o software estaacute inserido o qual possui aspectos teacutecnicos esociais sua infraestrutura que pertence ao seu ambiente teacutecnico o qual sempre necessitamanutenccedilatildeo e ao mesmo tempo usuaacuterios que utilizam o software e estatildeo constantementeformando opiniotildees oferecendo feedback e na expectativa por novidades [7] Assim a me-dida que novas caracteriacutesticas satildeo desenvolvidas novas tecnologias de infraestrutura satildeonecessaacuterias novos requisitos satildeo adicionados e o sistema de software deve se adaptar aessas mudanccedilas

Com relaccedilatildeo aos aspectos sociais que envolvem a evoluccedilatildeo do software eacute importanteressaltar os conceitos baacutesicos de como essa evoluccedilatildeo acontece Durante um estudo empiacutericopioneiro na aacuterea de evoluccedilatildeo de software para sistemas de grande escala Lehman e seuscolaboradores formularam um conjunto de observaccedilotildees que hoje satildeo conhecidas como asleis da evoluccedilatildeo de software ou simplesmente Leis de Lehman [16] No geral as leis deevoluccedilatildeo de software podem ser descritas da seguinte forma [16]

1 Mudanccedila contiacutenua um sistema se tornaraacute progressivamente menos satisfatoacuteriopara seus usuaacuterios com o tempo a menos que se adapte continuamente agraves necessi-dades que surgiratildeo

2 Complexidade Crescente um sistema se tornaraacute cada vez mais complexo amenos que se trabalhe para explicitamente reduzir sua complexidade

3 Auto-regulaccedilatildeo o processo de evoluccedilatildeo de software eacute auto-regulatoacuterio no que dizrespeito agraves distribuiccedilotildees dos artefatos e produtos produzidos

4 Conservaccedilatildeo da estabilidade organizacional a taxa meacutedia de atividade globalefetiva em um sistema em evoluccedilatildeo natildeo muda com o tempo ou seja a meacutedia detrabalho e esforccedilo colocado em cada entrega do sistema permanece a mesma

6

5 Conservaccedilatildeo de familiaridade a quantidade de conteuacutedo novo em cada entregado sistema tende a se manter constante com o tempo

6 Crescimento contiacutenuo A quantidade de funcionalidades em um sistema cresceraacutecom o tempo com o objetivo de satisfazer seus usuaacuterios

7 Decliacutenio de qualidade Um sistema seraacute percebido com qualidade inferior como passar do tempo a menos que seu design tenha uma manutenccedilatildeo minuciosa e seadapte a novas restriccedilotildees

8 Sistema de Feedback Evoluir um sistema com sucesso requer reconhecer que oprocesso de desenvolvimento acontece em um sistema de feedback de vaacuterios ciclosagentes e niacuteveis

Os aspectos teacutecnicos que envolvem a evoluccedilatildeo de software levam em consideraccedilatildeo astecnologias utilizadas para o seu desenvolvimento desde a linguagem de programaccedilatildeo agravesmaacutequinas onde o software seraacute hospedado que sofrem atualizaccedilotildees recebem novas versotildeescom novas caracteriacutesticas implementadas

Um estudo realizado por Lavre mostra como a evoluccedilatildeo das linguagens de programa-ccedilatildeo no contexto da evoluccedilatildeo de software muitas vezes satildeo subestimadas uma vez quemuitos podem considerar em seus estudos a linguagem de computaccedilatildeo como um artefatoimutaacutevel [8] Por exemplo coloca-se muita ecircnfase e cuidado para realizar o versionamentode coacutedigo fonte de um software mas este pode ser tornar inutilizaacutevel futuramente se nin-gueacutem souber qual versatildeo de compilador determinada versatildeo de coacutedigo foi desenvolvida

Para natildeo se deixar estagnar linguagens de programaccedilatildeo precisam se adaptar e evoluirQuando uma linguagem de programaccedilatildeo atualiza softwares que eram antes consideradosatualizados podem se tornar rapidamente obsoletos E ao mesmo tempo que novascaracteriacutesticas satildeo adicionadas a linguagem precisa fornecer compatibilidade com versotildeesanteriores aumentando sua complexidade Desenvolvedores entatildeo encontram-se tambeacutemem um empasse buscando um equiliacutebrio entre manter a compatibilidade da ferramentacom versotildees anteriores da linguagem e atualizaacute-la para manter o software atualizado [9]

A estrateacutegia de refatoraccedilatildeo de coacutedigo pode ser uma opccedilatildeo que permite a linguageme o software co-evoluiacuterem com um menor grau de dificuldade [9] Refatoraccedilatildeo (do inglecircsrefactoring) eacute o processo de modificaccedilatildeo de um software com o objetivo de melhorar a es-trutura interna do mesmo sem alterar sua percepccedilatildeo externa Eacute uma maneira disciplinadade melhorar o design do coacutedigo apoacutes ele jaacute ter sido implementado Por exemplo dividiruma funcionalidade grande feita em apenas um bloco de coacutedigo em vaacuterios moacutedulos [15]

A refatoraccedilatildeo de coacutedigo pode ser um meio utilizado para evoluir o software adaptandoo coacutedigo com caracteriacutesticas novas introduzidas pela linguagem modificando o design dosistema sem comprometer sua integridade No entanto novos desafios surgem visto que

7

refatorar o coacutedigo fonte de um sistema de grande porte natildeo eacute uma tarefa faacutecil havendo anecessidade de ferramentas que possam automatizar o processo ou realizar um estudo paraentender como as novas caracteriacutesticas da linguagem podem ser utilizadas para substituirou melhorar funcionalidades obsoletas [9]

22 MSR Mineraccedilatildeo de dados e a Engenharia deSoftware

Com o objetivo de compreender prever e planejar os vaacuterios aspectos do desenvolvimentode um projeto em especial tudo que possa impactar na evoluccedilatildeo de software a teacutecnicade mineraccedilatildeo de dados tem sido bastante utilizada em engenharia de software [17]

O termo Mineraccedilatildeo de Repositoacuterios de Software (MSR) tem sido utilizado para descre-ver vaacuterias maneiras de se examinar repositoacuterios de software Um repositoacuterio de softwarepode ser considerado um artefato que eacute produzido e arquivado durante a evoluccedilatildeo desoftware [1] Estes responsoacuterios armazenam informaccedilotildees que podem fornecer todos osdetalhes de desenvolvimento do software provendo meios necessaacuterios para uma anaacuteliseaprofundada de evoluccedilatildeo de software

Repositoacuterios de software satildeo comumente utilizados para armazenar e acompanhar ohistoacuterico de desenvolvimento do software mas raramente usados para tomada de deci-sotildees em relaccedilatildeo ao projeto Assim pesquisadores de MSR buscam modificar a impressatildeode que tais repositoacuterios satildeo estaacuteticos que servem apenas para manutenccedilatildeo de registrostransformando-os em repositoacuterios ativos que podem auxiliar na tomada de decisatildeo em pro-jetos de software modernos atraveacutes da identificaccedilatildeo de padrotildees para realizar a propagaccedilatildeode mudanccedilas [18]

221 Classificaccedilatildeo

De acordo com Kagdi et al dentre as abordagens de MSR utilizadas atualmente eacute possiacuteveldescrevecirc-las para entatildeo comparaacute-las e possivelmente classificaacute-las levando em considera-ccedilatildeo uma taxonomia de quatro dimensotildees os repositoacuterios de software utilizados (fontes dedados) o propoacutesito do MSR a metodologia e a avaliaccedilatildeo da abordagem [1] como mostraa Figura 21 onde as taxonomias destacadas em amarelo satildeo as que prevaleceram poreacutemnatildeo exclusivamente na metodologia adotada por este trabalho

8

Figura 21 Taxonomia em camadas adaptada do trabalho de Kagdi et al [1]

Fontes de Dados

As fontes de informaccedilatildeo variam de acordo com a abordagem utilizada e dentre as informa-ccedilotildees mineradas em repositoacuterios de software inclui-se as seguintes categorias os artefatosde software e suas versotildees as diferenccedilas entre os artefatos de software e suas versotildees e osmetadados sobre as mudanccedilas no software

As fontes de dados podem ser melhor classificadas de acordo com Hassan et al [17]

bull Repositoacuterios de controle de Versatildeo estes repositoacuterios guardam o histoacuterico de desen-volvimento de um projeto armazenando todas as mudanccedilas no coacutedigo fonte assimcomo os metadados associados com cada mudanccedila Exemplos git SVN

bull Bug repositories Estes repositoacuterios rastreiam o histoacuterico de resoluccedilatildeo de bugs quesatildeo reportados por usuaacuterios e desenvolvedores Exemplos Bugzilla e Jira

9

bull Histoacuterico de Comunicaccedilatildeo (Archived communications) estes repositoacuterios rastreiamdiscussotildees sobre os vaacuterios aspectos de um projeto de software por sua vida uacutetil Porexemplo listas de e-mails

bull Deployment logs logs com informaccedilotildees do software gerados por ferramentas dedesenvolvimento

bull Repositoacuterios de software Repositoacuterios onde o coacutedigo fonte de vaacuterios projetos satildeoarmazenados como por exemplo Sourceforgenet

No contexto deste trabalho estes repositoacuterios consistem em fontes de coacutedigo armaze-nadas em sistemas de controle de versatildeo especificamente coacutedigos na plataforma Github

O propoacutesito

O propoacutesito da mineraccedilatildeo de repositoacuterios de software se resume nas perguntas de pes-quisa que podem ser respondidas utilizando mineraccedilatildeo Assim existem duas classes deperguntas de pesquisa para MSR [1]

A primeira eacute a pergunta de anaacutelise market-basket1 ldquoSe A acontece o que mais podeacontecerrdquo A resposta para este tipo de pergunta eacute um conjunto de regras descrevendotendecircncias de relacionamentos como por exemplo se A acontecer entatildeo B e C acontecemdurante um periacuteodo X

A segunda classe diz respeito agraves perguntas de prevalecircncia (Prevalence Questions -PQ) como por exemplo perguntas do tipo ldquoA funcionalidade Y foi modificadardquo quepossuem uma resposta booleana ou ldquoQuantas vezes esta funcionalidade Y foi modificadardquocontendo uma resposta quantitativa

As perguntas de pesquisa deste trabalho se encaixam majoritariamente na segundaclasse onde o objetivo traccedilado eacute respondido de forma quantitativa com algumas tentativasde classificaccedilatildeo de tipos de repositoacuterios como seraacute descrito nos capiacutetulos seguintes

A metodologia

A metodologia corresponde a maneira como as questotildees de MSR iratildeo ser respondidas evaacuterias abordagens estatildeo disponiacuteveis Poreacutem Kagdi indica duas estrateacutegias baacutesicas quepodem ser utilizadas

Primeiramente pode-se utilizar a mediccedilatildeo indireta e anaacutelise da evoluccedilatildeo do softwareEsta abordagem pode ser realizada da seguinte forma extrair e computar informaccedilotildeesde cada versatildeo de um software separadamente e em seguida individualmente comparar

1Anaacutelise Market-basket eacute uma teacutecnica de modelagem baseada na teoria de que se vocecirc comprar certostipos de produtos vocecirc haacute uma probabilidade maior (ou menor) de comprar outros tipos de produtos [19]

10

propriedades encontradas como por exemplo comparar duas versotildees distintas de umsoftware atraveacutes de um repositoacuterio github realizando uma investigaccedilatildeo de alto niacutevel noque diz respeito a evoluccedilatildeo do software [1]

A segunda perspectiva de metodologia que pode ser utilizada corresponde agrave mediccedilatildeodireta e anaacutelise da evoluccedilatildeo do software Ela diz respeito agraves investigaccedilotildees que estudamos mecanismos que leva um software a ser modificado de uma versatildeo para outra focandonas diferenccedilas especiacuteficas entre estas versotildees como por exemplo examinando mudanccedilasespeciacuteficas das classes arquivos funccedilotildees de cada parte do coacutedigo [1]

Assim eacute possiacutevel descrever explicitamente que este trabalho utiliza em sua maioriauma metodologia com mediccedilotildees diretas atraveacutes da anaacutelise estaacutetica de informaccedilotildees docoacutedigo fonte de diferente versotildees para analisar os diferentes padrotildees de desenvolvimentoem que expressotildees lambda (definidas no capiacutetulo seguinte) satildeo utilizadas

A Avaliaccedilatildeo

Por fim existem diversas formas para se avaliar o estudo realizado sempre levando emconsideraccedilatildeo a validade dos resultados obtidos Pode-se utilizar de meacutetricas para avaliar osdados considerando o quanto das informaccedilotildees obtidas satildeo relevantes Outra forma de seavaliar seria atraveacutes da utilizaccedilatildeo de modelos probabiliacutesticos seguindo uma abordagemde teoria da informaccedilatildeo Assim foram utilizadas determinadas meacutetricas quantitativaspara avaliar os resultados obtidos neste trabalho

23 Trabalhos Relacionados

Como ressaltado na introduccedilatildeo o foco deste trabalho encontra-se em utilizar teacutecnicas deMSR para caracterizar a adoccedilatildeo de expressotildees lambda em repositoacuterios Java Ao reali-zar um estudo sobre o estado da arte encontrou-se diversos trabalhos que utilizam deMSR para obter informaccedilotildees relevantes sobre repositoacuterios de software em diversos focose em especial trabalhos que investiguem repositoacuterios na linguagem Java Jaacute existemtambeacutem alguns trabalhos que apresentam ferramentas de refatoraccedilatildeo de coacutedigo para im-plementaccedilatildeo de expressotildees lambda com foco na evoluccedilatildeo do software Dentre os trabalhosencontrados mencionados destacam-se

bull Em um trabalho sobre utilizaccedilatildeo de refatoraccedilatildeo de coacutedigo para realizar a transiccedilatildeode coacutedigo Java para as novas caracteriacutesticas implementadas no Java 8 Gyori et alapresenta uma ferramenta que automatiza com sucesso o trabalho de conversatildeo decoacutedigo como Annonymous Inner Class para expressotildees lambda [12] O capiacutetulo aseguir descreve em detalhes estes conceitos

11

bull Regrowing a Language de Overbey apresenta um estudo sobre a importacircncia da co-evoluccedilatildeo entre a linguagem de programaccedilatildeo e os projetos de software focando naslinguagens Fortran e Java e provando como ferramentas de refatoraccedilatildeo de coacutedigoauxiliam para que o software consiga evoluir juntamente com sua linguagem deprogramaccedilatildeo [9]

bull O trabalho sobre a adoccedilatildeo de generics em coacutedigo Java feito por Parnin utiliza demineraccedilatildeo de dados para realizar uma investigaccedilatildeo empiacuterica avaliando projetos decoacutedigo aberto com o objetivo de observar como desenvolvedores destes projetos estatildeoutilizando generics em Java [20]

Os estudos mencionados focam em assuntos particulares pertinentes a este trabalhoem que de um lado tem-se trabalhos que mostram a necessidade de refatoraccedilatildeo de coacutedigopara evoluccedilatildeo de software e do outro tem-se trabalhos que mostram que eacute possiacutevel utilizarde MSR para entender melhor como a evoluccedilatildeo da linguagem de programaccedilatildeo Java temafetado projetos reais de coacutedigo aberto e como estes projetos estatildeo se adaptando a estasevoluccedilotildees

12

Capiacutetulo 3

Java SE 8 e JDK 8

Este trabalho tem como objetivo caracterizar a adoccedilatildeo de expressotildees Lambda em siste-mas Java que podem ser considerados legados pois foram concebidos em um momentoanterior a introduccedilatildeo dessa nova caracteriacutestica na linguagem Java Com o intuito de faci-litar o entendimento do leitor sobre tais construccedilotildees esse capiacutetulo apresenta informaccedilotildeeshistoacutericas referentes agrave linguagem Java desde sua criaccedilatildeo ateacute a sua ascensatildeo como umadas linguagens de programaccedilatildeo mais populares Aleacutem disso seratildeo apresentadas as novascaracteriacutesticas presentes na versatildeo Java SE 8 com destaque nas expressotildees Lambda e deque forma vieram para auxiliar no desenvolvimento de sistemas

31 Histoacuterico

Java eacute uma linguagem de programaccedilatildeo orientada a objetos para propoacutesitos gerais [21] Alinguagem nasceu com o nome de Oak no ano de 1991 com o foco em televisotildees digitais acabo mas devido agrave complexidade e poder da linguagem logo expandiu-se para os outrosdomiacutenios principalmente a Internet [22] Posteriormente a linguagem recebeu o nome deGreentalk devido agrave marca Oak jaacute ser registrada por outra empresa e o principal projeto daequipe se chamar Green Por fim o nome Java foi o mais votado pela equipe da Sun emuma reuniatildeo para decidir o mais raacutepido possiacutevel um nome definitivo para a linguagem [23]

Em 1995 em sua primeira versatildeo puacuteblica 10 a linguagem Java jaacute comeccedilava a terum crescimento em sua popularidade como Web Applet nos navegadores mais popularesfornecendo seguranccedila e rapidez nas plataformas mais utilizadas [24] A cada nova versatildeopublicada novas funcionalidades e plataformas eram adicionadas e tornavam a linguagemmais difundida no meio computacional fazendo com que em 2006 a linguagem fosse divi-dida em Java EE (foco em rede e serviccedilos web) Java ME (foco em sistemas embarcados)e Java SE (foco em desktops e servidores) [25]

13

Apoacutes anos de evoluccedilatildeo e aprimoramento atraveacutes de diversas versotildees como visto naTabela 31 hoje o Java se tornou uma das linguagens de programaccedilatildeo mais utilizadas nomundo estando em aproximadamente 15 das linhas de coacutedigo disponiacuteveis pela inter-net [11] A quantidade de plataformas suportadas pela linguagem e com o advento dosistema operacional Android sendo rodado na maior parte dos smartphones do mundoaleacutem da simplicidade em codificar no paradigma orientado a objetos foram os fatoresrelevantes para que a linguagem se popularizasse no mundo digital [26]

Tabela 31 As versotildees anteriores de java e principais caracteriacutesticasVersatildeo Principais caracteriacutesticasJava 10 JVM e JDKJava 2 Event Listeners

Kestrel (Java 3) HotSpot JVMMerlin (Java 4) Diversas novas APIs como Assertion e expressotildees regularesTiger (Java 5) Generics

Mustang (Java 6) Web ServicesDolphin (Java 7) Suporte a linguagens dinamicas

32 Princiacutepios

Com o foco em alcanccedilar a Web e participar mais ativamente do mercado virtual e e-Commerce foram projetados princiacutepios que permitissem com que a linguagem pudessealcanccedilar seus objetivos principais ao mesmo tempo que mantinha a facilidade e fami-liarizaccedilatildeo da linguagem a seus desenvolvedores [27] Dessa forma a equipe da Oracledeterminou cinco princiacutepios que caracterizariam o foco da linguagem Java

bull simples orientada a objeto e familiar projetada para ser orientada a objeto epermitir que seus desenvolvedores comecem a codificar rapidamente sem a necessi-dade de uma curva de aprendizagem acentuada

bull segura e robusta projetada para prover software confiaacutevel por meio de checagensa tempo de compilaccedilatildeo e execuccedilatildeo Haacute uma grande preocupaccedilatildeo com seguranccediladevido agrave larga utilizaccedilatildeo da linguagem em sistemas distribuiacutedos

bull de arquitetura neutra e portaacutevel projetada para ser independente de qualquerarquitetura bastando rodar a JVM dessa forma garantindo a portabilidade paravaacuterios ambientes e dispositivos

14

bull executada em alta performance projetada para fornecer a maior performancepossiacutevel em tempo de execuccedilatildeo com a utilizaccedilatildeo do garbage collector em uma threadde baixa prioridade

bull interpretada dinacircmica e threaded projetada para ser interpretada por qual-quer dispositivo que possua JVM desenvolvida garantindo um desenvolvimento raacute-pido e em ciclos O uso da classe Thread permite que a linguagem acompanhe atendecircncia do paralelismo Aleacutem disso a ligaccedilatildeo de classes eacute feita em tempo real esomente quando necessaacuteria tornando-a dinacircmica

33 Evoluccedilatildeo

A primeira versatildeo do Java 8 foi lanccedilada em 2014 [28] e apresentou diversas atualizaccedilotildeesespalhadas em categorias como linguagem seguranccedila Collections ferramentas deployentre outras Dentre a grande quantidade de mudanccedilas os destaques se encontraram nasnovas melhorias presentes na linguagem que afetaram de forma mais direta a maneiracom que os desenvolvedores passaram a tratar e organizar o coacutedigo fonte As atualizaccedilotildeesreferentes a linguagem descritas oficialmente pela Oracle [29] satildeo

1 Lambda Expressions ou apenas Expressotildees Lambda correspondem a uma novacaracteriacutestica que permite que uma pequena funcionalidade possa ser utilizada comoum argumento de um meacutetodo facilitando a escrita de accedilotildees que seratildeo feitas repetida-mente em uma Collection ou quando um processo se completa ou quando encontraum erro Eacute tambeacutem uma forma compacta de se escrever coacutedigo que previamenteera escrito com anonymous inner classes [29] A Listagem 31 mostra uma classehipoteacutetica Calculator cujo meacutetodo operateBinary() recebe como paracircmetro doisinteiros e um objeto da classe IntegerMath que representa a operaccedilatildeo que deveraacuteser realizada ou seja uma funcionalidade dinacircmica

1 pub l i c c l a s s Ca l cu la to r 2

3 i n t e r f a c e IntegerMath 4 i n t opera t i on ( i n t a i n t b) 5 6

7 pub l i c i n t operateBinary ( i n t a i n t b IntegerMath op ) 8 re turn op opera t i on (a b) 9

10

11 pub l i c s t a t i c void main ( St r ing a rgs ) 12

15

13 Calcu la to r myApp = new Ca lcu la to r ( ) 14 IntegerMath add i t i on = (a b) minusgt a + b 15 IntegerMath subt ra c t i on = (a b) minusgt a minus b 16 System out p r i n t l n ( 40 + 2 = +17 myApp operateBinary (40 2 add i t i on ) ) 18 System out p r i n t l n ( 20 minus 10 = +19 myApp operateBinary (20 10 sub t ra c t i on ) ) 20 21 22

Listagem 31 Exemplo de coacutedigo com o uso de Expressatildeo Lambda [30]

2 Method References Frequentemente expressotildees lambda criam meacutetodos anocircni-mos Algumas vezes poreacutem satildeo utilizadas para chamar um meacutetodo jaacute existentena classe Ao inveacutes de escrever a expressatildeo Lambda para esse caso pode-se optarpor utilizar um Method Reference que facilita a escrita e leitura desse uso de ex-pressatildeo Lambda [29] A Listagem 32 mostra um exemplo de um meacutetodo estaacuteticoque compara duas pessoas pelas suas idades e a Listagem 33 a utilizaccedilatildeo de MethodReference para aplicar a utilizaccedilatildeo desse meacutetodo em um array e reduzir a escrita deuma expressatildeo lambda a uma forma mais legiacutevel

1 pub l i c s t a t i c i n t compareByAge ( Person a Person b) 2 re turn a b i r thday compareTo (b b i r thday ) 3 4

Listagem 32 Exemplo de meacutetodo de uma classe Pessoa [31]

1 Arrays s o r t ( rosterAsArray Person compareByAge ) 2

Listagem 33 Exemplo de uso de Method Reference [31]

3 Default Methods satildeo meacutetodos com a palavra-chave default que servem para adi-cionar implementaccedilotildees de meacutetodos a uma interface de alguma biblioteca mantendoa compatibilidade binaacuteria com versotildees mais antigas dessa interface Tambeacutem pos-sibilita a implementaccedilatildeo de meacutetodos estaacuteticos em interfaces [29] A Listagem 34apresenta a inclusatildeo de um meacutetodo default na interface TimeClient

1 pub l i c i n t e r f a c e TimeClient 2 void setTime ( i n t hour i n t minute i n t second ) 3 void setDate ( i n t day i n t month i n t year ) 4 void setDateAndTime ( i n t day i n t month i n t year 5 i n t hour i n t minute i n t second )

16

6 LocalDateTime getLocalDateTime ( ) 7

8 s t a t i c ZoneId getZoneId ( S t r ing zoneStr ing ) 9 t ry

10 re turn ZoneId o f ( zoneStr ing ) 11 catch ( DateTimeException e ) 12 System e r r p r i n t l n ( I n v a l i d time zone + zoneStr ing

+13 us ing d e f a u l t time zone in s t ead ) 14 re turn ZoneId systemDefault ( ) 15 16 17

18 d e f a u l t ZonedDateTime getZonedDateTime ( St r ing zoneStr ing ) 19 re turn ZonedDateTime o f ( getLocalDateTime ( ) getZoneId (

zoneStr ing ) ) 20 21 22

Listagem 34 Exemplo de interface com um meacutetodo default [32]

4 Repeating Annotations permitem a implementaccedilatildeo e utilizaccedilatildeo de anotaccedilotildees deum mesmo tipo que podem ser utilizadas mais de uma vez para a mesma declara-ccedilatildeo [29] A Listagem 35 apresenta duas anotaccedilotildees iguais com paracircmetros diferentespermitindo uma customizaccedilatildeo maior na aplicaccedilatildeo de um tipo de anotaccedilatildeo

1 Schedule ( dayOfMonth= l a s t )2 Schedule (dayOfWeek= Fr i hour= 23 )3 pub l i c void doPeriodicCleanup ( ) 4

Listagem 35 Exemplo de Repeating Annotations [33]

5 Type Annotations permitem que anotaccedilotildees possam ser utilizadas em tipos aleacutemde declaraccedilotildees dessa forma pode-se garantir que um campo sempre atenda agraves suasexpectativas e evite testes desnecessaacuterios [29] A Listagem 36 mostra um exemplo derestriccedilatildeo a uma String que nunca poderaacute ser nula devido agrave anotaccedilatildeo de NonNull

1 NonNull S t r ing s t r

Listagem 36 Exemplo de Type Annotation garantindo que o campo nunca seja null [34]

17

34 Expressotildees Lambda

Uma das mudanccedilas mais interessantes implementadas no Java 8 foi a adiccedilatildeo de expressotildeeslambda As expressotildees lambda permitem que a linguagem Java possa atuar parcialmentecomo uma linguagem de programaccedilatildeo funcional onde comportamentos satildeo avaliados eaplicados diferentemente da programaccedilatildeo imperativa que foca na mudanccedila de estadosNa praacutetica um comportamento pode ser passado como paracircmetro de um meacutetodo atraveacutesde uma escrita mais reduzida e legiacutevel Os benefiacutecios de utilizar expressotildees lambda incluemuma melhora na legibilidade e organizaccedilatildeo de coacutedigo que antes era escrito com AnonymousInner Class aleacutem de permitir uma forma simples de utilizar comportamento paralelo como uso de Streams

341 Sintaxe

A sintaxe de uma expressatildeo lambda eacute dividida nas seguintes partes [30]

bull Uma lista de paracircmetros separados por viacutergulas

bull Um token representado por uma seta -gt

bull Um corpo que pode ser representado por uma expressatildeo uacutenica ou um bloco de coacutedigodentro de chaves

As Listagens 37 e 38 mostram duas formas diferentes de se aplicar expressotildees Lambdacom uma sintaxe similar A primeira aplica a expressatildeo diretamente apoacutes a seta utilizadanormalmente para trechos de coacutedigo pequenos e simples e a segunda utiliza-se de chavespara incorporar o coacutedigo e da palavra-chave return para especificar o retorno forma maisutilizada para uma quantidade maior de coacutedigo

1 p minusgt p getGender ( ) == Person Sex MALE2 ampamp p getAge ( ) gt= 183 ampamp p getAge ( ) lt= 25

Listagem 37 Exemplo de expressatildeo lambda com uma expressatildeo [30]

1 p minusgt 2 re turn p getGender ( ) == Person Sex MALE3 ampamp p getAge ( ) gt= 184 ampamp p getAge ( ) lt= 25 5

Listagem 38 Exemplo de expressatildeo lambda com um bloco de coacutedigo [30]

18

342 Principais formas de uso

Anonymous Inner Class

Antes do Java 8 a necessidade de passar funccedilotildees ou expressotildees como paracircmetro de algummeacutetodo era suprida atraveacutes de Anonymous Inner Classes A utilizaccedilatildeo desse tipo dedeclaraccedilatildeo junto com a anotaccedilatildeo de Override permite sobrescrever um meacutetodo de umainterface funcional e ao mesmo tempo passa-la como argumento para um meacutetodo Umaexpressatildeo lambda se comporta da mesma forma poreacutem a quantidade de coacutedigo escritopela Anonymous Inner Class eacute maior e pode dificultar a leitura de coacutedigo pois conteacutemmuita informaccedilatildeo natildeo utilizada para efetivo entendimento do que estaacute sendo feito naqueletrecho

A Listagem 39 apresenta a instanciaccedilatildeo da classe EventHandler internamente ao meacute-todo setOnAction() de forma que o desenvolvedor possa escrever o comportamento quedeseja passar como paracircmetro do meacutetodo atraveacutes da substituiccedilatildeo do meacutetodo handle()que jaacute existe pelo meacutetodo handle() criado e escrito pelo desenvolvedor

1 btn setOnAction (new EventHandlerltActionEvent gt() 2 Override3 pub l i c void handle ( ActionEvent event ) 4 System out p r i n t l n ( He l lo World ) 5 6 )

Listagem 39 Exemplo de uso de Anonymous Inner Class [35]

Interface funcional

Ao projetar um coacutedigo novo o desenvolvedor que optar por utilizar expressotildees lambdadeve iniciar com a criaccedilatildeo de uma interface funcional Esse tipo de interface possui umuacutenico meacutetodo abstrato permitindo que expressotildees lambda sejam usadas para sobrescrevero comportamento do meacutetodo abstrato Uma interface funcional pode possuir outros meacuteto-dos desde que sejam default Uma nova anotaccedilatildeo FunctionalInterface foi adicionadacom a atualizaccedilatildeo do Java 8 para conferir em tempo de compilaccedilatildeo se a interface satisfazos requisitos desse modelo de interface

A Listagem 310 apresenta um exemplo de interface funcional com o objetivo de permi-tir o uso de expressotildees lambda que utilizaratildeo de dois Double como paracircmetro e jaacute utilizada nova anotaccedilatildeo FunctionalInterface introduzida no Java 8

1 Funct iona l Inte r face2 pub l i c i n t e r f a c e DoubleOp 3 pub l i c Double apply ( Double a Double b)

19

4

Listagem 310 Exemplo de interface funcional

Dessa forma conforme as Listagens 311 e 312 o meacutetodo apply() pode tomar formade qualquer operaccedilatildeo entre dois Double que seraacute especificada quando a expressatildeo lambdafor montada dando o aspecto de linguagem funcional agrave linguagem e mais facilidade eliberdade ao desenvolvedor

1 pub l i c c l a s s Ca l cu la to r 2 pub l i c s t a t i c Double c a l c ( Double op1 Double op2 DoubleOp operator ) 3 re turn operator apply ( op1 op2 ) 4 5

Listagem 311 Exemplo de aplicaccedilatildeo da interface funcional

1 Double r e s u l t 1 = Ca lcu la to r c a l c (10d 50d ( a b ) minusgt a + b)

Listagem 312 Uso de expressatildeo lambda para o exemplo anterior

Collections

Dentre as atualizaccedilotildees de pacotes do Java 8 foi adicionado um meacutetodo stream() nainterface Collection Esse meacutetodo trata as Collection como streams o que significa queapesar de natildeo ser possiacutevel acessar elementos diretamente algumas novas manipulaccedilotildeessatildeo possiacuteveis Essas manipulaccedilotildees satildeo na verdade meacutetodos da interface Stream quepodem receber como paracircmetro uma expressatildeo lambda ou seja um comportamento a seraplicado agrave Collection Dentre os meacutetodos temos

bull filter() O meacutetodo filter() recebe uma expressatildeo lambda contendo uma condiccedilatildeopara filtragem da collection

bull map() O meacutetodo map() mapeia os elementos de uma Collection em outro objetocomo uma String A expressatildeo lambda passada por paracircmetro deve retornar o tipode objeto ao qual seraacute mapeado

bull forEach() O meacutetodo forEach() aplica uma operaccedilatildeo especiacutefica para cada ele-mento da Collection A expressatildeo lambda a ser passada deve conter a operaccedilatildeo aser realizada

bull min() e max() Os meacutetodos min() e max() retornam o elemento menor ou maiorda Collection dependendo da expressatildeo lambda passada como paracircmetro

20

A Listagem 313 demonstra como vaacuterias operaccedilotildees com uma Collection podem seraplicadas de uma vez de forma que lendo a expressatildeo lambda jaacute eacute possiacutevel saber oresultado da aplicaccedilatildeo do meacutetodo agrave Collection

1 r o s t e r2 stream ( )3 f i l t e r (4 p minusgt p getGender ( ) == Person Sex MALE5 ampamp p getAge ( ) gt= 186 ampamp p getAge ( ) lt= 25)7 map(p minusgt p getEmailAddress ( ) )8 forEach ( emai l minusgt System out p r i n t l n ( emai l ) )

Listagem 313 Exemplo de utilizaccedilatildeo de meacutetodos de stream com expressotildees lambda [30]

21

Capiacutetulo 4

Estudo e o Processo de Mineraccedilatildeo

A definiccedilatildeo da metodologia utilizada para realizaccedilatildeo deste trabalho eacute importante para queexista uma padronizaccedilatildeo e melhor entendimento de como os resultados foram obtidos paraque a replicaccedilatildeo do mesmo possa ser realizada em trabalhos futuros [36]

Figura 41 Processo utilizado para realizaccedilatildeo do estudo

O esquema representado na Figura 41 descreve o processo seguido para a realizaccedilatildeodeste trabalho que foi divido em trecircs grandes etapas a de planejamento definindo osobjetivos questotildees de pesquisa e meios de investigaccedilatildeo deste projeto a etapa de execuccedilatildeorealizando todo o procedimento metodoloacutegico definido para a coleta e refinamento de

22

dados e a etapa de avaliaccedilatildeo onde foram classificados e avaliados os dados coletadospara responder agraves questotildees de pesquisa

A seguir na primeira seccedilatildeo seratildeo apresentadas em detalhes as questotildees de pesquisa aserem respondidas Em seguida seraacute feito uma breve descriccedilatildeo da fonte de dados utilizada- especificamente os projetos utilizados como objetos de estudo deste trabalho e por fimtodo o restante da metodologia que foi de fato desenvolvida para obter os resultadosnecessaacuterios

41 Questotildees de Pesquisa

Com o objetivo de entender e caracterizar melhor o uso de expressotildees lambda foramdefinidas as seguintes questotildees de pesquisa a serem respondidas

bull PQ-1 Quando os projetos comeccedilaram a introduzir o uso de expressotildees lambda emseus coacutedigos e qual a meacutedia de expressotildees lambda por snapshots caso existam

bull PQ-2 Como as equipes de desenvolvimento estatildeo utilizando expressotildees lambdaatraveacutes de refatoraccedilatildeo de coacutedigo ou introduzindo apenas em coacutedigo novo

bull PQ-3 Quais satildeo os padrotildees tipicamente adotados para o uso de expressotildees lambda

A primeira pergunta de pesquisa gira em torno de como projetos populares open-sourceestatildeo se adaptando agrave introduccedilatildeo de expressotildees lambda em Java muitos projetos jaacute estatildeoutilizando as expressotildees lambda Se sim a partir de quando comeccedilaram a utilizaacute-lasdesde o iniacutecio da introduccedilatildeo das mesmas no Java 8 ou em um periacuteodo mais tardio Aleacutemdisso eacute interessante descobrir se a utilizaccedilatildeo dessa nova caracteriacutestica tem acontecido deforma expressiva ou natildeo

Em seguida para melhor entender a forma como as expressotildees lambda estatildeo sendointroduzidas em projetos eacute interessante investigar se as equipes de desenvolvimento estatildeose preocupando em refatorar coacutedigo com o objetivo de evoluir o software ou se estatildeoexperimentando utilizar expressotildees lambda apenas em coacutedigo novo introduzido

Como a introduccedilatildeo de novas funcionalidades em projetos open-source de grande escaladepende do objetivo do projeto e os padrotildees de projeto utilizados [37] espera-se obser-var diversas abordagens quanto a utilizaccedilatildeo de expressotildees lambda para entatildeo poderclassificar estes softwares quanto a abordagem utilizada

Eacute de grande importacircncia para este estudo conseguir identificar na praacutetica comoexpressotildees lambda estatildeo sendo tipicamente adotadas nestes projetos Assim a terceirapergunta de pesquisa busca identificar alguns exemplos de utilizaccedilatildeo atraveacutes da realizaccedilatildeode alguns estudos de caso

23

Eacute importante ressaltar que apesar de as expressotildees lambda serem uma alternativa aouso de AIC elas natildeo os substituem completamente Existem precondiccedilotildees para que umaAIC possa ser substituiacuteda por expressotildees lambda [12] descritas a seguir

bull AIC deve instanciar-se de uma interface

bull AIC natildeo deve possuir nenhum campo e declarar apenas um meacutetodo

bull AIC natildeo deve possuir uma referecircncia para this ou super

bull AIC natildeo deve declarar um meacutetodo recursivo

Para responder agrave primeira pergunta apenas dados gerais sobre todos os projetos seratildeonecessaacuterios ao passo que pelas perguntas 2 e 3 possuiacuterem uma natureza mais complexaseraacute necessaacuterio aleacutem de uma anaacutelise geral estatiacutestica a realizaccedilatildeo de alguns estudos decaso para obter resultados mais completos

42 Fonte de Dados e Objetos de Estudo

Para responder agraves perguntas de pesquisa estabelecidas foram selecionados os 99 projetosmais populares na linguagem Java dentro da plataforma github ateacute a data da coleta dosdados feita em Abril de 2017 Satildeo considerados populares os repositoacuterios que possuema maior quantidade possiacutevel de estrelas (stars) A decisatildeo de escolher os 99 projetos maispopulares foi por sua natureza imparcial e ao mesmo tempo para que se possa analisarprojetos que satildeo de familiaridade e conhecimento da comunidade do github e de domiacuteniopuacuteblico Os 99 projetos estatildeo listados no Anexo I

Para entender a transiccedilatildeo feita por esses projetos entre as versotildees anteriores do Java eo Java 8 com as expressotildees lambda eacute necessaacuterio analisar o coacutedigo de vaacuterias versotildees a fimde observar alguma mudanccedila para cada projeto Como satildeo 99 projetos e vaacuterios dessesprojetos possuem milhares de linhas de coacutedigo e commits seria impossiacutevel avaliar todosos commits Optou-se entatildeo por coletar snapshots mensais de cada projeto conformeprocedimento tambeacutem seguido anteriormente [38] Cada snapshots representa o estadodo projeto em um determinado mecircs e como criteacuterio de escolha padratildeo todos os snapshotsequivalem ao uacuteltimo commit realizado no determinado mecircs que este representa

O proacuteximo passo eacute determinar o periacuteodo de tempo em que esses snapshots seriamcoletados Como Java 8 (e consequentemente as expressotildees lambda) foi introduzidoapenas em meados de 2014 [28] coletar dados de projetos a partir de um periacuteodo muitoantes deste ano natildeo agregaria valor ao estudo em questatildeo Definiu-se entatildeo um periacuteodopara a coleta mensal desses snapshots atraveacutes dos anos Janeiro de 2013 um ano antesda introduccedilatildeo do Java 8 para que se pudesse identificar para todos os projetos o mecircs

24

exato em que expressotildees lambda foram introduzidas ateacute o mecircs da coleta de dados Abrilde 2017

Eacute importante ressaltar que a definiccedilatildeo dos meses foi definida do dia primeiro de ummecircs ao dia primeiro do proacuteximo mecircs e por consequecircncia alguns snapshots que deveriamrepresentar o final de determinado mecircs correspondem na verdade a commits realizadosno dia primeiro do mecircs seguinte Por exemplo pode existir casos em que o commit querepresente o mecircs de Marccedilo de 2016 seja na verdade o commit realizado no dia primeirode Abril de 2016 Isso se deve a natureza da forma como os resultados de log de commitssatildeo obtidos pelo git [39] Poreacutem isso natildeo interfere nas anaacutelises ou no propoacutesito destetrabalho uma vez que foram realizadas verificaccedilotildees e validaccedilotildees para que natildeo existamdatas repetidas (e consequentemente commits repetidos) por repositoacuterio

Neste trabalho o termo projeto e repositoacuterio foram utilizados de forma intercaladapara representar a mesma coisa o software desenvolvido que possui um repositoacuterio naplataforma github Os termos commit snapshops e versotildees tambeacutem representam a mesmacoisa uma vez que foi definido que seriam utilizados apenas um commit por mecircs pararepresentar um determinado snapshot ou versatildeo do repositoacuterio em questatildeo

Todos os 99 projetos seratildeo utilizados para a realizaccedilatildeo de uma anaacutelise geral de ca-racterizaccedilatildeo do uso de expressotildees lambda Para as anaacutelises aprofundadas foi feito umcriteacuterio de classificaccedilatildeo para que apenas alguns projetos possam ser analisados em niacutevelde coacutedigo como estudos de caso

Resumindo foram escolhidos os 99 projetos mais populares de Java no github cole-tando dados mensais de seus commits a partir do ano de 2013 ateacute a data da coleta dosdados lembrando que nem todos os projetos existem desde 2013 (projetos mais recentes)

43 Processo de Mineraccedilatildeo

A abordagem utilizada para coletar e analisar os 99 projetos escolhidos como mostra aFigura 42 foi realizada de forma automatizada utilizando scripts python e dois projetosdesenvolvidos em Java para a coleta e tratamento de dados como descrito a seguir

Primeiramente foi realizado uma coacutepia dos repositoacuterios atuais de todos os 99 projetosmais populares do github em Java Para automatizar o processo foi desenvolvido umscript em python que lista todos os projetos escolhidos clona todos os repositoacuterios emuma pasta na maacutequina local e cria um arquivo temporaacuterio com as informaccedilotildees do nomede cada repositoacuterio e seu caminho absoluto na maacutequina local

25

Figura 42 Metodologia implementada para coleta e tratamento de dados

Em seguida foi necessaacuterio realizar o checkout de todas as versotildees entre Janeiro de2013 a Abril de 2017 de cada projeto Por motivos de otimizaccedilatildeo de espaccedilo da maacutequinalocal e automatizaccedilatildeo no processo de checkout utilizou-se de um segundo script pythonque realizava as seguintes tarefas para cada mecircs em cada projeto verificar se dentreo mecircs estipulado houve algum commit para aquele projeto se sim pega-se o hash douacuteltimo commit do mecircs realiza o checkout conta-se a quantidade de linhas de coacutedigo emJava que o projeto tem utilizando a biblioteca cloc e armazena todas as informaccedilotildeespertinentes referentes a todos os projetos que naquele mecircs tiveram commits para que oprojeto static-analysis possa entatildeo ser executado sobre esses projetos naquele determinadomomento As informaccedilotildees coletadas que satildeo utilizadas pelo static-analysis correspondemao nome do projeto o hash do commit para aquela versatildeo a pasta onde o projeto estaacutearmazenado na maacutequina local a quantidade de linhas de coacutedigo Java do projeto e datareferente ao commit Essas informaccedilotildees satildeo pertinentes para que o projeto static-analysisconsiga funcionar de forma correta projeto este descrito em detalhes a seguir

431 static-analysis

O static-analysis foi um projeto desenvolvido anteriormente a este trabalho pelos alunosThiago Cavalcanti e Vinicius de Almeida cujo objetivo eacute realizar a anaacutelise estaacutetica de

26

coacutedigos-fonte Java e gerar arquivos de saiacuteda contendo informaccedilotildees de classes e meacutetodoscom suas devidas ocorrecircncias de caracteriacutesticas da linguagem [40]

A anaacutelise estaacutetica de coacutedigo consiste em analisar um coacutedigo-fonte sem a necessidadede executaacute-lo Esse tipo de anaacutelise eacute de extrema importacircncia para manter um coacutedigo dequalidade evitar futuras refatoraccedilotildees e obter informaccedilotildees estatiacutesticas de forma raacutepida epraacutetica [41]

Seguindo esse princiacutepio o static-analysis foi projetado para receber um arquivo deentrada csv seguindo o padratildeo

Tipo da Aplicaccedilatildeo Inicio do projeto Antes ou Apoacutes Java 5 Nome do ProjetoVersatildeo Caminho absolutoQuantidade de linhas de coacutedigo

Atraveacutes da informaccedilatildeo do caminho absoluto do projeto o static-analysis varre osdiretoacuterios em busca dos arquivos fonte java realiza o parse desses arquivos e utilizade Visitors para extrair as informaccedilotildees desejadas e exporta-las em arquivos csv Ouso de Visitors permite que sejam escolhidas as informaccedilotildees desejadas para a consultacomo expressotildees Lambda e AIC s aleacutem de possibilitar que sejam implementados novosVisitors conforme a linguagem evolua ou as necessidades mudem

Para este trabalho foram utilizados os Visitors de expressotildees Lambda map() filter()AICs e declaraccedilotildees de meacutetodos

432 BDAnalisador

Apoacutes obter todas as informaccedilotildees necessaacuterias geradas pelo static-analysis era preciso ma-nipular os dados de forma que facilitasse a coleta de dados para o estudo proposto Comovaacuterios arquivos em formato csv satildeo de difiacutecil manipulaccedilatildeo foi desenvolvido entatildeo umaferramenta chamada BDAnalisador Esta ferramenta eacute responsaacutevel por processar os arqui-vos em csv gerados pelo static-analysis e popular uma base de dados relacional MySQLcom as informaccedilotildees pertinentes a este estudo

O BDAnalisador foi desenvolvido com a intenccedilatildeo de tornar mais simples o trabalhocom os dados resultantes do static-analysis de forma que consultas em SQL pudessemser feitas a ponto de permitir a obtenccedilatildeo de resultados mais complexos Seguindo esseobjetivo o framework Hibernate foi escolhido como ferramenta para persistecircncia devidoa ser um framework jaacute consolidado no mercado e que de forma simples relaciona osobjetos Java ao banco de dados MySQL [42] A divisatildeo de classes foi projetada em quatroentidades Projeto Versao Classe e Metodo cada uma com seus respectivos camposcontendo as informaccedilotildees necessaacuterias para a pesquisa como pode ser visto na Figura 44Eacute importante ressaltar que a tabela de Versao guarda hashs de commits devido agrave escolhade utilizar commits para obter mais informaccedilatildeo de evoluccedilatildeo de coacutedigo em um menor

27

espaccedilo de tempo Aleacutem disso para este trabalho optou-se por persistir todos os meacutetodose classes de cada versatildeo sem se importar com a repeticcedilatildeo desses dados pois a hipoacutetesede haver grandes refatoraccedilotildees entre versotildees poderia comprometer a confiabilidade dasinformaccedilotildees

Figura 43 Diagrama de classes UML do BDAnalisador

Como visto na Figura 43 seguindo parcialmente a arquitetura MVC cada entidadepossui sua respectiva classe DAO(Data Access Object) para persistecircncia dos dados eapenas uma classe Controlador no projeto responsaacutevel pela manipulaccedilatildeo e parse dosdados dos arquivos csv gerados pelo static analysis para serem enviados agraves classes DAOO sistema inicia chamando o meacutetodo inicializar() da classe Controlador Esse meacutetodoeacute responsaacutevel por ler um arquivo de entrada csv que segue o mesmo modelo do arquivo dostatic-analysis citado na seccedilatildeo anterior O arquivo conteacutem os dados de todos os projetose suas respectivas versotildees dessa forma o meacutetodo instancia um objeto da classe Projetoe persiste o projeto no banco de dados Para cada versatildeo encontrada no arquivo deentrada o inicializar() aciona os meacutetodos responsaacuteveis por instanciar e preencher aslistas da classe Classe e Metodo Os meacutetodos responsaacuteveis por preencher as listas varremos arquivos csv gerados pelo static-analysis e fazem o parse das informaccedilotildees relevantescomo nomes dos meacutetodos e quantidades de lambdas para construir os objetos que seratildeogravados Ao final dos preenchimentos o objeto Versatildeo eacute instanciado e gravado no bancode dados atraveacutes de sua classe DAO ao mesmo tempo que grava suas respectivas Classese Metodos

28

Apoacutes vaacuterios testes e correccedilotildees de bugs o banco de dados se encontrava finalmente comas informaccedilotildees de 99 projetos Java open-source separados por um commit por mecircs desde2013 cada um com suas respectivas informaccedilotildees de classes meacutetodos e a quantidade deexpressotildees lambda filters e maps em cada meacutetodo Filter ou Filter pattern eacute o padratildeode projeto que tem como objetivo filtrar objetos de uma coleccedilatildeo (Collection) de acordocom algum criteacuterio Jaacute o map ou map pattern eacute um padratildeo que ldquomapeia os elementosde uma coleccedilatildeo aplicando uma funccedilatildeo a eles para uma nova coleccedilatildeo [43] A coleta deinformaccedilotildees sobre esses padrotildees podem ser uacuteteis para possiacuteveis anaacutelises de oportunidadesde uso de expressotildees lambda para refatoraccedilatildeo de coacutedigo

A Figura 44 mostra o esquema de como o banco de dados resultante foi gerado

Figura 44 Modelo relacional do banco de dados populado pelo BDAnalisador Imagemgerada com software DBeaver [2]

44 Classificaccedilatildeo e Anaacutelise

Com o banco de dados populado restam apenas as etapas de classificaccedilatildeo e anaacutelise pararesponder as questotildees de pesquisa propostas Para isso inicialmente houve uma tentativade se utilizar apenas queries SQL para analisar os dados de acordo com as informaccedilotildeesrelevantes Poreacutem devido ao fato de o banco de dados conter todas as informaccedilotildees detodos os projetos e todas as suas versotildees queries que possuem uma alta complexidadedemoravam muito tempo para retornar os dados

Assim com o objetivo de facilitar o trabalho alguns scripts python foram desenvolvi-dos para rodar as queries separadamente e individualmente para cada projeto de formaautomatizada a fim de melhorar o tempo de resposta para obtenccedilatildeo dos resultados

29

441 Meacutedia de Lambda

O primeiro script retorna a quantidade de expressotildees lambda (ou AICs) por n snapshotsque contenha expressotildees lambda O objetivo eacute ter uma visatildeo geral da meacutedia de expressotildeeslambda e AICs utilizadas por cada projeto e como nem todos os snapshots coletados decada projeto possuem expressotildees lambda e AICs apenas aqueles com alguma expressatildeolambda ou AIC satildeo incluiacutedos no caacutelculo da meacutedia

Mmedia =sumn qtdLambdai

n

442 Anaacutelise Temporal

O segundo script retorna para cada projeto a soma total da quantidade de expressotildeeslambda AIC map() e filter() no projeto inteiro para cada versatildeo Ou seja tem-seo total de cada uma das quatro propriedades selecionadas para cada mecircs do projetoobtendo assim uma visatildeo temporal de evoluccedilatildeo do uso das caracteriacutesticas descritas ATabela 41 ilustra parcialmente o resultado obtido para o projeto agera onde idVersaoeacute o identificador no banco de dados referente ao hash do commit mensal coletado qtd eacutea quantidade de cada uma das caracteriacutesticas escolhidas e a data do commit encontra-seno formato americano

Tabela 41 Informaccedilotildees mensais sobre o projeto ageraidVersao Data do Commit qtd lambda qtd AIC qtd maps qtd filter

823 512016 0 29 4 0755 612016 13 28 4 0686 6152016 13 29 4 0621 812016 13 29 4 0555 8162016 13 30 4 0485 922016 13 30 4 0422 10132016 14 30 4 0356 11282016 14 30 4 0295 12212016 21 30 5 0232 212017 21 30 5 0175 312017 21 30 5 0112 3312017 21 36 5 048 4242017 21 48 5 0

Os resultados obtidos com esta anaacutelise temporal permitiu a identificaccedilatildeo de padrotildees nautilizaccedilatildeo de expressotildees lambda em relaccedilatildeo a utilizaccedilatildeo de AIC por todos os projetos Foi

30

possiacutevel classificar todos os projetos em 6 grupos ilustrado na Figura 45 Primeiramenteseparou-se os projetos entre os que possuem expressotildees lambda e os que natildeo possuemDentre os que possuem identificou-se cinco categorias

1 Grupo 1 Quantidade de AICs e expressotildees lambda aumentam com o tempo pro-porcionalmente

2 Grupo 2 Quantidade de AICs diminui agrave medida que a quantidade de expressotildeeslambda aumentam e a quantidade de expressotildees lambda ultrapassa a quantidade deAIC em um determinado momento

3 Grupo 3 Quantidade de AICs diminui agrave medida que a quantidade de expressotildeeslambda aumentam mas a quantidade de AIC permanece superior agrave quantidade delambda

4 Grupo 4 Expressotildees lambda satildeo introduzidas e existem por um pequeno periacuteodode tempo mas satildeo completamente removidas posteriormente

5 Grupo 5 Quantidade de expressotildees lambda eacute constante e muito inferior compa-rado com a quantidade de AICs no projeto Foi determinado que para pertencera esta classificaccedilatildeo o projeto precisa ter uma razatildeo de meacutedia de expressotildees lamb-dasnapshot por meacutedia de AICsnapshot inferior a 020 Esse paracircmetro foi esta-belecido com o objetivo de definir um padratildeo para o que pode ser considerado umprojeto com poucas expressotildees lambda

Figura 45 Classificaccedilatildeo dos projetos

31

443 Refatoraccedilatildeo de Coacutedigo

O uacuteltimo script teve como objetivo realizar uma tentativa inicial de identificar refatoraccedilatildeode coacutedigo da seguinte maneira para todos os projetos que possuem expressotildees lambdaforam identificados o mecircs imediatamente antes da introduccedilatildeo de expressotildees lambda e omecircs seguinte onde houve a primeira ocorrecircncia de lambda no projeto Assim realizou-se uma anaacutelise do tamanho em quantidade de linhas de coacutedigo de todos os meacutetodosdo projeto que no mecircs seguinte tiveram introduccedilatildeo de lambda Em seguida fez-se umacomparaccedilatildeo com os mesmos meacutetodos em relaccedilatildeo ao mecircs anterior e assim foi possiacuteveldetectar quais meacutetodos tiveram a quantidade de linhas de coacutedigo reduzidas o que seriaum indicativo natildeo necessariamente exclusivo de que uma refatoraccedilatildeo de coacutedigo possa terocorrido

Sabe-se que este meacutetodo de detecccedilatildeo de refatoraccedilatildeo de coacutedigo possui suas limitaccedilotildeesuma vez que as comparaccedilotildees para saber se um meacutetodo existe em ambas versotildees eacute feitopuramente por comparaccedilatildeo de String (nome do meacutetodo) e a classe que este pertence

444 Casos de Uso

Os meacutetodos descritos acima ajudaram a identificar alguns padrotildees e facilitar a anaacutelise dosdados Poreacutem natildeo satildeo suficientes para que se possa responder agraves questotildees de pesquisaDessa forma apoacutes a identificaccedilatildeo dos grupos de classificaccedilatildeo para os projetos foramescolhidos um projeto de cada grupo (com exceccedilatildeo do grupo dos projetos sem expressotildeeslambda) para realizar um breve estudo de caso com o objetivo de identificar e caracterizarmelhor a adoccedilatildeo de expressotildees lambda Os projetos escolhidos foram agera vertxAndroid-CleanArchitecture RxJava e guava

32

Capiacutetulo 5

Resultados Obtidos e Anaacutelise

Neste capiacutetulo seratildeo apresentados os dados obtidos e anaacutelise com o objetivo de responderagraves questotildees de pesquisa propostas Como mencionado anteriormente as perguntas seratildeorespondidas de duas maneiras algumas com informaccedilotildees gerais sobre todos os projetose outras com breve estudos de caso envolvendo cinco projetos

51 Visatildeo Geral

Dentre os repositoacuterios coletados para a anaacutelise 74 (7474) natildeo utilizaram nenhumaexpressatildeo lambda no projeto durante todo o periacuteodo analisado (Janeiro de 2013 a Abrilde 2017) restando apenas 25 repositoacuterios (2525) com expressotildees lambda Eacute interessantedestacar que apesar de a quantidade de repositoacuterios que natildeo possuem expressotildees lambdaser relativamente expressiva muitos destes repositoacuterios satildeo de projetos em Java que umdia foram populares e atualmente natildeo estatildeo sendo mais desenvolvidos (por exemplo umaplicativo que soacute funciona para Android 23 atualmente descontinuado)

Levando em consideraccedilatildeo apenas os projetos que possuem expressotildees lambda exis-tem dois tipos de dados que podem ser analisados para responder agrave primeira questatildeo depesquisa atraveacutes dos dados obtidos pelo meacutetodo anteriormente mencionado como anaacutelisetemporal e a meacutedia de lambda por snapshot mencionados no capiacutetulo anterior

Com relaccedilatildeo ao ano em que a primeira ocorrecircncia foi encontrada 6 projetos introduzi-ram expressotildees lambda jaacute em 2014 8 comeccedilaram a utilizar em 2015 7 em 2016 e apenas4 tiveram a primeira ocorrecircncia de expressotildees lambda em 2017 Dessa forma percebe-seque os projetos estatildeo relativamente bem distribuiacutedos em grupos quanto ao ano em que seintroduziu expressotildees lambda

Pela meacutedia de lambda por snapshot (lambdasnapshot) a maioria (11 projetos) possuiuma quantidade expressiva acima de 100 lambdasnapshot (com 6 projetos entre 20 e 100lambdasnapshot e 8 projetos com menos de 20 lambdasnapshot) como apresentados no

33

graacutefico da Figura 51 Isso mostra que essa nova caracteriacutestica jaacute estaacute sendo bem utilizadanos projetos que comeccedilaram a migrar para a nova versatildeo do Java

Figura 51 Graacuteficos dos projetos separados por ano de introduccedilatildeo de expressotildees lambdae meacutedia de lambda por snapshot

Com isso pode-se observar que apesar de a quantidade de projetos que possuemexpressotildees lambda natildeo ser tatildeo alta eacute possiacutevel obter resultados expressivos uma vez quea quantidade dos projetos com lambda estatildeo bem dispersos quanto ao periacuteodo em quecomeccedilaram a adotar essa caracteriacutestica e a quantidade de expressotildees lambda por snapshot

511 Projetos Selecionados

Atraveacutes dos grupos de classificaccedilatildeo identificados pela anaacutelise temporal descritos na Figura45 cinco projetos foram selecionados para uma anaacutelise detalhada levando em consideraccedilatildeoo grupo em que eles pertencem Estes projetos seratildeo apresentados a seguir

512 agera

Agera eacute uma biblioteca Android que ajuda a introduzir programaccedilatildeo funcional reativa(functional reactive programming) em projetos Android Eacute um projeto recente lanccediladoem 2016 pela Google [44] e encontra-se no grupo dos projetos que introduziram expressotildeeslambda em 2016 no mesmo ano de seu lanccedilamento contendo uma meacutedia de expressotildeeslambda de 16 lambdasnapshot

Na classificaccedilatildeo estabelecida agera pertence ao Grupo 1 onde a quantidade de ex-pressotildees lambda no projeto com o tempo aumentam juntamente com a quantidade deAICs como mostra o graacutefico de anaacutelise temporal na Figura 52

34

Figura 52 Graacuteficos de anaacutelise temporal do projeto agera

513 vertx

Eclipse Vertx eacute um conjunto de ferramentas para criaccedilatildeo de reactive applications namaacutequina virtual Java (JVM) em grande escala [45] Seu primeiro lanccedilamento aconteceuem 2011 e a primeira ocorrecircncia de expressotildees lambda no projeto aconteceu em 2014 Esteprojeto possui uma meacutedia de 2867 lambdasnapshot e dentre os projetos consideradosneste trabalho eacute o que possui a maior quantidade de expressotildees lambda

Este projeto pertence ao Grupo 2 onde a quantidade de expressotildees lambda aumen-tou consideravelmente pelos meses ultrapassando a quantidade de AICs que diminuiudrasticamente como mostra a Figura 53

35

Figura 53 Graacuteficos de anaacutelise temporal do projeto Vertx

514 Android-CleanArchitecture

Apesar de ser uma amostra de projeto Android-CleanArchitecture que tem como objetivoconstruir aplicaccedilotildees Android utilizando clean architecture foi lanccedilado em 2014 mas semanteacutem sempre atualizado [46]

A introduccedilatildeo de expressotildees lambda que aconteceu no ano de 2015 se deu de formatiacutemida com uma meacutedia de 35 lambdasnapshot De qualquer forma este projeto conseguerepresentar com seu graacutefico de anaacutelise temporal o grupo 3 composto por projetos em quea quantidade de expressotildees lambda aumentou mas sem ultrapassar AICs que diminuiacuteramdemonstrado no graacutefico da Figura 54

36

Figura 54 Graacuteficos de anaacutelise temporal do projeto Android-CleanArchitecture

515 RxJava

Dentre os repositoacuterios estudados RxJava eacute considerado o mais popular Como umaimplementaccedilatildeo de Reactive Extensions para a JVM RxJava teve seu lanccedilamento dadoem 2013 [47] Expressotildees lambda apareceram pela primeira vez no ano de 2015 comuma meacutedia de 766 lambdasnapshot

Apesar de uma meacutedia relativamente alta o tempo de vida das expressotildees lambda nesteprojeto foi bem curto caracterizando assim projetos do grupo 4 houve a introduccedilatildeo dasexpressotildees lambda no projeto poreacutem houve a remoccedilatildeo completa de todas as expressotildeeslambda previamente introduzidas desaparecendo completamente do projeto ateacute a datada coleta de dados (Figura 55)

37

Figura 55 Graacuteficos de anaacutelise temporal do projeto RxJava

516 guava

Guava eacute um conjunto de bibliotecas para Java da Google lanccedilado em 2011 A atualizaccedilatildeodo coacutedigo do projeto para Java 8 aconteceu somente em 2016 e apesar do projeto conteruma meacutedia de 281 lambdasnapshot ele foi escolhido como representante dos projetosdo Grupo 5 (Figura 56) que possuem expressotildees lambda mas de forma natildeo expressiva osuficiente quando comparado com a quantidade de AIC pelo fato de sua razatildeo de meacutedia delambdasnapshot por meacutedia de AICsnapshot ser 004 Ou seja embora o projeto tenhaexpressotildees lambda estas satildeo consideradas muito poucas quando inseridas no contextogeral deste projeto que eacute considerado um projeto grande

38

Figura 56 Graacuteficos de anaacutelise temporal do projeto Guava

52 Refatoraccedilatildeo de Coacutedigo

Com o objetivo de caracterizar melhor como as expressotildees lambda estatildeo sendo utilizadaseacute interessante identificar se estas estatildeo sendo introduzidas atraveacutes de refatoraccedilatildeo de coacutedigoou em coacutedigo novo

Os projetos classificados como pertencentes ao Grupo 2 possuem em comum o fatode expressotildees lambda aumentarem a medida que AICs diminuem ultrapassando-as eessa caracteriacutestica em comum pode indicar que nestes projetos possivelmente houve re-fatoraccedilatildeo de coacutedigo visto que AIC sendo substituiacutedo por expressotildees lambda dentro dascondiccedilotildees determinadas eacute a maneira mais comum de se identificar refatoraccedilatildeo de coacute-digo para introduccedilatildeo de expressotildees lambda [12] Os projetos que compotildeem o grupo 2representam 44 de todos os projetos estudados que possuem expressotildees lambda o quepode ser um indicativo caso a hipoacutetese de refatoraccedilatildeo de coacutedigo seja positiva de quemuitos projetos que estatildeo adotando o Java 8 estatildeo se preocupando de alguma formacom refatoraccedilatildeo se coacutedigo Fazem parte desse grupo os seguintes projetos elasticsearchjava-design-patterns PocketHub presto RxJava-Android-Samples spark vertx zipkinjava8-tutorial dropwizard e material-dialogs

39

Outra maneira de verificar possiacuteveis indicadores de refatoraccedilatildeo de coacutedigo foi atraveacutesda anaacutelise dos tamanhos (em quantidade de linhas de coacutedigo) dos meacutetodos com expressotildeeslambda no mecircs em que se introduziu expressotildees lambda e um mecircs imediatamente antesdeste Essa anaacutelise mostra que dos 25 projetos com expressotildees lambda 12 (48) projetostiveram ao menos um meacutetodo em que houve uma diminuiccedilatildeo no tamanho o que podeser considerado um indicativo de refatoraccedilatildeo de coacutedigo A Figura 57 mostra todos osprojetos em relaccedilatildeo agrave quantidade total de meacutetodos que possuem lambda no primeiro mecircsde introduccedilatildeo do mesmo em vermelho comparado com a quantidade desses meacutetodos quetiveram uma diminuiccedilatildeo no tamanho quando comparados com o coacutedigo do mecircs anteriorem azul

Figura 57 Comparaccedilatildeo entre todos os projetos com expressatildeo lambda sobre refatoraccedilatildeode coacutedigo no mecircs de introduccedilatildeo da caracteriacutestica

Ainda observando a figura 57 com relaccedilatildeo aos projetos que natildeo tiveram nenhummeacutetodo com diminuiccedilatildeo de tamanho (barra azul) percebe-se que todos os 13 projetossequer tiveram uma quantidade significativa de meacutetodos que possuem expressotildees lambda(com o maior tendo apenas 5 meacutetodos) no mecircs de introduccedilatildeo da caracteriacutestica no projetoe ao mesmo tempo jaacute existiam no mecircs em que natildeo existia lambda no projeto Essa eacuteuma observaccedilatildeo importante porque projetos como vertx sendo este o que possui a maiormeacutedia de lambdasnapshot de todos os projetos e ao mesmo tempo tendo apenas trecircsmeacutetodos que continham expressotildees lambda no mecircs da introduccedilatildeo e que existiam no mecircs

40

anterior permitem inferir que todas as outras expressotildees lambda existentes no projetopara este determinado mecircs de introduccedilatildeo encontram-se em coacutedigo novo introduzido

Eacute importante ressaltar que somente essa anaacutelise natildeo eacute exclusivamente suficiente paradeterminar se estes projetos estatildeo realmente introduzindo lambda em coacutedigo novo ourealizando refatoraccedilatildeo uma vez que como a comparaccedilatildeo aconteceu apenas no mecircs deintroduccedilatildeo com o mecircs imediatamente anterior natildeo reflete todo o ciclo de vida do pro-jeto Por exemplo algumas equipes podem escolher refatorar o coacutedigo depois de umtempo de adaptaccedilatildeo apoacutes a transiccedilatildeo para a nova versatildeo da linguagem Assim paraobter uma melhor anaacutelise sobre refatoraccedilatildeo de coacutedigo ou natildeo feita nestes projetos aleacutemde outras anaacutelises referentes aos padrotildees tipicamente adotados para implementaccedilatildeo delambda nestes projetos seratildeo apresentados a seguir os estudos de caso dos cinco projetospreviamente selecionados

Outro ponto importante eacute o fato de que apesar das informaccedilotildees quanto agraves quantida-des de filter e map terem sido incluiacutedas inicialmente no trabalho para observar possiacuteveispadrotildees de refatoraccedilatildeo de coacutedigo percebeu-se que estas natildeo satildeo utilizadas de forma con-sideraacutevel pelos projetos estudados e para fins de anaacutelises generalizadas natildeo apresentaramtanta influecircncia na utilizaccedilatildeo de expressotildees lambda quanto a quantidade de AICs noprojeto

53 Estudos de Caso

Dentre os projetos analisados verificou-se que os projetos de pequeno e meacutedio porte op-taram por refatorar de uma vez seus coacutedigos para incluir expressotildees lambda em situaccedilotildeesem que se utilizava AICs anteriormente ou em alguns poucos casos de utilizaccedilatildeo deCollection Os projetos de grande porte natildeo apresentaram nenhuma refatoraccedilatildeo de coacute-digo ou uma refatoraccedilatildeo parcial gradativa provavelmente devido agrave grande quantidade dearquivos e coacutedigo que possuem o que pode tornar o trabalho de refatoraccedilatildeo extenso ecansativo

O projeto vertx que pertence ao grupo 2 dos projetos em que a quantidade de ex-pressotildees lambda aumentaram e as de AICs diminuiacuteram com lambda ultrapassando AICsexecutou inicialmente commits em maio de 2014 com adiccedilatildeo de coacutedigo novo utilizandoexpressotildees lambda e apoacutes um mecircs realizou um commit maior com a refatoraccedilatildeo de todasas AICs para expressotildees lambda Apoacutes a refatoraccedilatildeo o projeto se preocupou em mantera utilizaccedilatildeo de expressotildees lambda ao mesmo tempo que o uso de AICs se manteve apenasaos casos de classes com interfaces natildeo funcionais A Figura 58 apresenta uma parte docommit de refatoraccedilatildeo de coacutedigo que mostra em vermelho a parte eliminada do coacutedigo(AIC) e em verde o coacutedigo novo representando a substituiccedilatildeo por uma expressatildeo lambda

41

Figura 58 Commit de refatoraccedilatildeo de coacutedigo do projeto Vertx [3]

Alguns projetos ainda natildeo se preocuparam em refatorar o coacutedigo para o uso de ex-pressotildees lambda ateacute a data deste trabalho que eacute o caso do projeto guava que apresentouum commit em 03112016 com a atualizaccedilatildeo do projeto para Java 8 Mas a partir daatualizaccedilatildeo se preocupou em utilizar as expressotildees lambda apenas na implementaccedilatildeo decoacutedigo novo O cenaacuterio em que a refatoraccedilatildeo natildeo eacute prioridade ainda eacute a realidade de vaacuteriosprojetos de grande porte visto que os dados de projetos sem nenhuma expressatildeo lambdasatildeo o maior nuacutemero neste trabalho Poreacutem projetos que jaacute adotaram a utilizaccedilatildeo do Java8 tendem a mudar isso com o passar do tempo A Figura 59 apresenta em verde umaadiccedilatildeo de coacutedigo novo com expressatildeo lambda sem a eliminaccedilatildeo de algum coacutedigo anteriora esse que estaria em vermelho

42

Figura 59 Exemplo de um arquivo do commit de adiccedilatildeo de coacutedigo novo em Java 8 doprojeto Guava [4]

Na categoria de projetos em que os AICs e expressotildees lambda aumentam proporci-onalmente (grupo 1) o projeto agera realizou um commit em 19052016 com a adiccedilatildeoda biblioteca retrolambda como dependecircncia do projeto Essa biblioteca utilizada prin-cipalmente por projetos Android permite executar coacutedigo Java 8 contendo expressotildeeslambda em Java 5 6 e 7 [48] O commit tambeacutem apresenta refatoraccedilatildeo dos AICs ad-vindos de interfaces funcionais para expressotildees lambda Apesar de o projeto continuar autilizar as expressotildees lambda em seus commits posteriores o nuacutemero de AICs tambeacutemcontinuou a aumentar visualizando os commits posteriores notou-se que esses AICs satildeorelativos a interfaces natildeo funcionais ou seja que possuem mais de um meacutetodo O projetoAndroid-CleanArchitecture eacute similar ao agera pois tambeacutem optou pela instalaccedilatildeo da bi-blioteca retrolambda para uso de expressotildees lambda em seus coacutedigos e como tambeacutem eacuteum projeto de pequeno porte houve uma pequena refatoraccedilatildeo dos AICs A Figura 510mostra a parte do commit de refatoraccedilatildeo de coacutedigo em que o desenvolvedor adiciona abiblioteca retrolambda como dependecircncia

43

Figura 510 Commit de adiccedilatildeo da biblioteca Retrolambda no projeto Agera [5]

Outro caso interessante eacute o do projeto RxJava que em 2015 optou pela refatoraccedilatildeodo coacutedigo para a utilizaccedilatildeo de expressotildees lambda quase eliminando por completo o usode AICs mas que no ano seguinte reverteu os commits de forma que eliminasse comple-tamente o uso de expressotildees lambda para manter a retrocompatibilidade com o Java 6A Figura 511 demonstra uma parte do commit de reversatildeo do coacutedigo para Java 6 emque pode ser visto em vermelho o coacutedigo anterior com expressotildees lambda e o verde como novo coacutedigo utilizando AIC novamente

44

Figura 511 Commit de remoccedilatildeo de Lambdas e volta para o uso de AICs no projetoRXJava [6]

Essa preocupaccedilatildeo com retrocompatibilidade de coacutedigo pode ser um fator crucial nadecisatildeo das equipes de desenvolvimento na hora de decidir como fazer o software co-evoluircom a linguagem sem perder a compatibilidade com versotildees anteriores

45

Capiacutetulo 6

Consideraccedilotildees Finais

Este estudo permitiu entender melhor como projetos estatildeo realizando a migraccedilatildeo para oJava 8 em especial utilizando uma nova caracteriacutestica introduzida expressatildeo lambdaApesar de a maioria dos projetos populares considerados natildeo possuiacuterem nenhuma ocor-recircncia de expressotildees lambda os projetos que tinham expressotildees lambda foram suficientespara realizar um primeiro estudo de caracterizaccedilatildeo no uso desta caracteriacutestica e com osprojetos efetivamente utilizados para estudo foi possiacutevel agrupaacute-los quanto a maneira emque as expressotildees lambda estavam sendo utilizadas quando comparadas com AICs em 5grandes grupos quando AIC e lambda aumentam proporcionalmente quando AIC dimi-nui e lambda aumenta ultrapassando AIC quando AIC diminui mas continua superior aolambda crescente expressotildees lambda que foram introduzidas e retiradas completamentedo coacutedigo e expressotildees lambda que natildeo existem em quantidades expressivas

Foi possiacutevel entatildeo realizar um estudo aprofundado levando em consideraccedilatildeo as di-ferentes maneiras com que as expressotildees lambda foram adotadas nos projetos atraveacutes daescolha de um projeto que representasse cada grupo para anaacutelise Dentre os cinco projetosestudados foi possiacutevel observar alguns padrotildees tipicamente adotados por desenvolvedorespara implementar expressotildees lambda em seus projetos como a utilizaccedilatildeo da bibliotecas(retrolambda) que permitissem uma flexibilizaccedilatildeo na utilizaccedilatildeo de expressotildees lambda oucomo lambda eacute primariamente utilizada para substituir determinados AICs ou operaccedilotildeesem Collection

Aleacutem disso foi possiacutevel observar como a refatoraccedilatildeo de coacutedigo acontece em cada umdesses projetos Observou-se como projetos menores tendem a refatorar coacutedigo maisfacilmente ao passo que projetos maiores e mais complexos fazem menos refatoraccedilatildeo oudemoram mais entre o periacuteodo em que houve a primeira migraccedilatildeo de coacutedigo para a novaversatildeo da linguagem ateacute o periacuteodo em que realmente decidem refatorar coacutedigo Aleacutem dacomplexidade do projeto influenciar na decisatildeo de migrar o projeto para uma versatildeo maisrecente da linguagem a preocupaccedilatildeo com retrocompatibilidade com versotildees anteriores da

46

linguagem tambeacutem podem ser uma barreira para que projetos comecem a evoluir o coacutedigojuntamente com a evoluccedilatildeo da linguagem

Ainda assim foi possiacutevel observar que a preocupaccedilatildeo com a co-evoluccedilatildeo do software-linguagem existe entre os desenvolvedores de projetos mas a realizaccedilatildeo da migraccedilatildeo aindaacontece lentamente devido agrave diversos fatores que precisam ser levados em consideraccedilatildeopara a manutenccedilatildeo do projeto

Para trabalhos e contribuiccedilotildees futuras seria interessante desenvolver uma ferramentaque pudesse analisar diretamente no coacutedigo-fonte as oportunidades de aplicaccedilatildeo de ex-pressotildees lambda dessa forma poderiam ser analisadas as porcentagens de conversatildeo decoacutedigo para Java 8 e obter melhores conclusotildees sobre a importacircncia que os projetos estatildeodando para a evoluccedilatildeo de seus coacutedigos Outro fator interessante seria aplicar mais Visitorsagrave ferramenta static-analysis e fazer este mesmo estudo aplicado agrave outras caracteriacutesticasda linguagem

47

Referecircncias

[1] Kagdi Huzefa Michael L Collard e Jonathan I Maletic A survey and taxonomyof approaches for mining software repositories in the context of software evolution2007 ix 3 8 9 10 11

[2] DBeaver Dbeaver - features httpdbeaverjkissorgdocsfeatures ix 29

[3] Eclipse Vertx commit Java8-ify code httpsgithubcomeclipsevertxcommit93f95e9c77419f442a42fe711b6eeaef88192fd3 ix 42

[4] Google Guava commit Release java 8 changes to guava httpsgithubcomgoogleguavacommit73e382fa877f80994817a136b0adcc4365ccd904 ix 43

[5] Google Agera commit Collapsed testapp with retrolambda httpsgithubcomgoogleageracommit5e518b7b05f9e7a34a314945f68deff7b2c3e334 ix 44

[6] ReactiveX Rxjava commit 2x full jdk 6 compatible backport + includ-ing bugfixes up to today httpsgithubcomReactiveXRxJavacommit000a174d87a901135f9665d3b11f3627fd2dc4ed ix 45

[7] Godfrey M W e D M German The past present and future of software evolutionEm 2008 Frontiers of Maintenance paacuteginas 129ndash138 Sept 2008 1 6

[8] Favre J M Languages evolve too changing the software time scale Em Principles ofSoftware Evolution Eighth International Workshop on paacuteginas 33ndash42 IEEE 20051 5 7

[9] Overbey Jeffrey L e Ralph E Johnson Regrowing a language refactoring tools allowprogramming languages to evolve Em ACM SIGPLAN Notices volume 44 paacuteginas493ndash502 ACM 2009 1 5 7 8 12

[10] Grechanik Mark Collin McMillan Luca DeFerrari Marco Comi Stefano CrespiDenys Poshyvanyk Chen Fu Qing Xie e Carlo Ghezzi An empirical investiga-tion into a large-scale java open source code repository Em Proceedings of the2010 ACM-IEEE International Symposium on Empirical Software Engineering andMeasurement ESEM rsquo10 paacuteginas 111ndash1110 New York NY USA 2010 ACMISBN 978-1-4503-0039-1 httpdoiacmorg10114518527861852801 1

[11] TIOBE Tiobe httpswwwtiobecomtiobe-index 1 14

48

[12] Gyori Alex Lyle Franklin Danny Dig e Jan Lahoda Crossing the gap from im-perative to functional programming through refactoring Em Proceedings of the 20139th Joint Meeting on Foundations of Software Engineering ESECFSE 2013 paacute-ginas 543ndash553 New York NY USA 2013 ACM ISBN 978-1-4503-2237-9 httpdoiacmorg10114524914112491461 2 11 24 39

[13] OpenJDK State of the lambda httpcropenjdkjavanet~briangoetzlambdalambda-state-4html 2

[14] Han Jiawei Micheline Kamber e Jian Pei Data Mining Concepts and TechniquesMorgan Kaufmann Publishers Inc San Francisco CA USA 3rd ediccedilatildeo 2011ISBN 0123814790 9780123814791 3

[15] Fowler Martin e Kent Beck Refactoring improving the design of existing codeAddison-Wesley Professional 1999 5 7

[16] Lehman M M J F Ramil P D Wernick D E Perry e W M Turski Met-rics and laws of software evolution - the nineties view Em Proceedings of the4th International Symposium on Software Metrics METRICS rsquo97 paacuteginas 20ndashWashington DC USA 1997 IEEE Computer Society ISBN 0-8186-8093-8 httpdlacmorgcitationcfmid=823454823901 6

[17] Hassan Ahmed E e Tao Xie Software intelligence The future of mining softwareengineering data Em Proceedings of the FSESDP Workshop on Future of SoftwareEngineering Research FoSER rsquo10 paacuteginas 161ndash166 New York NY USA 2010ACM ISBN 978-1-4503-0427-6 httpdoiacmorg101145188236218823978 9

[18] Hassan Ahmed E The road ahead for mining software repositories Em Frontiers ofSoftware Maintenance 2008 FoSM 2008 paacuteginas 48ndash57 IEEE 2008 8

[19] Berry Michael J e Gordon Linoff Data Mining Techniques For Marketing Salesand Customer Support John Wiley amp Sons Inc New York NY USA 1997ISBN 0471179809 10

[20] Parnin Chris Christian Bird e Emerson Murphy-Hill Java generics adoption hownew features are introduced championed or ignored Em Proceedings of the 8thWorking Conference on Mining Software Repositories paacuteginas 3ndash12 ACM 2011 12

[21] Oracle The java language specification httpsdocsoraclecomjavasespecsjlsse8jls8pdf 13

[22] Oracle The history of java technology httpwwworaclecomtechnetworkjavajavaseoverviewjavahistory-index-198355html 13

[23] Murphy Kieron So why did they decide to call itjava httpwwwjavaworldcomarticle2077265core-javaso-why-did-they-decide-to-call-it-java-html 13

[24] McGraw Tata Object-oriented Programming with Java Essentials and ApplicationsHill Education 13

49

[25] Oracle Differences between java ee and java se httpdocsoraclecomjavaee6firstcupdocgkhoyhtml 13

[26] Lindsey Clark S The History of Java Cambridge 14

[27] Oracle The java language environment httpwwworaclecomtechnetworkjavaintro-141325html 14

[28] Oracle Jdk 8 httpopenjdkjavanetprojectsjdk8 15 24

[29] Oracle Enhancements in java se 8 httpdocsoraclecomjavase8docstechnotesguideslanguageenhancementshtmljavase8 15 16 17

[30] Oracle Lambda expressions httpdocsoraclecomjavasetutorialjavajavaOOlambdaexpressionshtml 16 18 21

[31] Oracle Method references httpdocsoraclecomjavasetutorialjavajavaOOmethodreferenceshtml 16

[32] Oracle Default methods httpdocsoraclecomjavasetutorialjavaIandIdefaultmethodshtml 17

[33] Oracle Repeating annotations httpdocsoraclecomjavasetutorialjavaannotationsrepeatinghtml 17

[34] Oracle Type annotations httpdocsoraclecomjavasetutorialjavaannotationstype_annotationshtml 17

[35] Oracle Anonymous inner classes httpsdocsoraclecomjavasetutorialjavajavaOOanonymousclasseshtml 19

[36] Kothari CR Research Methodology Methods and Techniques New Age Interna-tional (P) Limited 2004 ISBN 9788122415223 httpsbooksgooglecombrbooksid=8c6gkbKi-F4C 22

[37] Nakakoji Kumiyo Yasuhiro Yamamoto Yoshiyuki Nishinaka Kouichi Kishida eYunwen Ye Evolution patterns of open-source software systems and communitiesEm IWPSE rsquo02 Proceedings of the International Workshop on Principles of SoftwareEvolution paacuteginas 76ndash85 New York NY USA 2002 ACM Press ISBN 1581135459httpdxdoiorg101145512035512055 23

[38] Rahman Foyzur Christian Bird e Premkumar Devanbu Clones What is that smellEmpirical Software Engineering 17(4-5)503ndash530 2012 24

[39] Chacon Scott Pro Git Apress Berkely CA USA 1st ediccedilatildeo 2009ISBN 1430218339 9781430218333 25

[40] Cavalcanti Thiago Gomes e Viniacutecius Correa de Almeida Caracterizaccedilatildeo do uso deconstruccedilotildees da linguagem java em projetos open-source Publicaccedilatildeo online 2016httpbdmunbbrhandle1048315733 27

50

[41] Parr Terence Language Implementation Patterns Create Your Own Domain-Specific and General Programming Languages Pragmatic Bookshelf 1st ediccedilatildeo 2009ISBN 193435645X 9781934356456 27

[42] Janssen Thorben 5 reasons to use jpa hibernate Publicaccedilatildeo online httpswwwsitepointcom5-reasons-to-use-jpa-hibernate 27

[43] Franklin Lyle Alex Gyori Jan Lahoda e Danny Dig Lambdaficator From imperativeto functional programming through automated refactoring Em Proceedings of the2013 International Conference on Software Engineering ICSE rsquo13 paacuteginas 1287ndash1290 Piscataway NJ USA 2013 IEEE Press ISBN 978-1-4673-3076-3 httpdlacmorgcitationcfmid=24867882486986 29

[44] Google Agera httpsgithubcomgoogleagerawiki 34

[45] Eclipse Eclipse vertx httpvertxio 35

[46] Cejas Fernando Android cleanarchitecture httpsgithubcomandroid10Android-CleanArchitecture 36

[47] ReactiveX Rxjava httpsgithubcomReactiveXRxJava 37

[48] Luontola Esko Retrolambda httpsgithubcomorfjackalretrolambda 43

51

Anexo I

Projetos utilizados

fastjson

platform_frameworks_base

netty

material-dialogs

kotlin

okhttp

tinker

AndroidUtilCode

RxJava

spring-boot

java-design-patterns

elasticsearch

ExoPlayer

kafka

vertx

realm-java

guava

zipkin

bazel

stetho

Signal-Android

glide

agera

fresco

plaid

presto

libgdx

spark

52

disruptor

lottie-android

flexbox-layout

PocketHub

zxing

spring-framework

deeplearning4j

dropwizard

interviews

BaseRecyclerViewAdapterHelper

uCrop

DanmakuFlameMaster

lottie-react-native

android-UniversalMusicPlayer

AndroidInterview-Q-A

greenDAO

retrofit

MaterialDrawer

BottomBar

druid

MPAndroidChart

Hystrix

guice

recyclerview-animators

dubbo

androidannotations

RxJava-Android-Samples

PhotoView

clojure

CircleImageView

AndroidSwipeLayout

jedis

MaterialViewPager

butterknife

junit4

RxBinding

leakcanary

SimianArmy

picasso

UltimateRecyclerView

53

AndroidViewAnimations

AppIntro

FizzBuzzEnterpriseEdition

ion

cheesesquare

physical-web

RxAndroid

Android-CleanArchitecture

Calligraphy

Android-Bootstrap

iosched

Android_Data

MaterialDesignLibrary

ListViewAnimations

EventBus

java8-tutorial

AndroidSlidingUpPanel

dagger

okhttputils

logger

HomeMirror

Material-Animations

android-Ultra-Pull-To-Refresh

android-async-http

Android-ObservableScrollView

Android-Universal-Image-Loader

ActionBarSherlock

SlidingMenu

storm

PagerSlidingTabStrip

Android-PullToRefresh

54

  • Dedicatoacuteria
  • Agradecimentos
  • Resumo
  • Abstract
  • Introduccedilatildeo
    • Contexto
    • Objetivos
      • Objetivos Gerais
      • Objetivos Especiacuteficos
        • Metodologia
        • Organizaccedilatildeo do Trabalho
          • Evoluccedilatildeo e Mineraccedilatildeo de Repositoacuterios de Software
            • Evoluccedilatildeo de Software
            • MSR Mineraccedilatildeo de dados e a Engenharia de Software
              • Classificaccedilatildeo
                • Trabalhos Relacionados
                  • Java SE 8 e JDK 8
                    • Histoacuterico
                    • Princiacutepios
                    • Evoluccedilatildeo
                    • Expressotildees Lambda
                      • Sintaxe
                      • Principais formas de uso
                          • Estudo e o Processo de Mineraccedilatildeo
                            • Questotildees de Pesquisa
                            • Fonte de Dados e Objetos de Estudo
                            • Processo de Mineraccedilatildeo
                              • static-analysis
                              • BDAnalisador
                                • Classificaccedilatildeo e Anaacutelise
                                  • Meacutedia de Lambda
                                  • Anaacutelise Temporal
                                  • Refatoraccedilatildeo de Coacutedigo
                                  • Casos de Uso
                                      • Resultados Obtidos e Anaacutelise
                                        • Visatildeo Geral
                                          • Projetos Selecionados
                                          • agera
                                          • vertx
                                          • Android-CleanArchitecture
                                          • RxJava
                                          • guava
                                            • Refatoraccedilatildeo de Coacutedigo
                                            • Estudos de Caso
                                              • Consideraccedilotildees Finais
                                              • Referecircncias
                                              • Anexo
                                              • Projetos utilizados

5 Conservaccedilatildeo de familiaridade a quantidade de conteuacutedo novo em cada entregado sistema tende a se manter constante com o tempo

6 Crescimento contiacutenuo A quantidade de funcionalidades em um sistema cresceraacutecom o tempo com o objetivo de satisfazer seus usuaacuterios

7 Decliacutenio de qualidade Um sistema seraacute percebido com qualidade inferior como passar do tempo a menos que seu design tenha uma manutenccedilatildeo minuciosa e seadapte a novas restriccedilotildees

8 Sistema de Feedback Evoluir um sistema com sucesso requer reconhecer que oprocesso de desenvolvimento acontece em um sistema de feedback de vaacuterios ciclosagentes e niacuteveis

Os aspectos teacutecnicos que envolvem a evoluccedilatildeo de software levam em consideraccedilatildeo astecnologias utilizadas para o seu desenvolvimento desde a linguagem de programaccedilatildeo agravesmaacutequinas onde o software seraacute hospedado que sofrem atualizaccedilotildees recebem novas versotildeescom novas caracteriacutesticas implementadas

Um estudo realizado por Lavre mostra como a evoluccedilatildeo das linguagens de programa-ccedilatildeo no contexto da evoluccedilatildeo de software muitas vezes satildeo subestimadas uma vez quemuitos podem considerar em seus estudos a linguagem de computaccedilatildeo como um artefatoimutaacutevel [8] Por exemplo coloca-se muita ecircnfase e cuidado para realizar o versionamentode coacutedigo fonte de um software mas este pode ser tornar inutilizaacutevel futuramente se nin-gueacutem souber qual versatildeo de compilador determinada versatildeo de coacutedigo foi desenvolvida

Para natildeo se deixar estagnar linguagens de programaccedilatildeo precisam se adaptar e evoluirQuando uma linguagem de programaccedilatildeo atualiza softwares que eram antes consideradosatualizados podem se tornar rapidamente obsoletos E ao mesmo tempo que novascaracteriacutesticas satildeo adicionadas a linguagem precisa fornecer compatibilidade com versotildeesanteriores aumentando sua complexidade Desenvolvedores entatildeo encontram-se tambeacutemem um empasse buscando um equiliacutebrio entre manter a compatibilidade da ferramentacom versotildees anteriores da linguagem e atualizaacute-la para manter o software atualizado [9]

A estrateacutegia de refatoraccedilatildeo de coacutedigo pode ser uma opccedilatildeo que permite a linguageme o software co-evoluiacuterem com um menor grau de dificuldade [9] Refatoraccedilatildeo (do inglecircsrefactoring) eacute o processo de modificaccedilatildeo de um software com o objetivo de melhorar a es-trutura interna do mesmo sem alterar sua percepccedilatildeo externa Eacute uma maneira disciplinadade melhorar o design do coacutedigo apoacutes ele jaacute ter sido implementado Por exemplo dividiruma funcionalidade grande feita em apenas um bloco de coacutedigo em vaacuterios moacutedulos [15]

A refatoraccedilatildeo de coacutedigo pode ser um meio utilizado para evoluir o software adaptandoo coacutedigo com caracteriacutesticas novas introduzidas pela linguagem modificando o design dosistema sem comprometer sua integridade No entanto novos desafios surgem visto que

7

refatorar o coacutedigo fonte de um sistema de grande porte natildeo eacute uma tarefa faacutecil havendo anecessidade de ferramentas que possam automatizar o processo ou realizar um estudo paraentender como as novas caracteriacutesticas da linguagem podem ser utilizadas para substituirou melhorar funcionalidades obsoletas [9]

22 MSR Mineraccedilatildeo de dados e a Engenharia deSoftware

Com o objetivo de compreender prever e planejar os vaacuterios aspectos do desenvolvimentode um projeto em especial tudo que possa impactar na evoluccedilatildeo de software a teacutecnicade mineraccedilatildeo de dados tem sido bastante utilizada em engenharia de software [17]

O termo Mineraccedilatildeo de Repositoacuterios de Software (MSR) tem sido utilizado para descre-ver vaacuterias maneiras de se examinar repositoacuterios de software Um repositoacuterio de softwarepode ser considerado um artefato que eacute produzido e arquivado durante a evoluccedilatildeo desoftware [1] Estes responsoacuterios armazenam informaccedilotildees que podem fornecer todos osdetalhes de desenvolvimento do software provendo meios necessaacuterios para uma anaacuteliseaprofundada de evoluccedilatildeo de software

Repositoacuterios de software satildeo comumente utilizados para armazenar e acompanhar ohistoacuterico de desenvolvimento do software mas raramente usados para tomada de deci-sotildees em relaccedilatildeo ao projeto Assim pesquisadores de MSR buscam modificar a impressatildeode que tais repositoacuterios satildeo estaacuteticos que servem apenas para manutenccedilatildeo de registrostransformando-os em repositoacuterios ativos que podem auxiliar na tomada de decisatildeo em pro-jetos de software modernos atraveacutes da identificaccedilatildeo de padrotildees para realizar a propagaccedilatildeode mudanccedilas [18]

221 Classificaccedilatildeo

De acordo com Kagdi et al dentre as abordagens de MSR utilizadas atualmente eacute possiacuteveldescrevecirc-las para entatildeo comparaacute-las e possivelmente classificaacute-las levando em considera-ccedilatildeo uma taxonomia de quatro dimensotildees os repositoacuterios de software utilizados (fontes dedados) o propoacutesito do MSR a metodologia e a avaliaccedilatildeo da abordagem [1] como mostraa Figura 21 onde as taxonomias destacadas em amarelo satildeo as que prevaleceram poreacutemnatildeo exclusivamente na metodologia adotada por este trabalho

8

Figura 21 Taxonomia em camadas adaptada do trabalho de Kagdi et al [1]

Fontes de Dados

As fontes de informaccedilatildeo variam de acordo com a abordagem utilizada e dentre as informa-ccedilotildees mineradas em repositoacuterios de software inclui-se as seguintes categorias os artefatosde software e suas versotildees as diferenccedilas entre os artefatos de software e suas versotildees e osmetadados sobre as mudanccedilas no software

As fontes de dados podem ser melhor classificadas de acordo com Hassan et al [17]

bull Repositoacuterios de controle de Versatildeo estes repositoacuterios guardam o histoacuterico de desen-volvimento de um projeto armazenando todas as mudanccedilas no coacutedigo fonte assimcomo os metadados associados com cada mudanccedila Exemplos git SVN

bull Bug repositories Estes repositoacuterios rastreiam o histoacuterico de resoluccedilatildeo de bugs quesatildeo reportados por usuaacuterios e desenvolvedores Exemplos Bugzilla e Jira

9

bull Histoacuterico de Comunicaccedilatildeo (Archived communications) estes repositoacuterios rastreiamdiscussotildees sobre os vaacuterios aspectos de um projeto de software por sua vida uacutetil Porexemplo listas de e-mails

bull Deployment logs logs com informaccedilotildees do software gerados por ferramentas dedesenvolvimento

bull Repositoacuterios de software Repositoacuterios onde o coacutedigo fonte de vaacuterios projetos satildeoarmazenados como por exemplo Sourceforgenet

No contexto deste trabalho estes repositoacuterios consistem em fontes de coacutedigo armaze-nadas em sistemas de controle de versatildeo especificamente coacutedigos na plataforma Github

O propoacutesito

O propoacutesito da mineraccedilatildeo de repositoacuterios de software se resume nas perguntas de pes-quisa que podem ser respondidas utilizando mineraccedilatildeo Assim existem duas classes deperguntas de pesquisa para MSR [1]

A primeira eacute a pergunta de anaacutelise market-basket1 ldquoSe A acontece o que mais podeacontecerrdquo A resposta para este tipo de pergunta eacute um conjunto de regras descrevendotendecircncias de relacionamentos como por exemplo se A acontecer entatildeo B e C acontecemdurante um periacuteodo X

A segunda classe diz respeito agraves perguntas de prevalecircncia (Prevalence Questions -PQ) como por exemplo perguntas do tipo ldquoA funcionalidade Y foi modificadardquo quepossuem uma resposta booleana ou ldquoQuantas vezes esta funcionalidade Y foi modificadardquocontendo uma resposta quantitativa

As perguntas de pesquisa deste trabalho se encaixam majoritariamente na segundaclasse onde o objetivo traccedilado eacute respondido de forma quantitativa com algumas tentativasde classificaccedilatildeo de tipos de repositoacuterios como seraacute descrito nos capiacutetulos seguintes

A metodologia

A metodologia corresponde a maneira como as questotildees de MSR iratildeo ser respondidas evaacuterias abordagens estatildeo disponiacuteveis Poreacutem Kagdi indica duas estrateacutegias baacutesicas quepodem ser utilizadas

Primeiramente pode-se utilizar a mediccedilatildeo indireta e anaacutelise da evoluccedilatildeo do softwareEsta abordagem pode ser realizada da seguinte forma extrair e computar informaccedilotildeesde cada versatildeo de um software separadamente e em seguida individualmente comparar

1Anaacutelise Market-basket eacute uma teacutecnica de modelagem baseada na teoria de que se vocecirc comprar certostipos de produtos vocecirc haacute uma probabilidade maior (ou menor) de comprar outros tipos de produtos [19]

10

propriedades encontradas como por exemplo comparar duas versotildees distintas de umsoftware atraveacutes de um repositoacuterio github realizando uma investigaccedilatildeo de alto niacutevel noque diz respeito a evoluccedilatildeo do software [1]

A segunda perspectiva de metodologia que pode ser utilizada corresponde agrave mediccedilatildeodireta e anaacutelise da evoluccedilatildeo do software Ela diz respeito agraves investigaccedilotildees que estudamos mecanismos que leva um software a ser modificado de uma versatildeo para outra focandonas diferenccedilas especiacuteficas entre estas versotildees como por exemplo examinando mudanccedilasespeciacuteficas das classes arquivos funccedilotildees de cada parte do coacutedigo [1]

Assim eacute possiacutevel descrever explicitamente que este trabalho utiliza em sua maioriauma metodologia com mediccedilotildees diretas atraveacutes da anaacutelise estaacutetica de informaccedilotildees docoacutedigo fonte de diferente versotildees para analisar os diferentes padrotildees de desenvolvimentoem que expressotildees lambda (definidas no capiacutetulo seguinte) satildeo utilizadas

A Avaliaccedilatildeo

Por fim existem diversas formas para se avaliar o estudo realizado sempre levando emconsideraccedilatildeo a validade dos resultados obtidos Pode-se utilizar de meacutetricas para avaliar osdados considerando o quanto das informaccedilotildees obtidas satildeo relevantes Outra forma de seavaliar seria atraveacutes da utilizaccedilatildeo de modelos probabiliacutesticos seguindo uma abordagemde teoria da informaccedilatildeo Assim foram utilizadas determinadas meacutetricas quantitativaspara avaliar os resultados obtidos neste trabalho

23 Trabalhos Relacionados

Como ressaltado na introduccedilatildeo o foco deste trabalho encontra-se em utilizar teacutecnicas deMSR para caracterizar a adoccedilatildeo de expressotildees lambda em repositoacuterios Java Ao reali-zar um estudo sobre o estado da arte encontrou-se diversos trabalhos que utilizam deMSR para obter informaccedilotildees relevantes sobre repositoacuterios de software em diversos focose em especial trabalhos que investiguem repositoacuterios na linguagem Java Jaacute existemtambeacutem alguns trabalhos que apresentam ferramentas de refatoraccedilatildeo de coacutedigo para im-plementaccedilatildeo de expressotildees lambda com foco na evoluccedilatildeo do software Dentre os trabalhosencontrados mencionados destacam-se

bull Em um trabalho sobre utilizaccedilatildeo de refatoraccedilatildeo de coacutedigo para realizar a transiccedilatildeode coacutedigo Java para as novas caracteriacutesticas implementadas no Java 8 Gyori et alapresenta uma ferramenta que automatiza com sucesso o trabalho de conversatildeo decoacutedigo como Annonymous Inner Class para expressotildees lambda [12] O capiacutetulo aseguir descreve em detalhes estes conceitos

11

bull Regrowing a Language de Overbey apresenta um estudo sobre a importacircncia da co-evoluccedilatildeo entre a linguagem de programaccedilatildeo e os projetos de software focando naslinguagens Fortran e Java e provando como ferramentas de refatoraccedilatildeo de coacutedigoauxiliam para que o software consiga evoluir juntamente com sua linguagem deprogramaccedilatildeo [9]

bull O trabalho sobre a adoccedilatildeo de generics em coacutedigo Java feito por Parnin utiliza demineraccedilatildeo de dados para realizar uma investigaccedilatildeo empiacuterica avaliando projetos decoacutedigo aberto com o objetivo de observar como desenvolvedores destes projetos estatildeoutilizando generics em Java [20]

Os estudos mencionados focam em assuntos particulares pertinentes a este trabalhoem que de um lado tem-se trabalhos que mostram a necessidade de refatoraccedilatildeo de coacutedigopara evoluccedilatildeo de software e do outro tem-se trabalhos que mostram que eacute possiacutevel utilizarde MSR para entender melhor como a evoluccedilatildeo da linguagem de programaccedilatildeo Java temafetado projetos reais de coacutedigo aberto e como estes projetos estatildeo se adaptando a estasevoluccedilotildees

12

Capiacutetulo 3

Java SE 8 e JDK 8

Este trabalho tem como objetivo caracterizar a adoccedilatildeo de expressotildees Lambda em siste-mas Java que podem ser considerados legados pois foram concebidos em um momentoanterior a introduccedilatildeo dessa nova caracteriacutestica na linguagem Java Com o intuito de faci-litar o entendimento do leitor sobre tais construccedilotildees esse capiacutetulo apresenta informaccedilotildeeshistoacutericas referentes agrave linguagem Java desde sua criaccedilatildeo ateacute a sua ascensatildeo como umadas linguagens de programaccedilatildeo mais populares Aleacutem disso seratildeo apresentadas as novascaracteriacutesticas presentes na versatildeo Java SE 8 com destaque nas expressotildees Lambda e deque forma vieram para auxiliar no desenvolvimento de sistemas

31 Histoacuterico

Java eacute uma linguagem de programaccedilatildeo orientada a objetos para propoacutesitos gerais [21] Alinguagem nasceu com o nome de Oak no ano de 1991 com o foco em televisotildees digitais acabo mas devido agrave complexidade e poder da linguagem logo expandiu-se para os outrosdomiacutenios principalmente a Internet [22] Posteriormente a linguagem recebeu o nome deGreentalk devido agrave marca Oak jaacute ser registrada por outra empresa e o principal projeto daequipe se chamar Green Por fim o nome Java foi o mais votado pela equipe da Sun emuma reuniatildeo para decidir o mais raacutepido possiacutevel um nome definitivo para a linguagem [23]

Em 1995 em sua primeira versatildeo puacuteblica 10 a linguagem Java jaacute comeccedilava a terum crescimento em sua popularidade como Web Applet nos navegadores mais popularesfornecendo seguranccedila e rapidez nas plataformas mais utilizadas [24] A cada nova versatildeopublicada novas funcionalidades e plataformas eram adicionadas e tornavam a linguagemmais difundida no meio computacional fazendo com que em 2006 a linguagem fosse divi-dida em Java EE (foco em rede e serviccedilos web) Java ME (foco em sistemas embarcados)e Java SE (foco em desktops e servidores) [25]

13

Apoacutes anos de evoluccedilatildeo e aprimoramento atraveacutes de diversas versotildees como visto naTabela 31 hoje o Java se tornou uma das linguagens de programaccedilatildeo mais utilizadas nomundo estando em aproximadamente 15 das linhas de coacutedigo disponiacuteveis pela inter-net [11] A quantidade de plataformas suportadas pela linguagem e com o advento dosistema operacional Android sendo rodado na maior parte dos smartphones do mundoaleacutem da simplicidade em codificar no paradigma orientado a objetos foram os fatoresrelevantes para que a linguagem se popularizasse no mundo digital [26]

Tabela 31 As versotildees anteriores de java e principais caracteriacutesticasVersatildeo Principais caracteriacutesticasJava 10 JVM e JDKJava 2 Event Listeners

Kestrel (Java 3) HotSpot JVMMerlin (Java 4) Diversas novas APIs como Assertion e expressotildees regularesTiger (Java 5) Generics

Mustang (Java 6) Web ServicesDolphin (Java 7) Suporte a linguagens dinamicas

32 Princiacutepios

Com o foco em alcanccedilar a Web e participar mais ativamente do mercado virtual e e-Commerce foram projetados princiacutepios que permitissem com que a linguagem pudessealcanccedilar seus objetivos principais ao mesmo tempo que mantinha a facilidade e fami-liarizaccedilatildeo da linguagem a seus desenvolvedores [27] Dessa forma a equipe da Oracledeterminou cinco princiacutepios que caracterizariam o foco da linguagem Java

bull simples orientada a objeto e familiar projetada para ser orientada a objeto epermitir que seus desenvolvedores comecem a codificar rapidamente sem a necessi-dade de uma curva de aprendizagem acentuada

bull segura e robusta projetada para prover software confiaacutevel por meio de checagensa tempo de compilaccedilatildeo e execuccedilatildeo Haacute uma grande preocupaccedilatildeo com seguranccediladevido agrave larga utilizaccedilatildeo da linguagem em sistemas distribuiacutedos

bull de arquitetura neutra e portaacutevel projetada para ser independente de qualquerarquitetura bastando rodar a JVM dessa forma garantindo a portabilidade paravaacuterios ambientes e dispositivos

14

bull executada em alta performance projetada para fornecer a maior performancepossiacutevel em tempo de execuccedilatildeo com a utilizaccedilatildeo do garbage collector em uma threadde baixa prioridade

bull interpretada dinacircmica e threaded projetada para ser interpretada por qual-quer dispositivo que possua JVM desenvolvida garantindo um desenvolvimento raacute-pido e em ciclos O uso da classe Thread permite que a linguagem acompanhe atendecircncia do paralelismo Aleacutem disso a ligaccedilatildeo de classes eacute feita em tempo real esomente quando necessaacuteria tornando-a dinacircmica

33 Evoluccedilatildeo

A primeira versatildeo do Java 8 foi lanccedilada em 2014 [28] e apresentou diversas atualizaccedilotildeesespalhadas em categorias como linguagem seguranccedila Collections ferramentas deployentre outras Dentre a grande quantidade de mudanccedilas os destaques se encontraram nasnovas melhorias presentes na linguagem que afetaram de forma mais direta a maneiracom que os desenvolvedores passaram a tratar e organizar o coacutedigo fonte As atualizaccedilotildeesreferentes a linguagem descritas oficialmente pela Oracle [29] satildeo

1 Lambda Expressions ou apenas Expressotildees Lambda correspondem a uma novacaracteriacutestica que permite que uma pequena funcionalidade possa ser utilizada comoum argumento de um meacutetodo facilitando a escrita de accedilotildees que seratildeo feitas repetida-mente em uma Collection ou quando um processo se completa ou quando encontraum erro Eacute tambeacutem uma forma compacta de se escrever coacutedigo que previamenteera escrito com anonymous inner classes [29] A Listagem 31 mostra uma classehipoteacutetica Calculator cujo meacutetodo operateBinary() recebe como paracircmetro doisinteiros e um objeto da classe IntegerMath que representa a operaccedilatildeo que deveraacuteser realizada ou seja uma funcionalidade dinacircmica

1 pub l i c c l a s s Ca l cu la to r 2

3 i n t e r f a c e IntegerMath 4 i n t opera t i on ( i n t a i n t b) 5 6

7 pub l i c i n t operateBinary ( i n t a i n t b IntegerMath op ) 8 re turn op opera t i on (a b) 9

10

11 pub l i c s t a t i c void main ( St r ing a rgs ) 12

15

13 Calcu la to r myApp = new Ca lcu la to r ( ) 14 IntegerMath add i t i on = (a b) minusgt a + b 15 IntegerMath subt ra c t i on = (a b) minusgt a minus b 16 System out p r i n t l n ( 40 + 2 = +17 myApp operateBinary (40 2 add i t i on ) ) 18 System out p r i n t l n ( 20 minus 10 = +19 myApp operateBinary (20 10 sub t ra c t i on ) ) 20 21 22

Listagem 31 Exemplo de coacutedigo com o uso de Expressatildeo Lambda [30]

2 Method References Frequentemente expressotildees lambda criam meacutetodos anocircni-mos Algumas vezes poreacutem satildeo utilizadas para chamar um meacutetodo jaacute existentena classe Ao inveacutes de escrever a expressatildeo Lambda para esse caso pode-se optarpor utilizar um Method Reference que facilita a escrita e leitura desse uso de ex-pressatildeo Lambda [29] A Listagem 32 mostra um exemplo de um meacutetodo estaacuteticoque compara duas pessoas pelas suas idades e a Listagem 33 a utilizaccedilatildeo de MethodReference para aplicar a utilizaccedilatildeo desse meacutetodo em um array e reduzir a escrita deuma expressatildeo lambda a uma forma mais legiacutevel

1 pub l i c s t a t i c i n t compareByAge ( Person a Person b) 2 re turn a b i r thday compareTo (b b i r thday ) 3 4

Listagem 32 Exemplo de meacutetodo de uma classe Pessoa [31]

1 Arrays s o r t ( rosterAsArray Person compareByAge ) 2

Listagem 33 Exemplo de uso de Method Reference [31]

3 Default Methods satildeo meacutetodos com a palavra-chave default que servem para adi-cionar implementaccedilotildees de meacutetodos a uma interface de alguma biblioteca mantendoa compatibilidade binaacuteria com versotildees mais antigas dessa interface Tambeacutem pos-sibilita a implementaccedilatildeo de meacutetodos estaacuteticos em interfaces [29] A Listagem 34apresenta a inclusatildeo de um meacutetodo default na interface TimeClient

1 pub l i c i n t e r f a c e TimeClient 2 void setTime ( i n t hour i n t minute i n t second ) 3 void setDate ( i n t day i n t month i n t year ) 4 void setDateAndTime ( i n t day i n t month i n t year 5 i n t hour i n t minute i n t second )

16

6 LocalDateTime getLocalDateTime ( ) 7

8 s t a t i c ZoneId getZoneId ( S t r ing zoneStr ing ) 9 t ry

10 re turn ZoneId o f ( zoneStr ing ) 11 catch ( DateTimeException e ) 12 System e r r p r i n t l n ( I n v a l i d time zone + zoneStr ing

+13 us ing d e f a u l t time zone in s t ead ) 14 re turn ZoneId systemDefault ( ) 15 16 17

18 d e f a u l t ZonedDateTime getZonedDateTime ( St r ing zoneStr ing ) 19 re turn ZonedDateTime o f ( getLocalDateTime ( ) getZoneId (

zoneStr ing ) ) 20 21 22

Listagem 34 Exemplo de interface com um meacutetodo default [32]

4 Repeating Annotations permitem a implementaccedilatildeo e utilizaccedilatildeo de anotaccedilotildees deum mesmo tipo que podem ser utilizadas mais de uma vez para a mesma declara-ccedilatildeo [29] A Listagem 35 apresenta duas anotaccedilotildees iguais com paracircmetros diferentespermitindo uma customizaccedilatildeo maior na aplicaccedilatildeo de um tipo de anotaccedilatildeo

1 Schedule ( dayOfMonth= l a s t )2 Schedule (dayOfWeek= Fr i hour= 23 )3 pub l i c void doPeriodicCleanup ( ) 4

Listagem 35 Exemplo de Repeating Annotations [33]

5 Type Annotations permitem que anotaccedilotildees possam ser utilizadas em tipos aleacutemde declaraccedilotildees dessa forma pode-se garantir que um campo sempre atenda agraves suasexpectativas e evite testes desnecessaacuterios [29] A Listagem 36 mostra um exemplo derestriccedilatildeo a uma String que nunca poderaacute ser nula devido agrave anotaccedilatildeo de NonNull

1 NonNull S t r ing s t r

Listagem 36 Exemplo de Type Annotation garantindo que o campo nunca seja null [34]

17

34 Expressotildees Lambda

Uma das mudanccedilas mais interessantes implementadas no Java 8 foi a adiccedilatildeo de expressotildeeslambda As expressotildees lambda permitem que a linguagem Java possa atuar parcialmentecomo uma linguagem de programaccedilatildeo funcional onde comportamentos satildeo avaliados eaplicados diferentemente da programaccedilatildeo imperativa que foca na mudanccedila de estadosNa praacutetica um comportamento pode ser passado como paracircmetro de um meacutetodo atraveacutesde uma escrita mais reduzida e legiacutevel Os benefiacutecios de utilizar expressotildees lambda incluemuma melhora na legibilidade e organizaccedilatildeo de coacutedigo que antes era escrito com AnonymousInner Class aleacutem de permitir uma forma simples de utilizar comportamento paralelo como uso de Streams

341 Sintaxe

A sintaxe de uma expressatildeo lambda eacute dividida nas seguintes partes [30]

bull Uma lista de paracircmetros separados por viacutergulas

bull Um token representado por uma seta -gt

bull Um corpo que pode ser representado por uma expressatildeo uacutenica ou um bloco de coacutedigodentro de chaves

As Listagens 37 e 38 mostram duas formas diferentes de se aplicar expressotildees Lambdacom uma sintaxe similar A primeira aplica a expressatildeo diretamente apoacutes a seta utilizadanormalmente para trechos de coacutedigo pequenos e simples e a segunda utiliza-se de chavespara incorporar o coacutedigo e da palavra-chave return para especificar o retorno forma maisutilizada para uma quantidade maior de coacutedigo

1 p minusgt p getGender ( ) == Person Sex MALE2 ampamp p getAge ( ) gt= 183 ampamp p getAge ( ) lt= 25

Listagem 37 Exemplo de expressatildeo lambda com uma expressatildeo [30]

1 p minusgt 2 re turn p getGender ( ) == Person Sex MALE3 ampamp p getAge ( ) gt= 184 ampamp p getAge ( ) lt= 25 5

Listagem 38 Exemplo de expressatildeo lambda com um bloco de coacutedigo [30]

18

342 Principais formas de uso

Anonymous Inner Class

Antes do Java 8 a necessidade de passar funccedilotildees ou expressotildees como paracircmetro de algummeacutetodo era suprida atraveacutes de Anonymous Inner Classes A utilizaccedilatildeo desse tipo dedeclaraccedilatildeo junto com a anotaccedilatildeo de Override permite sobrescrever um meacutetodo de umainterface funcional e ao mesmo tempo passa-la como argumento para um meacutetodo Umaexpressatildeo lambda se comporta da mesma forma poreacutem a quantidade de coacutedigo escritopela Anonymous Inner Class eacute maior e pode dificultar a leitura de coacutedigo pois conteacutemmuita informaccedilatildeo natildeo utilizada para efetivo entendimento do que estaacute sendo feito naqueletrecho

A Listagem 39 apresenta a instanciaccedilatildeo da classe EventHandler internamente ao meacute-todo setOnAction() de forma que o desenvolvedor possa escrever o comportamento quedeseja passar como paracircmetro do meacutetodo atraveacutes da substituiccedilatildeo do meacutetodo handle()que jaacute existe pelo meacutetodo handle() criado e escrito pelo desenvolvedor

1 btn setOnAction (new EventHandlerltActionEvent gt() 2 Override3 pub l i c void handle ( ActionEvent event ) 4 System out p r i n t l n ( He l lo World ) 5 6 )

Listagem 39 Exemplo de uso de Anonymous Inner Class [35]

Interface funcional

Ao projetar um coacutedigo novo o desenvolvedor que optar por utilizar expressotildees lambdadeve iniciar com a criaccedilatildeo de uma interface funcional Esse tipo de interface possui umuacutenico meacutetodo abstrato permitindo que expressotildees lambda sejam usadas para sobrescrevero comportamento do meacutetodo abstrato Uma interface funcional pode possuir outros meacuteto-dos desde que sejam default Uma nova anotaccedilatildeo FunctionalInterface foi adicionadacom a atualizaccedilatildeo do Java 8 para conferir em tempo de compilaccedilatildeo se a interface satisfazos requisitos desse modelo de interface

A Listagem 310 apresenta um exemplo de interface funcional com o objetivo de permi-tir o uso de expressotildees lambda que utilizaratildeo de dois Double como paracircmetro e jaacute utilizada nova anotaccedilatildeo FunctionalInterface introduzida no Java 8

1 Funct iona l Inte r face2 pub l i c i n t e r f a c e DoubleOp 3 pub l i c Double apply ( Double a Double b)

19

4

Listagem 310 Exemplo de interface funcional

Dessa forma conforme as Listagens 311 e 312 o meacutetodo apply() pode tomar formade qualquer operaccedilatildeo entre dois Double que seraacute especificada quando a expressatildeo lambdafor montada dando o aspecto de linguagem funcional agrave linguagem e mais facilidade eliberdade ao desenvolvedor

1 pub l i c c l a s s Ca l cu la to r 2 pub l i c s t a t i c Double c a l c ( Double op1 Double op2 DoubleOp operator ) 3 re turn operator apply ( op1 op2 ) 4 5

Listagem 311 Exemplo de aplicaccedilatildeo da interface funcional

1 Double r e s u l t 1 = Ca lcu la to r c a l c (10d 50d ( a b ) minusgt a + b)

Listagem 312 Uso de expressatildeo lambda para o exemplo anterior

Collections

Dentre as atualizaccedilotildees de pacotes do Java 8 foi adicionado um meacutetodo stream() nainterface Collection Esse meacutetodo trata as Collection como streams o que significa queapesar de natildeo ser possiacutevel acessar elementos diretamente algumas novas manipulaccedilotildeessatildeo possiacuteveis Essas manipulaccedilotildees satildeo na verdade meacutetodos da interface Stream quepodem receber como paracircmetro uma expressatildeo lambda ou seja um comportamento a seraplicado agrave Collection Dentre os meacutetodos temos

bull filter() O meacutetodo filter() recebe uma expressatildeo lambda contendo uma condiccedilatildeopara filtragem da collection

bull map() O meacutetodo map() mapeia os elementos de uma Collection em outro objetocomo uma String A expressatildeo lambda passada por paracircmetro deve retornar o tipode objeto ao qual seraacute mapeado

bull forEach() O meacutetodo forEach() aplica uma operaccedilatildeo especiacutefica para cada ele-mento da Collection A expressatildeo lambda a ser passada deve conter a operaccedilatildeo aser realizada

bull min() e max() Os meacutetodos min() e max() retornam o elemento menor ou maiorda Collection dependendo da expressatildeo lambda passada como paracircmetro

20

A Listagem 313 demonstra como vaacuterias operaccedilotildees com uma Collection podem seraplicadas de uma vez de forma que lendo a expressatildeo lambda jaacute eacute possiacutevel saber oresultado da aplicaccedilatildeo do meacutetodo agrave Collection

1 r o s t e r2 stream ( )3 f i l t e r (4 p minusgt p getGender ( ) == Person Sex MALE5 ampamp p getAge ( ) gt= 186 ampamp p getAge ( ) lt= 25)7 map(p minusgt p getEmailAddress ( ) )8 forEach ( emai l minusgt System out p r i n t l n ( emai l ) )

Listagem 313 Exemplo de utilizaccedilatildeo de meacutetodos de stream com expressotildees lambda [30]

21

Capiacutetulo 4

Estudo e o Processo de Mineraccedilatildeo

A definiccedilatildeo da metodologia utilizada para realizaccedilatildeo deste trabalho eacute importante para queexista uma padronizaccedilatildeo e melhor entendimento de como os resultados foram obtidos paraque a replicaccedilatildeo do mesmo possa ser realizada em trabalhos futuros [36]

Figura 41 Processo utilizado para realizaccedilatildeo do estudo

O esquema representado na Figura 41 descreve o processo seguido para a realizaccedilatildeodeste trabalho que foi divido em trecircs grandes etapas a de planejamento definindo osobjetivos questotildees de pesquisa e meios de investigaccedilatildeo deste projeto a etapa de execuccedilatildeorealizando todo o procedimento metodoloacutegico definido para a coleta e refinamento de

22

dados e a etapa de avaliaccedilatildeo onde foram classificados e avaliados os dados coletadospara responder agraves questotildees de pesquisa

A seguir na primeira seccedilatildeo seratildeo apresentadas em detalhes as questotildees de pesquisa aserem respondidas Em seguida seraacute feito uma breve descriccedilatildeo da fonte de dados utilizada- especificamente os projetos utilizados como objetos de estudo deste trabalho e por fimtodo o restante da metodologia que foi de fato desenvolvida para obter os resultadosnecessaacuterios

41 Questotildees de Pesquisa

Com o objetivo de entender e caracterizar melhor o uso de expressotildees lambda foramdefinidas as seguintes questotildees de pesquisa a serem respondidas

bull PQ-1 Quando os projetos comeccedilaram a introduzir o uso de expressotildees lambda emseus coacutedigos e qual a meacutedia de expressotildees lambda por snapshots caso existam

bull PQ-2 Como as equipes de desenvolvimento estatildeo utilizando expressotildees lambdaatraveacutes de refatoraccedilatildeo de coacutedigo ou introduzindo apenas em coacutedigo novo

bull PQ-3 Quais satildeo os padrotildees tipicamente adotados para o uso de expressotildees lambda

A primeira pergunta de pesquisa gira em torno de como projetos populares open-sourceestatildeo se adaptando agrave introduccedilatildeo de expressotildees lambda em Java muitos projetos jaacute estatildeoutilizando as expressotildees lambda Se sim a partir de quando comeccedilaram a utilizaacute-lasdesde o iniacutecio da introduccedilatildeo das mesmas no Java 8 ou em um periacuteodo mais tardio Aleacutemdisso eacute interessante descobrir se a utilizaccedilatildeo dessa nova caracteriacutestica tem acontecido deforma expressiva ou natildeo

Em seguida para melhor entender a forma como as expressotildees lambda estatildeo sendointroduzidas em projetos eacute interessante investigar se as equipes de desenvolvimento estatildeose preocupando em refatorar coacutedigo com o objetivo de evoluir o software ou se estatildeoexperimentando utilizar expressotildees lambda apenas em coacutedigo novo introduzido

Como a introduccedilatildeo de novas funcionalidades em projetos open-source de grande escaladepende do objetivo do projeto e os padrotildees de projeto utilizados [37] espera-se obser-var diversas abordagens quanto a utilizaccedilatildeo de expressotildees lambda para entatildeo poderclassificar estes softwares quanto a abordagem utilizada

Eacute de grande importacircncia para este estudo conseguir identificar na praacutetica comoexpressotildees lambda estatildeo sendo tipicamente adotadas nestes projetos Assim a terceirapergunta de pesquisa busca identificar alguns exemplos de utilizaccedilatildeo atraveacutes da realizaccedilatildeode alguns estudos de caso

23

Eacute importante ressaltar que apesar de as expressotildees lambda serem uma alternativa aouso de AIC elas natildeo os substituem completamente Existem precondiccedilotildees para que umaAIC possa ser substituiacuteda por expressotildees lambda [12] descritas a seguir

bull AIC deve instanciar-se de uma interface

bull AIC natildeo deve possuir nenhum campo e declarar apenas um meacutetodo

bull AIC natildeo deve possuir uma referecircncia para this ou super

bull AIC natildeo deve declarar um meacutetodo recursivo

Para responder agrave primeira pergunta apenas dados gerais sobre todos os projetos seratildeonecessaacuterios ao passo que pelas perguntas 2 e 3 possuiacuterem uma natureza mais complexaseraacute necessaacuterio aleacutem de uma anaacutelise geral estatiacutestica a realizaccedilatildeo de alguns estudos decaso para obter resultados mais completos

42 Fonte de Dados e Objetos de Estudo

Para responder agraves perguntas de pesquisa estabelecidas foram selecionados os 99 projetosmais populares na linguagem Java dentro da plataforma github ateacute a data da coleta dosdados feita em Abril de 2017 Satildeo considerados populares os repositoacuterios que possuema maior quantidade possiacutevel de estrelas (stars) A decisatildeo de escolher os 99 projetos maispopulares foi por sua natureza imparcial e ao mesmo tempo para que se possa analisarprojetos que satildeo de familiaridade e conhecimento da comunidade do github e de domiacuteniopuacuteblico Os 99 projetos estatildeo listados no Anexo I

Para entender a transiccedilatildeo feita por esses projetos entre as versotildees anteriores do Java eo Java 8 com as expressotildees lambda eacute necessaacuterio analisar o coacutedigo de vaacuterias versotildees a fimde observar alguma mudanccedila para cada projeto Como satildeo 99 projetos e vaacuterios dessesprojetos possuem milhares de linhas de coacutedigo e commits seria impossiacutevel avaliar todosos commits Optou-se entatildeo por coletar snapshots mensais de cada projeto conformeprocedimento tambeacutem seguido anteriormente [38] Cada snapshots representa o estadodo projeto em um determinado mecircs e como criteacuterio de escolha padratildeo todos os snapshotsequivalem ao uacuteltimo commit realizado no determinado mecircs que este representa

O proacuteximo passo eacute determinar o periacuteodo de tempo em que esses snapshots seriamcoletados Como Java 8 (e consequentemente as expressotildees lambda) foi introduzidoapenas em meados de 2014 [28] coletar dados de projetos a partir de um periacuteodo muitoantes deste ano natildeo agregaria valor ao estudo em questatildeo Definiu-se entatildeo um periacuteodopara a coleta mensal desses snapshots atraveacutes dos anos Janeiro de 2013 um ano antesda introduccedilatildeo do Java 8 para que se pudesse identificar para todos os projetos o mecircs

24

exato em que expressotildees lambda foram introduzidas ateacute o mecircs da coleta de dados Abrilde 2017

Eacute importante ressaltar que a definiccedilatildeo dos meses foi definida do dia primeiro de ummecircs ao dia primeiro do proacuteximo mecircs e por consequecircncia alguns snapshots que deveriamrepresentar o final de determinado mecircs correspondem na verdade a commits realizadosno dia primeiro do mecircs seguinte Por exemplo pode existir casos em que o commit querepresente o mecircs de Marccedilo de 2016 seja na verdade o commit realizado no dia primeirode Abril de 2016 Isso se deve a natureza da forma como os resultados de log de commitssatildeo obtidos pelo git [39] Poreacutem isso natildeo interfere nas anaacutelises ou no propoacutesito destetrabalho uma vez que foram realizadas verificaccedilotildees e validaccedilotildees para que natildeo existamdatas repetidas (e consequentemente commits repetidos) por repositoacuterio

Neste trabalho o termo projeto e repositoacuterio foram utilizados de forma intercaladapara representar a mesma coisa o software desenvolvido que possui um repositoacuterio naplataforma github Os termos commit snapshops e versotildees tambeacutem representam a mesmacoisa uma vez que foi definido que seriam utilizados apenas um commit por mecircs pararepresentar um determinado snapshot ou versatildeo do repositoacuterio em questatildeo

Todos os 99 projetos seratildeo utilizados para a realizaccedilatildeo de uma anaacutelise geral de ca-racterizaccedilatildeo do uso de expressotildees lambda Para as anaacutelises aprofundadas foi feito umcriteacuterio de classificaccedilatildeo para que apenas alguns projetos possam ser analisados em niacutevelde coacutedigo como estudos de caso

Resumindo foram escolhidos os 99 projetos mais populares de Java no github cole-tando dados mensais de seus commits a partir do ano de 2013 ateacute a data da coleta dosdados lembrando que nem todos os projetos existem desde 2013 (projetos mais recentes)

43 Processo de Mineraccedilatildeo

A abordagem utilizada para coletar e analisar os 99 projetos escolhidos como mostra aFigura 42 foi realizada de forma automatizada utilizando scripts python e dois projetosdesenvolvidos em Java para a coleta e tratamento de dados como descrito a seguir

Primeiramente foi realizado uma coacutepia dos repositoacuterios atuais de todos os 99 projetosmais populares do github em Java Para automatizar o processo foi desenvolvido umscript em python que lista todos os projetos escolhidos clona todos os repositoacuterios emuma pasta na maacutequina local e cria um arquivo temporaacuterio com as informaccedilotildees do nomede cada repositoacuterio e seu caminho absoluto na maacutequina local

25

Figura 42 Metodologia implementada para coleta e tratamento de dados

Em seguida foi necessaacuterio realizar o checkout de todas as versotildees entre Janeiro de2013 a Abril de 2017 de cada projeto Por motivos de otimizaccedilatildeo de espaccedilo da maacutequinalocal e automatizaccedilatildeo no processo de checkout utilizou-se de um segundo script pythonque realizava as seguintes tarefas para cada mecircs em cada projeto verificar se dentreo mecircs estipulado houve algum commit para aquele projeto se sim pega-se o hash douacuteltimo commit do mecircs realiza o checkout conta-se a quantidade de linhas de coacutedigo emJava que o projeto tem utilizando a biblioteca cloc e armazena todas as informaccedilotildeespertinentes referentes a todos os projetos que naquele mecircs tiveram commits para que oprojeto static-analysis possa entatildeo ser executado sobre esses projetos naquele determinadomomento As informaccedilotildees coletadas que satildeo utilizadas pelo static-analysis correspondemao nome do projeto o hash do commit para aquela versatildeo a pasta onde o projeto estaacutearmazenado na maacutequina local a quantidade de linhas de coacutedigo Java do projeto e datareferente ao commit Essas informaccedilotildees satildeo pertinentes para que o projeto static-analysisconsiga funcionar de forma correta projeto este descrito em detalhes a seguir

431 static-analysis

O static-analysis foi um projeto desenvolvido anteriormente a este trabalho pelos alunosThiago Cavalcanti e Vinicius de Almeida cujo objetivo eacute realizar a anaacutelise estaacutetica de

26

coacutedigos-fonte Java e gerar arquivos de saiacuteda contendo informaccedilotildees de classes e meacutetodoscom suas devidas ocorrecircncias de caracteriacutesticas da linguagem [40]

A anaacutelise estaacutetica de coacutedigo consiste em analisar um coacutedigo-fonte sem a necessidadede executaacute-lo Esse tipo de anaacutelise eacute de extrema importacircncia para manter um coacutedigo dequalidade evitar futuras refatoraccedilotildees e obter informaccedilotildees estatiacutesticas de forma raacutepida epraacutetica [41]

Seguindo esse princiacutepio o static-analysis foi projetado para receber um arquivo deentrada csv seguindo o padratildeo

Tipo da Aplicaccedilatildeo Inicio do projeto Antes ou Apoacutes Java 5 Nome do ProjetoVersatildeo Caminho absolutoQuantidade de linhas de coacutedigo

Atraveacutes da informaccedilatildeo do caminho absoluto do projeto o static-analysis varre osdiretoacuterios em busca dos arquivos fonte java realiza o parse desses arquivos e utilizade Visitors para extrair as informaccedilotildees desejadas e exporta-las em arquivos csv Ouso de Visitors permite que sejam escolhidas as informaccedilotildees desejadas para a consultacomo expressotildees Lambda e AIC s aleacutem de possibilitar que sejam implementados novosVisitors conforme a linguagem evolua ou as necessidades mudem

Para este trabalho foram utilizados os Visitors de expressotildees Lambda map() filter()AICs e declaraccedilotildees de meacutetodos

432 BDAnalisador

Apoacutes obter todas as informaccedilotildees necessaacuterias geradas pelo static-analysis era preciso ma-nipular os dados de forma que facilitasse a coleta de dados para o estudo proposto Comovaacuterios arquivos em formato csv satildeo de difiacutecil manipulaccedilatildeo foi desenvolvido entatildeo umaferramenta chamada BDAnalisador Esta ferramenta eacute responsaacutevel por processar os arqui-vos em csv gerados pelo static-analysis e popular uma base de dados relacional MySQLcom as informaccedilotildees pertinentes a este estudo

O BDAnalisador foi desenvolvido com a intenccedilatildeo de tornar mais simples o trabalhocom os dados resultantes do static-analysis de forma que consultas em SQL pudessemser feitas a ponto de permitir a obtenccedilatildeo de resultados mais complexos Seguindo esseobjetivo o framework Hibernate foi escolhido como ferramenta para persistecircncia devidoa ser um framework jaacute consolidado no mercado e que de forma simples relaciona osobjetos Java ao banco de dados MySQL [42] A divisatildeo de classes foi projetada em quatroentidades Projeto Versao Classe e Metodo cada uma com seus respectivos camposcontendo as informaccedilotildees necessaacuterias para a pesquisa como pode ser visto na Figura 44Eacute importante ressaltar que a tabela de Versao guarda hashs de commits devido agrave escolhade utilizar commits para obter mais informaccedilatildeo de evoluccedilatildeo de coacutedigo em um menor

27

espaccedilo de tempo Aleacutem disso para este trabalho optou-se por persistir todos os meacutetodose classes de cada versatildeo sem se importar com a repeticcedilatildeo desses dados pois a hipoacutetesede haver grandes refatoraccedilotildees entre versotildees poderia comprometer a confiabilidade dasinformaccedilotildees

Figura 43 Diagrama de classes UML do BDAnalisador

Como visto na Figura 43 seguindo parcialmente a arquitetura MVC cada entidadepossui sua respectiva classe DAO(Data Access Object) para persistecircncia dos dados eapenas uma classe Controlador no projeto responsaacutevel pela manipulaccedilatildeo e parse dosdados dos arquivos csv gerados pelo static analysis para serem enviados agraves classes DAOO sistema inicia chamando o meacutetodo inicializar() da classe Controlador Esse meacutetodoeacute responsaacutevel por ler um arquivo de entrada csv que segue o mesmo modelo do arquivo dostatic-analysis citado na seccedilatildeo anterior O arquivo conteacutem os dados de todos os projetose suas respectivas versotildees dessa forma o meacutetodo instancia um objeto da classe Projetoe persiste o projeto no banco de dados Para cada versatildeo encontrada no arquivo deentrada o inicializar() aciona os meacutetodos responsaacuteveis por instanciar e preencher aslistas da classe Classe e Metodo Os meacutetodos responsaacuteveis por preencher as listas varremos arquivos csv gerados pelo static-analysis e fazem o parse das informaccedilotildees relevantescomo nomes dos meacutetodos e quantidades de lambdas para construir os objetos que seratildeogravados Ao final dos preenchimentos o objeto Versatildeo eacute instanciado e gravado no bancode dados atraveacutes de sua classe DAO ao mesmo tempo que grava suas respectivas Classese Metodos

28

Apoacutes vaacuterios testes e correccedilotildees de bugs o banco de dados se encontrava finalmente comas informaccedilotildees de 99 projetos Java open-source separados por um commit por mecircs desde2013 cada um com suas respectivas informaccedilotildees de classes meacutetodos e a quantidade deexpressotildees lambda filters e maps em cada meacutetodo Filter ou Filter pattern eacute o padratildeode projeto que tem como objetivo filtrar objetos de uma coleccedilatildeo (Collection) de acordocom algum criteacuterio Jaacute o map ou map pattern eacute um padratildeo que ldquomapeia os elementosde uma coleccedilatildeo aplicando uma funccedilatildeo a eles para uma nova coleccedilatildeo [43] A coleta deinformaccedilotildees sobre esses padrotildees podem ser uacuteteis para possiacuteveis anaacutelises de oportunidadesde uso de expressotildees lambda para refatoraccedilatildeo de coacutedigo

A Figura 44 mostra o esquema de como o banco de dados resultante foi gerado

Figura 44 Modelo relacional do banco de dados populado pelo BDAnalisador Imagemgerada com software DBeaver [2]

44 Classificaccedilatildeo e Anaacutelise

Com o banco de dados populado restam apenas as etapas de classificaccedilatildeo e anaacutelise pararesponder as questotildees de pesquisa propostas Para isso inicialmente houve uma tentativade se utilizar apenas queries SQL para analisar os dados de acordo com as informaccedilotildeesrelevantes Poreacutem devido ao fato de o banco de dados conter todas as informaccedilotildees detodos os projetos e todas as suas versotildees queries que possuem uma alta complexidadedemoravam muito tempo para retornar os dados

Assim com o objetivo de facilitar o trabalho alguns scripts python foram desenvolvi-dos para rodar as queries separadamente e individualmente para cada projeto de formaautomatizada a fim de melhorar o tempo de resposta para obtenccedilatildeo dos resultados

29

441 Meacutedia de Lambda

O primeiro script retorna a quantidade de expressotildees lambda (ou AICs) por n snapshotsque contenha expressotildees lambda O objetivo eacute ter uma visatildeo geral da meacutedia de expressotildeeslambda e AICs utilizadas por cada projeto e como nem todos os snapshots coletados decada projeto possuem expressotildees lambda e AICs apenas aqueles com alguma expressatildeolambda ou AIC satildeo incluiacutedos no caacutelculo da meacutedia

Mmedia =sumn qtdLambdai

n

442 Anaacutelise Temporal

O segundo script retorna para cada projeto a soma total da quantidade de expressotildeeslambda AIC map() e filter() no projeto inteiro para cada versatildeo Ou seja tem-seo total de cada uma das quatro propriedades selecionadas para cada mecircs do projetoobtendo assim uma visatildeo temporal de evoluccedilatildeo do uso das caracteriacutesticas descritas ATabela 41 ilustra parcialmente o resultado obtido para o projeto agera onde idVersaoeacute o identificador no banco de dados referente ao hash do commit mensal coletado qtd eacutea quantidade de cada uma das caracteriacutesticas escolhidas e a data do commit encontra-seno formato americano

Tabela 41 Informaccedilotildees mensais sobre o projeto ageraidVersao Data do Commit qtd lambda qtd AIC qtd maps qtd filter

823 512016 0 29 4 0755 612016 13 28 4 0686 6152016 13 29 4 0621 812016 13 29 4 0555 8162016 13 30 4 0485 922016 13 30 4 0422 10132016 14 30 4 0356 11282016 14 30 4 0295 12212016 21 30 5 0232 212017 21 30 5 0175 312017 21 30 5 0112 3312017 21 36 5 048 4242017 21 48 5 0

Os resultados obtidos com esta anaacutelise temporal permitiu a identificaccedilatildeo de padrotildees nautilizaccedilatildeo de expressotildees lambda em relaccedilatildeo a utilizaccedilatildeo de AIC por todos os projetos Foi

30

possiacutevel classificar todos os projetos em 6 grupos ilustrado na Figura 45 Primeiramenteseparou-se os projetos entre os que possuem expressotildees lambda e os que natildeo possuemDentre os que possuem identificou-se cinco categorias

1 Grupo 1 Quantidade de AICs e expressotildees lambda aumentam com o tempo pro-porcionalmente

2 Grupo 2 Quantidade de AICs diminui agrave medida que a quantidade de expressotildeeslambda aumentam e a quantidade de expressotildees lambda ultrapassa a quantidade deAIC em um determinado momento

3 Grupo 3 Quantidade de AICs diminui agrave medida que a quantidade de expressotildeeslambda aumentam mas a quantidade de AIC permanece superior agrave quantidade delambda

4 Grupo 4 Expressotildees lambda satildeo introduzidas e existem por um pequeno periacuteodode tempo mas satildeo completamente removidas posteriormente

5 Grupo 5 Quantidade de expressotildees lambda eacute constante e muito inferior compa-rado com a quantidade de AICs no projeto Foi determinado que para pertencera esta classificaccedilatildeo o projeto precisa ter uma razatildeo de meacutedia de expressotildees lamb-dasnapshot por meacutedia de AICsnapshot inferior a 020 Esse paracircmetro foi esta-belecido com o objetivo de definir um padratildeo para o que pode ser considerado umprojeto com poucas expressotildees lambda

Figura 45 Classificaccedilatildeo dos projetos

31

443 Refatoraccedilatildeo de Coacutedigo

O uacuteltimo script teve como objetivo realizar uma tentativa inicial de identificar refatoraccedilatildeode coacutedigo da seguinte maneira para todos os projetos que possuem expressotildees lambdaforam identificados o mecircs imediatamente antes da introduccedilatildeo de expressotildees lambda e omecircs seguinte onde houve a primeira ocorrecircncia de lambda no projeto Assim realizou-se uma anaacutelise do tamanho em quantidade de linhas de coacutedigo de todos os meacutetodosdo projeto que no mecircs seguinte tiveram introduccedilatildeo de lambda Em seguida fez-se umacomparaccedilatildeo com os mesmos meacutetodos em relaccedilatildeo ao mecircs anterior e assim foi possiacuteveldetectar quais meacutetodos tiveram a quantidade de linhas de coacutedigo reduzidas o que seriaum indicativo natildeo necessariamente exclusivo de que uma refatoraccedilatildeo de coacutedigo possa terocorrido

Sabe-se que este meacutetodo de detecccedilatildeo de refatoraccedilatildeo de coacutedigo possui suas limitaccedilotildeesuma vez que as comparaccedilotildees para saber se um meacutetodo existe em ambas versotildees eacute feitopuramente por comparaccedilatildeo de String (nome do meacutetodo) e a classe que este pertence

444 Casos de Uso

Os meacutetodos descritos acima ajudaram a identificar alguns padrotildees e facilitar a anaacutelise dosdados Poreacutem natildeo satildeo suficientes para que se possa responder agraves questotildees de pesquisaDessa forma apoacutes a identificaccedilatildeo dos grupos de classificaccedilatildeo para os projetos foramescolhidos um projeto de cada grupo (com exceccedilatildeo do grupo dos projetos sem expressotildeeslambda) para realizar um breve estudo de caso com o objetivo de identificar e caracterizarmelhor a adoccedilatildeo de expressotildees lambda Os projetos escolhidos foram agera vertxAndroid-CleanArchitecture RxJava e guava

32

Capiacutetulo 5

Resultados Obtidos e Anaacutelise

Neste capiacutetulo seratildeo apresentados os dados obtidos e anaacutelise com o objetivo de responderagraves questotildees de pesquisa propostas Como mencionado anteriormente as perguntas seratildeorespondidas de duas maneiras algumas com informaccedilotildees gerais sobre todos os projetose outras com breve estudos de caso envolvendo cinco projetos

51 Visatildeo Geral

Dentre os repositoacuterios coletados para a anaacutelise 74 (7474) natildeo utilizaram nenhumaexpressatildeo lambda no projeto durante todo o periacuteodo analisado (Janeiro de 2013 a Abrilde 2017) restando apenas 25 repositoacuterios (2525) com expressotildees lambda Eacute interessantedestacar que apesar de a quantidade de repositoacuterios que natildeo possuem expressotildees lambdaser relativamente expressiva muitos destes repositoacuterios satildeo de projetos em Java que umdia foram populares e atualmente natildeo estatildeo sendo mais desenvolvidos (por exemplo umaplicativo que soacute funciona para Android 23 atualmente descontinuado)

Levando em consideraccedilatildeo apenas os projetos que possuem expressotildees lambda exis-tem dois tipos de dados que podem ser analisados para responder agrave primeira questatildeo depesquisa atraveacutes dos dados obtidos pelo meacutetodo anteriormente mencionado como anaacutelisetemporal e a meacutedia de lambda por snapshot mencionados no capiacutetulo anterior

Com relaccedilatildeo ao ano em que a primeira ocorrecircncia foi encontrada 6 projetos introduzi-ram expressotildees lambda jaacute em 2014 8 comeccedilaram a utilizar em 2015 7 em 2016 e apenas4 tiveram a primeira ocorrecircncia de expressotildees lambda em 2017 Dessa forma percebe-seque os projetos estatildeo relativamente bem distribuiacutedos em grupos quanto ao ano em que seintroduziu expressotildees lambda

Pela meacutedia de lambda por snapshot (lambdasnapshot) a maioria (11 projetos) possuiuma quantidade expressiva acima de 100 lambdasnapshot (com 6 projetos entre 20 e 100lambdasnapshot e 8 projetos com menos de 20 lambdasnapshot) como apresentados no

33

graacutefico da Figura 51 Isso mostra que essa nova caracteriacutestica jaacute estaacute sendo bem utilizadanos projetos que comeccedilaram a migrar para a nova versatildeo do Java

Figura 51 Graacuteficos dos projetos separados por ano de introduccedilatildeo de expressotildees lambdae meacutedia de lambda por snapshot

Com isso pode-se observar que apesar de a quantidade de projetos que possuemexpressotildees lambda natildeo ser tatildeo alta eacute possiacutevel obter resultados expressivos uma vez quea quantidade dos projetos com lambda estatildeo bem dispersos quanto ao periacuteodo em quecomeccedilaram a adotar essa caracteriacutestica e a quantidade de expressotildees lambda por snapshot

511 Projetos Selecionados

Atraveacutes dos grupos de classificaccedilatildeo identificados pela anaacutelise temporal descritos na Figura45 cinco projetos foram selecionados para uma anaacutelise detalhada levando em consideraccedilatildeoo grupo em que eles pertencem Estes projetos seratildeo apresentados a seguir

512 agera

Agera eacute uma biblioteca Android que ajuda a introduzir programaccedilatildeo funcional reativa(functional reactive programming) em projetos Android Eacute um projeto recente lanccediladoem 2016 pela Google [44] e encontra-se no grupo dos projetos que introduziram expressotildeeslambda em 2016 no mesmo ano de seu lanccedilamento contendo uma meacutedia de expressotildeeslambda de 16 lambdasnapshot

Na classificaccedilatildeo estabelecida agera pertence ao Grupo 1 onde a quantidade de ex-pressotildees lambda no projeto com o tempo aumentam juntamente com a quantidade deAICs como mostra o graacutefico de anaacutelise temporal na Figura 52

34

Figura 52 Graacuteficos de anaacutelise temporal do projeto agera

513 vertx

Eclipse Vertx eacute um conjunto de ferramentas para criaccedilatildeo de reactive applications namaacutequina virtual Java (JVM) em grande escala [45] Seu primeiro lanccedilamento aconteceuem 2011 e a primeira ocorrecircncia de expressotildees lambda no projeto aconteceu em 2014 Esteprojeto possui uma meacutedia de 2867 lambdasnapshot e dentre os projetos consideradosneste trabalho eacute o que possui a maior quantidade de expressotildees lambda

Este projeto pertence ao Grupo 2 onde a quantidade de expressotildees lambda aumen-tou consideravelmente pelos meses ultrapassando a quantidade de AICs que diminuiudrasticamente como mostra a Figura 53

35

Figura 53 Graacuteficos de anaacutelise temporal do projeto Vertx

514 Android-CleanArchitecture

Apesar de ser uma amostra de projeto Android-CleanArchitecture que tem como objetivoconstruir aplicaccedilotildees Android utilizando clean architecture foi lanccedilado em 2014 mas semanteacutem sempre atualizado [46]

A introduccedilatildeo de expressotildees lambda que aconteceu no ano de 2015 se deu de formatiacutemida com uma meacutedia de 35 lambdasnapshot De qualquer forma este projeto conseguerepresentar com seu graacutefico de anaacutelise temporal o grupo 3 composto por projetos em quea quantidade de expressotildees lambda aumentou mas sem ultrapassar AICs que diminuiacuteramdemonstrado no graacutefico da Figura 54

36

Figura 54 Graacuteficos de anaacutelise temporal do projeto Android-CleanArchitecture

515 RxJava

Dentre os repositoacuterios estudados RxJava eacute considerado o mais popular Como umaimplementaccedilatildeo de Reactive Extensions para a JVM RxJava teve seu lanccedilamento dadoem 2013 [47] Expressotildees lambda apareceram pela primeira vez no ano de 2015 comuma meacutedia de 766 lambdasnapshot

Apesar de uma meacutedia relativamente alta o tempo de vida das expressotildees lambda nesteprojeto foi bem curto caracterizando assim projetos do grupo 4 houve a introduccedilatildeo dasexpressotildees lambda no projeto poreacutem houve a remoccedilatildeo completa de todas as expressotildeeslambda previamente introduzidas desaparecendo completamente do projeto ateacute a datada coleta de dados (Figura 55)

37

Figura 55 Graacuteficos de anaacutelise temporal do projeto RxJava

516 guava

Guava eacute um conjunto de bibliotecas para Java da Google lanccedilado em 2011 A atualizaccedilatildeodo coacutedigo do projeto para Java 8 aconteceu somente em 2016 e apesar do projeto conteruma meacutedia de 281 lambdasnapshot ele foi escolhido como representante dos projetosdo Grupo 5 (Figura 56) que possuem expressotildees lambda mas de forma natildeo expressiva osuficiente quando comparado com a quantidade de AIC pelo fato de sua razatildeo de meacutedia delambdasnapshot por meacutedia de AICsnapshot ser 004 Ou seja embora o projeto tenhaexpressotildees lambda estas satildeo consideradas muito poucas quando inseridas no contextogeral deste projeto que eacute considerado um projeto grande

38

Figura 56 Graacuteficos de anaacutelise temporal do projeto Guava

52 Refatoraccedilatildeo de Coacutedigo

Com o objetivo de caracterizar melhor como as expressotildees lambda estatildeo sendo utilizadaseacute interessante identificar se estas estatildeo sendo introduzidas atraveacutes de refatoraccedilatildeo de coacutedigoou em coacutedigo novo

Os projetos classificados como pertencentes ao Grupo 2 possuem em comum o fatode expressotildees lambda aumentarem a medida que AICs diminuem ultrapassando-as eessa caracteriacutestica em comum pode indicar que nestes projetos possivelmente houve re-fatoraccedilatildeo de coacutedigo visto que AIC sendo substituiacutedo por expressotildees lambda dentro dascondiccedilotildees determinadas eacute a maneira mais comum de se identificar refatoraccedilatildeo de coacute-digo para introduccedilatildeo de expressotildees lambda [12] Os projetos que compotildeem o grupo 2representam 44 de todos os projetos estudados que possuem expressotildees lambda o quepode ser um indicativo caso a hipoacutetese de refatoraccedilatildeo de coacutedigo seja positiva de quemuitos projetos que estatildeo adotando o Java 8 estatildeo se preocupando de alguma formacom refatoraccedilatildeo se coacutedigo Fazem parte desse grupo os seguintes projetos elasticsearchjava-design-patterns PocketHub presto RxJava-Android-Samples spark vertx zipkinjava8-tutorial dropwizard e material-dialogs

39

Outra maneira de verificar possiacuteveis indicadores de refatoraccedilatildeo de coacutedigo foi atraveacutesda anaacutelise dos tamanhos (em quantidade de linhas de coacutedigo) dos meacutetodos com expressotildeeslambda no mecircs em que se introduziu expressotildees lambda e um mecircs imediatamente antesdeste Essa anaacutelise mostra que dos 25 projetos com expressotildees lambda 12 (48) projetostiveram ao menos um meacutetodo em que houve uma diminuiccedilatildeo no tamanho o que podeser considerado um indicativo de refatoraccedilatildeo de coacutedigo A Figura 57 mostra todos osprojetos em relaccedilatildeo agrave quantidade total de meacutetodos que possuem lambda no primeiro mecircsde introduccedilatildeo do mesmo em vermelho comparado com a quantidade desses meacutetodos quetiveram uma diminuiccedilatildeo no tamanho quando comparados com o coacutedigo do mecircs anteriorem azul

Figura 57 Comparaccedilatildeo entre todos os projetos com expressatildeo lambda sobre refatoraccedilatildeode coacutedigo no mecircs de introduccedilatildeo da caracteriacutestica

Ainda observando a figura 57 com relaccedilatildeo aos projetos que natildeo tiveram nenhummeacutetodo com diminuiccedilatildeo de tamanho (barra azul) percebe-se que todos os 13 projetossequer tiveram uma quantidade significativa de meacutetodos que possuem expressotildees lambda(com o maior tendo apenas 5 meacutetodos) no mecircs de introduccedilatildeo da caracteriacutestica no projetoe ao mesmo tempo jaacute existiam no mecircs em que natildeo existia lambda no projeto Essa eacuteuma observaccedilatildeo importante porque projetos como vertx sendo este o que possui a maiormeacutedia de lambdasnapshot de todos os projetos e ao mesmo tempo tendo apenas trecircsmeacutetodos que continham expressotildees lambda no mecircs da introduccedilatildeo e que existiam no mecircs

40

anterior permitem inferir que todas as outras expressotildees lambda existentes no projetopara este determinado mecircs de introduccedilatildeo encontram-se em coacutedigo novo introduzido

Eacute importante ressaltar que somente essa anaacutelise natildeo eacute exclusivamente suficiente paradeterminar se estes projetos estatildeo realmente introduzindo lambda em coacutedigo novo ourealizando refatoraccedilatildeo uma vez que como a comparaccedilatildeo aconteceu apenas no mecircs deintroduccedilatildeo com o mecircs imediatamente anterior natildeo reflete todo o ciclo de vida do pro-jeto Por exemplo algumas equipes podem escolher refatorar o coacutedigo depois de umtempo de adaptaccedilatildeo apoacutes a transiccedilatildeo para a nova versatildeo da linguagem Assim paraobter uma melhor anaacutelise sobre refatoraccedilatildeo de coacutedigo ou natildeo feita nestes projetos aleacutemde outras anaacutelises referentes aos padrotildees tipicamente adotados para implementaccedilatildeo delambda nestes projetos seratildeo apresentados a seguir os estudos de caso dos cinco projetospreviamente selecionados

Outro ponto importante eacute o fato de que apesar das informaccedilotildees quanto agraves quantida-des de filter e map terem sido incluiacutedas inicialmente no trabalho para observar possiacuteveispadrotildees de refatoraccedilatildeo de coacutedigo percebeu-se que estas natildeo satildeo utilizadas de forma con-sideraacutevel pelos projetos estudados e para fins de anaacutelises generalizadas natildeo apresentaramtanta influecircncia na utilizaccedilatildeo de expressotildees lambda quanto a quantidade de AICs noprojeto

53 Estudos de Caso

Dentre os projetos analisados verificou-se que os projetos de pequeno e meacutedio porte op-taram por refatorar de uma vez seus coacutedigos para incluir expressotildees lambda em situaccedilotildeesem que se utilizava AICs anteriormente ou em alguns poucos casos de utilizaccedilatildeo deCollection Os projetos de grande porte natildeo apresentaram nenhuma refatoraccedilatildeo de coacute-digo ou uma refatoraccedilatildeo parcial gradativa provavelmente devido agrave grande quantidade dearquivos e coacutedigo que possuem o que pode tornar o trabalho de refatoraccedilatildeo extenso ecansativo

O projeto vertx que pertence ao grupo 2 dos projetos em que a quantidade de ex-pressotildees lambda aumentaram e as de AICs diminuiacuteram com lambda ultrapassando AICsexecutou inicialmente commits em maio de 2014 com adiccedilatildeo de coacutedigo novo utilizandoexpressotildees lambda e apoacutes um mecircs realizou um commit maior com a refatoraccedilatildeo de todasas AICs para expressotildees lambda Apoacutes a refatoraccedilatildeo o projeto se preocupou em mantera utilizaccedilatildeo de expressotildees lambda ao mesmo tempo que o uso de AICs se manteve apenasaos casos de classes com interfaces natildeo funcionais A Figura 58 apresenta uma parte docommit de refatoraccedilatildeo de coacutedigo que mostra em vermelho a parte eliminada do coacutedigo(AIC) e em verde o coacutedigo novo representando a substituiccedilatildeo por uma expressatildeo lambda

41

Figura 58 Commit de refatoraccedilatildeo de coacutedigo do projeto Vertx [3]

Alguns projetos ainda natildeo se preocuparam em refatorar o coacutedigo para o uso de ex-pressotildees lambda ateacute a data deste trabalho que eacute o caso do projeto guava que apresentouum commit em 03112016 com a atualizaccedilatildeo do projeto para Java 8 Mas a partir daatualizaccedilatildeo se preocupou em utilizar as expressotildees lambda apenas na implementaccedilatildeo decoacutedigo novo O cenaacuterio em que a refatoraccedilatildeo natildeo eacute prioridade ainda eacute a realidade de vaacuteriosprojetos de grande porte visto que os dados de projetos sem nenhuma expressatildeo lambdasatildeo o maior nuacutemero neste trabalho Poreacutem projetos que jaacute adotaram a utilizaccedilatildeo do Java8 tendem a mudar isso com o passar do tempo A Figura 59 apresenta em verde umaadiccedilatildeo de coacutedigo novo com expressatildeo lambda sem a eliminaccedilatildeo de algum coacutedigo anteriora esse que estaria em vermelho

42

Figura 59 Exemplo de um arquivo do commit de adiccedilatildeo de coacutedigo novo em Java 8 doprojeto Guava [4]

Na categoria de projetos em que os AICs e expressotildees lambda aumentam proporci-onalmente (grupo 1) o projeto agera realizou um commit em 19052016 com a adiccedilatildeoda biblioteca retrolambda como dependecircncia do projeto Essa biblioteca utilizada prin-cipalmente por projetos Android permite executar coacutedigo Java 8 contendo expressotildeeslambda em Java 5 6 e 7 [48] O commit tambeacutem apresenta refatoraccedilatildeo dos AICs ad-vindos de interfaces funcionais para expressotildees lambda Apesar de o projeto continuar autilizar as expressotildees lambda em seus commits posteriores o nuacutemero de AICs tambeacutemcontinuou a aumentar visualizando os commits posteriores notou-se que esses AICs satildeorelativos a interfaces natildeo funcionais ou seja que possuem mais de um meacutetodo O projetoAndroid-CleanArchitecture eacute similar ao agera pois tambeacutem optou pela instalaccedilatildeo da bi-blioteca retrolambda para uso de expressotildees lambda em seus coacutedigos e como tambeacutem eacuteum projeto de pequeno porte houve uma pequena refatoraccedilatildeo dos AICs A Figura 510mostra a parte do commit de refatoraccedilatildeo de coacutedigo em que o desenvolvedor adiciona abiblioteca retrolambda como dependecircncia

43

Figura 510 Commit de adiccedilatildeo da biblioteca Retrolambda no projeto Agera [5]

Outro caso interessante eacute o do projeto RxJava que em 2015 optou pela refatoraccedilatildeodo coacutedigo para a utilizaccedilatildeo de expressotildees lambda quase eliminando por completo o usode AICs mas que no ano seguinte reverteu os commits de forma que eliminasse comple-tamente o uso de expressotildees lambda para manter a retrocompatibilidade com o Java 6A Figura 511 demonstra uma parte do commit de reversatildeo do coacutedigo para Java 6 emque pode ser visto em vermelho o coacutedigo anterior com expressotildees lambda e o verde como novo coacutedigo utilizando AIC novamente

44

Figura 511 Commit de remoccedilatildeo de Lambdas e volta para o uso de AICs no projetoRXJava [6]

Essa preocupaccedilatildeo com retrocompatibilidade de coacutedigo pode ser um fator crucial nadecisatildeo das equipes de desenvolvimento na hora de decidir como fazer o software co-evoluircom a linguagem sem perder a compatibilidade com versotildees anteriores

45

Capiacutetulo 6

Consideraccedilotildees Finais

Este estudo permitiu entender melhor como projetos estatildeo realizando a migraccedilatildeo para oJava 8 em especial utilizando uma nova caracteriacutestica introduzida expressatildeo lambdaApesar de a maioria dos projetos populares considerados natildeo possuiacuterem nenhuma ocor-recircncia de expressotildees lambda os projetos que tinham expressotildees lambda foram suficientespara realizar um primeiro estudo de caracterizaccedilatildeo no uso desta caracteriacutestica e com osprojetos efetivamente utilizados para estudo foi possiacutevel agrupaacute-los quanto a maneira emque as expressotildees lambda estavam sendo utilizadas quando comparadas com AICs em 5grandes grupos quando AIC e lambda aumentam proporcionalmente quando AIC dimi-nui e lambda aumenta ultrapassando AIC quando AIC diminui mas continua superior aolambda crescente expressotildees lambda que foram introduzidas e retiradas completamentedo coacutedigo e expressotildees lambda que natildeo existem em quantidades expressivas

Foi possiacutevel entatildeo realizar um estudo aprofundado levando em consideraccedilatildeo as di-ferentes maneiras com que as expressotildees lambda foram adotadas nos projetos atraveacutes daescolha de um projeto que representasse cada grupo para anaacutelise Dentre os cinco projetosestudados foi possiacutevel observar alguns padrotildees tipicamente adotados por desenvolvedorespara implementar expressotildees lambda em seus projetos como a utilizaccedilatildeo da bibliotecas(retrolambda) que permitissem uma flexibilizaccedilatildeo na utilizaccedilatildeo de expressotildees lambda oucomo lambda eacute primariamente utilizada para substituir determinados AICs ou operaccedilotildeesem Collection

Aleacutem disso foi possiacutevel observar como a refatoraccedilatildeo de coacutedigo acontece em cada umdesses projetos Observou-se como projetos menores tendem a refatorar coacutedigo maisfacilmente ao passo que projetos maiores e mais complexos fazem menos refatoraccedilatildeo oudemoram mais entre o periacuteodo em que houve a primeira migraccedilatildeo de coacutedigo para a novaversatildeo da linguagem ateacute o periacuteodo em que realmente decidem refatorar coacutedigo Aleacutem dacomplexidade do projeto influenciar na decisatildeo de migrar o projeto para uma versatildeo maisrecente da linguagem a preocupaccedilatildeo com retrocompatibilidade com versotildees anteriores da

46

linguagem tambeacutem podem ser uma barreira para que projetos comecem a evoluir o coacutedigojuntamente com a evoluccedilatildeo da linguagem

Ainda assim foi possiacutevel observar que a preocupaccedilatildeo com a co-evoluccedilatildeo do software-linguagem existe entre os desenvolvedores de projetos mas a realizaccedilatildeo da migraccedilatildeo aindaacontece lentamente devido agrave diversos fatores que precisam ser levados em consideraccedilatildeopara a manutenccedilatildeo do projeto

Para trabalhos e contribuiccedilotildees futuras seria interessante desenvolver uma ferramentaque pudesse analisar diretamente no coacutedigo-fonte as oportunidades de aplicaccedilatildeo de ex-pressotildees lambda dessa forma poderiam ser analisadas as porcentagens de conversatildeo decoacutedigo para Java 8 e obter melhores conclusotildees sobre a importacircncia que os projetos estatildeodando para a evoluccedilatildeo de seus coacutedigos Outro fator interessante seria aplicar mais Visitorsagrave ferramenta static-analysis e fazer este mesmo estudo aplicado agrave outras caracteriacutesticasda linguagem

47

Referecircncias

[1] Kagdi Huzefa Michael L Collard e Jonathan I Maletic A survey and taxonomyof approaches for mining software repositories in the context of software evolution2007 ix 3 8 9 10 11

[2] DBeaver Dbeaver - features httpdbeaverjkissorgdocsfeatures ix 29

[3] Eclipse Vertx commit Java8-ify code httpsgithubcomeclipsevertxcommit93f95e9c77419f442a42fe711b6eeaef88192fd3 ix 42

[4] Google Guava commit Release java 8 changes to guava httpsgithubcomgoogleguavacommit73e382fa877f80994817a136b0adcc4365ccd904 ix 43

[5] Google Agera commit Collapsed testapp with retrolambda httpsgithubcomgoogleageracommit5e518b7b05f9e7a34a314945f68deff7b2c3e334 ix 44

[6] ReactiveX Rxjava commit 2x full jdk 6 compatible backport + includ-ing bugfixes up to today httpsgithubcomReactiveXRxJavacommit000a174d87a901135f9665d3b11f3627fd2dc4ed ix 45

[7] Godfrey M W e D M German The past present and future of software evolutionEm 2008 Frontiers of Maintenance paacuteginas 129ndash138 Sept 2008 1 6

[8] Favre J M Languages evolve too changing the software time scale Em Principles ofSoftware Evolution Eighth International Workshop on paacuteginas 33ndash42 IEEE 20051 5 7

[9] Overbey Jeffrey L e Ralph E Johnson Regrowing a language refactoring tools allowprogramming languages to evolve Em ACM SIGPLAN Notices volume 44 paacuteginas493ndash502 ACM 2009 1 5 7 8 12

[10] Grechanik Mark Collin McMillan Luca DeFerrari Marco Comi Stefano CrespiDenys Poshyvanyk Chen Fu Qing Xie e Carlo Ghezzi An empirical investiga-tion into a large-scale java open source code repository Em Proceedings of the2010 ACM-IEEE International Symposium on Empirical Software Engineering andMeasurement ESEM rsquo10 paacuteginas 111ndash1110 New York NY USA 2010 ACMISBN 978-1-4503-0039-1 httpdoiacmorg10114518527861852801 1

[11] TIOBE Tiobe httpswwwtiobecomtiobe-index 1 14

48

[12] Gyori Alex Lyle Franklin Danny Dig e Jan Lahoda Crossing the gap from im-perative to functional programming through refactoring Em Proceedings of the 20139th Joint Meeting on Foundations of Software Engineering ESECFSE 2013 paacute-ginas 543ndash553 New York NY USA 2013 ACM ISBN 978-1-4503-2237-9 httpdoiacmorg10114524914112491461 2 11 24 39

[13] OpenJDK State of the lambda httpcropenjdkjavanet~briangoetzlambdalambda-state-4html 2

[14] Han Jiawei Micheline Kamber e Jian Pei Data Mining Concepts and TechniquesMorgan Kaufmann Publishers Inc San Francisco CA USA 3rd ediccedilatildeo 2011ISBN 0123814790 9780123814791 3

[15] Fowler Martin e Kent Beck Refactoring improving the design of existing codeAddison-Wesley Professional 1999 5 7

[16] Lehman M M J F Ramil P D Wernick D E Perry e W M Turski Met-rics and laws of software evolution - the nineties view Em Proceedings of the4th International Symposium on Software Metrics METRICS rsquo97 paacuteginas 20ndashWashington DC USA 1997 IEEE Computer Society ISBN 0-8186-8093-8 httpdlacmorgcitationcfmid=823454823901 6

[17] Hassan Ahmed E e Tao Xie Software intelligence The future of mining softwareengineering data Em Proceedings of the FSESDP Workshop on Future of SoftwareEngineering Research FoSER rsquo10 paacuteginas 161ndash166 New York NY USA 2010ACM ISBN 978-1-4503-0427-6 httpdoiacmorg101145188236218823978 9

[18] Hassan Ahmed E The road ahead for mining software repositories Em Frontiers ofSoftware Maintenance 2008 FoSM 2008 paacuteginas 48ndash57 IEEE 2008 8

[19] Berry Michael J e Gordon Linoff Data Mining Techniques For Marketing Salesand Customer Support John Wiley amp Sons Inc New York NY USA 1997ISBN 0471179809 10

[20] Parnin Chris Christian Bird e Emerson Murphy-Hill Java generics adoption hownew features are introduced championed or ignored Em Proceedings of the 8thWorking Conference on Mining Software Repositories paacuteginas 3ndash12 ACM 2011 12

[21] Oracle The java language specification httpsdocsoraclecomjavasespecsjlsse8jls8pdf 13

[22] Oracle The history of java technology httpwwworaclecomtechnetworkjavajavaseoverviewjavahistory-index-198355html 13

[23] Murphy Kieron So why did they decide to call itjava httpwwwjavaworldcomarticle2077265core-javaso-why-did-they-decide-to-call-it-java-html 13

[24] McGraw Tata Object-oriented Programming with Java Essentials and ApplicationsHill Education 13

49

[25] Oracle Differences between java ee and java se httpdocsoraclecomjavaee6firstcupdocgkhoyhtml 13

[26] Lindsey Clark S The History of Java Cambridge 14

[27] Oracle The java language environment httpwwworaclecomtechnetworkjavaintro-141325html 14

[28] Oracle Jdk 8 httpopenjdkjavanetprojectsjdk8 15 24

[29] Oracle Enhancements in java se 8 httpdocsoraclecomjavase8docstechnotesguideslanguageenhancementshtmljavase8 15 16 17

[30] Oracle Lambda expressions httpdocsoraclecomjavasetutorialjavajavaOOlambdaexpressionshtml 16 18 21

[31] Oracle Method references httpdocsoraclecomjavasetutorialjavajavaOOmethodreferenceshtml 16

[32] Oracle Default methods httpdocsoraclecomjavasetutorialjavaIandIdefaultmethodshtml 17

[33] Oracle Repeating annotations httpdocsoraclecomjavasetutorialjavaannotationsrepeatinghtml 17

[34] Oracle Type annotations httpdocsoraclecomjavasetutorialjavaannotationstype_annotationshtml 17

[35] Oracle Anonymous inner classes httpsdocsoraclecomjavasetutorialjavajavaOOanonymousclasseshtml 19

[36] Kothari CR Research Methodology Methods and Techniques New Age Interna-tional (P) Limited 2004 ISBN 9788122415223 httpsbooksgooglecombrbooksid=8c6gkbKi-F4C 22

[37] Nakakoji Kumiyo Yasuhiro Yamamoto Yoshiyuki Nishinaka Kouichi Kishida eYunwen Ye Evolution patterns of open-source software systems and communitiesEm IWPSE rsquo02 Proceedings of the International Workshop on Principles of SoftwareEvolution paacuteginas 76ndash85 New York NY USA 2002 ACM Press ISBN 1581135459httpdxdoiorg101145512035512055 23

[38] Rahman Foyzur Christian Bird e Premkumar Devanbu Clones What is that smellEmpirical Software Engineering 17(4-5)503ndash530 2012 24

[39] Chacon Scott Pro Git Apress Berkely CA USA 1st ediccedilatildeo 2009ISBN 1430218339 9781430218333 25

[40] Cavalcanti Thiago Gomes e Viniacutecius Correa de Almeida Caracterizaccedilatildeo do uso deconstruccedilotildees da linguagem java em projetos open-source Publicaccedilatildeo online 2016httpbdmunbbrhandle1048315733 27

50

[41] Parr Terence Language Implementation Patterns Create Your Own Domain-Specific and General Programming Languages Pragmatic Bookshelf 1st ediccedilatildeo 2009ISBN 193435645X 9781934356456 27

[42] Janssen Thorben 5 reasons to use jpa hibernate Publicaccedilatildeo online httpswwwsitepointcom5-reasons-to-use-jpa-hibernate 27

[43] Franklin Lyle Alex Gyori Jan Lahoda e Danny Dig Lambdaficator From imperativeto functional programming through automated refactoring Em Proceedings of the2013 International Conference on Software Engineering ICSE rsquo13 paacuteginas 1287ndash1290 Piscataway NJ USA 2013 IEEE Press ISBN 978-1-4673-3076-3 httpdlacmorgcitationcfmid=24867882486986 29

[44] Google Agera httpsgithubcomgoogleagerawiki 34

[45] Eclipse Eclipse vertx httpvertxio 35

[46] Cejas Fernando Android cleanarchitecture httpsgithubcomandroid10Android-CleanArchitecture 36

[47] ReactiveX Rxjava httpsgithubcomReactiveXRxJava 37

[48] Luontola Esko Retrolambda httpsgithubcomorfjackalretrolambda 43

51

Anexo I

Projetos utilizados

fastjson

platform_frameworks_base

netty

material-dialogs

kotlin

okhttp

tinker

AndroidUtilCode

RxJava

spring-boot

java-design-patterns

elasticsearch

ExoPlayer

kafka

vertx

realm-java

guava

zipkin

bazel

stetho

Signal-Android

glide

agera

fresco

plaid

presto

libgdx

spark

52

disruptor

lottie-android

flexbox-layout

PocketHub

zxing

spring-framework

deeplearning4j

dropwizard

interviews

BaseRecyclerViewAdapterHelper

uCrop

DanmakuFlameMaster

lottie-react-native

android-UniversalMusicPlayer

AndroidInterview-Q-A

greenDAO

retrofit

MaterialDrawer

BottomBar

druid

MPAndroidChart

Hystrix

guice

recyclerview-animators

dubbo

androidannotations

RxJava-Android-Samples

PhotoView

clojure

CircleImageView

AndroidSwipeLayout

jedis

MaterialViewPager

butterknife

junit4

RxBinding

leakcanary

SimianArmy

picasso

UltimateRecyclerView

53

AndroidViewAnimations

AppIntro

FizzBuzzEnterpriseEdition

ion

cheesesquare

physical-web

RxAndroid

Android-CleanArchitecture

Calligraphy

Android-Bootstrap

iosched

Android_Data

MaterialDesignLibrary

ListViewAnimations

EventBus

java8-tutorial

AndroidSlidingUpPanel

dagger

okhttputils

logger

HomeMirror

Material-Animations

android-Ultra-Pull-To-Refresh

android-async-http

Android-ObservableScrollView

Android-Universal-Image-Loader

ActionBarSherlock

SlidingMenu

storm

PagerSlidingTabStrip

Android-PullToRefresh

54

  • Dedicatoacuteria
  • Agradecimentos
  • Resumo
  • Abstract
  • Introduccedilatildeo
    • Contexto
    • Objetivos
      • Objetivos Gerais
      • Objetivos Especiacuteficos
        • Metodologia
        • Organizaccedilatildeo do Trabalho
          • Evoluccedilatildeo e Mineraccedilatildeo de Repositoacuterios de Software
            • Evoluccedilatildeo de Software
            • MSR Mineraccedilatildeo de dados e a Engenharia de Software
              • Classificaccedilatildeo
                • Trabalhos Relacionados
                  • Java SE 8 e JDK 8
                    • Histoacuterico
                    • Princiacutepios
                    • Evoluccedilatildeo
                    • Expressotildees Lambda
                      • Sintaxe
                      • Principais formas de uso
                          • Estudo e o Processo de Mineraccedilatildeo
                            • Questotildees de Pesquisa
                            • Fonte de Dados e Objetos de Estudo
                            • Processo de Mineraccedilatildeo
                              • static-analysis
                              • BDAnalisador
                                • Classificaccedilatildeo e Anaacutelise
                                  • Meacutedia de Lambda
                                  • Anaacutelise Temporal
                                  • Refatoraccedilatildeo de Coacutedigo
                                  • Casos de Uso
                                      • Resultados Obtidos e Anaacutelise
                                        • Visatildeo Geral
                                          • Projetos Selecionados
                                          • agera
                                          • vertx
                                          • Android-CleanArchitecture
                                          • RxJava
                                          • guava
                                            • Refatoraccedilatildeo de Coacutedigo
                                            • Estudos de Caso
                                              • Consideraccedilotildees Finais
                                              • Referecircncias
                                              • Anexo
                                              • Projetos utilizados

refatorar o coacutedigo fonte de um sistema de grande porte natildeo eacute uma tarefa faacutecil havendo anecessidade de ferramentas que possam automatizar o processo ou realizar um estudo paraentender como as novas caracteriacutesticas da linguagem podem ser utilizadas para substituirou melhorar funcionalidades obsoletas [9]

22 MSR Mineraccedilatildeo de dados e a Engenharia deSoftware

Com o objetivo de compreender prever e planejar os vaacuterios aspectos do desenvolvimentode um projeto em especial tudo que possa impactar na evoluccedilatildeo de software a teacutecnicade mineraccedilatildeo de dados tem sido bastante utilizada em engenharia de software [17]

O termo Mineraccedilatildeo de Repositoacuterios de Software (MSR) tem sido utilizado para descre-ver vaacuterias maneiras de se examinar repositoacuterios de software Um repositoacuterio de softwarepode ser considerado um artefato que eacute produzido e arquivado durante a evoluccedilatildeo desoftware [1] Estes responsoacuterios armazenam informaccedilotildees que podem fornecer todos osdetalhes de desenvolvimento do software provendo meios necessaacuterios para uma anaacuteliseaprofundada de evoluccedilatildeo de software

Repositoacuterios de software satildeo comumente utilizados para armazenar e acompanhar ohistoacuterico de desenvolvimento do software mas raramente usados para tomada de deci-sotildees em relaccedilatildeo ao projeto Assim pesquisadores de MSR buscam modificar a impressatildeode que tais repositoacuterios satildeo estaacuteticos que servem apenas para manutenccedilatildeo de registrostransformando-os em repositoacuterios ativos que podem auxiliar na tomada de decisatildeo em pro-jetos de software modernos atraveacutes da identificaccedilatildeo de padrotildees para realizar a propagaccedilatildeode mudanccedilas [18]

221 Classificaccedilatildeo

De acordo com Kagdi et al dentre as abordagens de MSR utilizadas atualmente eacute possiacuteveldescrevecirc-las para entatildeo comparaacute-las e possivelmente classificaacute-las levando em considera-ccedilatildeo uma taxonomia de quatro dimensotildees os repositoacuterios de software utilizados (fontes dedados) o propoacutesito do MSR a metodologia e a avaliaccedilatildeo da abordagem [1] como mostraa Figura 21 onde as taxonomias destacadas em amarelo satildeo as que prevaleceram poreacutemnatildeo exclusivamente na metodologia adotada por este trabalho

8

Figura 21 Taxonomia em camadas adaptada do trabalho de Kagdi et al [1]

Fontes de Dados

As fontes de informaccedilatildeo variam de acordo com a abordagem utilizada e dentre as informa-ccedilotildees mineradas em repositoacuterios de software inclui-se as seguintes categorias os artefatosde software e suas versotildees as diferenccedilas entre os artefatos de software e suas versotildees e osmetadados sobre as mudanccedilas no software

As fontes de dados podem ser melhor classificadas de acordo com Hassan et al [17]

bull Repositoacuterios de controle de Versatildeo estes repositoacuterios guardam o histoacuterico de desen-volvimento de um projeto armazenando todas as mudanccedilas no coacutedigo fonte assimcomo os metadados associados com cada mudanccedila Exemplos git SVN

bull Bug repositories Estes repositoacuterios rastreiam o histoacuterico de resoluccedilatildeo de bugs quesatildeo reportados por usuaacuterios e desenvolvedores Exemplos Bugzilla e Jira

9

bull Histoacuterico de Comunicaccedilatildeo (Archived communications) estes repositoacuterios rastreiamdiscussotildees sobre os vaacuterios aspectos de um projeto de software por sua vida uacutetil Porexemplo listas de e-mails

bull Deployment logs logs com informaccedilotildees do software gerados por ferramentas dedesenvolvimento

bull Repositoacuterios de software Repositoacuterios onde o coacutedigo fonte de vaacuterios projetos satildeoarmazenados como por exemplo Sourceforgenet

No contexto deste trabalho estes repositoacuterios consistem em fontes de coacutedigo armaze-nadas em sistemas de controle de versatildeo especificamente coacutedigos na plataforma Github

O propoacutesito

O propoacutesito da mineraccedilatildeo de repositoacuterios de software se resume nas perguntas de pes-quisa que podem ser respondidas utilizando mineraccedilatildeo Assim existem duas classes deperguntas de pesquisa para MSR [1]

A primeira eacute a pergunta de anaacutelise market-basket1 ldquoSe A acontece o que mais podeacontecerrdquo A resposta para este tipo de pergunta eacute um conjunto de regras descrevendotendecircncias de relacionamentos como por exemplo se A acontecer entatildeo B e C acontecemdurante um periacuteodo X

A segunda classe diz respeito agraves perguntas de prevalecircncia (Prevalence Questions -PQ) como por exemplo perguntas do tipo ldquoA funcionalidade Y foi modificadardquo quepossuem uma resposta booleana ou ldquoQuantas vezes esta funcionalidade Y foi modificadardquocontendo uma resposta quantitativa

As perguntas de pesquisa deste trabalho se encaixam majoritariamente na segundaclasse onde o objetivo traccedilado eacute respondido de forma quantitativa com algumas tentativasde classificaccedilatildeo de tipos de repositoacuterios como seraacute descrito nos capiacutetulos seguintes

A metodologia

A metodologia corresponde a maneira como as questotildees de MSR iratildeo ser respondidas evaacuterias abordagens estatildeo disponiacuteveis Poreacutem Kagdi indica duas estrateacutegias baacutesicas quepodem ser utilizadas

Primeiramente pode-se utilizar a mediccedilatildeo indireta e anaacutelise da evoluccedilatildeo do softwareEsta abordagem pode ser realizada da seguinte forma extrair e computar informaccedilotildeesde cada versatildeo de um software separadamente e em seguida individualmente comparar

1Anaacutelise Market-basket eacute uma teacutecnica de modelagem baseada na teoria de que se vocecirc comprar certostipos de produtos vocecirc haacute uma probabilidade maior (ou menor) de comprar outros tipos de produtos [19]

10

propriedades encontradas como por exemplo comparar duas versotildees distintas de umsoftware atraveacutes de um repositoacuterio github realizando uma investigaccedilatildeo de alto niacutevel noque diz respeito a evoluccedilatildeo do software [1]

A segunda perspectiva de metodologia que pode ser utilizada corresponde agrave mediccedilatildeodireta e anaacutelise da evoluccedilatildeo do software Ela diz respeito agraves investigaccedilotildees que estudamos mecanismos que leva um software a ser modificado de uma versatildeo para outra focandonas diferenccedilas especiacuteficas entre estas versotildees como por exemplo examinando mudanccedilasespeciacuteficas das classes arquivos funccedilotildees de cada parte do coacutedigo [1]

Assim eacute possiacutevel descrever explicitamente que este trabalho utiliza em sua maioriauma metodologia com mediccedilotildees diretas atraveacutes da anaacutelise estaacutetica de informaccedilotildees docoacutedigo fonte de diferente versotildees para analisar os diferentes padrotildees de desenvolvimentoem que expressotildees lambda (definidas no capiacutetulo seguinte) satildeo utilizadas

A Avaliaccedilatildeo

Por fim existem diversas formas para se avaliar o estudo realizado sempre levando emconsideraccedilatildeo a validade dos resultados obtidos Pode-se utilizar de meacutetricas para avaliar osdados considerando o quanto das informaccedilotildees obtidas satildeo relevantes Outra forma de seavaliar seria atraveacutes da utilizaccedilatildeo de modelos probabiliacutesticos seguindo uma abordagemde teoria da informaccedilatildeo Assim foram utilizadas determinadas meacutetricas quantitativaspara avaliar os resultados obtidos neste trabalho

23 Trabalhos Relacionados

Como ressaltado na introduccedilatildeo o foco deste trabalho encontra-se em utilizar teacutecnicas deMSR para caracterizar a adoccedilatildeo de expressotildees lambda em repositoacuterios Java Ao reali-zar um estudo sobre o estado da arte encontrou-se diversos trabalhos que utilizam deMSR para obter informaccedilotildees relevantes sobre repositoacuterios de software em diversos focose em especial trabalhos que investiguem repositoacuterios na linguagem Java Jaacute existemtambeacutem alguns trabalhos que apresentam ferramentas de refatoraccedilatildeo de coacutedigo para im-plementaccedilatildeo de expressotildees lambda com foco na evoluccedilatildeo do software Dentre os trabalhosencontrados mencionados destacam-se

bull Em um trabalho sobre utilizaccedilatildeo de refatoraccedilatildeo de coacutedigo para realizar a transiccedilatildeode coacutedigo Java para as novas caracteriacutesticas implementadas no Java 8 Gyori et alapresenta uma ferramenta que automatiza com sucesso o trabalho de conversatildeo decoacutedigo como Annonymous Inner Class para expressotildees lambda [12] O capiacutetulo aseguir descreve em detalhes estes conceitos

11

bull Regrowing a Language de Overbey apresenta um estudo sobre a importacircncia da co-evoluccedilatildeo entre a linguagem de programaccedilatildeo e os projetos de software focando naslinguagens Fortran e Java e provando como ferramentas de refatoraccedilatildeo de coacutedigoauxiliam para que o software consiga evoluir juntamente com sua linguagem deprogramaccedilatildeo [9]

bull O trabalho sobre a adoccedilatildeo de generics em coacutedigo Java feito por Parnin utiliza demineraccedilatildeo de dados para realizar uma investigaccedilatildeo empiacuterica avaliando projetos decoacutedigo aberto com o objetivo de observar como desenvolvedores destes projetos estatildeoutilizando generics em Java [20]

Os estudos mencionados focam em assuntos particulares pertinentes a este trabalhoem que de um lado tem-se trabalhos que mostram a necessidade de refatoraccedilatildeo de coacutedigopara evoluccedilatildeo de software e do outro tem-se trabalhos que mostram que eacute possiacutevel utilizarde MSR para entender melhor como a evoluccedilatildeo da linguagem de programaccedilatildeo Java temafetado projetos reais de coacutedigo aberto e como estes projetos estatildeo se adaptando a estasevoluccedilotildees

12

Capiacutetulo 3

Java SE 8 e JDK 8

Este trabalho tem como objetivo caracterizar a adoccedilatildeo de expressotildees Lambda em siste-mas Java que podem ser considerados legados pois foram concebidos em um momentoanterior a introduccedilatildeo dessa nova caracteriacutestica na linguagem Java Com o intuito de faci-litar o entendimento do leitor sobre tais construccedilotildees esse capiacutetulo apresenta informaccedilotildeeshistoacutericas referentes agrave linguagem Java desde sua criaccedilatildeo ateacute a sua ascensatildeo como umadas linguagens de programaccedilatildeo mais populares Aleacutem disso seratildeo apresentadas as novascaracteriacutesticas presentes na versatildeo Java SE 8 com destaque nas expressotildees Lambda e deque forma vieram para auxiliar no desenvolvimento de sistemas

31 Histoacuterico

Java eacute uma linguagem de programaccedilatildeo orientada a objetos para propoacutesitos gerais [21] Alinguagem nasceu com o nome de Oak no ano de 1991 com o foco em televisotildees digitais acabo mas devido agrave complexidade e poder da linguagem logo expandiu-se para os outrosdomiacutenios principalmente a Internet [22] Posteriormente a linguagem recebeu o nome deGreentalk devido agrave marca Oak jaacute ser registrada por outra empresa e o principal projeto daequipe se chamar Green Por fim o nome Java foi o mais votado pela equipe da Sun emuma reuniatildeo para decidir o mais raacutepido possiacutevel um nome definitivo para a linguagem [23]

Em 1995 em sua primeira versatildeo puacuteblica 10 a linguagem Java jaacute comeccedilava a terum crescimento em sua popularidade como Web Applet nos navegadores mais popularesfornecendo seguranccedila e rapidez nas plataformas mais utilizadas [24] A cada nova versatildeopublicada novas funcionalidades e plataformas eram adicionadas e tornavam a linguagemmais difundida no meio computacional fazendo com que em 2006 a linguagem fosse divi-dida em Java EE (foco em rede e serviccedilos web) Java ME (foco em sistemas embarcados)e Java SE (foco em desktops e servidores) [25]

13

Apoacutes anos de evoluccedilatildeo e aprimoramento atraveacutes de diversas versotildees como visto naTabela 31 hoje o Java se tornou uma das linguagens de programaccedilatildeo mais utilizadas nomundo estando em aproximadamente 15 das linhas de coacutedigo disponiacuteveis pela inter-net [11] A quantidade de plataformas suportadas pela linguagem e com o advento dosistema operacional Android sendo rodado na maior parte dos smartphones do mundoaleacutem da simplicidade em codificar no paradigma orientado a objetos foram os fatoresrelevantes para que a linguagem se popularizasse no mundo digital [26]

Tabela 31 As versotildees anteriores de java e principais caracteriacutesticasVersatildeo Principais caracteriacutesticasJava 10 JVM e JDKJava 2 Event Listeners

Kestrel (Java 3) HotSpot JVMMerlin (Java 4) Diversas novas APIs como Assertion e expressotildees regularesTiger (Java 5) Generics

Mustang (Java 6) Web ServicesDolphin (Java 7) Suporte a linguagens dinamicas

32 Princiacutepios

Com o foco em alcanccedilar a Web e participar mais ativamente do mercado virtual e e-Commerce foram projetados princiacutepios que permitissem com que a linguagem pudessealcanccedilar seus objetivos principais ao mesmo tempo que mantinha a facilidade e fami-liarizaccedilatildeo da linguagem a seus desenvolvedores [27] Dessa forma a equipe da Oracledeterminou cinco princiacutepios que caracterizariam o foco da linguagem Java

bull simples orientada a objeto e familiar projetada para ser orientada a objeto epermitir que seus desenvolvedores comecem a codificar rapidamente sem a necessi-dade de uma curva de aprendizagem acentuada

bull segura e robusta projetada para prover software confiaacutevel por meio de checagensa tempo de compilaccedilatildeo e execuccedilatildeo Haacute uma grande preocupaccedilatildeo com seguranccediladevido agrave larga utilizaccedilatildeo da linguagem em sistemas distribuiacutedos

bull de arquitetura neutra e portaacutevel projetada para ser independente de qualquerarquitetura bastando rodar a JVM dessa forma garantindo a portabilidade paravaacuterios ambientes e dispositivos

14

bull executada em alta performance projetada para fornecer a maior performancepossiacutevel em tempo de execuccedilatildeo com a utilizaccedilatildeo do garbage collector em uma threadde baixa prioridade

bull interpretada dinacircmica e threaded projetada para ser interpretada por qual-quer dispositivo que possua JVM desenvolvida garantindo um desenvolvimento raacute-pido e em ciclos O uso da classe Thread permite que a linguagem acompanhe atendecircncia do paralelismo Aleacutem disso a ligaccedilatildeo de classes eacute feita em tempo real esomente quando necessaacuteria tornando-a dinacircmica

33 Evoluccedilatildeo

A primeira versatildeo do Java 8 foi lanccedilada em 2014 [28] e apresentou diversas atualizaccedilotildeesespalhadas em categorias como linguagem seguranccedila Collections ferramentas deployentre outras Dentre a grande quantidade de mudanccedilas os destaques se encontraram nasnovas melhorias presentes na linguagem que afetaram de forma mais direta a maneiracom que os desenvolvedores passaram a tratar e organizar o coacutedigo fonte As atualizaccedilotildeesreferentes a linguagem descritas oficialmente pela Oracle [29] satildeo

1 Lambda Expressions ou apenas Expressotildees Lambda correspondem a uma novacaracteriacutestica que permite que uma pequena funcionalidade possa ser utilizada comoum argumento de um meacutetodo facilitando a escrita de accedilotildees que seratildeo feitas repetida-mente em uma Collection ou quando um processo se completa ou quando encontraum erro Eacute tambeacutem uma forma compacta de se escrever coacutedigo que previamenteera escrito com anonymous inner classes [29] A Listagem 31 mostra uma classehipoteacutetica Calculator cujo meacutetodo operateBinary() recebe como paracircmetro doisinteiros e um objeto da classe IntegerMath que representa a operaccedilatildeo que deveraacuteser realizada ou seja uma funcionalidade dinacircmica

1 pub l i c c l a s s Ca l cu la to r 2

3 i n t e r f a c e IntegerMath 4 i n t opera t i on ( i n t a i n t b) 5 6

7 pub l i c i n t operateBinary ( i n t a i n t b IntegerMath op ) 8 re turn op opera t i on (a b) 9

10

11 pub l i c s t a t i c void main ( St r ing a rgs ) 12

15

13 Calcu la to r myApp = new Ca lcu la to r ( ) 14 IntegerMath add i t i on = (a b) minusgt a + b 15 IntegerMath subt ra c t i on = (a b) minusgt a minus b 16 System out p r i n t l n ( 40 + 2 = +17 myApp operateBinary (40 2 add i t i on ) ) 18 System out p r i n t l n ( 20 minus 10 = +19 myApp operateBinary (20 10 sub t ra c t i on ) ) 20 21 22

Listagem 31 Exemplo de coacutedigo com o uso de Expressatildeo Lambda [30]

2 Method References Frequentemente expressotildees lambda criam meacutetodos anocircni-mos Algumas vezes poreacutem satildeo utilizadas para chamar um meacutetodo jaacute existentena classe Ao inveacutes de escrever a expressatildeo Lambda para esse caso pode-se optarpor utilizar um Method Reference que facilita a escrita e leitura desse uso de ex-pressatildeo Lambda [29] A Listagem 32 mostra um exemplo de um meacutetodo estaacuteticoque compara duas pessoas pelas suas idades e a Listagem 33 a utilizaccedilatildeo de MethodReference para aplicar a utilizaccedilatildeo desse meacutetodo em um array e reduzir a escrita deuma expressatildeo lambda a uma forma mais legiacutevel

1 pub l i c s t a t i c i n t compareByAge ( Person a Person b) 2 re turn a b i r thday compareTo (b b i r thday ) 3 4

Listagem 32 Exemplo de meacutetodo de uma classe Pessoa [31]

1 Arrays s o r t ( rosterAsArray Person compareByAge ) 2

Listagem 33 Exemplo de uso de Method Reference [31]

3 Default Methods satildeo meacutetodos com a palavra-chave default que servem para adi-cionar implementaccedilotildees de meacutetodos a uma interface de alguma biblioteca mantendoa compatibilidade binaacuteria com versotildees mais antigas dessa interface Tambeacutem pos-sibilita a implementaccedilatildeo de meacutetodos estaacuteticos em interfaces [29] A Listagem 34apresenta a inclusatildeo de um meacutetodo default na interface TimeClient

1 pub l i c i n t e r f a c e TimeClient 2 void setTime ( i n t hour i n t minute i n t second ) 3 void setDate ( i n t day i n t month i n t year ) 4 void setDateAndTime ( i n t day i n t month i n t year 5 i n t hour i n t minute i n t second )

16

6 LocalDateTime getLocalDateTime ( ) 7

8 s t a t i c ZoneId getZoneId ( S t r ing zoneStr ing ) 9 t ry

10 re turn ZoneId o f ( zoneStr ing ) 11 catch ( DateTimeException e ) 12 System e r r p r i n t l n ( I n v a l i d time zone + zoneStr ing

+13 us ing d e f a u l t time zone in s t ead ) 14 re turn ZoneId systemDefault ( ) 15 16 17

18 d e f a u l t ZonedDateTime getZonedDateTime ( St r ing zoneStr ing ) 19 re turn ZonedDateTime o f ( getLocalDateTime ( ) getZoneId (

zoneStr ing ) ) 20 21 22

Listagem 34 Exemplo de interface com um meacutetodo default [32]

4 Repeating Annotations permitem a implementaccedilatildeo e utilizaccedilatildeo de anotaccedilotildees deum mesmo tipo que podem ser utilizadas mais de uma vez para a mesma declara-ccedilatildeo [29] A Listagem 35 apresenta duas anotaccedilotildees iguais com paracircmetros diferentespermitindo uma customizaccedilatildeo maior na aplicaccedilatildeo de um tipo de anotaccedilatildeo

1 Schedule ( dayOfMonth= l a s t )2 Schedule (dayOfWeek= Fr i hour= 23 )3 pub l i c void doPeriodicCleanup ( ) 4

Listagem 35 Exemplo de Repeating Annotations [33]

5 Type Annotations permitem que anotaccedilotildees possam ser utilizadas em tipos aleacutemde declaraccedilotildees dessa forma pode-se garantir que um campo sempre atenda agraves suasexpectativas e evite testes desnecessaacuterios [29] A Listagem 36 mostra um exemplo derestriccedilatildeo a uma String que nunca poderaacute ser nula devido agrave anotaccedilatildeo de NonNull

1 NonNull S t r ing s t r

Listagem 36 Exemplo de Type Annotation garantindo que o campo nunca seja null [34]

17

34 Expressotildees Lambda

Uma das mudanccedilas mais interessantes implementadas no Java 8 foi a adiccedilatildeo de expressotildeeslambda As expressotildees lambda permitem que a linguagem Java possa atuar parcialmentecomo uma linguagem de programaccedilatildeo funcional onde comportamentos satildeo avaliados eaplicados diferentemente da programaccedilatildeo imperativa que foca na mudanccedila de estadosNa praacutetica um comportamento pode ser passado como paracircmetro de um meacutetodo atraveacutesde uma escrita mais reduzida e legiacutevel Os benefiacutecios de utilizar expressotildees lambda incluemuma melhora na legibilidade e organizaccedilatildeo de coacutedigo que antes era escrito com AnonymousInner Class aleacutem de permitir uma forma simples de utilizar comportamento paralelo como uso de Streams

341 Sintaxe

A sintaxe de uma expressatildeo lambda eacute dividida nas seguintes partes [30]

bull Uma lista de paracircmetros separados por viacutergulas

bull Um token representado por uma seta -gt

bull Um corpo que pode ser representado por uma expressatildeo uacutenica ou um bloco de coacutedigodentro de chaves

As Listagens 37 e 38 mostram duas formas diferentes de se aplicar expressotildees Lambdacom uma sintaxe similar A primeira aplica a expressatildeo diretamente apoacutes a seta utilizadanormalmente para trechos de coacutedigo pequenos e simples e a segunda utiliza-se de chavespara incorporar o coacutedigo e da palavra-chave return para especificar o retorno forma maisutilizada para uma quantidade maior de coacutedigo

1 p minusgt p getGender ( ) == Person Sex MALE2 ampamp p getAge ( ) gt= 183 ampamp p getAge ( ) lt= 25

Listagem 37 Exemplo de expressatildeo lambda com uma expressatildeo [30]

1 p minusgt 2 re turn p getGender ( ) == Person Sex MALE3 ampamp p getAge ( ) gt= 184 ampamp p getAge ( ) lt= 25 5

Listagem 38 Exemplo de expressatildeo lambda com um bloco de coacutedigo [30]

18

342 Principais formas de uso

Anonymous Inner Class

Antes do Java 8 a necessidade de passar funccedilotildees ou expressotildees como paracircmetro de algummeacutetodo era suprida atraveacutes de Anonymous Inner Classes A utilizaccedilatildeo desse tipo dedeclaraccedilatildeo junto com a anotaccedilatildeo de Override permite sobrescrever um meacutetodo de umainterface funcional e ao mesmo tempo passa-la como argumento para um meacutetodo Umaexpressatildeo lambda se comporta da mesma forma poreacutem a quantidade de coacutedigo escritopela Anonymous Inner Class eacute maior e pode dificultar a leitura de coacutedigo pois conteacutemmuita informaccedilatildeo natildeo utilizada para efetivo entendimento do que estaacute sendo feito naqueletrecho

A Listagem 39 apresenta a instanciaccedilatildeo da classe EventHandler internamente ao meacute-todo setOnAction() de forma que o desenvolvedor possa escrever o comportamento quedeseja passar como paracircmetro do meacutetodo atraveacutes da substituiccedilatildeo do meacutetodo handle()que jaacute existe pelo meacutetodo handle() criado e escrito pelo desenvolvedor

1 btn setOnAction (new EventHandlerltActionEvent gt() 2 Override3 pub l i c void handle ( ActionEvent event ) 4 System out p r i n t l n ( He l lo World ) 5 6 )

Listagem 39 Exemplo de uso de Anonymous Inner Class [35]

Interface funcional

Ao projetar um coacutedigo novo o desenvolvedor que optar por utilizar expressotildees lambdadeve iniciar com a criaccedilatildeo de uma interface funcional Esse tipo de interface possui umuacutenico meacutetodo abstrato permitindo que expressotildees lambda sejam usadas para sobrescrevero comportamento do meacutetodo abstrato Uma interface funcional pode possuir outros meacuteto-dos desde que sejam default Uma nova anotaccedilatildeo FunctionalInterface foi adicionadacom a atualizaccedilatildeo do Java 8 para conferir em tempo de compilaccedilatildeo se a interface satisfazos requisitos desse modelo de interface

A Listagem 310 apresenta um exemplo de interface funcional com o objetivo de permi-tir o uso de expressotildees lambda que utilizaratildeo de dois Double como paracircmetro e jaacute utilizada nova anotaccedilatildeo FunctionalInterface introduzida no Java 8

1 Funct iona l Inte r face2 pub l i c i n t e r f a c e DoubleOp 3 pub l i c Double apply ( Double a Double b)

19

4

Listagem 310 Exemplo de interface funcional

Dessa forma conforme as Listagens 311 e 312 o meacutetodo apply() pode tomar formade qualquer operaccedilatildeo entre dois Double que seraacute especificada quando a expressatildeo lambdafor montada dando o aspecto de linguagem funcional agrave linguagem e mais facilidade eliberdade ao desenvolvedor

1 pub l i c c l a s s Ca l cu la to r 2 pub l i c s t a t i c Double c a l c ( Double op1 Double op2 DoubleOp operator ) 3 re turn operator apply ( op1 op2 ) 4 5

Listagem 311 Exemplo de aplicaccedilatildeo da interface funcional

1 Double r e s u l t 1 = Ca lcu la to r c a l c (10d 50d ( a b ) minusgt a + b)

Listagem 312 Uso de expressatildeo lambda para o exemplo anterior

Collections

Dentre as atualizaccedilotildees de pacotes do Java 8 foi adicionado um meacutetodo stream() nainterface Collection Esse meacutetodo trata as Collection como streams o que significa queapesar de natildeo ser possiacutevel acessar elementos diretamente algumas novas manipulaccedilotildeessatildeo possiacuteveis Essas manipulaccedilotildees satildeo na verdade meacutetodos da interface Stream quepodem receber como paracircmetro uma expressatildeo lambda ou seja um comportamento a seraplicado agrave Collection Dentre os meacutetodos temos

bull filter() O meacutetodo filter() recebe uma expressatildeo lambda contendo uma condiccedilatildeopara filtragem da collection

bull map() O meacutetodo map() mapeia os elementos de uma Collection em outro objetocomo uma String A expressatildeo lambda passada por paracircmetro deve retornar o tipode objeto ao qual seraacute mapeado

bull forEach() O meacutetodo forEach() aplica uma operaccedilatildeo especiacutefica para cada ele-mento da Collection A expressatildeo lambda a ser passada deve conter a operaccedilatildeo aser realizada

bull min() e max() Os meacutetodos min() e max() retornam o elemento menor ou maiorda Collection dependendo da expressatildeo lambda passada como paracircmetro

20

A Listagem 313 demonstra como vaacuterias operaccedilotildees com uma Collection podem seraplicadas de uma vez de forma que lendo a expressatildeo lambda jaacute eacute possiacutevel saber oresultado da aplicaccedilatildeo do meacutetodo agrave Collection

1 r o s t e r2 stream ( )3 f i l t e r (4 p minusgt p getGender ( ) == Person Sex MALE5 ampamp p getAge ( ) gt= 186 ampamp p getAge ( ) lt= 25)7 map(p minusgt p getEmailAddress ( ) )8 forEach ( emai l minusgt System out p r i n t l n ( emai l ) )

Listagem 313 Exemplo de utilizaccedilatildeo de meacutetodos de stream com expressotildees lambda [30]

21

Capiacutetulo 4

Estudo e o Processo de Mineraccedilatildeo

A definiccedilatildeo da metodologia utilizada para realizaccedilatildeo deste trabalho eacute importante para queexista uma padronizaccedilatildeo e melhor entendimento de como os resultados foram obtidos paraque a replicaccedilatildeo do mesmo possa ser realizada em trabalhos futuros [36]

Figura 41 Processo utilizado para realizaccedilatildeo do estudo

O esquema representado na Figura 41 descreve o processo seguido para a realizaccedilatildeodeste trabalho que foi divido em trecircs grandes etapas a de planejamento definindo osobjetivos questotildees de pesquisa e meios de investigaccedilatildeo deste projeto a etapa de execuccedilatildeorealizando todo o procedimento metodoloacutegico definido para a coleta e refinamento de

22

dados e a etapa de avaliaccedilatildeo onde foram classificados e avaliados os dados coletadospara responder agraves questotildees de pesquisa

A seguir na primeira seccedilatildeo seratildeo apresentadas em detalhes as questotildees de pesquisa aserem respondidas Em seguida seraacute feito uma breve descriccedilatildeo da fonte de dados utilizada- especificamente os projetos utilizados como objetos de estudo deste trabalho e por fimtodo o restante da metodologia que foi de fato desenvolvida para obter os resultadosnecessaacuterios

41 Questotildees de Pesquisa

Com o objetivo de entender e caracterizar melhor o uso de expressotildees lambda foramdefinidas as seguintes questotildees de pesquisa a serem respondidas

bull PQ-1 Quando os projetos comeccedilaram a introduzir o uso de expressotildees lambda emseus coacutedigos e qual a meacutedia de expressotildees lambda por snapshots caso existam

bull PQ-2 Como as equipes de desenvolvimento estatildeo utilizando expressotildees lambdaatraveacutes de refatoraccedilatildeo de coacutedigo ou introduzindo apenas em coacutedigo novo

bull PQ-3 Quais satildeo os padrotildees tipicamente adotados para o uso de expressotildees lambda

A primeira pergunta de pesquisa gira em torno de como projetos populares open-sourceestatildeo se adaptando agrave introduccedilatildeo de expressotildees lambda em Java muitos projetos jaacute estatildeoutilizando as expressotildees lambda Se sim a partir de quando comeccedilaram a utilizaacute-lasdesde o iniacutecio da introduccedilatildeo das mesmas no Java 8 ou em um periacuteodo mais tardio Aleacutemdisso eacute interessante descobrir se a utilizaccedilatildeo dessa nova caracteriacutestica tem acontecido deforma expressiva ou natildeo

Em seguida para melhor entender a forma como as expressotildees lambda estatildeo sendointroduzidas em projetos eacute interessante investigar se as equipes de desenvolvimento estatildeose preocupando em refatorar coacutedigo com o objetivo de evoluir o software ou se estatildeoexperimentando utilizar expressotildees lambda apenas em coacutedigo novo introduzido

Como a introduccedilatildeo de novas funcionalidades em projetos open-source de grande escaladepende do objetivo do projeto e os padrotildees de projeto utilizados [37] espera-se obser-var diversas abordagens quanto a utilizaccedilatildeo de expressotildees lambda para entatildeo poderclassificar estes softwares quanto a abordagem utilizada

Eacute de grande importacircncia para este estudo conseguir identificar na praacutetica comoexpressotildees lambda estatildeo sendo tipicamente adotadas nestes projetos Assim a terceirapergunta de pesquisa busca identificar alguns exemplos de utilizaccedilatildeo atraveacutes da realizaccedilatildeode alguns estudos de caso

23

Eacute importante ressaltar que apesar de as expressotildees lambda serem uma alternativa aouso de AIC elas natildeo os substituem completamente Existem precondiccedilotildees para que umaAIC possa ser substituiacuteda por expressotildees lambda [12] descritas a seguir

bull AIC deve instanciar-se de uma interface

bull AIC natildeo deve possuir nenhum campo e declarar apenas um meacutetodo

bull AIC natildeo deve possuir uma referecircncia para this ou super

bull AIC natildeo deve declarar um meacutetodo recursivo

Para responder agrave primeira pergunta apenas dados gerais sobre todos os projetos seratildeonecessaacuterios ao passo que pelas perguntas 2 e 3 possuiacuterem uma natureza mais complexaseraacute necessaacuterio aleacutem de uma anaacutelise geral estatiacutestica a realizaccedilatildeo de alguns estudos decaso para obter resultados mais completos

42 Fonte de Dados e Objetos de Estudo

Para responder agraves perguntas de pesquisa estabelecidas foram selecionados os 99 projetosmais populares na linguagem Java dentro da plataforma github ateacute a data da coleta dosdados feita em Abril de 2017 Satildeo considerados populares os repositoacuterios que possuema maior quantidade possiacutevel de estrelas (stars) A decisatildeo de escolher os 99 projetos maispopulares foi por sua natureza imparcial e ao mesmo tempo para que se possa analisarprojetos que satildeo de familiaridade e conhecimento da comunidade do github e de domiacuteniopuacuteblico Os 99 projetos estatildeo listados no Anexo I

Para entender a transiccedilatildeo feita por esses projetos entre as versotildees anteriores do Java eo Java 8 com as expressotildees lambda eacute necessaacuterio analisar o coacutedigo de vaacuterias versotildees a fimde observar alguma mudanccedila para cada projeto Como satildeo 99 projetos e vaacuterios dessesprojetos possuem milhares de linhas de coacutedigo e commits seria impossiacutevel avaliar todosos commits Optou-se entatildeo por coletar snapshots mensais de cada projeto conformeprocedimento tambeacutem seguido anteriormente [38] Cada snapshots representa o estadodo projeto em um determinado mecircs e como criteacuterio de escolha padratildeo todos os snapshotsequivalem ao uacuteltimo commit realizado no determinado mecircs que este representa

O proacuteximo passo eacute determinar o periacuteodo de tempo em que esses snapshots seriamcoletados Como Java 8 (e consequentemente as expressotildees lambda) foi introduzidoapenas em meados de 2014 [28] coletar dados de projetos a partir de um periacuteodo muitoantes deste ano natildeo agregaria valor ao estudo em questatildeo Definiu-se entatildeo um periacuteodopara a coleta mensal desses snapshots atraveacutes dos anos Janeiro de 2013 um ano antesda introduccedilatildeo do Java 8 para que se pudesse identificar para todos os projetos o mecircs

24

exato em que expressotildees lambda foram introduzidas ateacute o mecircs da coleta de dados Abrilde 2017

Eacute importante ressaltar que a definiccedilatildeo dos meses foi definida do dia primeiro de ummecircs ao dia primeiro do proacuteximo mecircs e por consequecircncia alguns snapshots que deveriamrepresentar o final de determinado mecircs correspondem na verdade a commits realizadosno dia primeiro do mecircs seguinte Por exemplo pode existir casos em que o commit querepresente o mecircs de Marccedilo de 2016 seja na verdade o commit realizado no dia primeirode Abril de 2016 Isso se deve a natureza da forma como os resultados de log de commitssatildeo obtidos pelo git [39] Poreacutem isso natildeo interfere nas anaacutelises ou no propoacutesito destetrabalho uma vez que foram realizadas verificaccedilotildees e validaccedilotildees para que natildeo existamdatas repetidas (e consequentemente commits repetidos) por repositoacuterio

Neste trabalho o termo projeto e repositoacuterio foram utilizados de forma intercaladapara representar a mesma coisa o software desenvolvido que possui um repositoacuterio naplataforma github Os termos commit snapshops e versotildees tambeacutem representam a mesmacoisa uma vez que foi definido que seriam utilizados apenas um commit por mecircs pararepresentar um determinado snapshot ou versatildeo do repositoacuterio em questatildeo

Todos os 99 projetos seratildeo utilizados para a realizaccedilatildeo de uma anaacutelise geral de ca-racterizaccedilatildeo do uso de expressotildees lambda Para as anaacutelises aprofundadas foi feito umcriteacuterio de classificaccedilatildeo para que apenas alguns projetos possam ser analisados em niacutevelde coacutedigo como estudos de caso

Resumindo foram escolhidos os 99 projetos mais populares de Java no github cole-tando dados mensais de seus commits a partir do ano de 2013 ateacute a data da coleta dosdados lembrando que nem todos os projetos existem desde 2013 (projetos mais recentes)

43 Processo de Mineraccedilatildeo

A abordagem utilizada para coletar e analisar os 99 projetos escolhidos como mostra aFigura 42 foi realizada de forma automatizada utilizando scripts python e dois projetosdesenvolvidos em Java para a coleta e tratamento de dados como descrito a seguir

Primeiramente foi realizado uma coacutepia dos repositoacuterios atuais de todos os 99 projetosmais populares do github em Java Para automatizar o processo foi desenvolvido umscript em python que lista todos os projetos escolhidos clona todos os repositoacuterios emuma pasta na maacutequina local e cria um arquivo temporaacuterio com as informaccedilotildees do nomede cada repositoacuterio e seu caminho absoluto na maacutequina local

25

Figura 42 Metodologia implementada para coleta e tratamento de dados

Em seguida foi necessaacuterio realizar o checkout de todas as versotildees entre Janeiro de2013 a Abril de 2017 de cada projeto Por motivos de otimizaccedilatildeo de espaccedilo da maacutequinalocal e automatizaccedilatildeo no processo de checkout utilizou-se de um segundo script pythonque realizava as seguintes tarefas para cada mecircs em cada projeto verificar se dentreo mecircs estipulado houve algum commit para aquele projeto se sim pega-se o hash douacuteltimo commit do mecircs realiza o checkout conta-se a quantidade de linhas de coacutedigo emJava que o projeto tem utilizando a biblioteca cloc e armazena todas as informaccedilotildeespertinentes referentes a todos os projetos que naquele mecircs tiveram commits para que oprojeto static-analysis possa entatildeo ser executado sobre esses projetos naquele determinadomomento As informaccedilotildees coletadas que satildeo utilizadas pelo static-analysis correspondemao nome do projeto o hash do commit para aquela versatildeo a pasta onde o projeto estaacutearmazenado na maacutequina local a quantidade de linhas de coacutedigo Java do projeto e datareferente ao commit Essas informaccedilotildees satildeo pertinentes para que o projeto static-analysisconsiga funcionar de forma correta projeto este descrito em detalhes a seguir

431 static-analysis

O static-analysis foi um projeto desenvolvido anteriormente a este trabalho pelos alunosThiago Cavalcanti e Vinicius de Almeida cujo objetivo eacute realizar a anaacutelise estaacutetica de

26

coacutedigos-fonte Java e gerar arquivos de saiacuteda contendo informaccedilotildees de classes e meacutetodoscom suas devidas ocorrecircncias de caracteriacutesticas da linguagem [40]

A anaacutelise estaacutetica de coacutedigo consiste em analisar um coacutedigo-fonte sem a necessidadede executaacute-lo Esse tipo de anaacutelise eacute de extrema importacircncia para manter um coacutedigo dequalidade evitar futuras refatoraccedilotildees e obter informaccedilotildees estatiacutesticas de forma raacutepida epraacutetica [41]

Seguindo esse princiacutepio o static-analysis foi projetado para receber um arquivo deentrada csv seguindo o padratildeo

Tipo da Aplicaccedilatildeo Inicio do projeto Antes ou Apoacutes Java 5 Nome do ProjetoVersatildeo Caminho absolutoQuantidade de linhas de coacutedigo

Atraveacutes da informaccedilatildeo do caminho absoluto do projeto o static-analysis varre osdiretoacuterios em busca dos arquivos fonte java realiza o parse desses arquivos e utilizade Visitors para extrair as informaccedilotildees desejadas e exporta-las em arquivos csv Ouso de Visitors permite que sejam escolhidas as informaccedilotildees desejadas para a consultacomo expressotildees Lambda e AIC s aleacutem de possibilitar que sejam implementados novosVisitors conforme a linguagem evolua ou as necessidades mudem

Para este trabalho foram utilizados os Visitors de expressotildees Lambda map() filter()AICs e declaraccedilotildees de meacutetodos

432 BDAnalisador

Apoacutes obter todas as informaccedilotildees necessaacuterias geradas pelo static-analysis era preciso ma-nipular os dados de forma que facilitasse a coleta de dados para o estudo proposto Comovaacuterios arquivos em formato csv satildeo de difiacutecil manipulaccedilatildeo foi desenvolvido entatildeo umaferramenta chamada BDAnalisador Esta ferramenta eacute responsaacutevel por processar os arqui-vos em csv gerados pelo static-analysis e popular uma base de dados relacional MySQLcom as informaccedilotildees pertinentes a este estudo

O BDAnalisador foi desenvolvido com a intenccedilatildeo de tornar mais simples o trabalhocom os dados resultantes do static-analysis de forma que consultas em SQL pudessemser feitas a ponto de permitir a obtenccedilatildeo de resultados mais complexos Seguindo esseobjetivo o framework Hibernate foi escolhido como ferramenta para persistecircncia devidoa ser um framework jaacute consolidado no mercado e que de forma simples relaciona osobjetos Java ao banco de dados MySQL [42] A divisatildeo de classes foi projetada em quatroentidades Projeto Versao Classe e Metodo cada uma com seus respectivos camposcontendo as informaccedilotildees necessaacuterias para a pesquisa como pode ser visto na Figura 44Eacute importante ressaltar que a tabela de Versao guarda hashs de commits devido agrave escolhade utilizar commits para obter mais informaccedilatildeo de evoluccedilatildeo de coacutedigo em um menor

27

espaccedilo de tempo Aleacutem disso para este trabalho optou-se por persistir todos os meacutetodose classes de cada versatildeo sem se importar com a repeticcedilatildeo desses dados pois a hipoacutetesede haver grandes refatoraccedilotildees entre versotildees poderia comprometer a confiabilidade dasinformaccedilotildees

Figura 43 Diagrama de classes UML do BDAnalisador

Como visto na Figura 43 seguindo parcialmente a arquitetura MVC cada entidadepossui sua respectiva classe DAO(Data Access Object) para persistecircncia dos dados eapenas uma classe Controlador no projeto responsaacutevel pela manipulaccedilatildeo e parse dosdados dos arquivos csv gerados pelo static analysis para serem enviados agraves classes DAOO sistema inicia chamando o meacutetodo inicializar() da classe Controlador Esse meacutetodoeacute responsaacutevel por ler um arquivo de entrada csv que segue o mesmo modelo do arquivo dostatic-analysis citado na seccedilatildeo anterior O arquivo conteacutem os dados de todos os projetose suas respectivas versotildees dessa forma o meacutetodo instancia um objeto da classe Projetoe persiste o projeto no banco de dados Para cada versatildeo encontrada no arquivo deentrada o inicializar() aciona os meacutetodos responsaacuteveis por instanciar e preencher aslistas da classe Classe e Metodo Os meacutetodos responsaacuteveis por preencher as listas varremos arquivos csv gerados pelo static-analysis e fazem o parse das informaccedilotildees relevantescomo nomes dos meacutetodos e quantidades de lambdas para construir os objetos que seratildeogravados Ao final dos preenchimentos o objeto Versatildeo eacute instanciado e gravado no bancode dados atraveacutes de sua classe DAO ao mesmo tempo que grava suas respectivas Classese Metodos

28

Apoacutes vaacuterios testes e correccedilotildees de bugs o banco de dados se encontrava finalmente comas informaccedilotildees de 99 projetos Java open-source separados por um commit por mecircs desde2013 cada um com suas respectivas informaccedilotildees de classes meacutetodos e a quantidade deexpressotildees lambda filters e maps em cada meacutetodo Filter ou Filter pattern eacute o padratildeode projeto que tem como objetivo filtrar objetos de uma coleccedilatildeo (Collection) de acordocom algum criteacuterio Jaacute o map ou map pattern eacute um padratildeo que ldquomapeia os elementosde uma coleccedilatildeo aplicando uma funccedilatildeo a eles para uma nova coleccedilatildeo [43] A coleta deinformaccedilotildees sobre esses padrotildees podem ser uacuteteis para possiacuteveis anaacutelises de oportunidadesde uso de expressotildees lambda para refatoraccedilatildeo de coacutedigo

A Figura 44 mostra o esquema de como o banco de dados resultante foi gerado

Figura 44 Modelo relacional do banco de dados populado pelo BDAnalisador Imagemgerada com software DBeaver [2]

44 Classificaccedilatildeo e Anaacutelise

Com o banco de dados populado restam apenas as etapas de classificaccedilatildeo e anaacutelise pararesponder as questotildees de pesquisa propostas Para isso inicialmente houve uma tentativade se utilizar apenas queries SQL para analisar os dados de acordo com as informaccedilotildeesrelevantes Poreacutem devido ao fato de o banco de dados conter todas as informaccedilotildees detodos os projetos e todas as suas versotildees queries que possuem uma alta complexidadedemoravam muito tempo para retornar os dados

Assim com o objetivo de facilitar o trabalho alguns scripts python foram desenvolvi-dos para rodar as queries separadamente e individualmente para cada projeto de formaautomatizada a fim de melhorar o tempo de resposta para obtenccedilatildeo dos resultados

29

441 Meacutedia de Lambda

O primeiro script retorna a quantidade de expressotildees lambda (ou AICs) por n snapshotsque contenha expressotildees lambda O objetivo eacute ter uma visatildeo geral da meacutedia de expressotildeeslambda e AICs utilizadas por cada projeto e como nem todos os snapshots coletados decada projeto possuem expressotildees lambda e AICs apenas aqueles com alguma expressatildeolambda ou AIC satildeo incluiacutedos no caacutelculo da meacutedia

Mmedia =sumn qtdLambdai

n

442 Anaacutelise Temporal

O segundo script retorna para cada projeto a soma total da quantidade de expressotildeeslambda AIC map() e filter() no projeto inteiro para cada versatildeo Ou seja tem-seo total de cada uma das quatro propriedades selecionadas para cada mecircs do projetoobtendo assim uma visatildeo temporal de evoluccedilatildeo do uso das caracteriacutesticas descritas ATabela 41 ilustra parcialmente o resultado obtido para o projeto agera onde idVersaoeacute o identificador no banco de dados referente ao hash do commit mensal coletado qtd eacutea quantidade de cada uma das caracteriacutesticas escolhidas e a data do commit encontra-seno formato americano

Tabela 41 Informaccedilotildees mensais sobre o projeto ageraidVersao Data do Commit qtd lambda qtd AIC qtd maps qtd filter

823 512016 0 29 4 0755 612016 13 28 4 0686 6152016 13 29 4 0621 812016 13 29 4 0555 8162016 13 30 4 0485 922016 13 30 4 0422 10132016 14 30 4 0356 11282016 14 30 4 0295 12212016 21 30 5 0232 212017 21 30 5 0175 312017 21 30 5 0112 3312017 21 36 5 048 4242017 21 48 5 0

Os resultados obtidos com esta anaacutelise temporal permitiu a identificaccedilatildeo de padrotildees nautilizaccedilatildeo de expressotildees lambda em relaccedilatildeo a utilizaccedilatildeo de AIC por todos os projetos Foi

30

possiacutevel classificar todos os projetos em 6 grupos ilustrado na Figura 45 Primeiramenteseparou-se os projetos entre os que possuem expressotildees lambda e os que natildeo possuemDentre os que possuem identificou-se cinco categorias

1 Grupo 1 Quantidade de AICs e expressotildees lambda aumentam com o tempo pro-porcionalmente

2 Grupo 2 Quantidade de AICs diminui agrave medida que a quantidade de expressotildeeslambda aumentam e a quantidade de expressotildees lambda ultrapassa a quantidade deAIC em um determinado momento

3 Grupo 3 Quantidade de AICs diminui agrave medida que a quantidade de expressotildeeslambda aumentam mas a quantidade de AIC permanece superior agrave quantidade delambda

4 Grupo 4 Expressotildees lambda satildeo introduzidas e existem por um pequeno periacuteodode tempo mas satildeo completamente removidas posteriormente

5 Grupo 5 Quantidade de expressotildees lambda eacute constante e muito inferior compa-rado com a quantidade de AICs no projeto Foi determinado que para pertencera esta classificaccedilatildeo o projeto precisa ter uma razatildeo de meacutedia de expressotildees lamb-dasnapshot por meacutedia de AICsnapshot inferior a 020 Esse paracircmetro foi esta-belecido com o objetivo de definir um padratildeo para o que pode ser considerado umprojeto com poucas expressotildees lambda

Figura 45 Classificaccedilatildeo dos projetos

31

443 Refatoraccedilatildeo de Coacutedigo

O uacuteltimo script teve como objetivo realizar uma tentativa inicial de identificar refatoraccedilatildeode coacutedigo da seguinte maneira para todos os projetos que possuem expressotildees lambdaforam identificados o mecircs imediatamente antes da introduccedilatildeo de expressotildees lambda e omecircs seguinte onde houve a primeira ocorrecircncia de lambda no projeto Assim realizou-se uma anaacutelise do tamanho em quantidade de linhas de coacutedigo de todos os meacutetodosdo projeto que no mecircs seguinte tiveram introduccedilatildeo de lambda Em seguida fez-se umacomparaccedilatildeo com os mesmos meacutetodos em relaccedilatildeo ao mecircs anterior e assim foi possiacuteveldetectar quais meacutetodos tiveram a quantidade de linhas de coacutedigo reduzidas o que seriaum indicativo natildeo necessariamente exclusivo de que uma refatoraccedilatildeo de coacutedigo possa terocorrido

Sabe-se que este meacutetodo de detecccedilatildeo de refatoraccedilatildeo de coacutedigo possui suas limitaccedilotildeesuma vez que as comparaccedilotildees para saber se um meacutetodo existe em ambas versotildees eacute feitopuramente por comparaccedilatildeo de String (nome do meacutetodo) e a classe que este pertence

444 Casos de Uso

Os meacutetodos descritos acima ajudaram a identificar alguns padrotildees e facilitar a anaacutelise dosdados Poreacutem natildeo satildeo suficientes para que se possa responder agraves questotildees de pesquisaDessa forma apoacutes a identificaccedilatildeo dos grupos de classificaccedilatildeo para os projetos foramescolhidos um projeto de cada grupo (com exceccedilatildeo do grupo dos projetos sem expressotildeeslambda) para realizar um breve estudo de caso com o objetivo de identificar e caracterizarmelhor a adoccedilatildeo de expressotildees lambda Os projetos escolhidos foram agera vertxAndroid-CleanArchitecture RxJava e guava

32

Capiacutetulo 5

Resultados Obtidos e Anaacutelise

Neste capiacutetulo seratildeo apresentados os dados obtidos e anaacutelise com o objetivo de responderagraves questotildees de pesquisa propostas Como mencionado anteriormente as perguntas seratildeorespondidas de duas maneiras algumas com informaccedilotildees gerais sobre todos os projetose outras com breve estudos de caso envolvendo cinco projetos

51 Visatildeo Geral

Dentre os repositoacuterios coletados para a anaacutelise 74 (7474) natildeo utilizaram nenhumaexpressatildeo lambda no projeto durante todo o periacuteodo analisado (Janeiro de 2013 a Abrilde 2017) restando apenas 25 repositoacuterios (2525) com expressotildees lambda Eacute interessantedestacar que apesar de a quantidade de repositoacuterios que natildeo possuem expressotildees lambdaser relativamente expressiva muitos destes repositoacuterios satildeo de projetos em Java que umdia foram populares e atualmente natildeo estatildeo sendo mais desenvolvidos (por exemplo umaplicativo que soacute funciona para Android 23 atualmente descontinuado)

Levando em consideraccedilatildeo apenas os projetos que possuem expressotildees lambda exis-tem dois tipos de dados que podem ser analisados para responder agrave primeira questatildeo depesquisa atraveacutes dos dados obtidos pelo meacutetodo anteriormente mencionado como anaacutelisetemporal e a meacutedia de lambda por snapshot mencionados no capiacutetulo anterior

Com relaccedilatildeo ao ano em que a primeira ocorrecircncia foi encontrada 6 projetos introduzi-ram expressotildees lambda jaacute em 2014 8 comeccedilaram a utilizar em 2015 7 em 2016 e apenas4 tiveram a primeira ocorrecircncia de expressotildees lambda em 2017 Dessa forma percebe-seque os projetos estatildeo relativamente bem distribuiacutedos em grupos quanto ao ano em que seintroduziu expressotildees lambda

Pela meacutedia de lambda por snapshot (lambdasnapshot) a maioria (11 projetos) possuiuma quantidade expressiva acima de 100 lambdasnapshot (com 6 projetos entre 20 e 100lambdasnapshot e 8 projetos com menos de 20 lambdasnapshot) como apresentados no

33

graacutefico da Figura 51 Isso mostra que essa nova caracteriacutestica jaacute estaacute sendo bem utilizadanos projetos que comeccedilaram a migrar para a nova versatildeo do Java

Figura 51 Graacuteficos dos projetos separados por ano de introduccedilatildeo de expressotildees lambdae meacutedia de lambda por snapshot

Com isso pode-se observar que apesar de a quantidade de projetos que possuemexpressotildees lambda natildeo ser tatildeo alta eacute possiacutevel obter resultados expressivos uma vez quea quantidade dos projetos com lambda estatildeo bem dispersos quanto ao periacuteodo em quecomeccedilaram a adotar essa caracteriacutestica e a quantidade de expressotildees lambda por snapshot

511 Projetos Selecionados

Atraveacutes dos grupos de classificaccedilatildeo identificados pela anaacutelise temporal descritos na Figura45 cinco projetos foram selecionados para uma anaacutelise detalhada levando em consideraccedilatildeoo grupo em que eles pertencem Estes projetos seratildeo apresentados a seguir

512 agera

Agera eacute uma biblioteca Android que ajuda a introduzir programaccedilatildeo funcional reativa(functional reactive programming) em projetos Android Eacute um projeto recente lanccediladoem 2016 pela Google [44] e encontra-se no grupo dos projetos que introduziram expressotildeeslambda em 2016 no mesmo ano de seu lanccedilamento contendo uma meacutedia de expressotildeeslambda de 16 lambdasnapshot

Na classificaccedilatildeo estabelecida agera pertence ao Grupo 1 onde a quantidade de ex-pressotildees lambda no projeto com o tempo aumentam juntamente com a quantidade deAICs como mostra o graacutefico de anaacutelise temporal na Figura 52

34

Figura 52 Graacuteficos de anaacutelise temporal do projeto agera

513 vertx

Eclipse Vertx eacute um conjunto de ferramentas para criaccedilatildeo de reactive applications namaacutequina virtual Java (JVM) em grande escala [45] Seu primeiro lanccedilamento aconteceuem 2011 e a primeira ocorrecircncia de expressotildees lambda no projeto aconteceu em 2014 Esteprojeto possui uma meacutedia de 2867 lambdasnapshot e dentre os projetos consideradosneste trabalho eacute o que possui a maior quantidade de expressotildees lambda

Este projeto pertence ao Grupo 2 onde a quantidade de expressotildees lambda aumen-tou consideravelmente pelos meses ultrapassando a quantidade de AICs que diminuiudrasticamente como mostra a Figura 53

35

Figura 53 Graacuteficos de anaacutelise temporal do projeto Vertx

514 Android-CleanArchitecture

Apesar de ser uma amostra de projeto Android-CleanArchitecture que tem como objetivoconstruir aplicaccedilotildees Android utilizando clean architecture foi lanccedilado em 2014 mas semanteacutem sempre atualizado [46]

A introduccedilatildeo de expressotildees lambda que aconteceu no ano de 2015 se deu de formatiacutemida com uma meacutedia de 35 lambdasnapshot De qualquer forma este projeto conseguerepresentar com seu graacutefico de anaacutelise temporal o grupo 3 composto por projetos em quea quantidade de expressotildees lambda aumentou mas sem ultrapassar AICs que diminuiacuteramdemonstrado no graacutefico da Figura 54

36

Figura 54 Graacuteficos de anaacutelise temporal do projeto Android-CleanArchitecture

515 RxJava

Dentre os repositoacuterios estudados RxJava eacute considerado o mais popular Como umaimplementaccedilatildeo de Reactive Extensions para a JVM RxJava teve seu lanccedilamento dadoem 2013 [47] Expressotildees lambda apareceram pela primeira vez no ano de 2015 comuma meacutedia de 766 lambdasnapshot

Apesar de uma meacutedia relativamente alta o tempo de vida das expressotildees lambda nesteprojeto foi bem curto caracterizando assim projetos do grupo 4 houve a introduccedilatildeo dasexpressotildees lambda no projeto poreacutem houve a remoccedilatildeo completa de todas as expressotildeeslambda previamente introduzidas desaparecendo completamente do projeto ateacute a datada coleta de dados (Figura 55)

37

Figura 55 Graacuteficos de anaacutelise temporal do projeto RxJava

516 guava

Guava eacute um conjunto de bibliotecas para Java da Google lanccedilado em 2011 A atualizaccedilatildeodo coacutedigo do projeto para Java 8 aconteceu somente em 2016 e apesar do projeto conteruma meacutedia de 281 lambdasnapshot ele foi escolhido como representante dos projetosdo Grupo 5 (Figura 56) que possuem expressotildees lambda mas de forma natildeo expressiva osuficiente quando comparado com a quantidade de AIC pelo fato de sua razatildeo de meacutedia delambdasnapshot por meacutedia de AICsnapshot ser 004 Ou seja embora o projeto tenhaexpressotildees lambda estas satildeo consideradas muito poucas quando inseridas no contextogeral deste projeto que eacute considerado um projeto grande

38

Figura 56 Graacuteficos de anaacutelise temporal do projeto Guava

52 Refatoraccedilatildeo de Coacutedigo

Com o objetivo de caracterizar melhor como as expressotildees lambda estatildeo sendo utilizadaseacute interessante identificar se estas estatildeo sendo introduzidas atraveacutes de refatoraccedilatildeo de coacutedigoou em coacutedigo novo

Os projetos classificados como pertencentes ao Grupo 2 possuem em comum o fatode expressotildees lambda aumentarem a medida que AICs diminuem ultrapassando-as eessa caracteriacutestica em comum pode indicar que nestes projetos possivelmente houve re-fatoraccedilatildeo de coacutedigo visto que AIC sendo substituiacutedo por expressotildees lambda dentro dascondiccedilotildees determinadas eacute a maneira mais comum de se identificar refatoraccedilatildeo de coacute-digo para introduccedilatildeo de expressotildees lambda [12] Os projetos que compotildeem o grupo 2representam 44 de todos os projetos estudados que possuem expressotildees lambda o quepode ser um indicativo caso a hipoacutetese de refatoraccedilatildeo de coacutedigo seja positiva de quemuitos projetos que estatildeo adotando o Java 8 estatildeo se preocupando de alguma formacom refatoraccedilatildeo se coacutedigo Fazem parte desse grupo os seguintes projetos elasticsearchjava-design-patterns PocketHub presto RxJava-Android-Samples spark vertx zipkinjava8-tutorial dropwizard e material-dialogs

39

Outra maneira de verificar possiacuteveis indicadores de refatoraccedilatildeo de coacutedigo foi atraveacutesda anaacutelise dos tamanhos (em quantidade de linhas de coacutedigo) dos meacutetodos com expressotildeeslambda no mecircs em que se introduziu expressotildees lambda e um mecircs imediatamente antesdeste Essa anaacutelise mostra que dos 25 projetos com expressotildees lambda 12 (48) projetostiveram ao menos um meacutetodo em que houve uma diminuiccedilatildeo no tamanho o que podeser considerado um indicativo de refatoraccedilatildeo de coacutedigo A Figura 57 mostra todos osprojetos em relaccedilatildeo agrave quantidade total de meacutetodos que possuem lambda no primeiro mecircsde introduccedilatildeo do mesmo em vermelho comparado com a quantidade desses meacutetodos quetiveram uma diminuiccedilatildeo no tamanho quando comparados com o coacutedigo do mecircs anteriorem azul

Figura 57 Comparaccedilatildeo entre todos os projetos com expressatildeo lambda sobre refatoraccedilatildeode coacutedigo no mecircs de introduccedilatildeo da caracteriacutestica

Ainda observando a figura 57 com relaccedilatildeo aos projetos que natildeo tiveram nenhummeacutetodo com diminuiccedilatildeo de tamanho (barra azul) percebe-se que todos os 13 projetossequer tiveram uma quantidade significativa de meacutetodos que possuem expressotildees lambda(com o maior tendo apenas 5 meacutetodos) no mecircs de introduccedilatildeo da caracteriacutestica no projetoe ao mesmo tempo jaacute existiam no mecircs em que natildeo existia lambda no projeto Essa eacuteuma observaccedilatildeo importante porque projetos como vertx sendo este o que possui a maiormeacutedia de lambdasnapshot de todos os projetos e ao mesmo tempo tendo apenas trecircsmeacutetodos que continham expressotildees lambda no mecircs da introduccedilatildeo e que existiam no mecircs

40

anterior permitem inferir que todas as outras expressotildees lambda existentes no projetopara este determinado mecircs de introduccedilatildeo encontram-se em coacutedigo novo introduzido

Eacute importante ressaltar que somente essa anaacutelise natildeo eacute exclusivamente suficiente paradeterminar se estes projetos estatildeo realmente introduzindo lambda em coacutedigo novo ourealizando refatoraccedilatildeo uma vez que como a comparaccedilatildeo aconteceu apenas no mecircs deintroduccedilatildeo com o mecircs imediatamente anterior natildeo reflete todo o ciclo de vida do pro-jeto Por exemplo algumas equipes podem escolher refatorar o coacutedigo depois de umtempo de adaptaccedilatildeo apoacutes a transiccedilatildeo para a nova versatildeo da linguagem Assim paraobter uma melhor anaacutelise sobre refatoraccedilatildeo de coacutedigo ou natildeo feita nestes projetos aleacutemde outras anaacutelises referentes aos padrotildees tipicamente adotados para implementaccedilatildeo delambda nestes projetos seratildeo apresentados a seguir os estudos de caso dos cinco projetospreviamente selecionados

Outro ponto importante eacute o fato de que apesar das informaccedilotildees quanto agraves quantida-des de filter e map terem sido incluiacutedas inicialmente no trabalho para observar possiacuteveispadrotildees de refatoraccedilatildeo de coacutedigo percebeu-se que estas natildeo satildeo utilizadas de forma con-sideraacutevel pelos projetos estudados e para fins de anaacutelises generalizadas natildeo apresentaramtanta influecircncia na utilizaccedilatildeo de expressotildees lambda quanto a quantidade de AICs noprojeto

53 Estudos de Caso

Dentre os projetos analisados verificou-se que os projetos de pequeno e meacutedio porte op-taram por refatorar de uma vez seus coacutedigos para incluir expressotildees lambda em situaccedilotildeesem que se utilizava AICs anteriormente ou em alguns poucos casos de utilizaccedilatildeo deCollection Os projetos de grande porte natildeo apresentaram nenhuma refatoraccedilatildeo de coacute-digo ou uma refatoraccedilatildeo parcial gradativa provavelmente devido agrave grande quantidade dearquivos e coacutedigo que possuem o que pode tornar o trabalho de refatoraccedilatildeo extenso ecansativo

O projeto vertx que pertence ao grupo 2 dos projetos em que a quantidade de ex-pressotildees lambda aumentaram e as de AICs diminuiacuteram com lambda ultrapassando AICsexecutou inicialmente commits em maio de 2014 com adiccedilatildeo de coacutedigo novo utilizandoexpressotildees lambda e apoacutes um mecircs realizou um commit maior com a refatoraccedilatildeo de todasas AICs para expressotildees lambda Apoacutes a refatoraccedilatildeo o projeto se preocupou em mantera utilizaccedilatildeo de expressotildees lambda ao mesmo tempo que o uso de AICs se manteve apenasaos casos de classes com interfaces natildeo funcionais A Figura 58 apresenta uma parte docommit de refatoraccedilatildeo de coacutedigo que mostra em vermelho a parte eliminada do coacutedigo(AIC) e em verde o coacutedigo novo representando a substituiccedilatildeo por uma expressatildeo lambda

41

Figura 58 Commit de refatoraccedilatildeo de coacutedigo do projeto Vertx [3]

Alguns projetos ainda natildeo se preocuparam em refatorar o coacutedigo para o uso de ex-pressotildees lambda ateacute a data deste trabalho que eacute o caso do projeto guava que apresentouum commit em 03112016 com a atualizaccedilatildeo do projeto para Java 8 Mas a partir daatualizaccedilatildeo se preocupou em utilizar as expressotildees lambda apenas na implementaccedilatildeo decoacutedigo novo O cenaacuterio em que a refatoraccedilatildeo natildeo eacute prioridade ainda eacute a realidade de vaacuteriosprojetos de grande porte visto que os dados de projetos sem nenhuma expressatildeo lambdasatildeo o maior nuacutemero neste trabalho Poreacutem projetos que jaacute adotaram a utilizaccedilatildeo do Java8 tendem a mudar isso com o passar do tempo A Figura 59 apresenta em verde umaadiccedilatildeo de coacutedigo novo com expressatildeo lambda sem a eliminaccedilatildeo de algum coacutedigo anteriora esse que estaria em vermelho

42

Figura 59 Exemplo de um arquivo do commit de adiccedilatildeo de coacutedigo novo em Java 8 doprojeto Guava [4]

Na categoria de projetos em que os AICs e expressotildees lambda aumentam proporci-onalmente (grupo 1) o projeto agera realizou um commit em 19052016 com a adiccedilatildeoda biblioteca retrolambda como dependecircncia do projeto Essa biblioteca utilizada prin-cipalmente por projetos Android permite executar coacutedigo Java 8 contendo expressotildeeslambda em Java 5 6 e 7 [48] O commit tambeacutem apresenta refatoraccedilatildeo dos AICs ad-vindos de interfaces funcionais para expressotildees lambda Apesar de o projeto continuar autilizar as expressotildees lambda em seus commits posteriores o nuacutemero de AICs tambeacutemcontinuou a aumentar visualizando os commits posteriores notou-se que esses AICs satildeorelativos a interfaces natildeo funcionais ou seja que possuem mais de um meacutetodo O projetoAndroid-CleanArchitecture eacute similar ao agera pois tambeacutem optou pela instalaccedilatildeo da bi-blioteca retrolambda para uso de expressotildees lambda em seus coacutedigos e como tambeacutem eacuteum projeto de pequeno porte houve uma pequena refatoraccedilatildeo dos AICs A Figura 510mostra a parte do commit de refatoraccedilatildeo de coacutedigo em que o desenvolvedor adiciona abiblioteca retrolambda como dependecircncia

43

Figura 510 Commit de adiccedilatildeo da biblioteca Retrolambda no projeto Agera [5]

Outro caso interessante eacute o do projeto RxJava que em 2015 optou pela refatoraccedilatildeodo coacutedigo para a utilizaccedilatildeo de expressotildees lambda quase eliminando por completo o usode AICs mas que no ano seguinte reverteu os commits de forma que eliminasse comple-tamente o uso de expressotildees lambda para manter a retrocompatibilidade com o Java 6A Figura 511 demonstra uma parte do commit de reversatildeo do coacutedigo para Java 6 emque pode ser visto em vermelho o coacutedigo anterior com expressotildees lambda e o verde como novo coacutedigo utilizando AIC novamente

44

Figura 511 Commit de remoccedilatildeo de Lambdas e volta para o uso de AICs no projetoRXJava [6]

Essa preocupaccedilatildeo com retrocompatibilidade de coacutedigo pode ser um fator crucial nadecisatildeo das equipes de desenvolvimento na hora de decidir como fazer o software co-evoluircom a linguagem sem perder a compatibilidade com versotildees anteriores

45

Capiacutetulo 6

Consideraccedilotildees Finais

Este estudo permitiu entender melhor como projetos estatildeo realizando a migraccedilatildeo para oJava 8 em especial utilizando uma nova caracteriacutestica introduzida expressatildeo lambdaApesar de a maioria dos projetos populares considerados natildeo possuiacuterem nenhuma ocor-recircncia de expressotildees lambda os projetos que tinham expressotildees lambda foram suficientespara realizar um primeiro estudo de caracterizaccedilatildeo no uso desta caracteriacutestica e com osprojetos efetivamente utilizados para estudo foi possiacutevel agrupaacute-los quanto a maneira emque as expressotildees lambda estavam sendo utilizadas quando comparadas com AICs em 5grandes grupos quando AIC e lambda aumentam proporcionalmente quando AIC dimi-nui e lambda aumenta ultrapassando AIC quando AIC diminui mas continua superior aolambda crescente expressotildees lambda que foram introduzidas e retiradas completamentedo coacutedigo e expressotildees lambda que natildeo existem em quantidades expressivas

Foi possiacutevel entatildeo realizar um estudo aprofundado levando em consideraccedilatildeo as di-ferentes maneiras com que as expressotildees lambda foram adotadas nos projetos atraveacutes daescolha de um projeto que representasse cada grupo para anaacutelise Dentre os cinco projetosestudados foi possiacutevel observar alguns padrotildees tipicamente adotados por desenvolvedorespara implementar expressotildees lambda em seus projetos como a utilizaccedilatildeo da bibliotecas(retrolambda) que permitissem uma flexibilizaccedilatildeo na utilizaccedilatildeo de expressotildees lambda oucomo lambda eacute primariamente utilizada para substituir determinados AICs ou operaccedilotildeesem Collection

Aleacutem disso foi possiacutevel observar como a refatoraccedilatildeo de coacutedigo acontece em cada umdesses projetos Observou-se como projetos menores tendem a refatorar coacutedigo maisfacilmente ao passo que projetos maiores e mais complexos fazem menos refatoraccedilatildeo oudemoram mais entre o periacuteodo em que houve a primeira migraccedilatildeo de coacutedigo para a novaversatildeo da linguagem ateacute o periacuteodo em que realmente decidem refatorar coacutedigo Aleacutem dacomplexidade do projeto influenciar na decisatildeo de migrar o projeto para uma versatildeo maisrecente da linguagem a preocupaccedilatildeo com retrocompatibilidade com versotildees anteriores da

46

linguagem tambeacutem podem ser uma barreira para que projetos comecem a evoluir o coacutedigojuntamente com a evoluccedilatildeo da linguagem

Ainda assim foi possiacutevel observar que a preocupaccedilatildeo com a co-evoluccedilatildeo do software-linguagem existe entre os desenvolvedores de projetos mas a realizaccedilatildeo da migraccedilatildeo aindaacontece lentamente devido agrave diversos fatores que precisam ser levados em consideraccedilatildeopara a manutenccedilatildeo do projeto

Para trabalhos e contribuiccedilotildees futuras seria interessante desenvolver uma ferramentaque pudesse analisar diretamente no coacutedigo-fonte as oportunidades de aplicaccedilatildeo de ex-pressotildees lambda dessa forma poderiam ser analisadas as porcentagens de conversatildeo decoacutedigo para Java 8 e obter melhores conclusotildees sobre a importacircncia que os projetos estatildeodando para a evoluccedilatildeo de seus coacutedigos Outro fator interessante seria aplicar mais Visitorsagrave ferramenta static-analysis e fazer este mesmo estudo aplicado agrave outras caracteriacutesticasda linguagem

47

Referecircncias

[1] Kagdi Huzefa Michael L Collard e Jonathan I Maletic A survey and taxonomyof approaches for mining software repositories in the context of software evolution2007 ix 3 8 9 10 11

[2] DBeaver Dbeaver - features httpdbeaverjkissorgdocsfeatures ix 29

[3] Eclipse Vertx commit Java8-ify code httpsgithubcomeclipsevertxcommit93f95e9c77419f442a42fe711b6eeaef88192fd3 ix 42

[4] Google Guava commit Release java 8 changes to guava httpsgithubcomgoogleguavacommit73e382fa877f80994817a136b0adcc4365ccd904 ix 43

[5] Google Agera commit Collapsed testapp with retrolambda httpsgithubcomgoogleageracommit5e518b7b05f9e7a34a314945f68deff7b2c3e334 ix 44

[6] ReactiveX Rxjava commit 2x full jdk 6 compatible backport + includ-ing bugfixes up to today httpsgithubcomReactiveXRxJavacommit000a174d87a901135f9665d3b11f3627fd2dc4ed ix 45

[7] Godfrey M W e D M German The past present and future of software evolutionEm 2008 Frontiers of Maintenance paacuteginas 129ndash138 Sept 2008 1 6

[8] Favre J M Languages evolve too changing the software time scale Em Principles ofSoftware Evolution Eighth International Workshop on paacuteginas 33ndash42 IEEE 20051 5 7

[9] Overbey Jeffrey L e Ralph E Johnson Regrowing a language refactoring tools allowprogramming languages to evolve Em ACM SIGPLAN Notices volume 44 paacuteginas493ndash502 ACM 2009 1 5 7 8 12

[10] Grechanik Mark Collin McMillan Luca DeFerrari Marco Comi Stefano CrespiDenys Poshyvanyk Chen Fu Qing Xie e Carlo Ghezzi An empirical investiga-tion into a large-scale java open source code repository Em Proceedings of the2010 ACM-IEEE International Symposium on Empirical Software Engineering andMeasurement ESEM rsquo10 paacuteginas 111ndash1110 New York NY USA 2010 ACMISBN 978-1-4503-0039-1 httpdoiacmorg10114518527861852801 1

[11] TIOBE Tiobe httpswwwtiobecomtiobe-index 1 14

48

[12] Gyori Alex Lyle Franklin Danny Dig e Jan Lahoda Crossing the gap from im-perative to functional programming through refactoring Em Proceedings of the 20139th Joint Meeting on Foundations of Software Engineering ESECFSE 2013 paacute-ginas 543ndash553 New York NY USA 2013 ACM ISBN 978-1-4503-2237-9 httpdoiacmorg10114524914112491461 2 11 24 39

[13] OpenJDK State of the lambda httpcropenjdkjavanet~briangoetzlambdalambda-state-4html 2

[14] Han Jiawei Micheline Kamber e Jian Pei Data Mining Concepts and TechniquesMorgan Kaufmann Publishers Inc San Francisco CA USA 3rd ediccedilatildeo 2011ISBN 0123814790 9780123814791 3

[15] Fowler Martin e Kent Beck Refactoring improving the design of existing codeAddison-Wesley Professional 1999 5 7

[16] Lehman M M J F Ramil P D Wernick D E Perry e W M Turski Met-rics and laws of software evolution - the nineties view Em Proceedings of the4th International Symposium on Software Metrics METRICS rsquo97 paacuteginas 20ndashWashington DC USA 1997 IEEE Computer Society ISBN 0-8186-8093-8 httpdlacmorgcitationcfmid=823454823901 6

[17] Hassan Ahmed E e Tao Xie Software intelligence The future of mining softwareengineering data Em Proceedings of the FSESDP Workshop on Future of SoftwareEngineering Research FoSER rsquo10 paacuteginas 161ndash166 New York NY USA 2010ACM ISBN 978-1-4503-0427-6 httpdoiacmorg101145188236218823978 9

[18] Hassan Ahmed E The road ahead for mining software repositories Em Frontiers ofSoftware Maintenance 2008 FoSM 2008 paacuteginas 48ndash57 IEEE 2008 8

[19] Berry Michael J e Gordon Linoff Data Mining Techniques For Marketing Salesand Customer Support John Wiley amp Sons Inc New York NY USA 1997ISBN 0471179809 10

[20] Parnin Chris Christian Bird e Emerson Murphy-Hill Java generics adoption hownew features are introduced championed or ignored Em Proceedings of the 8thWorking Conference on Mining Software Repositories paacuteginas 3ndash12 ACM 2011 12

[21] Oracle The java language specification httpsdocsoraclecomjavasespecsjlsse8jls8pdf 13

[22] Oracle The history of java technology httpwwworaclecomtechnetworkjavajavaseoverviewjavahistory-index-198355html 13

[23] Murphy Kieron So why did they decide to call itjava httpwwwjavaworldcomarticle2077265core-javaso-why-did-they-decide-to-call-it-java-html 13

[24] McGraw Tata Object-oriented Programming with Java Essentials and ApplicationsHill Education 13

49

[25] Oracle Differences between java ee and java se httpdocsoraclecomjavaee6firstcupdocgkhoyhtml 13

[26] Lindsey Clark S The History of Java Cambridge 14

[27] Oracle The java language environment httpwwworaclecomtechnetworkjavaintro-141325html 14

[28] Oracle Jdk 8 httpopenjdkjavanetprojectsjdk8 15 24

[29] Oracle Enhancements in java se 8 httpdocsoraclecomjavase8docstechnotesguideslanguageenhancementshtmljavase8 15 16 17

[30] Oracle Lambda expressions httpdocsoraclecomjavasetutorialjavajavaOOlambdaexpressionshtml 16 18 21

[31] Oracle Method references httpdocsoraclecomjavasetutorialjavajavaOOmethodreferenceshtml 16

[32] Oracle Default methods httpdocsoraclecomjavasetutorialjavaIandIdefaultmethodshtml 17

[33] Oracle Repeating annotations httpdocsoraclecomjavasetutorialjavaannotationsrepeatinghtml 17

[34] Oracle Type annotations httpdocsoraclecomjavasetutorialjavaannotationstype_annotationshtml 17

[35] Oracle Anonymous inner classes httpsdocsoraclecomjavasetutorialjavajavaOOanonymousclasseshtml 19

[36] Kothari CR Research Methodology Methods and Techniques New Age Interna-tional (P) Limited 2004 ISBN 9788122415223 httpsbooksgooglecombrbooksid=8c6gkbKi-F4C 22

[37] Nakakoji Kumiyo Yasuhiro Yamamoto Yoshiyuki Nishinaka Kouichi Kishida eYunwen Ye Evolution patterns of open-source software systems and communitiesEm IWPSE rsquo02 Proceedings of the International Workshop on Principles of SoftwareEvolution paacuteginas 76ndash85 New York NY USA 2002 ACM Press ISBN 1581135459httpdxdoiorg101145512035512055 23

[38] Rahman Foyzur Christian Bird e Premkumar Devanbu Clones What is that smellEmpirical Software Engineering 17(4-5)503ndash530 2012 24

[39] Chacon Scott Pro Git Apress Berkely CA USA 1st ediccedilatildeo 2009ISBN 1430218339 9781430218333 25

[40] Cavalcanti Thiago Gomes e Viniacutecius Correa de Almeida Caracterizaccedilatildeo do uso deconstruccedilotildees da linguagem java em projetos open-source Publicaccedilatildeo online 2016httpbdmunbbrhandle1048315733 27

50

[41] Parr Terence Language Implementation Patterns Create Your Own Domain-Specific and General Programming Languages Pragmatic Bookshelf 1st ediccedilatildeo 2009ISBN 193435645X 9781934356456 27

[42] Janssen Thorben 5 reasons to use jpa hibernate Publicaccedilatildeo online httpswwwsitepointcom5-reasons-to-use-jpa-hibernate 27

[43] Franklin Lyle Alex Gyori Jan Lahoda e Danny Dig Lambdaficator From imperativeto functional programming through automated refactoring Em Proceedings of the2013 International Conference on Software Engineering ICSE rsquo13 paacuteginas 1287ndash1290 Piscataway NJ USA 2013 IEEE Press ISBN 978-1-4673-3076-3 httpdlacmorgcitationcfmid=24867882486986 29

[44] Google Agera httpsgithubcomgoogleagerawiki 34

[45] Eclipse Eclipse vertx httpvertxio 35

[46] Cejas Fernando Android cleanarchitecture httpsgithubcomandroid10Android-CleanArchitecture 36

[47] ReactiveX Rxjava httpsgithubcomReactiveXRxJava 37

[48] Luontola Esko Retrolambda httpsgithubcomorfjackalretrolambda 43

51

Anexo I

Projetos utilizados

fastjson

platform_frameworks_base

netty

material-dialogs

kotlin

okhttp

tinker

AndroidUtilCode

RxJava

spring-boot

java-design-patterns

elasticsearch

ExoPlayer

kafka

vertx

realm-java

guava

zipkin

bazel

stetho

Signal-Android

glide

agera

fresco

plaid

presto

libgdx

spark

52

disruptor

lottie-android

flexbox-layout

PocketHub

zxing

spring-framework

deeplearning4j

dropwizard

interviews

BaseRecyclerViewAdapterHelper

uCrop

DanmakuFlameMaster

lottie-react-native

android-UniversalMusicPlayer

AndroidInterview-Q-A

greenDAO

retrofit

MaterialDrawer

BottomBar

druid

MPAndroidChart

Hystrix

guice

recyclerview-animators

dubbo

androidannotations

RxJava-Android-Samples

PhotoView

clojure

CircleImageView

AndroidSwipeLayout

jedis

MaterialViewPager

butterknife

junit4

RxBinding

leakcanary

SimianArmy

picasso

UltimateRecyclerView

53

AndroidViewAnimations

AppIntro

FizzBuzzEnterpriseEdition

ion

cheesesquare

physical-web

RxAndroid

Android-CleanArchitecture

Calligraphy

Android-Bootstrap

iosched

Android_Data

MaterialDesignLibrary

ListViewAnimations

EventBus

java8-tutorial

AndroidSlidingUpPanel

dagger

okhttputils

logger

HomeMirror

Material-Animations

android-Ultra-Pull-To-Refresh

android-async-http

Android-ObservableScrollView

Android-Universal-Image-Loader

ActionBarSherlock

SlidingMenu

storm

PagerSlidingTabStrip

Android-PullToRefresh

54

  • Dedicatoacuteria
  • Agradecimentos
  • Resumo
  • Abstract
  • Introduccedilatildeo
    • Contexto
    • Objetivos
      • Objetivos Gerais
      • Objetivos Especiacuteficos
        • Metodologia
        • Organizaccedilatildeo do Trabalho
          • Evoluccedilatildeo e Mineraccedilatildeo de Repositoacuterios de Software
            • Evoluccedilatildeo de Software
            • MSR Mineraccedilatildeo de dados e a Engenharia de Software
              • Classificaccedilatildeo
                • Trabalhos Relacionados
                  • Java SE 8 e JDK 8
                    • Histoacuterico
                    • Princiacutepios
                    • Evoluccedilatildeo
                    • Expressotildees Lambda
                      • Sintaxe
                      • Principais formas de uso
                          • Estudo e o Processo de Mineraccedilatildeo
                            • Questotildees de Pesquisa
                            • Fonte de Dados e Objetos de Estudo
                            • Processo de Mineraccedilatildeo
                              • static-analysis
                              • BDAnalisador
                                • Classificaccedilatildeo e Anaacutelise
                                  • Meacutedia de Lambda
                                  • Anaacutelise Temporal
                                  • Refatoraccedilatildeo de Coacutedigo
                                  • Casos de Uso
                                      • Resultados Obtidos e Anaacutelise
                                        • Visatildeo Geral
                                          • Projetos Selecionados
                                          • agera
                                          • vertx
                                          • Android-CleanArchitecture
                                          • RxJava
                                          • guava
                                            • Refatoraccedilatildeo de Coacutedigo
                                            • Estudos de Caso
                                              • Consideraccedilotildees Finais
                                              • Referecircncias
                                              • Anexo
                                              • Projetos utilizados

Figura 21 Taxonomia em camadas adaptada do trabalho de Kagdi et al [1]

Fontes de Dados

As fontes de informaccedilatildeo variam de acordo com a abordagem utilizada e dentre as informa-ccedilotildees mineradas em repositoacuterios de software inclui-se as seguintes categorias os artefatosde software e suas versotildees as diferenccedilas entre os artefatos de software e suas versotildees e osmetadados sobre as mudanccedilas no software

As fontes de dados podem ser melhor classificadas de acordo com Hassan et al [17]

bull Repositoacuterios de controle de Versatildeo estes repositoacuterios guardam o histoacuterico de desen-volvimento de um projeto armazenando todas as mudanccedilas no coacutedigo fonte assimcomo os metadados associados com cada mudanccedila Exemplos git SVN

bull Bug repositories Estes repositoacuterios rastreiam o histoacuterico de resoluccedilatildeo de bugs quesatildeo reportados por usuaacuterios e desenvolvedores Exemplos Bugzilla e Jira

9

bull Histoacuterico de Comunicaccedilatildeo (Archived communications) estes repositoacuterios rastreiamdiscussotildees sobre os vaacuterios aspectos de um projeto de software por sua vida uacutetil Porexemplo listas de e-mails

bull Deployment logs logs com informaccedilotildees do software gerados por ferramentas dedesenvolvimento

bull Repositoacuterios de software Repositoacuterios onde o coacutedigo fonte de vaacuterios projetos satildeoarmazenados como por exemplo Sourceforgenet

No contexto deste trabalho estes repositoacuterios consistem em fontes de coacutedigo armaze-nadas em sistemas de controle de versatildeo especificamente coacutedigos na plataforma Github

O propoacutesito

O propoacutesito da mineraccedilatildeo de repositoacuterios de software se resume nas perguntas de pes-quisa que podem ser respondidas utilizando mineraccedilatildeo Assim existem duas classes deperguntas de pesquisa para MSR [1]

A primeira eacute a pergunta de anaacutelise market-basket1 ldquoSe A acontece o que mais podeacontecerrdquo A resposta para este tipo de pergunta eacute um conjunto de regras descrevendotendecircncias de relacionamentos como por exemplo se A acontecer entatildeo B e C acontecemdurante um periacuteodo X

A segunda classe diz respeito agraves perguntas de prevalecircncia (Prevalence Questions -PQ) como por exemplo perguntas do tipo ldquoA funcionalidade Y foi modificadardquo quepossuem uma resposta booleana ou ldquoQuantas vezes esta funcionalidade Y foi modificadardquocontendo uma resposta quantitativa

As perguntas de pesquisa deste trabalho se encaixam majoritariamente na segundaclasse onde o objetivo traccedilado eacute respondido de forma quantitativa com algumas tentativasde classificaccedilatildeo de tipos de repositoacuterios como seraacute descrito nos capiacutetulos seguintes

A metodologia

A metodologia corresponde a maneira como as questotildees de MSR iratildeo ser respondidas evaacuterias abordagens estatildeo disponiacuteveis Poreacutem Kagdi indica duas estrateacutegias baacutesicas quepodem ser utilizadas

Primeiramente pode-se utilizar a mediccedilatildeo indireta e anaacutelise da evoluccedilatildeo do softwareEsta abordagem pode ser realizada da seguinte forma extrair e computar informaccedilotildeesde cada versatildeo de um software separadamente e em seguida individualmente comparar

1Anaacutelise Market-basket eacute uma teacutecnica de modelagem baseada na teoria de que se vocecirc comprar certostipos de produtos vocecirc haacute uma probabilidade maior (ou menor) de comprar outros tipos de produtos [19]

10

propriedades encontradas como por exemplo comparar duas versotildees distintas de umsoftware atraveacutes de um repositoacuterio github realizando uma investigaccedilatildeo de alto niacutevel noque diz respeito a evoluccedilatildeo do software [1]

A segunda perspectiva de metodologia que pode ser utilizada corresponde agrave mediccedilatildeodireta e anaacutelise da evoluccedilatildeo do software Ela diz respeito agraves investigaccedilotildees que estudamos mecanismos que leva um software a ser modificado de uma versatildeo para outra focandonas diferenccedilas especiacuteficas entre estas versotildees como por exemplo examinando mudanccedilasespeciacuteficas das classes arquivos funccedilotildees de cada parte do coacutedigo [1]

Assim eacute possiacutevel descrever explicitamente que este trabalho utiliza em sua maioriauma metodologia com mediccedilotildees diretas atraveacutes da anaacutelise estaacutetica de informaccedilotildees docoacutedigo fonte de diferente versotildees para analisar os diferentes padrotildees de desenvolvimentoem que expressotildees lambda (definidas no capiacutetulo seguinte) satildeo utilizadas

A Avaliaccedilatildeo

Por fim existem diversas formas para se avaliar o estudo realizado sempre levando emconsideraccedilatildeo a validade dos resultados obtidos Pode-se utilizar de meacutetricas para avaliar osdados considerando o quanto das informaccedilotildees obtidas satildeo relevantes Outra forma de seavaliar seria atraveacutes da utilizaccedilatildeo de modelos probabiliacutesticos seguindo uma abordagemde teoria da informaccedilatildeo Assim foram utilizadas determinadas meacutetricas quantitativaspara avaliar os resultados obtidos neste trabalho

23 Trabalhos Relacionados

Como ressaltado na introduccedilatildeo o foco deste trabalho encontra-se em utilizar teacutecnicas deMSR para caracterizar a adoccedilatildeo de expressotildees lambda em repositoacuterios Java Ao reali-zar um estudo sobre o estado da arte encontrou-se diversos trabalhos que utilizam deMSR para obter informaccedilotildees relevantes sobre repositoacuterios de software em diversos focose em especial trabalhos que investiguem repositoacuterios na linguagem Java Jaacute existemtambeacutem alguns trabalhos que apresentam ferramentas de refatoraccedilatildeo de coacutedigo para im-plementaccedilatildeo de expressotildees lambda com foco na evoluccedilatildeo do software Dentre os trabalhosencontrados mencionados destacam-se

bull Em um trabalho sobre utilizaccedilatildeo de refatoraccedilatildeo de coacutedigo para realizar a transiccedilatildeode coacutedigo Java para as novas caracteriacutesticas implementadas no Java 8 Gyori et alapresenta uma ferramenta que automatiza com sucesso o trabalho de conversatildeo decoacutedigo como Annonymous Inner Class para expressotildees lambda [12] O capiacutetulo aseguir descreve em detalhes estes conceitos

11

bull Regrowing a Language de Overbey apresenta um estudo sobre a importacircncia da co-evoluccedilatildeo entre a linguagem de programaccedilatildeo e os projetos de software focando naslinguagens Fortran e Java e provando como ferramentas de refatoraccedilatildeo de coacutedigoauxiliam para que o software consiga evoluir juntamente com sua linguagem deprogramaccedilatildeo [9]

bull O trabalho sobre a adoccedilatildeo de generics em coacutedigo Java feito por Parnin utiliza demineraccedilatildeo de dados para realizar uma investigaccedilatildeo empiacuterica avaliando projetos decoacutedigo aberto com o objetivo de observar como desenvolvedores destes projetos estatildeoutilizando generics em Java [20]

Os estudos mencionados focam em assuntos particulares pertinentes a este trabalhoem que de um lado tem-se trabalhos que mostram a necessidade de refatoraccedilatildeo de coacutedigopara evoluccedilatildeo de software e do outro tem-se trabalhos que mostram que eacute possiacutevel utilizarde MSR para entender melhor como a evoluccedilatildeo da linguagem de programaccedilatildeo Java temafetado projetos reais de coacutedigo aberto e como estes projetos estatildeo se adaptando a estasevoluccedilotildees

12

Capiacutetulo 3

Java SE 8 e JDK 8

Este trabalho tem como objetivo caracterizar a adoccedilatildeo de expressotildees Lambda em siste-mas Java que podem ser considerados legados pois foram concebidos em um momentoanterior a introduccedilatildeo dessa nova caracteriacutestica na linguagem Java Com o intuito de faci-litar o entendimento do leitor sobre tais construccedilotildees esse capiacutetulo apresenta informaccedilotildeeshistoacutericas referentes agrave linguagem Java desde sua criaccedilatildeo ateacute a sua ascensatildeo como umadas linguagens de programaccedilatildeo mais populares Aleacutem disso seratildeo apresentadas as novascaracteriacutesticas presentes na versatildeo Java SE 8 com destaque nas expressotildees Lambda e deque forma vieram para auxiliar no desenvolvimento de sistemas

31 Histoacuterico

Java eacute uma linguagem de programaccedilatildeo orientada a objetos para propoacutesitos gerais [21] Alinguagem nasceu com o nome de Oak no ano de 1991 com o foco em televisotildees digitais acabo mas devido agrave complexidade e poder da linguagem logo expandiu-se para os outrosdomiacutenios principalmente a Internet [22] Posteriormente a linguagem recebeu o nome deGreentalk devido agrave marca Oak jaacute ser registrada por outra empresa e o principal projeto daequipe se chamar Green Por fim o nome Java foi o mais votado pela equipe da Sun emuma reuniatildeo para decidir o mais raacutepido possiacutevel um nome definitivo para a linguagem [23]

Em 1995 em sua primeira versatildeo puacuteblica 10 a linguagem Java jaacute comeccedilava a terum crescimento em sua popularidade como Web Applet nos navegadores mais popularesfornecendo seguranccedila e rapidez nas plataformas mais utilizadas [24] A cada nova versatildeopublicada novas funcionalidades e plataformas eram adicionadas e tornavam a linguagemmais difundida no meio computacional fazendo com que em 2006 a linguagem fosse divi-dida em Java EE (foco em rede e serviccedilos web) Java ME (foco em sistemas embarcados)e Java SE (foco em desktops e servidores) [25]

13

Apoacutes anos de evoluccedilatildeo e aprimoramento atraveacutes de diversas versotildees como visto naTabela 31 hoje o Java se tornou uma das linguagens de programaccedilatildeo mais utilizadas nomundo estando em aproximadamente 15 das linhas de coacutedigo disponiacuteveis pela inter-net [11] A quantidade de plataformas suportadas pela linguagem e com o advento dosistema operacional Android sendo rodado na maior parte dos smartphones do mundoaleacutem da simplicidade em codificar no paradigma orientado a objetos foram os fatoresrelevantes para que a linguagem se popularizasse no mundo digital [26]

Tabela 31 As versotildees anteriores de java e principais caracteriacutesticasVersatildeo Principais caracteriacutesticasJava 10 JVM e JDKJava 2 Event Listeners

Kestrel (Java 3) HotSpot JVMMerlin (Java 4) Diversas novas APIs como Assertion e expressotildees regularesTiger (Java 5) Generics

Mustang (Java 6) Web ServicesDolphin (Java 7) Suporte a linguagens dinamicas

32 Princiacutepios

Com o foco em alcanccedilar a Web e participar mais ativamente do mercado virtual e e-Commerce foram projetados princiacutepios que permitissem com que a linguagem pudessealcanccedilar seus objetivos principais ao mesmo tempo que mantinha a facilidade e fami-liarizaccedilatildeo da linguagem a seus desenvolvedores [27] Dessa forma a equipe da Oracledeterminou cinco princiacutepios que caracterizariam o foco da linguagem Java

bull simples orientada a objeto e familiar projetada para ser orientada a objeto epermitir que seus desenvolvedores comecem a codificar rapidamente sem a necessi-dade de uma curva de aprendizagem acentuada

bull segura e robusta projetada para prover software confiaacutevel por meio de checagensa tempo de compilaccedilatildeo e execuccedilatildeo Haacute uma grande preocupaccedilatildeo com seguranccediladevido agrave larga utilizaccedilatildeo da linguagem em sistemas distribuiacutedos

bull de arquitetura neutra e portaacutevel projetada para ser independente de qualquerarquitetura bastando rodar a JVM dessa forma garantindo a portabilidade paravaacuterios ambientes e dispositivos

14

bull executada em alta performance projetada para fornecer a maior performancepossiacutevel em tempo de execuccedilatildeo com a utilizaccedilatildeo do garbage collector em uma threadde baixa prioridade

bull interpretada dinacircmica e threaded projetada para ser interpretada por qual-quer dispositivo que possua JVM desenvolvida garantindo um desenvolvimento raacute-pido e em ciclos O uso da classe Thread permite que a linguagem acompanhe atendecircncia do paralelismo Aleacutem disso a ligaccedilatildeo de classes eacute feita em tempo real esomente quando necessaacuteria tornando-a dinacircmica

33 Evoluccedilatildeo

A primeira versatildeo do Java 8 foi lanccedilada em 2014 [28] e apresentou diversas atualizaccedilotildeesespalhadas em categorias como linguagem seguranccedila Collections ferramentas deployentre outras Dentre a grande quantidade de mudanccedilas os destaques se encontraram nasnovas melhorias presentes na linguagem que afetaram de forma mais direta a maneiracom que os desenvolvedores passaram a tratar e organizar o coacutedigo fonte As atualizaccedilotildeesreferentes a linguagem descritas oficialmente pela Oracle [29] satildeo

1 Lambda Expressions ou apenas Expressotildees Lambda correspondem a uma novacaracteriacutestica que permite que uma pequena funcionalidade possa ser utilizada comoum argumento de um meacutetodo facilitando a escrita de accedilotildees que seratildeo feitas repetida-mente em uma Collection ou quando um processo se completa ou quando encontraum erro Eacute tambeacutem uma forma compacta de se escrever coacutedigo que previamenteera escrito com anonymous inner classes [29] A Listagem 31 mostra uma classehipoteacutetica Calculator cujo meacutetodo operateBinary() recebe como paracircmetro doisinteiros e um objeto da classe IntegerMath que representa a operaccedilatildeo que deveraacuteser realizada ou seja uma funcionalidade dinacircmica

1 pub l i c c l a s s Ca l cu la to r 2

3 i n t e r f a c e IntegerMath 4 i n t opera t i on ( i n t a i n t b) 5 6

7 pub l i c i n t operateBinary ( i n t a i n t b IntegerMath op ) 8 re turn op opera t i on (a b) 9

10

11 pub l i c s t a t i c void main ( St r ing a rgs ) 12

15

13 Calcu la to r myApp = new Ca lcu la to r ( ) 14 IntegerMath add i t i on = (a b) minusgt a + b 15 IntegerMath subt ra c t i on = (a b) minusgt a minus b 16 System out p r i n t l n ( 40 + 2 = +17 myApp operateBinary (40 2 add i t i on ) ) 18 System out p r i n t l n ( 20 minus 10 = +19 myApp operateBinary (20 10 sub t ra c t i on ) ) 20 21 22

Listagem 31 Exemplo de coacutedigo com o uso de Expressatildeo Lambda [30]

2 Method References Frequentemente expressotildees lambda criam meacutetodos anocircni-mos Algumas vezes poreacutem satildeo utilizadas para chamar um meacutetodo jaacute existentena classe Ao inveacutes de escrever a expressatildeo Lambda para esse caso pode-se optarpor utilizar um Method Reference que facilita a escrita e leitura desse uso de ex-pressatildeo Lambda [29] A Listagem 32 mostra um exemplo de um meacutetodo estaacuteticoque compara duas pessoas pelas suas idades e a Listagem 33 a utilizaccedilatildeo de MethodReference para aplicar a utilizaccedilatildeo desse meacutetodo em um array e reduzir a escrita deuma expressatildeo lambda a uma forma mais legiacutevel

1 pub l i c s t a t i c i n t compareByAge ( Person a Person b) 2 re turn a b i r thday compareTo (b b i r thday ) 3 4

Listagem 32 Exemplo de meacutetodo de uma classe Pessoa [31]

1 Arrays s o r t ( rosterAsArray Person compareByAge ) 2

Listagem 33 Exemplo de uso de Method Reference [31]

3 Default Methods satildeo meacutetodos com a palavra-chave default que servem para adi-cionar implementaccedilotildees de meacutetodos a uma interface de alguma biblioteca mantendoa compatibilidade binaacuteria com versotildees mais antigas dessa interface Tambeacutem pos-sibilita a implementaccedilatildeo de meacutetodos estaacuteticos em interfaces [29] A Listagem 34apresenta a inclusatildeo de um meacutetodo default na interface TimeClient

1 pub l i c i n t e r f a c e TimeClient 2 void setTime ( i n t hour i n t minute i n t second ) 3 void setDate ( i n t day i n t month i n t year ) 4 void setDateAndTime ( i n t day i n t month i n t year 5 i n t hour i n t minute i n t second )

16

6 LocalDateTime getLocalDateTime ( ) 7

8 s t a t i c ZoneId getZoneId ( S t r ing zoneStr ing ) 9 t ry

10 re turn ZoneId o f ( zoneStr ing ) 11 catch ( DateTimeException e ) 12 System e r r p r i n t l n ( I n v a l i d time zone + zoneStr ing

+13 us ing d e f a u l t time zone in s t ead ) 14 re turn ZoneId systemDefault ( ) 15 16 17

18 d e f a u l t ZonedDateTime getZonedDateTime ( St r ing zoneStr ing ) 19 re turn ZonedDateTime o f ( getLocalDateTime ( ) getZoneId (

zoneStr ing ) ) 20 21 22

Listagem 34 Exemplo de interface com um meacutetodo default [32]

4 Repeating Annotations permitem a implementaccedilatildeo e utilizaccedilatildeo de anotaccedilotildees deum mesmo tipo que podem ser utilizadas mais de uma vez para a mesma declara-ccedilatildeo [29] A Listagem 35 apresenta duas anotaccedilotildees iguais com paracircmetros diferentespermitindo uma customizaccedilatildeo maior na aplicaccedilatildeo de um tipo de anotaccedilatildeo

1 Schedule ( dayOfMonth= l a s t )2 Schedule (dayOfWeek= Fr i hour= 23 )3 pub l i c void doPeriodicCleanup ( ) 4

Listagem 35 Exemplo de Repeating Annotations [33]

5 Type Annotations permitem que anotaccedilotildees possam ser utilizadas em tipos aleacutemde declaraccedilotildees dessa forma pode-se garantir que um campo sempre atenda agraves suasexpectativas e evite testes desnecessaacuterios [29] A Listagem 36 mostra um exemplo derestriccedilatildeo a uma String que nunca poderaacute ser nula devido agrave anotaccedilatildeo de NonNull

1 NonNull S t r ing s t r

Listagem 36 Exemplo de Type Annotation garantindo que o campo nunca seja null [34]

17

34 Expressotildees Lambda

Uma das mudanccedilas mais interessantes implementadas no Java 8 foi a adiccedilatildeo de expressotildeeslambda As expressotildees lambda permitem que a linguagem Java possa atuar parcialmentecomo uma linguagem de programaccedilatildeo funcional onde comportamentos satildeo avaliados eaplicados diferentemente da programaccedilatildeo imperativa que foca na mudanccedila de estadosNa praacutetica um comportamento pode ser passado como paracircmetro de um meacutetodo atraveacutesde uma escrita mais reduzida e legiacutevel Os benefiacutecios de utilizar expressotildees lambda incluemuma melhora na legibilidade e organizaccedilatildeo de coacutedigo que antes era escrito com AnonymousInner Class aleacutem de permitir uma forma simples de utilizar comportamento paralelo como uso de Streams

341 Sintaxe

A sintaxe de uma expressatildeo lambda eacute dividida nas seguintes partes [30]

bull Uma lista de paracircmetros separados por viacutergulas

bull Um token representado por uma seta -gt

bull Um corpo que pode ser representado por uma expressatildeo uacutenica ou um bloco de coacutedigodentro de chaves

As Listagens 37 e 38 mostram duas formas diferentes de se aplicar expressotildees Lambdacom uma sintaxe similar A primeira aplica a expressatildeo diretamente apoacutes a seta utilizadanormalmente para trechos de coacutedigo pequenos e simples e a segunda utiliza-se de chavespara incorporar o coacutedigo e da palavra-chave return para especificar o retorno forma maisutilizada para uma quantidade maior de coacutedigo

1 p minusgt p getGender ( ) == Person Sex MALE2 ampamp p getAge ( ) gt= 183 ampamp p getAge ( ) lt= 25

Listagem 37 Exemplo de expressatildeo lambda com uma expressatildeo [30]

1 p minusgt 2 re turn p getGender ( ) == Person Sex MALE3 ampamp p getAge ( ) gt= 184 ampamp p getAge ( ) lt= 25 5

Listagem 38 Exemplo de expressatildeo lambda com um bloco de coacutedigo [30]

18

342 Principais formas de uso

Anonymous Inner Class

Antes do Java 8 a necessidade de passar funccedilotildees ou expressotildees como paracircmetro de algummeacutetodo era suprida atraveacutes de Anonymous Inner Classes A utilizaccedilatildeo desse tipo dedeclaraccedilatildeo junto com a anotaccedilatildeo de Override permite sobrescrever um meacutetodo de umainterface funcional e ao mesmo tempo passa-la como argumento para um meacutetodo Umaexpressatildeo lambda se comporta da mesma forma poreacutem a quantidade de coacutedigo escritopela Anonymous Inner Class eacute maior e pode dificultar a leitura de coacutedigo pois conteacutemmuita informaccedilatildeo natildeo utilizada para efetivo entendimento do que estaacute sendo feito naqueletrecho

A Listagem 39 apresenta a instanciaccedilatildeo da classe EventHandler internamente ao meacute-todo setOnAction() de forma que o desenvolvedor possa escrever o comportamento quedeseja passar como paracircmetro do meacutetodo atraveacutes da substituiccedilatildeo do meacutetodo handle()que jaacute existe pelo meacutetodo handle() criado e escrito pelo desenvolvedor

1 btn setOnAction (new EventHandlerltActionEvent gt() 2 Override3 pub l i c void handle ( ActionEvent event ) 4 System out p r i n t l n ( He l lo World ) 5 6 )

Listagem 39 Exemplo de uso de Anonymous Inner Class [35]

Interface funcional

Ao projetar um coacutedigo novo o desenvolvedor que optar por utilizar expressotildees lambdadeve iniciar com a criaccedilatildeo de uma interface funcional Esse tipo de interface possui umuacutenico meacutetodo abstrato permitindo que expressotildees lambda sejam usadas para sobrescrevero comportamento do meacutetodo abstrato Uma interface funcional pode possuir outros meacuteto-dos desde que sejam default Uma nova anotaccedilatildeo FunctionalInterface foi adicionadacom a atualizaccedilatildeo do Java 8 para conferir em tempo de compilaccedilatildeo se a interface satisfazos requisitos desse modelo de interface

A Listagem 310 apresenta um exemplo de interface funcional com o objetivo de permi-tir o uso de expressotildees lambda que utilizaratildeo de dois Double como paracircmetro e jaacute utilizada nova anotaccedilatildeo FunctionalInterface introduzida no Java 8

1 Funct iona l Inte r face2 pub l i c i n t e r f a c e DoubleOp 3 pub l i c Double apply ( Double a Double b)

19

4

Listagem 310 Exemplo de interface funcional

Dessa forma conforme as Listagens 311 e 312 o meacutetodo apply() pode tomar formade qualquer operaccedilatildeo entre dois Double que seraacute especificada quando a expressatildeo lambdafor montada dando o aspecto de linguagem funcional agrave linguagem e mais facilidade eliberdade ao desenvolvedor

1 pub l i c c l a s s Ca l cu la to r 2 pub l i c s t a t i c Double c a l c ( Double op1 Double op2 DoubleOp operator ) 3 re turn operator apply ( op1 op2 ) 4 5

Listagem 311 Exemplo de aplicaccedilatildeo da interface funcional

1 Double r e s u l t 1 = Ca lcu la to r c a l c (10d 50d ( a b ) minusgt a + b)

Listagem 312 Uso de expressatildeo lambda para o exemplo anterior

Collections

Dentre as atualizaccedilotildees de pacotes do Java 8 foi adicionado um meacutetodo stream() nainterface Collection Esse meacutetodo trata as Collection como streams o que significa queapesar de natildeo ser possiacutevel acessar elementos diretamente algumas novas manipulaccedilotildeessatildeo possiacuteveis Essas manipulaccedilotildees satildeo na verdade meacutetodos da interface Stream quepodem receber como paracircmetro uma expressatildeo lambda ou seja um comportamento a seraplicado agrave Collection Dentre os meacutetodos temos

bull filter() O meacutetodo filter() recebe uma expressatildeo lambda contendo uma condiccedilatildeopara filtragem da collection

bull map() O meacutetodo map() mapeia os elementos de uma Collection em outro objetocomo uma String A expressatildeo lambda passada por paracircmetro deve retornar o tipode objeto ao qual seraacute mapeado

bull forEach() O meacutetodo forEach() aplica uma operaccedilatildeo especiacutefica para cada ele-mento da Collection A expressatildeo lambda a ser passada deve conter a operaccedilatildeo aser realizada

bull min() e max() Os meacutetodos min() e max() retornam o elemento menor ou maiorda Collection dependendo da expressatildeo lambda passada como paracircmetro

20

A Listagem 313 demonstra como vaacuterias operaccedilotildees com uma Collection podem seraplicadas de uma vez de forma que lendo a expressatildeo lambda jaacute eacute possiacutevel saber oresultado da aplicaccedilatildeo do meacutetodo agrave Collection

1 r o s t e r2 stream ( )3 f i l t e r (4 p minusgt p getGender ( ) == Person Sex MALE5 ampamp p getAge ( ) gt= 186 ampamp p getAge ( ) lt= 25)7 map(p minusgt p getEmailAddress ( ) )8 forEach ( emai l minusgt System out p r i n t l n ( emai l ) )

Listagem 313 Exemplo de utilizaccedilatildeo de meacutetodos de stream com expressotildees lambda [30]

21

Capiacutetulo 4

Estudo e o Processo de Mineraccedilatildeo

A definiccedilatildeo da metodologia utilizada para realizaccedilatildeo deste trabalho eacute importante para queexista uma padronizaccedilatildeo e melhor entendimento de como os resultados foram obtidos paraque a replicaccedilatildeo do mesmo possa ser realizada em trabalhos futuros [36]

Figura 41 Processo utilizado para realizaccedilatildeo do estudo

O esquema representado na Figura 41 descreve o processo seguido para a realizaccedilatildeodeste trabalho que foi divido em trecircs grandes etapas a de planejamento definindo osobjetivos questotildees de pesquisa e meios de investigaccedilatildeo deste projeto a etapa de execuccedilatildeorealizando todo o procedimento metodoloacutegico definido para a coleta e refinamento de

22

dados e a etapa de avaliaccedilatildeo onde foram classificados e avaliados os dados coletadospara responder agraves questotildees de pesquisa

A seguir na primeira seccedilatildeo seratildeo apresentadas em detalhes as questotildees de pesquisa aserem respondidas Em seguida seraacute feito uma breve descriccedilatildeo da fonte de dados utilizada- especificamente os projetos utilizados como objetos de estudo deste trabalho e por fimtodo o restante da metodologia que foi de fato desenvolvida para obter os resultadosnecessaacuterios

41 Questotildees de Pesquisa

Com o objetivo de entender e caracterizar melhor o uso de expressotildees lambda foramdefinidas as seguintes questotildees de pesquisa a serem respondidas

bull PQ-1 Quando os projetos comeccedilaram a introduzir o uso de expressotildees lambda emseus coacutedigos e qual a meacutedia de expressotildees lambda por snapshots caso existam

bull PQ-2 Como as equipes de desenvolvimento estatildeo utilizando expressotildees lambdaatraveacutes de refatoraccedilatildeo de coacutedigo ou introduzindo apenas em coacutedigo novo

bull PQ-3 Quais satildeo os padrotildees tipicamente adotados para o uso de expressotildees lambda

A primeira pergunta de pesquisa gira em torno de como projetos populares open-sourceestatildeo se adaptando agrave introduccedilatildeo de expressotildees lambda em Java muitos projetos jaacute estatildeoutilizando as expressotildees lambda Se sim a partir de quando comeccedilaram a utilizaacute-lasdesde o iniacutecio da introduccedilatildeo das mesmas no Java 8 ou em um periacuteodo mais tardio Aleacutemdisso eacute interessante descobrir se a utilizaccedilatildeo dessa nova caracteriacutestica tem acontecido deforma expressiva ou natildeo

Em seguida para melhor entender a forma como as expressotildees lambda estatildeo sendointroduzidas em projetos eacute interessante investigar se as equipes de desenvolvimento estatildeose preocupando em refatorar coacutedigo com o objetivo de evoluir o software ou se estatildeoexperimentando utilizar expressotildees lambda apenas em coacutedigo novo introduzido

Como a introduccedilatildeo de novas funcionalidades em projetos open-source de grande escaladepende do objetivo do projeto e os padrotildees de projeto utilizados [37] espera-se obser-var diversas abordagens quanto a utilizaccedilatildeo de expressotildees lambda para entatildeo poderclassificar estes softwares quanto a abordagem utilizada

Eacute de grande importacircncia para este estudo conseguir identificar na praacutetica comoexpressotildees lambda estatildeo sendo tipicamente adotadas nestes projetos Assim a terceirapergunta de pesquisa busca identificar alguns exemplos de utilizaccedilatildeo atraveacutes da realizaccedilatildeode alguns estudos de caso

23

Eacute importante ressaltar que apesar de as expressotildees lambda serem uma alternativa aouso de AIC elas natildeo os substituem completamente Existem precondiccedilotildees para que umaAIC possa ser substituiacuteda por expressotildees lambda [12] descritas a seguir

bull AIC deve instanciar-se de uma interface

bull AIC natildeo deve possuir nenhum campo e declarar apenas um meacutetodo

bull AIC natildeo deve possuir uma referecircncia para this ou super

bull AIC natildeo deve declarar um meacutetodo recursivo

Para responder agrave primeira pergunta apenas dados gerais sobre todos os projetos seratildeonecessaacuterios ao passo que pelas perguntas 2 e 3 possuiacuterem uma natureza mais complexaseraacute necessaacuterio aleacutem de uma anaacutelise geral estatiacutestica a realizaccedilatildeo de alguns estudos decaso para obter resultados mais completos

42 Fonte de Dados e Objetos de Estudo

Para responder agraves perguntas de pesquisa estabelecidas foram selecionados os 99 projetosmais populares na linguagem Java dentro da plataforma github ateacute a data da coleta dosdados feita em Abril de 2017 Satildeo considerados populares os repositoacuterios que possuema maior quantidade possiacutevel de estrelas (stars) A decisatildeo de escolher os 99 projetos maispopulares foi por sua natureza imparcial e ao mesmo tempo para que se possa analisarprojetos que satildeo de familiaridade e conhecimento da comunidade do github e de domiacuteniopuacuteblico Os 99 projetos estatildeo listados no Anexo I

Para entender a transiccedilatildeo feita por esses projetos entre as versotildees anteriores do Java eo Java 8 com as expressotildees lambda eacute necessaacuterio analisar o coacutedigo de vaacuterias versotildees a fimde observar alguma mudanccedila para cada projeto Como satildeo 99 projetos e vaacuterios dessesprojetos possuem milhares de linhas de coacutedigo e commits seria impossiacutevel avaliar todosos commits Optou-se entatildeo por coletar snapshots mensais de cada projeto conformeprocedimento tambeacutem seguido anteriormente [38] Cada snapshots representa o estadodo projeto em um determinado mecircs e como criteacuterio de escolha padratildeo todos os snapshotsequivalem ao uacuteltimo commit realizado no determinado mecircs que este representa

O proacuteximo passo eacute determinar o periacuteodo de tempo em que esses snapshots seriamcoletados Como Java 8 (e consequentemente as expressotildees lambda) foi introduzidoapenas em meados de 2014 [28] coletar dados de projetos a partir de um periacuteodo muitoantes deste ano natildeo agregaria valor ao estudo em questatildeo Definiu-se entatildeo um periacuteodopara a coleta mensal desses snapshots atraveacutes dos anos Janeiro de 2013 um ano antesda introduccedilatildeo do Java 8 para que se pudesse identificar para todos os projetos o mecircs

24

exato em que expressotildees lambda foram introduzidas ateacute o mecircs da coleta de dados Abrilde 2017

Eacute importante ressaltar que a definiccedilatildeo dos meses foi definida do dia primeiro de ummecircs ao dia primeiro do proacuteximo mecircs e por consequecircncia alguns snapshots que deveriamrepresentar o final de determinado mecircs correspondem na verdade a commits realizadosno dia primeiro do mecircs seguinte Por exemplo pode existir casos em que o commit querepresente o mecircs de Marccedilo de 2016 seja na verdade o commit realizado no dia primeirode Abril de 2016 Isso se deve a natureza da forma como os resultados de log de commitssatildeo obtidos pelo git [39] Poreacutem isso natildeo interfere nas anaacutelises ou no propoacutesito destetrabalho uma vez que foram realizadas verificaccedilotildees e validaccedilotildees para que natildeo existamdatas repetidas (e consequentemente commits repetidos) por repositoacuterio

Neste trabalho o termo projeto e repositoacuterio foram utilizados de forma intercaladapara representar a mesma coisa o software desenvolvido que possui um repositoacuterio naplataforma github Os termos commit snapshops e versotildees tambeacutem representam a mesmacoisa uma vez que foi definido que seriam utilizados apenas um commit por mecircs pararepresentar um determinado snapshot ou versatildeo do repositoacuterio em questatildeo

Todos os 99 projetos seratildeo utilizados para a realizaccedilatildeo de uma anaacutelise geral de ca-racterizaccedilatildeo do uso de expressotildees lambda Para as anaacutelises aprofundadas foi feito umcriteacuterio de classificaccedilatildeo para que apenas alguns projetos possam ser analisados em niacutevelde coacutedigo como estudos de caso

Resumindo foram escolhidos os 99 projetos mais populares de Java no github cole-tando dados mensais de seus commits a partir do ano de 2013 ateacute a data da coleta dosdados lembrando que nem todos os projetos existem desde 2013 (projetos mais recentes)

43 Processo de Mineraccedilatildeo

A abordagem utilizada para coletar e analisar os 99 projetos escolhidos como mostra aFigura 42 foi realizada de forma automatizada utilizando scripts python e dois projetosdesenvolvidos em Java para a coleta e tratamento de dados como descrito a seguir

Primeiramente foi realizado uma coacutepia dos repositoacuterios atuais de todos os 99 projetosmais populares do github em Java Para automatizar o processo foi desenvolvido umscript em python que lista todos os projetos escolhidos clona todos os repositoacuterios emuma pasta na maacutequina local e cria um arquivo temporaacuterio com as informaccedilotildees do nomede cada repositoacuterio e seu caminho absoluto na maacutequina local

25

Figura 42 Metodologia implementada para coleta e tratamento de dados

Em seguida foi necessaacuterio realizar o checkout de todas as versotildees entre Janeiro de2013 a Abril de 2017 de cada projeto Por motivos de otimizaccedilatildeo de espaccedilo da maacutequinalocal e automatizaccedilatildeo no processo de checkout utilizou-se de um segundo script pythonque realizava as seguintes tarefas para cada mecircs em cada projeto verificar se dentreo mecircs estipulado houve algum commit para aquele projeto se sim pega-se o hash douacuteltimo commit do mecircs realiza o checkout conta-se a quantidade de linhas de coacutedigo emJava que o projeto tem utilizando a biblioteca cloc e armazena todas as informaccedilotildeespertinentes referentes a todos os projetos que naquele mecircs tiveram commits para que oprojeto static-analysis possa entatildeo ser executado sobre esses projetos naquele determinadomomento As informaccedilotildees coletadas que satildeo utilizadas pelo static-analysis correspondemao nome do projeto o hash do commit para aquela versatildeo a pasta onde o projeto estaacutearmazenado na maacutequina local a quantidade de linhas de coacutedigo Java do projeto e datareferente ao commit Essas informaccedilotildees satildeo pertinentes para que o projeto static-analysisconsiga funcionar de forma correta projeto este descrito em detalhes a seguir

431 static-analysis

O static-analysis foi um projeto desenvolvido anteriormente a este trabalho pelos alunosThiago Cavalcanti e Vinicius de Almeida cujo objetivo eacute realizar a anaacutelise estaacutetica de

26

coacutedigos-fonte Java e gerar arquivos de saiacuteda contendo informaccedilotildees de classes e meacutetodoscom suas devidas ocorrecircncias de caracteriacutesticas da linguagem [40]

A anaacutelise estaacutetica de coacutedigo consiste em analisar um coacutedigo-fonte sem a necessidadede executaacute-lo Esse tipo de anaacutelise eacute de extrema importacircncia para manter um coacutedigo dequalidade evitar futuras refatoraccedilotildees e obter informaccedilotildees estatiacutesticas de forma raacutepida epraacutetica [41]

Seguindo esse princiacutepio o static-analysis foi projetado para receber um arquivo deentrada csv seguindo o padratildeo

Tipo da Aplicaccedilatildeo Inicio do projeto Antes ou Apoacutes Java 5 Nome do ProjetoVersatildeo Caminho absolutoQuantidade de linhas de coacutedigo

Atraveacutes da informaccedilatildeo do caminho absoluto do projeto o static-analysis varre osdiretoacuterios em busca dos arquivos fonte java realiza o parse desses arquivos e utilizade Visitors para extrair as informaccedilotildees desejadas e exporta-las em arquivos csv Ouso de Visitors permite que sejam escolhidas as informaccedilotildees desejadas para a consultacomo expressotildees Lambda e AIC s aleacutem de possibilitar que sejam implementados novosVisitors conforme a linguagem evolua ou as necessidades mudem

Para este trabalho foram utilizados os Visitors de expressotildees Lambda map() filter()AICs e declaraccedilotildees de meacutetodos

432 BDAnalisador

Apoacutes obter todas as informaccedilotildees necessaacuterias geradas pelo static-analysis era preciso ma-nipular os dados de forma que facilitasse a coleta de dados para o estudo proposto Comovaacuterios arquivos em formato csv satildeo de difiacutecil manipulaccedilatildeo foi desenvolvido entatildeo umaferramenta chamada BDAnalisador Esta ferramenta eacute responsaacutevel por processar os arqui-vos em csv gerados pelo static-analysis e popular uma base de dados relacional MySQLcom as informaccedilotildees pertinentes a este estudo

O BDAnalisador foi desenvolvido com a intenccedilatildeo de tornar mais simples o trabalhocom os dados resultantes do static-analysis de forma que consultas em SQL pudessemser feitas a ponto de permitir a obtenccedilatildeo de resultados mais complexos Seguindo esseobjetivo o framework Hibernate foi escolhido como ferramenta para persistecircncia devidoa ser um framework jaacute consolidado no mercado e que de forma simples relaciona osobjetos Java ao banco de dados MySQL [42] A divisatildeo de classes foi projetada em quatroentidades Projeto Versao Classe e Metodo cada uma com seus respectivos camposcontendo as informaccedilotildees necessaacuterias para a pesquisa como pode ser visto na Figura 44Eacute importante ressaltar que a tabela de Versao guarda hashs de commits devido agrave escolhade utilizar commits para obter mais informaccedilatildeo de evoluccedilatildeo de coacutedigo em um menor

27

espaccedilo de tempo Aleacutem disso para este trabalho optou-se por persistir todos os meacutetodose classes de cada versatildeo sem se importar com a repeticcedilatildeo desses dados pois a hipoacutetesede haver grandes refatoraccedilotildees entre versotildees poderia comprometer a confiabilidade dasinformaccedilotildees

Figura 43 Diagrama de classes UML do BDAnalisador

Como visto na Figura 43 seguindo parcialmente a arquitetura MVC cada entidadepossui sua respectiva classe DAO(Data Access Object) para persistecircncia dos dados eapenas uma classe Controlador no projeto responsaacutevel pela manipulaccedilatildeo e parse dosdados dos arquivos csv gerados pelo static analysis para serem enviados agraves classes DAOO sistema inicia chamando o meacutetodo inicializar() da classe Controlador Esse meacutetodoeacute responsaacutevel por ler um arquivo de entrada csv que segue o mesmo modelo do arquivo dostatic-analysis citado na seccedilatildeo anterior O arquivo conteacutem os dados de todos os projetose suas respectivas versotildees dessa forma o meacutetodo instancia um objeto da classe Projetoe persiste o projeto no banco de dados Para cada versatildeo encontrada no arquivo deentrada o inicializar() aciona os meacutetodos responsaacuteveis por instanciar e preencher aslistas da classe Classe e Metodo Os meacutetodos responsaacuteveis por preencher as listas varremos arquivos csv gerados pelo static-analysis e fazem o parse das informaccedilotildees relevantescomo nomes dos meacutetodos e quantidades de lambdas para construir os objetos que seratildeogravados Ao final dos preenchimentos o objeto Versatildeo eacute instanciado e gravado no bancode dados atraveacutes de sua classe DAO ao mesmo tempo que grava suas respectivas Classese Metodos

28

Apoacutes vaacuterios testes e correccedilotildees de bugs o banco de dados se encontrava finalmente comas informaccedilotildees de 99 projetos Java open-source separados por um commit por mecircs desde2013 cada um com suas respectivas informaccedilotildees de classes meacutetodos e a quantidade deexpressotildees lambda filters e maps em cada meacutetodo Filter ou Filter pattern eacute o padratildeode projeto que tem como objetivo filtrar objetos de uma coleccedilatildeo (Collection) de acordocom algum criteacuterio Jaacute o map ou map pattern eacute um padratildeo que ldquomapeia os elementosde uma coleccedilatildeo aplicando uma funccedilatildeo a eles para uma nova coleccedilatildeo [43] A coleta deinformaccedilotildees sobre esses padrotildees podem ser uacuteteis para possiacuteveis anaacutelises de oportunidadesde uso de expressotildees lambda para refatoraccedilatildeo de coacutedigo

A Figura 44 mostra o esquema de como o banco de dados resultante foi gerado

Figura 44 Modelo relacional do banco de dados populado pelo BDAnalisador Imagemgerada com software DBeaver [2]

44 Classificaccedilatildeo e Anaacutelise

Com o banco de dados populado restam apenas as etapas de classificaccedilatildeo e anaacutelise pararesponder as questotildees de pesquisa propostas Para isso inicialmente houve uma tentativade se utilizar apenas queries SQL para analisar os dados de acordo com as informaccedilotildeesrelevantes Poreacutem devido ao fato de o banco de dados conter todas as informaccedilotildees detodos os projetos e todas as suas versotildees queries que possuem uma alta complexidadedemoravam muito tempo para retornar os dados

Assim com o objetivo de facilitar o trabalho alguns scripts python foram desenvolvi-dos para rodar as queries separadamente e individualmente para cada projeto de formaautomatizada a fim de melhorar o tempo de resposta para obtenccedilatildeo dos resultados

29

441 Meacutedia de Lambda

O primeiro script retorna a quantidade de expressotildees lambda (ou AICs) por n snapshotsque contenha expressotildees lambda O objetivo eacute ter uma visatildeo geral da meacutedia de expressotildeeslambda e AICs utilizadas por cada projeto e como nem todos os snapshots coletados decada projeto possuem expressotildees lambda e AICs apenas aqueles com alguma expressatildeolambda ou AIC satildeo incluiacutedos no caacutelculo da meacutedia

Mmedia =sumn qtdLambdai

n

442 Anaacutelise Temporal

O segundo script retorna para cada projeto a soma total da quantidade de expressotildeeslambda AIC map() e filter() no projeto inteiro para cada versatildeo Ou seja tem-seo total de cada uma das quatro propriedades selecionadas para cada mecircs do projetoobtendo assim uma visatildeo temporal de evoluccedilatildeo do uso das caracteriacutesticas descritas ATabela 41 ilustra parcialmente o resultado obtido para o projeto agera onde idVersaoeacute o identificador no banco de dados referente ao hash do commit mensal coletado qtd eacutea quantidade de cada uma das caracteriacutesticas escolhidas e a data do commit encontra-seno formato americano

Tabela 41 Informaccedilotildees mensais sobre o projeto ageraidVersao Data do Commit qtd lambda qtd AIC qtd maps qtd filter

823 512016 0 29 4 0755 612016 13 28 4 0686 6152016 13 29 4 0621 812016 13 29 4 0555 8162016 13 30 4 0485 922016 13 30 4 0422 10132016 14 30 4 0356 11282016 14 30 4 0295 12212016 21 30 5 0232 212017 21 30 5 0175 312017 21 30 5 0112 3312017 21 36 5 048 4242017 21 48 5 0

Os resultados obtidos com esta anaacutelise temporal permitiu a identificaccedilatildeo de padrotildees nautilizaccedilatildeo de expressotildees lambda em relaccedilatildeo a utilizaccedilatildeo de AIC por todos os projetos Foi

30

possiacutevel classificar todos os projetos em 6 grupos ilustrado na Figura 45 Primeiramenteseparou-se os projetos entre os que possuem expressotildees lambda e os que natildeo possuemDentre os que possuem identificou-se cinco categorias

1 Grupo 1 Quantidade de AICs e expressotildees lambda aumentam com o tempo pro-porcionalmente

2 Grupo 2 Quantidade de AICs diminui agrave medida que a quantidade de expressotildeeslambda aumentam e a quantidade de expressotildees lambda ultrapassa a quantidade deAIC em um determinado momento

3 Grupo 3 Quantidade de AICs diminui agrave medida que a quantidade de expressotildeeslambda aumentam mas a quantidade de AIC permanece superior agrave quantidade delambda

4 Grupo 4 Expressotildees lambda satildeo introduzidas e existem por um pequeno periacuteodode tempo mas satildeo completamente removidas posteriormente

5 Grupo 5 Quantidade de expressotildees lambda eacute constante e muito inferior compa-rado com a quantidade de AICs no projeto Foi determinado que para pertencera esta classificaccedilatildeo o projeto precisa ter uma razatildeo de meacutedia de expressotildees lamb-dasnapshot por meacutedia de AICsnapshot inferior a 020 Esse paracircmetro foi esta-belecido com o objetivo de definir um padratildeo para o que pode ser considerado umprojeto com poucas expressotildees lambda

Figura 45 Classificaccedilatildeo dos projetos

31

443 Refatoraccedilatildeo de Coacutedigo

O uacuteltimo script teve como objetivo realizar uma tentativa inicial de identificar refatoraccedilatildeode coacutedigo da seguinte maneira para todos os projetos que possuem expressotildees lambdaforam identificados o mecircs imediatamente antes da introduccedilatildeo de expressotildees lambda e omecircs seguinte onde houve a primeira ocorrecircncia de lambda no projeto Assim realizou-se uma anaacutelise do tamanho em quantidade de linhas de coacutedigo de todos os meacutetodosdo projeto que no mecircs seguinte tiveram introduccedilatildeo de lambda Em seguida fez-se umacomparaccedilatildeo com os mesmos meacutetodos em relaccedilatildeo ao mecircs anterior e assim foi possiacuteveldetectar quais meacutetodos tiveram a quantidade de linhas de coacutedigo reduzidas o que seriaum indicativo natildeo necessariamente exclusivo de que uma refatoraccedilatildeo de coacutedigo possa terocorrido

Sabe-se que este meacutetodo de detecccedilatildeo de refatoraccedilatildeo de coacutedigo possui suas limitaccedilotildeesuma vez que as comparaccedilotildees para saber se um meacutetodo existe em ambas versotildees eacute feitopuramente por comparaccedilatildeo de String (nome do meacutetodo) e a classe que este pertence

444 Casos de Uso

Os meacutetodos descritos acima ajudaram a identificar alguns padrotildees e facilitar a anaacutelise dosdados Poreacutem natildeo satildeo suficientes para que se possa responder agraves questotildees de pesquisaDessa forma apoacutes a identificaccedilatildeo dos grupos de classificaccedilatildeo para os projetos foramescolhidos um projeto de cada grupo (com exceccedilatildeo do grupo dos projetos sem expressotildeeslambda) para realizar um breve estudo de caso com o objetivo de identificar e caracterizarmelhor a adoccedilatildeo de expressotildees lambda Os projetos escolhidos foram agera vertxAndroid-CleanArchitecture RxJava e guava

32

Capiacutetulo 5

Resultados Obtidos e Anaacutelise

Neste capiacutetulo seratildeo apresentados os dados obtidos e anaacutelise com o objetivo de responderagraves questotildees de pesquisa propostas Como mencionado anteriormente as perguntas seratildeorespondidas de duas maneiras algumas com informaccedilotildees gerais sobre todos os projetose outras com breve estudos de caso envolvendo cinco projetos

51 Visatildeo Geral

Dentre os repositoacuterios coletados para a anaacutelise 74 (7474) natildeo utilizaram nenhumaexpressatildeo lambda no projeto durante todo o periacuteodo analisado (Janeiro de 2013 a Abrilde 2017) restando apenas 25 repositoacuterios (2525) com expressotildees lambda Eacute interessantedestacar que apesar de a quantidade de repositoacuterios que natildeo possuem expressotildees lambdaser relativamente expressiva muitos destes repositoacuterios satildeo de projetos em Java que umdia foram populares e atualmente natildeo estatildeo sendo mais desenvolvidos (por exemplo umaplicativo que soacute funciona para Android 23 atualmente descontinuado)

Levando em consideraccedilatildeo apenas os projetos que possuem expressotildees lambda exis-tem dois tipos de dados que podem ser analisados para responder agrave primeira questatildeo depesquisa atraveacutes dos dados obtidos pelo meacutetodo anteriormente mencionado como anaacutelisetemporal e a meacutedia de lambda por snapshot mencionados no capiacutetulo anterior

Com relaccedilatildeo ao ano em que a primeira ocorrecircncia foi encontrada 6 projetos introduzi-ram expressotildees lambda jaacute em 2014 8 comeccedilaram a utilizar em 2015 7 em 2016 e apenas4 tiveram a primeira ocorrecircncia de expressotildees lambda em 2017 Dessa forma percebe-seque os projetos estatildeo relativamente bem distribuiacutedos em grupos quanto ao ano em que seintroduziu expressotildees lambda

Pela meacutedia de lambda por snapshot (lambdasnapshot) a maioria (11 projetos) possuiuma quantidade expressiva acima de 100 lambdasnapshot (com 6 projetos entre 20 e 100lambdasnapshot e 8 projetos com menos de 20 lambdasnapshot) como apresentados no

33

graacutefico da Figura 51 Isso mostra que essa nova caracteriacutestica jaacute estaacute sendo bem utilizadanos projetos que comeccedilaram a migrar para a nova versatildeo do Java

Figura 51 Graacuteficos dos projetos separados por ano de introduccedilatildeo de expressotildees lambdae meacutedia de lambda por snapshot

Com isso pode-se observar que apesar de a quantidade de projetos que possuemexpressotildees lambda natildeo ser tatildeo alta eacute possiacutevel obter resultados expressivos uma vez quea quantidade dos projetos com lambda estatildeo bem dispersos quanto ao periacuteodo em quecomeccedilaram a adotar essa caracteriacutestica e a quantidade de expressotildees lambda por snapshot

511 Projetos Selecionados

Atraveacutes dos grupos de classificaccedilatildeo identificados pela anaacutelise temporal descritos na Figura45 cinco projetos foram selecionados para uma anaacutelise detalhada levando em consideraccedilatildeoo grupo em que eles pertencem Estes projetos seratildeo apresentados a seguir

512 agera

Agera eacute uma biblioteca Android que ajuda a introduzir programaccedilatildeo funcional reativa(functional reactive programming) em projetos Android Eacute um projeto recente lanccediladoem 2016 pela Google [44] e encontra-se no grupo dos projetos que introduziram expressotildeeslambda em 2016 no mesmo ano de seu lanccedilamento contendo uma meacutedia de expressotildeeslambda de 16 lambdasnapshot

Na classificaccedilatildeo estabelecida agera pertence ao Grupo 1 onde a quantidade de ex-pressotildees lambda no projeto com o tempo aumentam juntamente com a quantidade deAICs como mostra o graacutefico de anaacutelise temporal na Figura 52

34

Figura 52 Graacuteficos de anaacutelise temporal do projeto agera

513 vertx

Eclipse Vertx eacute um conjunto de ferramentas para criaccedilatildeo de reactive applications namaacutequina virtual Java (JVM) em grande escala [45] Seu primeiro lanccedilamento aconteceuem 2011 e a primeira ocorrecircncia de expressotildees lambda no projeto aconteceu em 2014 Esteprojeto possui uma meacutedia de 2867 lambdasnapshot e dentre os projetos consideradosneste trabalho eacute o que possui a maior quantidade de expressotildees lambda

Este projeto pertence ao Grupo 2 onde a quantidade de expressotildees lambda aumen-tou consideravelmente pelos meses ultrapassando a quantidade de AICs que diminuiudrasticamente como mostra a Figura 53

35

Figura 53 Graacuteficos de anaacutelise temporal do projeto Vertx

514 Android-CleanArchitecture

Apesar de ser uma amostra de projeto Android-CleanArchitecture que tem como objetivoconstruir aplicaccedilotildees Android utilizando clean architecture foi lanccedilado em 2014 mas semanteacutem sempre atualizado [46]

A introduccedilatildeo de expressotildees lambda que aconteceu no ano de 2015 se deu de formatiacutemida com uma meacutedia de 35 lambdasnapshot De qualquer forma este projeto conseguerepresentar com seu graacutefico de anaacutelise temporal o grupo 3 composto por projetos em quea quantidade de expressotildees lambda aumentou mas sem ultrapassar AICs que diminuiacuteramdemonstrado no graacutefico da Figura 54

36

Figura 54 Graacuteficos de anaacutelise temporal do projeto Android-CleanArchitecture

515 RxJava

Dentre os repositoacuterios estudados RxJava eacute considerado o mais popular Como umaimplementaccedilatildeo de Reactive Extensions para a JVM RxJava teve seu lanccedilamento dadoem 2013 [47] Expressotildees lambda apareceram pela primeira vez no ano de 2015 comuma meacutedia de 766 lambdasnapshot

Apesar de uma meacutedia relativamente alta o tempo de vida das expressotildees lambda nesteprojeto foi bem curto caracterizando assim projetos do grupo 4 houve a introduccedilatildeo dasexpressotildees lambda no projeto poreacutem houve a remoccedilatildeo completa de todas as expressotildeeslambda previamente introduzidas desaparecendo completamente do projeto ateacute a datada coleta de dados (Figura 55)

37

Figura 55 Graacuteficos de anaacutelise temporal do projeto RxJava

516 guava

Guava eacute um conjunto de bibliotecas para Java da Google lanccedilado em 2011 A atualizaccedilatildeodo coacutedigo do projeto para Java 8 aconteceu somente em 2016 e apesar do projeto conteruma meacutedia de 281 lambdasnapshot ele foi escolhido como representante dos projetosdo Grupo 5 (Figura 56) que possuem expressotildees lambda mas de forma natildeo expressiva osuficiente quando comparado com a quantidade de AIC pelo fato de sua razatildeo de meacutedia delambdasnapshot por meacutedia de AICsnapshot ser 004 Ou seja embora o projeto tenhaexpressotildees lambda estas satildeo consideradas muito poucas quando inseridas no contextogeral deste projeto que eacute considerado um projeto grande

38

Figura 56 Graacuteficos de anaacutelise temporal do projeto Guava

52 Refatoraccedilatildeo de Coacutedigo

Com o objetivo de caracterizar melhor como as expressotildees lambda estatildeo sendo utilizadaseacute interessante identificar se estas estatildeo sendo introduzidas atraveacutes de refatoraccedilatildeo de coacutedigoou em coacutedigo novo

Os projetos classificados como pertencentes ao Grupo 2 possuem em comum o fatode expressotildees lambda aumentarem a medida que AICs diminuem ultrapassando-as eessa caracteriacutestica em comum pode indicar que nestes projetos possivelmente houve re-fatoraccedilatildeo de coacutedigo visto que AIC sendo substituiacutedo por expressotildees lambda dentro dascondiccedilotildees determinadas eacute a maneira mais comum de se identificar refatoraccedilatildeo de coacute-digo para introduccedilatildeo de expressotildees lambda [12] Os projetos que compotildeem o grupo 2representam 44 de todos os projetos estudados que possuem expressotildees lambda o quepode ser um indicativo caso a hipoacutetese de refatoraccedilatildeo de coacutedigo seja positiva de quemuitos projetos que estatildeo adotando o Java 8 estatildeo se preocupando de alguma formacom refatoraccedilatildeo se coacutedigo Fazem parte desse grupo os seguintes projetos elasticsearchjava-design-patterns PocketHub presto RxJava-Android-Samples spark vertx zipkinjava8-tutorial dropwizard e material-dialogs

39

Outra maneira de verificar possiacuteveis indicadores de refatoraccedilatildeo de coacutedigo foi atraveacutesda anaacutelise dos tamanhos (em quantidade de linhas de coacutedigo) dos meacutetodos com expressotildeeslambda no mecircs em que se introduziu expressotildees lambda e um mecircs imediatamente antesdeste Essa anaacutelise mostra que dos 25 projetos com expressotildees lambda 12 (48) projetostiveram ao menos um meacutetodo em que houve uma diminuiccedilatildeo no tamanho o que podeser considerado um indicativo de refatoraccedilatildeo de coacutedigo A Figura 57 mostra todos osprojetos em relaccedilatildeo agrave quantidade total de meacutetodos que possuem lambda no primeiro mecircsde introduccedilatildeo do mesmo em vermelho comparado com a quantidade desses meacutetodos quetiveram uma diminuiccedilatildeo no tamanho quando comparados com o coacutedigo do mecircs anteriorem azul

Figura 57 Comparaccedilatildeo entre todos os projetos com expressatildeo lambda sobre refatoraccedilatildeode coacutedigo no mecircs de introduccedilatildeo da caracteriacutestica

Ainda observando a figura 57 com relaccedilatildeo aos projetos que natildeo tiveram nenhummeacutetodo com diminuiccedilatildeo de tamanho (barra azul) percebe-se que todos os 13 projetossequer tiveram uma quantidade significativa de meacutetodos que possuem expressotildees lambda(com o maior tendo apenas 5 meacutetodos) no mecircs de introduccedilatildeo da caracteriacutestica no projetoe ao mesmo tempo jaacute existiam no mecircs em que natildeo existia lambda no projeto Essa eacuteuma observaccedilatildeo importante porque projetos como vertx sendo este o que possui a maiormeacutedia de lambdasnapshot de todos os projetos e ao mesmo tempo tendo apenas trecircsmeacutetodos que continham expressotildees lambda no mecircs da introduccedilatildeo e que existiam no mecircs

40

anterior permitem inferir que todas as outras expressotildees lambda existentes no projetopara este determinado mecircs de introduccedilatildeo encontram-se em coacutedigo novo introduzido

Eacute importante ressaltar que somente essa anaacutelise natildeo eacute exclusivamente suficiente paradeterminar se estes projetos estatildeo realmente introduzindo lambda em coacutedigo novo ourealizando refatoraccedilatildeo uma vez que como a comparaccedilatildeo aconteceu apenas no mecircs deintroduccedilatildeo com o mecircs imediatamente anterior natildeo reflete todo o ciclo de vida do pro-jeto Por exemplo algumas equipes podem escolher refatorar o coacutedigo depois de umtempo de adaptaccedilatildeo apoacutes a transiccedilatildeo para a nova versatildeo da linguagem Assim paraobter uma melhor anaacutelise sobre refatoraccedilatildeo de coacutedigo ou natildeo feita nestes projetos aleacutemde outras anaacutelises referentes aos padrotildees tipicamente adotados para implementaccedilatildeo delambda nestes projetos seratildeo apresentados a seguir os estudos de caso dos cinco projetospreviamente selecionados

Outro ponto importante eacute o fato de que apesar das informaccedilotildees quanto agraves quantida-des de filter e map terem sido incluiacutedas inicialmente no trabalho para observar possiacuteveispadrotildees de refatoraccedilatildeo de coacutedigo percebeu-se que estas natildeo satildeo utilizadas de forma con-sideraacutevel pelos projetos estudados e para fins de anaacutelises generalizadas natildeo apresentaramtanta influecircncia na utilizaccedilatildeo de expressotildees lambda quanto a quantidade de AICs noprojeto

53 Estudos de Caso

Dentre os projetos analisados verificou-se que os projetos de pequeno e meacutedio porte op-taram por refatorar de uma vez seus coacutedigos para incluir expressotildees lambda em situaccedilotildeesem que se utilizava AICs anteriormente ou em alguns poucos casos de utilizaccedilatildeo deCollection Os projetos de grande porte natildeo apresentaram nenhuma refatoraccedilatildeo de coacute-digo ou uma refatoraccedilatildeo parcial gradativa provavelmente devido agrave grande quantidade dearquivos e coacutedigo que possuem o que pode tornar o trabalho de refatoraccedilatildeo extenso ecansativo

O projeto vertx que pertence ao grupo 2 dos projetos em que a quantidade de ex-pressotildees lambda aumentaram e as de AICs diminuiacuteram com lambda ultrapassando AICsexecutou inicialmente commits em maio de 2014 com adiccedilatildeo de coacutedigo novo utilizandoexpressotildees lambda e apoacutes um mecircs realizou um commit maior com a refatoraccedilatildeo de todasas AICs para expressotildees lambda Apoacutes a refatoraccedilatildeo o projeto se preocupou em mantera utilizaccedilatildeo de expressotildees lambda ao mesmo tempo que o uso de AICs se manteve apenasaos casos de classes com interfaces natildeo funcionais A Figura 58 apresenta uma parte docommit de refatoraccedilatildeo de coacutedigo que mostra em vermelho a parte eliminada do coacutedigo(AIC) e em verde o coacutedigo novo representando a substituiccedilatildeo por uma expressatildeo lambda

41

Figura 58 Commit de refatoraccedilatildeo de coacutedigo do projeto Vertx [3]

Alguns projetos ainda natildeo se preocuparam em refatorar o coacutedigo para o uso de ex-pressotildees lambda ateacute a data deste trabalho que eacute o caso do projeto guava que apresentouum commit em 03112016 com a atualizaccedilatildeo do projeto para Java 8 Mas a partir daatualizaccedilatildeo se preocupou em utilizar as expressotildees lambda apenas na implementaccedilatildeo decoacutedigo novo O cenaacuterio em que a refatoraccedilatildeo natildeo eacute prioridade ainda eacute a realidade de vaacuteriosprojetos de grande porte visto que os dados de projetos sem nenhuma expressatildeo lambdasatildeo o maior nuacutemero neste trabalho Poreacutem projetos que jaacute adotaram a utilizaccedilatildeo do Java8 tendem a mudar isso com o passar do tempo A Figura 59 apresenta em verde umaadiccedilatildeo de coacutedigo novo com expressatildeo lambda sem a eliminaccedilatildeo de algum coacutedigo anteriora esse que estaria em vermelho

42

Figura 59 Exemplo de um arquivo do commit de adiccedilatildeo de coacutedigo novo em Java 8 doprojeto Guava [4]

Na categoria de projetos em que os AICs e expressotildees lambda aumentam proporci-onalmente (grupo 1) o projeto agera realizou um commit em 19052016 com a adiccedilatildeoda biblioteca retrolambda como dependecircncia do projeto Essa biblioteca utilizada prin-cipalmente por projetos Android permite executar coacutedigo Java 8 contendo expressotildeeslambda em Java 5 6 e 7 [48] O commit tambeacutem apresenta refatoraccedilatildeo dos AICs ad-vindos de interfaces funcionais para expressotildees lambda Apesar de o projeto continuar autilizar as expressotildees lambda em seus commits posteriores o nuacutemero de AICs tambeacutemcontinuou a aumentar visualizando os commits posteriores notou-se que esses AICs satildeorelativos a interfaces natildeo funcionais ou seja que possuem mais de um meacutetodo O projetoAndroid-CleanArchitecture eacute similar ao agera pois tambeacutem optou pela instalaccedilatildeo da bi-blioteca retrolambda para uso de expressotildees lambda em seus coacutedigos e como tambeacutem eacuteum projeto de pequeno porte houve uma pequena refatoraccedilatildeo dos AICs A Figura 510mostra a parte do commit de refatoraccedilatildeo de coacutedigo em que o desenvolvedor adiciona abiblioteca retrolambda como dependecircncia

43

Figura 510 Commit de adiccedilatildeo da biblioteca Retrolambda no projeto Agera [5]

Outro caso interessante eacute o do projeto RxJava que em 2015 optou pela refatoraccedilatildeodo coacutedigo para a utilizaccedilatildeo de expressotildees lambda quase eliminando por completo o usode AICs mas que no ano seguinte reverteu os commits de forma que eliminasse comple-tamente o uso de expressotildees lambda para manter a retrocompatibilidade com o Java 6A Figura 511 demonstra uma parte do commit de reversatildeo do coacutedigo para Java 6 emque pode ser visto em vermelho o coacutedigo anterior com expressotildees lambda e o verde como novo coacutedigo utilizando AIC novamente

44

Figura 511 Commit de remoccedilatildeo de Lambdas e volta para o uso de AICs no projetoRXJava [6]

Essa preocupaccedilatildeo com retrocompatibilidade de coacutedigo pode ser um fator crucial nadecisatildeo das equipes de desenvolvimento na hora de decidir como fazer o software co-evoluircom a linguagem sem perder a compatibilidade com versotildees anteriores

45

Capiacutetulo 6

Consideraccedilotildees Finais

Este estudo permitiu entender melhor como projetos estatildeo realizando a migraccedilatildeo para oJava 8 em especial utilizando uma nova caracteriacutestica introduzida expressatildeo lambdaApesar de a maioria dos projetos populares considerados natildeo possuiacuterem nenhuma ocor-recircncia de expressotildees lambda os projetos que tinham expressotildees lambda foram suficientespara realizar um primeiro estudo de caracterizaccedilatildeo no uso desta caracteriacutestica e com osprojetos efetivamente utilizados para estudo foi possiacutevel agrupaacute-los quanto a maneira emque as expressotildees lambda estavam sendo utilizadas quando comparadas com AICs em 5grandes grupos quando AIC e lambda aumentam proporcionalmente quando AIC dimi-nui e lambda aumenta ultrapassando AIC quando AIC diminui mas continua superior aolambda crescente expressotildees lambda que foram introduzidas e retiradas completamentedo coacutedigo e expressotildees lambda que natildeo existem em quantidades expressivas

Foi possiacutevel entatildeo realizar um estudo aprofundado levando em consideraccedilatildeo as di-ferentes maneiras com que as expressotildees lambda foram adotadas nos projetos atraveacutes daescolha de um projeto que representasse cada grupo para anaacutelise Dentre os cinco projetosestudados foi possiacutevel observar alguns padrotildees tipicamente adotados por desenvolvedorespara implementar expressotildees lambda em seus projetos como a utilizaccedilatildeo da bibliotecas(retrolambda) que permitissem uma flexibilizaccedilatildeo na utilizaccedilatildeo de expressotildees lambda oucomo lambda eacute primariamente utilizada para substituir determinados AICs ou operaccedilotildeesem Collection

Aleacutem disso foi possiacutevel observar como a refatoraccedilatildeo de coacutedigo acontece em cada umdesses projetos Observou-se como projetos menores tendem a refatorar coacutedigo maisfacilmente ao passo que projetos maiores e mais complexos fazem menos refatoraccedilatildeo oudemoram mais entre o periacuteodo em que houve a primeira migraccedilatildeo de coacutedigo para a novaversatildeo da linguagem ateacute o periacuteodo em que realmente decidem refatorar coacutedigo Aleacutem dacomplexidade do projeto influenciar na decisatildeo de migrar o projeto para uma versatildeo maisrecente da linguagem a preocupaccedilatildeo com retrocompatibilidade com versotildees anteriores da

46

linguagem tambeacutem podem ser uma barreira para que projetos comecem a evoluir o coacutedigojuntamente com a evoluccedilatildeo da linguagem

Ainda assim foi possiacutevel observar que a preocupaccedilatildeo com a co-evoluccedilatildeo do software-linguagem existe entre os desenvolvedores de projetos mas a realizaccedilatildeo da migraccedilatildeo aindaacontece lentamente devido agrave diversos fatores que precisam ser levados em consideraccedilatildeopara a manutenccedilatildeo do projeto

Para trabalhos e contribuiccedilotildees futuras seria interessante desenvolver uma ferramentaque pudesse analisar diretamente no coacutedigo-fonte as oportunidades de aplicaccedilatildeo de ex-pressotildees lambda dessa forma poderiam ser analisadas as porcentagens de conversatildeo decoacutedigo para Java 8 e obter melhores conclusotildees sobre a importacircncia que os projetos estatildeodando para a evoluccedilatildeo de seus coacutedigos Outro fator interessante seria aplicar mais Visitorsagrave ferramenta static-analysis e fazer este mesmo estudo aplicado agrave outras caracteriacutesticasda linguagem

47

Referecircncias

[1] Kagdi Huzefa Michael L Collard e Jonathan I Maletic A survey and taxonomyof approaches for mining software repositories in the context of software evolution2007 ix 3 8 9 10 11

[2] DBeaver Dbeaver - features httpdbeaverjkissorgdocsfeatures ix 29

[3] Eclipse Vertx commit Java8-ify code httpsgithubcomeclipsevertxcommit93f95e9c77419f442a42fe711b6eeaef88192fd3 ix 42

[4] Google Guava commit Release java 8 changes to guava httpsgithubcomgoogleguavacommit73e382fa877f80994817a136b0adcc4365ccd904 ix 43

[5] Google Agera commit Collapsed testapp with retrolambda httpsgithubcomgoogleageracommit5e518b7b05f9e7a34a314945f68deff7b2c3e334 ix 44

[6] ReactiveX Rxjava commit 2x full jdk 6 compatible backport + includ-ing bugfixes up to today httpsgithubcomReactiveXRxJavacommit000a174d87a901135f9665d3b11f3627fd2dc4ed ix 45

[7] Godfrey M W e D M German The past present and future of software evolutionEm 2008 Frontiers of Maintenance paacuteginas 129ndash138 Sept 2008 1 6

[8] Favre J M Languages evolve too changing the software time scale Em Principles ofSoftware Evolution Eighth International Workshop on paacuteginas 33ndash42 IEEE 20051 5 7

[9] Overbey Jeffrey L e Ralph E Johnson Regrowing a language refactoring tools allowprogramming languages to evolve Em ACM SIGPLAN Notices volume 44 paacuteginas493ndash502 ACM 2009 1 5 7 8 12

[10] Grechanik Mark Collin McMillan Luca DeFerrari Marco Comi Stefano CrespiDenys Poshyvanyk Chen Fu Qing Xie e Carlo Ghezzi An empirical investiga-tion into a large-scale java open source code repository Em Proceedings of the2010 ACM-IEEE International Symposium on Empirical Software Engineering andMeasurement ESEM rsquo10 paacuteginas 111ndash1110 New York NY USA 2010 ACMISBN 978-1-4503-0039-1 httpdoiacmorg10114518527861852801 1

[11] TIOBE Tiobe httpswwwtiobecomtiobe-index 1 14

48

[12] Gyori Alex Lyle Franklin Danny Dig e Jan Lahoda Crossing the gap from im-perative to functional programming through refactoring Em Proceedings of the 20139th Joint Meeting on Foundations of Software Engineering ESECFSE 2013 paacute-ginas 543ndash553 New York NY USA 2013 ACM ISBN 978-1-4503-2237-9 httpdoiacmorg10114524914112491461 2 11 24 39

[13] OpenJDK State of the lambda httpcropenjdkjavanet~briangoetzlambdalambda-state-4html 2

[14] Han Jiawei Micheline Kamber e Jian Pei Data Mining Concepts and TechniquesMorgan Kaufmann Publishers Inc San Francisco CA USA 3rd ediccedilatildeo 2011ISBN 0123814790 9780123814791 3

[15] Fowler Martin e Kent Beck Refactoring improving the design of existing codeAddison-Wesley Professional 1999 5 7

[16] Lehman M M J F Ramil P D Wernick D E Perry e W M Turski Met-rics and laws of software evolution - the nineties view Em Proceedings of the4th International Symposium on Software Metrics METRICS rsquo97 paacuteginas 20ndashWashington DC USA 1997 IEEE Computer Society ISBN 0-8186-8093-8 httpdlacmorgcitationcfmid=823454823901 6

[17] Hassan Ahmed E e Tao Xie Software intelligence The future of mining softwareengineering data Em Proceedings of the FSESDP Workshop on Future of SoftwareEngineering Research FoSER rsquo10 paacuteginas 161ndash166 New York NY USA 2010ACM ISBN 978-1-4503-0427-6 httpdoiacmorg101145188236218823978 9

[18] Hassan Ahmed E The road ahead for mining software repositories Em Frontiers ofSoftware Maintenance 2008 FoSM 2008 paacuteginas 48ndash57 IEEE 2008 8

[19] Berry Michael J e Gordon Linoff Data Mining Techniques For Marketing Salesand Customer Support John Wiley amp Sons Inc New York NY USA 1997ISBN 0471179809 10

[20] Parnin Chris Christian Bird e Emerson Murphy-Hill Java generics adoption hownew features are introduced championed or ignored Em Proceedings of the 8thWorking Conference on Mining Software Repositories paacuteginas 3ndash12 ACM 2011 12

[21] Oracle The java language specification httpsdocsoraclecomjavasespecsjlsse8jls8pdf 13

[22] Oracle The history of java technology httpwwworaclecomtechnetworkjavajavaseoverviewjavahistory-index-198355html 13

[23] Murphy Kieron So why did they decide to call itjava httpwwwjavaworldcomarticle2077265core-javaso-why-did-they-decide-to-call-it-java-html 13

[24] McGraw Tata Object-oriented Programming with Java Essentials and ApplicationsHill Education 13

49

[25] Oracle Differences between java ee and java se httpdocsoraclecomjavaee6firstcupdocgkhoyhtml 13

[26] Lindsey Clark S The History of Java Cambridge 14

[27] Oracle The java language environment httpwwworaclecomtechnetworkjavaintro-141325html 14

[28] Oracle Jdk 8 httpopenjdkjavanetprojectsjdk8 15 24

[29] Oracle Enhancements in java se 8 httpdocsoraclecomjavase8docstechnotesguideslanguageenhancementshtmljavase8 15 16 17

[30] Oracle Lambda expressions httpdocsoraclecomjavasetutorialjavajavaOOlambdaexpressionshtml 16 18 21

[31] Oracle Method references httpdocsoraclecomjavasetutorialjavajavaOOmethodreferenceshtml 16

[32] Oracle Default methods httpdocsoraclecomjavasetutorialjavaIandIdefaultmethodshtml 17

[33] Oracle Repeating annotations httpdocsoraclecomjavasetutorialjavaannotationsrepeatinghtml 17

[34] Oracle Type annotations httpdocsoraclecomjavasetutorialjavaannotationstype_annotationshtml 17

[35] Oracle Anonymous inner classes httpsdocsoraclecomjavasetutorialjavajavaOOanonymousclasseshtml 19

[36] Kothari CR Research Methodology Methods and Techniques New Age Interna-tional (P) Limited 2004 ISBN 9788122415223 httpsbooksgooglecombrbooksid=8c6gkbKi-F4C 22

[37] Nakakoji Kumiyo Yasuhiro Yamamoto Yoshiyuki Nishinaka Kouichi Kishida eYunwen Ye Evolution patterns of open-source software systems and communitiesEm IWPSE rsquo02 Proceedings of the International Workshop on Principles of SoftwareEvolution paacuteginas 76ndash85 New York NY USA 2002 ACM Press ISBN 1581135459httpdxdoiorg101145512035512055 23

[38] Rahman Foyzur Christian Bird e Premkumar Devanbu Clones What is that smellEmpirical Software Engineering 17(4-5)503ndash530 2012 24

[39] Chacon Scott Pro Git Apress Berkely CA USA 1st ediccedilatildeo 2009ISBN 1430218339 9781430218333 25

[40] Cavalcanti Thiago Gomes e Viniacutecius Correa de Almeida Caracterizaccedilatildeo do uso deconstruccedilotildees da linguagem java em projetos open-source Publicaccedilatildeo online 2016httpbdmunbbrhandle1048315733 27

50

[41] Parr Terence Language Implementation Patterns Create Your Own Domain-Specific and General Programming Languages Pragmatic Bookshelf 1st ediccedilatildeo 2009ISBN 193435645X 9781934356456 27

[42] Janssen Thorben 5 reasons to use jpa hibernate Publicaccedilatildeo online httpswwwsitepointcom5-reasons-to-use-jpa-hibernate 27

[43] Franklin Lyle Alex Gyori Jan Lahoda e Danny Dig Lambdaficator From imperativeto functional programming through automated refactoring Em Proceedings of the2013 International Conference on Software Engineering ICSE rsquo13 paacuteginas 1287ndash1290 Piscataway NJ USA 2013 IEEE Press ISBN 978-1-4673-3076-3 httpdlacmorgcitationcfmid=24867882486986 29

[44] Google Agera httpsgithubcomgoogleagerawiki 34

[45] Eclipse Eclipse vertx httpvertxio 35

[46] Cejas Fernando Android cleanarchitecture httpsgithubcomandroid10Android-CleanArchitecture 36

[47] ReactiveX Rxjava httpsgithubcomReactiveXRxJava 37

[48] Luontola Esko Retrolambda httpsgithubcomorfjackalretrolambda 43

51

Anexo I

Projetos utilizados

fastjson

platform_frameworks_base

netty

material-dialogs

kotlin

okhttp

tinker

AndroidUtilCode

RxJava

spring-boot

java-design-patterns

elasticsearch

ExoPlayer

kafka

vertx

realm-java

guava

zipkin

bazel

stetho

Signal-Android

glide

agera

fresco

plaid

presto

libgdx

spark

52

disruptor

lottie-android

flexbox-layout

PocketHub

zxing

spring-framework

deeplearning4j

dropwizard

interviews

BaseRecyclerViewAdapterHelper

uCrop

DanmakuFlameMaster

lottie-react-native

android-UniversalMusicPlayer

AndroidInterview-Q-A

greenDAO

retrofit

MaterialDrawer

BottomBar

druid

MPAndroidChart

Hystrix

guice

recyclerview-animators

dubbo

androidannotations

RxJava-Android-Samples

PhotoView

clojure

CircleImageView

AndroidSwipeLayout

jedis

MaterialViewPager

butterknife

junit4

RxBinding

leakcanary

SimianArmy

picasso

UltimateRecyclerView

53

AndroidViewAnimations

AppIntro

FizzBuzzEnterpriseEdition

ion

cheesesquare

physical-web

RxAndroid

Android-CleanArchitecture

Calligraphy

Android-Bootstrap

iosched

Android_Data

MaterialDesignLibrary

ListViewAnimations

EventBus

java8-tutorial

AndroidSlidingUpPanel

dagger

okhttputils

logger

HomeMirror

Material-Animations

android-Ultra-Pull-To-Refresh

android-async-http

Android-ObservableScrollView

Android-Universal-Image-Loader

ActionBarSherlock

SlidingMenu

storm

PagerSlidingTabStrip

Android-PullToRefresh

54

  • Dedicatoacuteria
  • Agradecimentos
  • Resumo
  • Abstract
  • Introduccedilatildeo
    • Contexto
    • Objetivos
      • Objetivos Gerais
      • Objetivos Especiacuteficos
        • Metodologia
        • Organizaccedilatildeo do Trabalho
          • Evoluccedilatildeo e Mineraccedilatildeo de Repositoacuterios de Software
            • Evoluccedilatildeo de Software
            • MSR Mineraccedilatildeo de dados e a Engenharia de Software
              • Classificaccedilatildeo
                • Trabalhos Relacionados
                  • Java SE 8 e JDK 8
                    • Histoacuterico
                    • Princiacutepios
                    • Evoluccedilatildeo
                    • Expressotildees Lambda
                      • Sintaxe
                      • Principais formas de uso
                          • Estudo e o Processo de Mineraccedilatildeo
                            • Questotildees de Pesquisa
                            • Fonte de Dados e Objetos de Estudo
                            • Processo de Mineraccedilatildeo
                              • static-analysis
                              • BDAnalisador
                                • Classificaccedilatildeo e Anaacutelise
                                  • Meacutedia de Lambda
                                  • Anaacutelise Temporal
                                  • Refatoraccedilatildeo de Coacutedigo
                                  • Casos de Uso
                                      • Resultados Obtidos e Anaacutelise
                                        • Visatildeo Geral
                                          • Projetos Selecionados
                                          • agera
                                          • vertx
                                          • Android-CleanArchitecture
                                          • RxJava
                                          • guava
                                            • Refatoraccedilatildeo de Coacutedigo
                                            • Estudos de Caso
                                              • Consideraccedilotildees Finais
                                              • Referecircncias
                                              • Anexo
                                              • Projetos utilizados

bull Histoacuterico de Comunicaccedilatildeo (Archived communications) estes repositoacuterios rastreiamdiscussotildees sobre os vaacuterios aspectos de um projeto de software por sua vida uacutetil Porexemplo listas de e-mails

bull Deployment logs logs com informaccedilotildees do software gerados por ferramentas dedesenvolvimento

bull Repositoacuterios de software Repositoacuterios onde o coacutedigo fonte de vaacuterios projetos satildeoarmazenados como por exemplo Sourceforgenet

No contexto deste trabalho estes repositoacuterios consistem em fontes de coacutedigo armaze-nadas em sistemas de controle de versatildeo especificamente coacutedigos na plataforma Github

O propoacutesito

O propoacutesito da mineraccedilatildeo de repositoacuterios de software se resume nas perguntas de pes-quisa que podem ser respondidas utilizando mineraccedilatildeo Assim existem duas classes deperguntas de pesquisa para MSR [1]

A primeira eacute a pergunta de anaacutelise market-basket1 ldquoSe A acontece o que mais podeacontecerrdquo A resposta para este tipo de pergunta eacute um conjunto de regras descrevendotendecircncias de relacionamentos como por exemplo se A acontecer entatildeo B e C acontecemdurante um periacuteodo X

A segunda classe diz respeito agraves perguntas de prevalecircncia (Prevalence Questions -PQ) como por exemplo perguntas do tipo ldquoA funcionalidade Y foi modificadardquo quepossuem uma resposta booleana ou ldquoQuantas vezes esta funcionalidade Y foi modificadardquocontendo uma resposta quantitativa

As perguntas de pesquisa deste trabalho se encaixam majoritariamente na segundaclasse onde o objetivo traccedilado eacute respondido de forma quantitativa com algumas tentativasde classificaccedilatildeo de tipos de repositoacuterios como seraacute descrito nos capiacutetulos seguintes

A metodologia

A metodologia corresponde a maneira como as questotildees de MSR iratildeo ser respondidas evaacuterias abordagens estatildeo disponiacuteveis Poreacutem Kagdi indica duas estrateacutegias baacutesicas quepodem ser utilizadas

Primeiramente pode-se utilizar a mediccedilatildeo indireta e anaacutelise da evoluccedilatildeo do softwareEsta abordagem pode ser realizada da seguinte forma extrair e computar informaccedilotildeesde cada versatildeo de um software separadamente e em seguida individualmente comparar

1Anaacutelise Market-basket eacute uma teacutecnica de modelagem baseada na teoria de que se vocecirc comprar certostipos de produtos vocecirc haacute uma probabilidade maior (ou menor) de comprar outros tipos de produtos [19]

10

propriedades encontradas como por exemplo comparar duas versotildees distintas de umsoftware atraveacutes de um repositoacuterio github realizando uma investigaccedilatildeo de alto niacutevel noque diz respeito a evoluccedilatildeo do software [1]

A segunda perspectiva de metodologia que pode ser utilizada corresponde agrave mediccedilatildeodireta e anaacutelise da evoluccedilatildeo do software Ela diz respeito agraves investigaccedilotildees que estudamos mecanismos que leva um software a ser modificado de uma versatildeo para outra focandonas diferenccedilas especiacuteficas entre estas versotildees como por exemplo examinando mudanccedilasespeciacuteficas das classes arquivos funccedilotildees de cada parte do coacutedigo [1]

Assim eacute possiacutevel descrever explicitamente que este trabalho utiliza em sua maioriauma metodologia com mediccedilotildees diretas atraveacutes da anaacutelise estaacutetica de informaccedilotildees docoacutedigo fonte de diferente versotildees para analisar os diferentes padrotildees de desenvolvimentoem que expressotildees lambda (definidas no capiacutetulo seguinte) satildeo utilizadas

A Avaliaccedilatildeo

Por fim existem diversas formas para se avaliar o estudo realizado sempre levando emconsideraccedilatildeo a validade dos resultados obtidos Pode-se utilizar de meacutetricas para avaliar osdados considerando o quanto das informaccedilotildees obtidas satildeo relevantes Outra forma de seavaliar seria atraveacutes da utilizaccedilatildeo de modelos probabiliacutesticos seguindo uma abordagemde teoria da informaccedilatildeo Assim foram utilizadas determinadas meacutetricas quantitativaspara avaliar os resultados obtidos neste trabalho

23 Trabalhos Relacionados

Como ressaltado na introduccedilatildeo o foco deste trabalho encontra-se em utilizar teacutecnicas deMSR para caracterizar a adoccedilatildeo de expressotildees lambda em repositoacuterios Java Ao reali-zar um estudo sobre o estado da arte encontrou-se diversos trabalhos que utilizam deMSR para obter informaccedilotildees relevantes sobre repositoacuterios de software em diversos focose em especial trabalhos que investiguem repositoacuterios na linguagem Java Jaacute existemtambeacutem alguns trabalhos que apresentam ferramentas de refatoraccedilatildeo de coacutedigo para im-plementaccedilatildeo de expressotildees lambda com foco na evoluccedilatildeo do software Dentre os trabalhosencontrados mencionados destacam-se

bull Em um trabalho sobre utilizaccedilatildeo de refatoraccedilatildeo de coacutedigo para realizar a transiccedilatildeode coacutedigo Java para as novas caracteriacutesticas implementadas no Java 8 Gyori et alapresenta uma ferramenta que automatiza com sucesso o trabalho de conversatildeo decoacutedigo como Annonymous Inner Class para expressotildees lambda [12] O capiacutetulo aseguir descreve em detalhes estes conceitos

11

bull Regrowing a Language de Overbey apresenta um estudo sobre a importacircncia da co-evoluccedilatildeo entre a linguagem de programaccedilatildeo e os projetos de software focando naslinguagens Fortran e Java e provando como ferramentas de refatoraccedilatildeo de coacutedigoauxiliam para que o software consiga evoluir juntamente com sua linguagem deprogramaccedilatildeo [9]

bull O trabalho sobre a adoccedilatildeo de generics em coacutedigo Java feito por Parnin utiliza demineraccedilatildeo de dados para realizar uma investigaccedilatildeo empiacuterica avaliando projetos decoacutedigo aberto com o objetivo de observar como desenvolvedores destes projetos estatildeoutilizando generics em Java [20]

Os estudos mencionados focam em assuntos particulares pertinentes a este trabalhoem que de um lado tem-se trabalhos que mostram a necessidade de refatoraccedilatildeo de coacutedigopara evoluccedilatildeo de software e do outro tem-se trabalhos que mostram que eacute possiacutevel utilizarde MSR para entender melhor como a evoluccedilatildeo da linguagem de programaccedilatildeo Java temafetado projetos reais de coacutedigo aberto e como estes projetos estatildeo se adaptando a estasevoluccedilotildees

12

Capiacutetulo 3

Java SE 8 e JDK 8

Este trabalho tem como objetivo caracterizar a adoccedilatildeo de expressotildees Lambda em siste-mas Java que podem ser considerados legados pois foram concebidos em um momentoanterior a introduccedilatildeo dessa nova caracteriacutestica na linguagem Java Com o intuito de faci-litar o entendimento do leitor sobre tais construccedilotildees esse capiacutetulo apresenta informaccedilotildeeshistoacutericas referentes agrave linguagem Java desde sua criaccedilatildeo ateacute a sua ascensatildeo como umadas linguagens de programaccedilatildeo mais populares Aleacutem disso seratildeo apresentadas as novascaracteriacutesticas presentes na versatildeo Java SE 8 com destaque nas expressotildees Lambda e deque forma vieram para auxiliar no desenvolvimento de sistemas

31 Histoacuterico

Java eacute uma linguagem de programaccedilatildeo orientada a objetos para propoacutesitos gerais [21] Alinguagem nasceu com o nome de Oak no ano de 1991 com o foco em televisotildees digitais acabo mas devido agrave complexidade e poder da linguagem logo expandiu-se para os outrosdomiacutenios principalmente a Internet [22] Posteriormente a linguagem recebeu o nome deGreentalk devido agrave marca Oak jaacute ser registrada por outra empresa e o principal projeto daequipe se chamar Green Por fim o nome Java foi o mais votado pela equipe da Sun emuma reuniatildeo para decidir o mais raacutepido possiacutevel um nome definitivo para a linguagem [23]

Em 1995 em sua primeira versatildeo puacuteblica 10 a linguagem Java jaacute comeccedilava a terum crescimento em sua popularidade como Web Applet nos navegadores mais popularesfornecendo seguranccedila e rapidez nas plataformas mais utilizadas [24] A cada nova versatildeopublicada novas funcionalidades e plataformas eram adicionadas e tornavam a linguagemmais difundida no meio computacional fazendo com que em 2006 a linguagem fosse divi-dida em Java EE (foco em rede e serviccedilos web) Java ME (foco em sistemas embarcados)e Java SE (foco em desktops e servidores) [25]

13

Apoacutes anos de evoluccedilatildeo e aprimoramento atraveacutes de diversas versotildees como visto naTabela 31 hoje o Java se tornou uma das linguagens de programaccedilatildeo mais utilizadas nomundo estando em aproximadamente 15 das linhas de coacutedigo disponiacuteveis pela inter-net [11] A quantidade de plataformas suportadas pela linguagem e com o advento dosistema operacional Android sendo rodado na maior parte dos smartphones do mundoaleacutem da simplicidade em codificar no paradigma orientado a objetos foram os fatoresrelevantes para que a linguagem se popularizasse no mundo digital [26]

Tabela 31 As versotildees anteriores de java e principais caracteriacutesticasVersatildeo Principais caracteriacutesticasJava 10 JVM e JDKJava 2 Event Listeners

Kestrel (Java 3) HotSpot JVMMerlin (Java 4) Diversas novas APIs como Assertion e expressotildees regularesTiger (Java 5) Generics

Mustang (Java 6) Web ServicesDolphin (Java 7) Suporte a linguagens dinamicas

32 Princiacutepios

Com o foco em alcanccedilar a Web e participar mais ativamente do mercado virtual e e-Commerce foram projetados princiacutepios que permitissem com que a linguagem pudessealcanccedilar seus objetivos principais ao mesmo tempo que mantinha a facilidade e fami-liarizaccedilatildeo da linguagem a seus desenvolvedores [27] Dessa forma a equipe da Oracledeterminou cinco princiacutepios que caracterizariam o foco da linguagem Java

bull simples orientada a objeto e familiar projetada para ser orientada a objeto epermitir que seus desenvolvedores comecem a codificar rapidamente sem a necessi-dade de uma curva de aprendizagem acentuada

bull segura e robusta projetada para prover software confiaacutevel por meio de checagensa tempo de compilaccedilatildeo e execuccedilatildeo Haacute uma grande preocupaccedilatildeo com seguranccediladevido agrave larga utilizaccedilatildeo da linguagem em sistemas distribuiacutedos

bull de arquitetura neutra e portaacutevel projetada para ser independente de qualquerarquitetura bastando rodar a JVM dessa forma garantindo a portabilidade paravaacuterios ambientes e dispositivos

14

bull executada em alta performance projetada para fornecer a maior performancepossiacutevel em tempo de execuccedilatildeo com a utilizaccedilatildeo do garbage collector em uma threadde baixa prioridade

bull interpretada dinacircmica e threaded projetada para ser interpretada por qual-quer dispositivo que possua JVM desenvolvida garantindo um desenvolvimento raacute-pido e em ciclos O uso da classe Thread permite que a linguagem acompanhe atendecircncia do paralelismo Aleacutem disso a ligaccedilatildeo de classes eacute feita em tempo real esomente quando necessaacuteria tornando-a dinacircmica

33 Evoluccedilatildeo

A primeira versatildeo do Java 8 foi lanccedilada em 2014 [28] e apresentou diversas atualizaccedilotildeesespalhadas em categorias como linguagem seguranccedila Collections ferramentas deployentre outras Dentre a grande quantidade de mudanccedilas os destaques se encontraram nasnovas melhorias presentes na linguagem que afetaram de forma mais direta a maneiracom que os desenvolvedores passaram a tratar e organizar o coacutedigo fonte As atualizaccedilotildeesreferentes a linguagem descritas oficialmente pela Oracle [29] satildeo

1 Lambda Expressions ou apenas Expressotildees Lambda correspondem a uma novacaracteriacutestica que permite que uma pequena funcionalidade possa ser utilizada comoum argumento de um meacutetodo facilitando a escrita de accedilotildees que seratildeo feitas repetida-mente em uma Collection ou quando um processo se completa ou quando encontraum erro Eacute tambeacutem uma forma compacta de se escrever coacutedigo que previamenteera escrito com anonymous inner classes [29] A Listagem 31 mostra uma classehipoteacutetica Calculator cujo meacutetodo operateBinary() recebe como paracircmetro doisinteiros e um objeto da classe IntegerMath que representa a operaccedilatildeo que deveraacuteser realizada ou seja uma funcionalidade dinacircmica

1 pub l i c c l a s s Ca l cu la to r 2

3 i n t e r f a c e IntegerMath 4 i n t opera t i on ( i n t a i n t b) 5 6

7 pub l i c i n t operateBinary ( i n t a i n t b IntegerMath op ) 8 re turn op opera t i on (a b) 9

10

11 pub l i c s t a t i c void main ( St r ing a rgs ) 12

15

13 Calcu la to r myApp = new Ca lcu la to r ( ) 14 IntegerMath add i t i on = (a b) minusgt a + b 15 IntegerMath subt ra c t i on = (a b) minusgt a minus b 16 System out p r i n t l n ( 40 + 2 = +17 myApp operateBinary (40 2 add i t i on ) ) 18 System out p r i n t l n ( 20 minus 10 = +19 myApp operateBinary (20 10 sub t ra c t i on ) ) 20 21 22

Listagem 31 Exemplo de coacutedigo com o uso de Expressatildeo Lambda [30]

2 Method References Frequentemente expressotildees lambda criam meacutetodos anocircni-mos Algumas vezes poreacutem satildeo utilizadas para chamar um meacutetodo jaacute existentena classe Ao inveacutes de escrever a expressatildeo Lambda para esse caso pode-se optarpor utilizar um Method Reference que facilita a escrita e leitura desse uso de ex-pressatildeo Lambda [29] A Listagem 32 mostra um exemplo de um meacutetodo estaacuteticoque compara duas pessoas pelas suas idades e a Listagem 33 a utilizaccedilatildeo de MethodReference para aplicar a utilizaccedilatildeo desse meacutetodo em um array e reduzir a escrita deuma expressatildeo lambda a uma forma mais legiacutevel

1 pub l i c s t a t i c i n t compareByAge ( Person a Person b) 2 re turn a b i r thday compareTo (b b i r thday ) 3 4

Listagem 32 Exemplo de meacutetodo de uma classe Pessoa [31]

1 Arrays s o r t ( rosterAsArray Person compareByAge ) 2

Listagem 33 Exemplo de uso de Method Reference [31]

3 Default Methods satildeo meacutetodos com a palavra-chave default que servem para adi-cionar implementaccedilotildees de meacutetodos a uma interface de alguma biblioteca mantendoa compatibilidade binaacuteria com versotildees mais antigas dessa interface Tambeacutem pos-sibilita a implementaccedilatildeo de meacutetodos estaacuteticos em interfaces [29] A Listagem 34apresenta a inclusatildeo de um meacutetodo default na interface TimeClient

1 pub l i c i n t e r f a c e TimeClient 2 void setTime ( i n t hour i n t minute i n t second ) 3 void setDate ( i n t day i n t month i n t year ) 4 void setDateAndTime ( i n t day i n t month i n t year 5 i n t hour i n t minute i n t second )

16

6 LocalDateTime getLocalDateTime ( ) 7

8 s t a t i c ZoneId getZoneId ( S t r ing zoneStr ing ) 9 t ry

10 re turn ZoneId o f ( zoneStr ing ) 11 catch ( DateTimeException e ) 12 System e r r p r i n t l n ( I n v a l i d time zone + zoneStr ing

+13 us ing d e f a u l t time zone in s t ead ) 14 re turn ZoneId systemDefault ( ) 15 16 17

18 d e f a u l t ZonedDateTime getZonedDateTime ( St r ing zoneStr ing ) 19 re turn ZonedDateTime o f ( getLocalDateTime ( ) getZoneId (

zoneStr ing ) ) 20 21 22

Listagem 34 Exemplo de interface com um meacutetodo default [32]

4 Repeating Annotations permitem a implementaccedilatildeo e utilizaccedilatildeo de anotaccedilotildees deum mesmo tipo que podem ser utilizadas mais de uma vez para a mesma declara-ccedilatildeo [29] A Listagem 35 apresenta duas anotaccedilotildees iguais com paracircmetros diferentespermitindo uma customizaccedilatildeo maior na aplicaccedilatildeo de um tipo de anotaccedilatildeo

1 Schedule ( dayOfMonth= l a s t )2 Schedule (dayOfWeek= Fr i hour= 23 )3 pub l i c void doPeriodicCleanup ( ) 4

Listagem 35 Exemplo de Repeating Annotations [33]

5 Type Annotations permitem que anotaccedilotildees possam ser utilizadas em tipos aleacutemde declaraccedilotildees dessa forma pode-se garantir que um campo sempre atenda agraves suasexpectativas e evite testes desnecessaacuterios [29] A Listagem 36 mostra um exemplo derestriccedilatildeo a uma String que nunca poderaacute ser nula devido agrave anotaccedilatildeo de NonNull

1 NonNull S t r ing s t r

Listagem 36 Exemplo de Type Annotation garantindo que o campo nunca seja null [34]

17

34 Expressotildees Lambda

Uma das mudanccedilas mais interessantes implementadas no Java 8 foi a adiccedilatildeo de expressotildeeslambda As expressotildees lambda permitem que a linguagem Java possa atuar parcialmentecomo uma linguagem de programaccedilatildeo funcional onde comportamentos satildeo avaliados eaplicados diferentemente da programaccedilatildeo imperativa que foca na mudanccedila de estadosNa praacutetica um comportamento pode ser passado como paracircmetro de um meacutetodo atraveacutesde uma escrita mais reduzida e legiacutevel Os benefiacutecios de utilizar expressotildees lambda incluemuma melhora na legibilidade e organizaccedilatildeo de coacutedigo que antes era escrito com AnonymousInner Class aleacutem de permitir uma forma simples de utilizar comportamento paralelo como uso de Streams

341 Sintaxe

A sintaxe de uma expressatildeo lambda eacute dividida nas seguintes partes [30]

bull Uma lista de paracircmetros separados por viacutergulas

bull Um token representado por uma seta -gt

bull Um corpo que pode ser representado por uma expressatildeo uacutenica ou um bloco de coacutedigodentro de chaves

As Listagens 37 e 38 mostram duas formas diferentes de se aplicar expressotildees Lambdacom uma sintaxe similar A primeira aplica a expressatildeo diretamente apoacutes a seta utilizadanormalmente para trechos de coacutedigo pequenos e simples e a segunda utiliza-se de chavespara incorporar o coacutedigo e da palavra-chave return para especificar o retorno forma maisutilizada para uma quantidade maior de coacutedigo

1 p minusgt p getGender ( ) == Person Sex MALE2 ampamp p getAge ( ) gt= 183 ampamp p getAge ( ) lt= 25

Listagem 37 Exemplo de expressatildeo lambda com uma expressatildeo [30]

1 p minusgt 2 re turn p getGender ( ) == Person Sex MALE3 ampamp p getAge ( ) gt= 184 ampamp p getAge ( ) lt= 25 5

Listagem 38 Exemplo de expressatildeo lambda com um bloco de coacutedigo [30]

18

342 Principais formas de uso

Anonymous Inner Class

Antes do Java 8 a necessidade de passar funccedilotildees ou expressotildees como paracircmetro de algummeacutetodo era suprida atraveacutes de Anonymous Inner Classes A utilizaccedilatildeo desse tipo dedeclaraccedilatildeo junto com a anotaccedilatildeo de Override permite sobrescrever um meacutetodo de umainterface funcional e ao mesmo tempo passa-la como argumento para um meacutetodo Umaexpressatildeo lambda se comporta da mesma forma poreacutem a quantidade de coacutedigo escritopela Anonymous Inner Class eacute maior e pode dificultar a leitura de coacutedigo pois conteacutemmuita informaccedilatildeo natildeo utilizada para efetivo entendimento do que estaacute sendo feito naqueletrecho

A Listagem 39 apresenta a instanciaccedilatildeo da classe EventHandler internamente ao meacute-todo setOnAction() de forma que o desenvolvedor possa escrever o comportamento quedeseja passar como paracircmetro do meacutetodo atraveacutes da substituiccedilatildeo do meacutetodo handle()que jaacute existe pelo meacutetodo handle() criado e escrito pelo desenvolvedor

1 btn setOnAction (new EventHandlerltActionEvent gt() 2 Override3 pub l i c void handle ( ActionEvent event ) 4 System out p r i n t l n ( He l lo World ) 5 6 )

Listagem 39 Exemplo de uso de Anonymous Inner Class [35]

Interface funcional

Ao projetar um coacutedigo novo o desenvolvedor que optar por utilizar expressotildees lambdadeve iniciar com a criaccedilatildeo de uma interface funcional Esse tipo de interface possui umuacutenico meacutetodo abstrato permitindo que expressotildees lambda sejam usadas para sobrescrevero comportamento do meacutetodo abstrato Uma interface funcional pode possuir outros meacuteto-dos desde que sejam default Uma nova anotaccedilatildeo FunctionalInterface foi adicionadacom a atualizaccedilatildeo do Java 8 para conferir em tempo de compilaccedilatildeo se a interface satisfazos requisitos desse modelo de interface

A Listagem 310 apresenta um exemplo de interface funcional com o objetivo de permi-tir o uso de expressotildees lambda que utilizaratildeo de dois Double como paracircmetro e jaacute utilizada nova anotaccedilatildeo FunctionalInterface introduzida no Java 8

1 Funct iona l Inte r face2 pub l i c i n t e r f a c e DoubleOp 3 pub l i c Double apply ( Double a Double b)

19

4

Listagem 310 Exemplo de interface funcional

Dessa forma conforme as Listagens 311 e 312 o meacutetodo apply() pode tomar formade qualquer operaccedilatildeo entre dois Double que seraacute especificada quando a expressatildeo lambdafor montada dando o aspecto de linguagem funcional agrave linguagem e mais facilidade eliberdade ao desenvolvedor

1 pub l i c c l a s s Ca l cu la to r 2 pub l i c s t a t i c Double c a l c ( Double op1 Double op2 DoubleOp operator ) 3 re turn operator apply ( op1 op2 ) 4 5

Listagem 311 Exemplo de aplicaccedilatildeo da interface funcional

1 Double r e s u l t 1 = Ca lcu la to r c a l c (10d 50d ( a b ) minusgt a + b)

Listagem 312 Uso de expressatildeo lambda para o exemplo anterior

Collections

Dentre as atualizaccedilotildees de pacotes do Java 8 foi adicionado um meacutetodo stream() nainterface Collection Esse meacutetodo trata as Collection como streams o que significa queapesar de natildeo ser possiacutevel acessar elementos diretamente algumas novas manipulaccedilotildeessatildeo possiacuteveis Essas manipulaccedilotildees satildeo na verdade meacutetodos da interface Stream quepodem receber como paracircmetro uma expressatildeo lambda ou seja um comportamento a seraplicado agrave Collection Dentre os meacutetodos temos

bull filter() O meacutetodo filter() recebe uma expressatildeo lambda contendo uma condiccedilatildeopara filtragem da collection

bull map() O meacutetodo map() mapeia os elementos de uma Collection em outro objetocomo uma String A expressatildeo lambda passada por paracircmetro deve retornar o tipode objeto ao qual seraacute mapeado

bull forEach() O meacutetodo forEach() aplica uma operaccedilatildeo especiacutefica para cada ele-mento da Collection A expressatildeo lambda a ser passada deve conter a operaccedilatildeo aser realizada

bull min() e max() Os meacutetodos min() e max() retornam o elemento menor ou maiorda Collection dependendo da expressatildeo lambda passada como paracircmetro

20

A Listagem 313 demonstra como vaacuterias operaccedilotildees com uma Collection podem seraplicadas de uma vez de forma que lendo a expressatildeo lambda jaacute eacute possiacutevel saber oresultado da aplicaccedilatildeo do meacutetodo agrave Collection

1 r o s t e r2 stream ( )3 f i l t e r (4 p minusgt p getGender ( ) == Person Sex MALE5 ampamp p getAge ( ) gt= 186 ampamp p getAge ( ) lt= 25)7 map(p minusgt p getEmailAddress ( ) )8 forEach ( emai l minusgt System out p r i n t l n ( emai l ) )

Listagem 313 Exemplo de utilizaccedilatildeo de meacutetodos de stream com expressotildees lambda [30]

21

Capiacutetulo 4

Estudo e o Processo de Mineraccedilatildeo

A definiccedilatildeo da metodologia utilizada para realizaccedilatildeo deste trabalho eacute importante para queexista uma padronizaccedilatildeo e melhor entendimento de como os resultados foram obtidos paraque a replicaccedilatildeo do mesmo possa ser realizada em trabalhos futuros [36]

Figura 41 Processo utilizado para realizaccedilatildeo do estudo

O esquema representado na Figura 41 descreve o processo seguido para a realizaccedilatildeodeste trabalho que foi divido em trecircs grandes etapas a de planejamento definindo osobjetivos questotildees de pesquisa e meios de investigaccedilatildeo deste projeto a etapa de execuccedilatildeorealizando todo o procedimento metodoloacutegico definido para a coleta e refinamento de

22

dados e a etapa de avaliaccedilatildeo onde foram classificados e avaliados os dados coletadospara responder agraves questotildees de pesquisa

A seguir na primeira seccedilatildeo seratildeo apresentadas em detalhes as questotildees de pesquisa aserem respondidas Em seguida seraacute feito uma breve descriccedilatildeo da fonte de dados utilizada- especificamente os projetos utilizados como objetos de estudo deste trabalho e por fimtodo o restante da metodologia que foi de fato desenvolvida para obter os resultadosnecessaacuterios

41 Questotildees de Pesquisa

Com o objetivo de entender e caracterizar melhor o uso de expressotildees lambda foramdefinidas as seguintes questotildees de pesquisa a serem respondidas

bull PQ-1 Quando os projetos comeccedilaram a introduzir o uso de expressotildees lambda emseus coacutedigos e qual a meacutedia de expressotildees lambda por snapshots caso existam

bull PQ-2 Como as equipes de desenvolvimento estatildeo utilizando expressotildees lambdaatraveacutes de refatoraccedilatildeo de coacutedigo ou introduzindo apenas em coacutedigo novo

bull PQ-3 Quais satildeo os padrotildees tipicamente adotados para o uso de expressotildees lambda

A primeira pergunta de pesquisa gira em torno de como projetos populares open-sourceestatildeo se adaptando agrave introduccedilatildeo de expressotildees lambda em Java muitos projetos jaacute estatildeoutilizando as expressotildees lambda Se sim a partir de quando comeccedilaram a utilizaacute-lasdesde o iniacutecio da introduccedilatildeo das mesmas no Java 8 ou em um periacuteodo mais tardio Aleacutemdisso eacute interessante descobrir se a utilizaccedilatildeo dessa nova caracteriacutestica tem acontecido deforma expressiva ou natildeo

Em seguida para melhor entender a forma como as expressotildees lambda estatildeo sendointroduzidas em projetos eacute interessante investigar se as equipes de desenvolvimento estatildeose preocupando em refatorar coacutedigo com o objetivo de evoluir o software ou se estatildeoexperimentando utilizar expressotildees lambda apenas em coacutedigo novo introduzido

Como a introduccedilatildeo de novas funcionalidades em projetos open-source de grande escaladepende do objetivo do projeto e os padrotildees de projeto utilizados [37] espera-se obser-var diversas abordagens quanto a utilizaccedilatildeo de expressotildees lambda para entatildeo poderclassificar estes softwares quanto a abordagem utilizada

Eacute de grande importacircncia para este estudo conseguir identificar na praacutetica comoexpressotildees lambda estatildeo sendo tipicamente adotadas nestes projetos Assim a terceirapergunta de pesquisa busca identificar alguns exemplos de utilizaccedilatildeo atraveacutes da realizaccedilatildeode alguns estudos de caso

23

Eacute importante ressaltar que apesar de as expressotildees lambda serem uma alternativa aouso de AIC elas natildeo os substituem completamente Existem precondiccedilotildees para que umaAIC possa ser substituiacuteda por expressotildees lambda [12] descritas a seguir

bull AIC deve instanciar-se de uma interface

bull AIC natildeo deve possuir nenhum campo e declarar apenas um meacutetodo

bull AIC natildeo deve possuir uma referecircncia para this ou super

bull AIC natildeo deve declarar um meacutetodo recursivo

Para responder agrave primeira pergunta apenas dados gerais sobre todos os projetos seratildeonecessaacuterios ao passo que pelas perguntas 2 e 3 possuiacuterem uma natureza mais complexaseraacute necessaacuterio aleacutem de uma anaacutelise geral estatiacutestica a realizaccedilatildeo de alguns estudos decaso para obter resultados mais completos

42 Fonte de Dados e Objetos de Estudo

Para responder agraves perguntas de pesquisa estabelecidas foram selecionados os 99 projetosmais populares na linguagem Java dentro da plataforma github ateacute a data da coleta dosdados feita em Abril de 2017 Satildeo considerados populares os repositoacuterios que possuema maior quantidade possiacutevel de estrelas (stars) A decisatildeo de escolher os 99 projetos maispopulares foi por sua natureza imparcial e ao mesmo tempo para que se possa analisarprojetos que satildeo de familiaridade e conhecimento da comunidade do github e de domiacuteniopuacuteblico Os 99 projetos estatildeo listados no Anexo I

Para entender a transiccedilatildeo feita por esses projetos entre as versotildees anteriores do Java eo Java 8 com as expressotildees lambda eacute necessaacuterio analisar o coacutedigo de vaacuterias versotildees a fimde observar alguma mudanccedila para cada projeto Como satildeo 99 projetos e vaacuterios dessesprojetos possuem milhares de linhas de coacutedigo e commits seria impossiacutevel avaliar todosos commits Optou-se entatildeo por coletar snapshots mensais de cada projeto conformeprocedimento tambeacutem seguido anteriormente [38] Cada snapshots representa o estadodo projeto em um determinado mecircs e como criteacuterio de escolha padratildeo todos os snapshotsequivalem ao uacuteltimo commit realizado no determinado mecircs que este representa

O proacuteximo passo eacute determinar o periacuteodo de tempo em que esses snapshots seriamcoletados Como Java 8 (e consequentemente as expressotildees lambda) foi introduzidoapenas em meados de 2014 [28] coletar dados de projetos a partir de um periacuteodo muitoantes deste ano natildeo agregaria valor ao estudo em questatildeo Definiu-se entatildeo um periacuteodopara a coleta mensal desses snapshots atraveacutes dos anos Janeiro de 2013 um ano antesda introduccedilatildeo do Java 8 para que se pudesse identificar para todos os projetos o mecircs

24

exato em que expressotildees lambda foram introduzidas ateacute o mecircs da coleta de dados Abrilde 2017

Eacute importante ressaltar que a definiccedilatildeo dos meses foi definida do dia primeiro de ummecircs ao dia primeiro do proacuteximo mecircs e por consequecircncia alguns snapshots que deveriamrepresentar o final de determinado mecircs correspondem na verdade a commits realizadosno dia primeiro do mecircs seguinte Por exemplo pode existir casos em que o commit querepresente o mecircs de Marccedilo de 2016 seja na verdade o commit realizado no dia primeirode Abril de 2016 Isso se deve a natureza da forma como os resultados de log de commitssatildeo obtidos pelo git [39] Poreacutem isso natildeo interfere nas anaacutelises ou no propoacutesito destetrabalho uma vez que foram realizadas verificaccedilotildees e validaccedilotildees para que natildeo existamdatas repetidas (e consequentemente commits repetidos) por repositoacuterio

Neste trabalho o termo projeto e repositoacuterio foram utilizados de forma intercaladapara representar a mesma coisa o software desenvolvido que possui um repositoacuterio naplataforma github Os termos commit snapshops e versotildees tambeacutem representam a mesmacoisa uma vez que foi definido que seriam utilizados apenas um commit por mecircs pararepresentar um determinado snapshot ou versatildeo do repositoacuterio em questatildeo

Todos os 99 projetos seratildeo utilizados para a realizaccedilatildeo de uma anaacutelise geral de ca-racterizaccedilatildeo do uso de expressotildees lambda Para as anaacutelises aprofundadas foi feito umcriteacuterio de classificaccedilatildeo para que apenas alguns projetos possam ser analisados em niacutevelde coacutedigo como estudos de caso

Resumindo foram escolhidos os 99 projetos mais populares de Java no github cole-tando dados mensais de seus commits a partir do ano de 2013 ateacute a data da coleta dosdados lembrando que nem todos os projetos existem desde 2013 (projetos mais recentes)

43 Processo de Mineraccedilatildeo

A abordagem utilizada para coletar e analisar os 99 projetos escolhidos como mostra aFigura 42 foi realizada de forma automatizada utilizando scripts python e dois projetosdesenvolvidos em Java para a coleta e tratamento de dados como descrito a seguir

Primeiramente foi realizado uma coacutepia dos repositoacuterios atuais de todos os 99 projetosmais populares do github em Java Para automatizar o processo foi desenvolvido umscript em python que lista todos os projetos escolhidos clona todos os repositoacuterios emuma pasta na maacutequina local e cria um arquivo temporaacuterio com as informaccedilotildees do nomede cada repositoacuterio e seu caminho absoluto na maacutequina local

25

Figura 42 Metodologia implementada para coleta e tratamento de dados

Em seguida foi necessaacuterio realizar o checkout de todas as versotildees entre Janeiro de2013 a Abril de 2017 de cada projeto Por motivos de otimizaccedilatildeo de espaccedilo da maacutequinalocal e automatizaccedilatildeo no processo de checkout utilizou-se de um segundo script pythonque realizava as seguintes tarefas para cada mecircs em cada projeto verificar se dentreo mecircs estipulado houve algum commit para aquele projeto se sim pega-se o hash douacuteltimo commit do mecircs realiza o checkout conta-se a quantidade de linhas de coacutedigo emJava que o projeto tem utilizando a biblioteca cloc e armazena todas as informaccedilotildeespertinentes referentes a todos os projetos que naquele mecircs tiveram commits para que oprojeto static-analysis possa entatildeo ser executado sobre esses projetos naquele determinadomomento As informaccedilotildees coletadas que satildeo utilizadas pelo static-analysis correspondemao nome do projeto o hash do commit para aquela versatildeo a pasta onde o projeto estaacutearmazenado na maacutequina local a quantidade de linhas de coacutedigo Java do projeto e datareferente ao commit Essas informaccedilotildees satildeo pertinentes para que o projeto static-analysisconsiga funcionar de forma correta projeto este descrito em detalhes a seguir

431 static-analysis

O static-analysis foi um projeto desenvolvido anteriormente a este trabalho pelos alunosThiago Cavalcanti e Vinicius de Almeida cujo objetivo eacute realizar a anaacutelise estaacutetica de

26

coacutedigos-fonte Java e gerar arquivos de saiacuteda contendo informaccedilotildees de classes e meacutetodoscom suas devidas ocorrecircncias de caracteriacutesticas da linguagem [40]

A anaacutelise estaacutetica de coacutedigo consiste em analisar um coacutedigo-fonte sem a necessidadede executaacute-lo Esse tipo de anaacutelise eacute de extrema importacircncia para manter um coacutedigo dequalidade evitar futuras refatoraccedilotildees e obter informaccedilotildees estatiacutesticas de forma raacutepida epraacutetica [41]

Seguindo esse princiacutepio o static-analysis foi projetado para receber um arquivo deentrada csv seguindo o padratildeo

Tipo da Aplicaccedilatildeo Inicio do projeto Antes ou Apoacutes Java 5 Nome do ProjetoVersatildeo Caminho absolutoQuantidade de linhas de coacutedigo

Atraveacutes da informaccedilatildeo do caminho absoluto do projeto o static-analysis varre osdiretoacuterios em busca dos arquivos fonte java realiza o parse desses arquivos e utilizade Visitors para extrair as informaccedilotildees desejadas e exporta-las em arquivos csv Ouso de Visitors permite que sejam escolhidas as informaccedilotildees desejadas para a consultacomo expressotildees Lambda e AIC s aleacutem de possibilitar que sejam implementados novosVisitors conforme a linguagem evolua ou as necessidades mudem

Para este trabalho foram utilizados os Visitors de expressotildees Lambda map() filter()AICs e declaraccedilotildees de meacutetodos

432 BDAnalisador

Apoacutes obter todas as informaccedilotildees necessaacuterias geradas pelo static-analysis era preciso ma-nipular os dados de forma que facilitasse a coleta de dados para o estudo proposto Comovaacuterios arquivos em formato csv satildeo de difiacutecil manipulaccedilatildeo foi desenvolvido entatildeo umaferramenta chamada BDAnalisador Esta ferramenta eacute responsaacutevel por processar os arqui-vos em csv gerados pelo static-analysis e popular uma base de dados relacional MySQLcom as informaccedilotildees pertinentes a este estudo

O BDAnalisador foi desenvolvido com a intenccedilatildeo de tornar mais simples o trabalhocom os dados resultantes do static-analysis de forma que consultas em SQL pudessemser feitas a ponto de permitir a obtenccedilatildeo de resultados mais complexos Seguindo esseobjetivo o framework Hibernate foi escolhido como ferramenta para persistecircncia devidoa ser um framework jaacute consolidado no mercado e que de forma simples relaciona osobjetos Java ao banco de dados MySQL [42] A divisatildeo de classes foi projetada em quatroentidades Projeto Versao Classe e Metodo cada uma com seus respectivos camposcontendo as informaccedilotildees necessaacuterias para a pesquisa como pode ser visto na Figura 44Eacute importante ressaltar que a tabela de Versao guarda hashs de commits devido agrave escolhade utilizar commits para obter mais informaccedilatildeo de evoluccedilatildeo de coacutedigo em um menor

27

espaccedilo de tempo Aleacutem disso para este trabalho optou-se por persistir todos os meacutetodose classes de cada versatildeo sem se importar com a repeticcedilatildeo desses dados pois a hipoacutetesede haver grandes refatoraccedilotildees entre versotildees poderia comprometer a confiabilidade dasinformaccedilotildees

Figura 43 Diagrama de classes UML do BDAnalisador

Como visto na Figura 43 seguindo parcialmente a arquitetura MVC cada entidadepossui sua respectiva classe DAO(Data Access Object) para persistecircncia dos dados eapenas uma classe Controlador no projeto responsaacutevel pela manipulaccedilatildeo e parse dosdados dos arquivos csv gerados pelo static analysis para serem enviados agraves classes DAOO sistema inicia chamando o meacutetodo inicializar() da classe Controlador Esse meacutetodoeacute responsaacutevel por ler um arquivo de entrada csv que segue o mesmo modelo do arquivo dostatic-analysis citado na seccedilatildeo anterior O arquivo conteacutem os dados de todos os projetose suas respectivas versotildees dessa forma o meacutetodo instancia um objeto da classe Projetoe persiste o projeto no banco de dados Para cada versatildeo encontrada no arquivo deentrada o inicializar() aciona os meacutetodos responsaacuteveis por instanciar e preencher aslistas da classe Classe e Metodo Os meacutetodos responsaacuteveis por preencher as listas varremos arquivos csv gerados pelo static-analysis e fazem o parse das informaccedilotildees relevantescomo nomes dos meacutetodos e quantidades de lambdas para construir os objetos que seratildeogravados Ao final dos preenchimentos o objeto Versatildeo eacute instanciado e gravado no bancode dados atraveacutes de sua classe DAO ao mesmo tempo que grava suas respectivas Classese Metodos

28

Apoacutes vaacuterios testes e correccedilotildees de bugs o banco de dados se encontrava finalmente comas informaccedilotildees de 99 projetos Java open-source separados por um commit por mecircs desde2013 cada um com suas respectivas informaccedilotildees de classes meacutetodos e a quantidade deexpressotildees lambda filters e maps em cada meacutetodo Filter ou Filter pattern eacute o padratildeode projeto que tem como objetivo filtrar objetos de uma coleccedilatildeo (Collection) de acordocom algum criteacuterio Jaacute o map ou map pattern eacute um padratildeo que ldquomapeia os elementosde uma coleccedilatildeo aplicando uma funccedilatildeo a eles para uma nova coleccedilatildeo [43] A coleta deinformaccedilotildees sobre esses padrotildees podem ser uacuteteis para possiacuteveis anaacutelises de oportunidadesde uso de expressotildees lambda para refatoraccedilatildeo de coacutedigo

A Figura 44 mostra o esquema de como o banco de dados resultante foi gerado

Figura 44 Modelo relacional do banco de dados populado pelo BDAnalisador Imagemgerada com software DBeaver [2]

44 Classificaccedilatildeo e Anaacutelise

Com o banco de dados populado restam apenas as etapas de classificaccedilatildeo e anaacutelise pararesponder as questotildees de pesquisa propostas Para isso inicialmente houve uma tentativade se utilizar apenas queries SQL para analisar os dados de acordo com as informaccedilotildeesrelevantes Poreacutem devido ao fato de o banco de dados conter todas as informaccedilotildees detodos os projetos e todas as suas versotildees queries que possuem uma alta complexidadedemoravam muito tempo para retornar os dados

Assim com o objetivo de facilitar o trabalho alguns scripts python foram desenvolvi-dos para rodar as queries separadamente e individualmente para cada projeto de formaautomatizada a fim de melhorar o tempo de resposta para obtenccedilatildeo dos resultados

29

441 Meacutedia de Lambda

O primeiro script retorna a quantidade de expressotildees lambda (ou AICs) por n snapshotsque contenha expressotildees lambda O objetivo eacute ter uma visatildeo geral da meacutedia de expressotildeeslambda e AICs utilizadas por cada projeto e como nem todos os snapshots coletados decada projeto possuem expressotildees lambda e AICs apenas aqueles com alguma expressatildeolambda ou AIC satildeo incluiacutedos no caacutelculo da meacutedia

Mmedia =sumn qtdLambdai

n

442 Anaacutelise Temporal

O segundo script retorna para cada projeto a soma total da quantidade de expressotildeeslambda AIC map() e filter() no projeto inteiro para cada versatildeo Ou seja tem-seo total de cada uma das quatro propriedades selecionadas para cada mecircs do projetoobtendo assim uma visatildeo temporal de evoluccedilatildeo do uso das caracteriacutesticas descritas ATabela 41 ilustra parcialmente o resultado obtido para o projeto agera onde idVersaoeacute o identificador no banco de dados referente ao hash do commit mensal coletado qtd eacutea quantidade de cada uma das caracteriacutesticas escolhidas e a data do commit encontra-seno formato americano

Tabela 41 Informaccedilotildees mensais sobre o projeto ageraidVersao Data do Commit qtd lambda qtd AIC qtd maps qtd filter

823 512016 0 29 4 0755 612016 13 28 4 0686 6152016 13 29 4 0621 812016 13 29 4 0555 8162016 13 30 4 0485 922016 13 30 4 0422 10132016 14 30 4 0356 11282016 14 30 4 0295 12212016 21 30 5 0232 212017 21 30 5 0175 312017 21 30 5 0112 3312017 21 36 5 048 4242017 21 48 5 0

Os resultados obtidos com esta anaacutelise temporal permitiu a identificaccedilatildeo de padrotildees nautilizaccedilatildeo de expressotildees lambda em relaccedilatildeo a utilizaccedilatildeo de AIC por todos os projetos Foi

30

possiacutevel classificar todos os projetos em 6 grupos ilustrado na Figura 45 Primeiramenteseparou-se os projetos entre os que possuem expressotildees lambda e os que natildeo possuemDentre os que possuem identificou-se cinco categorias

1 Grupo 1 Quantidade de AICs e expressotildees lambda aumentam com o tempo pro-porcionalmente

2 Grupo 2 Quantidade de AICs diminui agrave medida que a quantidade de expressotildeeslambda aumentam e a quantidade de expressotildees lambda ultrapassa a quantidade deAIC em um determinado momento

3 Grupo 3 Quantidade de AICs diminui agrave medida que a quantidade de expressotildeeslambda aumentam mas a quantidade de AIC permanece superior agrave quantidade delambda

4 Grupo 4 Expressotildees lambda satildeo introduzidas e existem por um pequeno periacuteodode tempo mas satildeo completamente removidas posteriormente

5 Grupo 5 Quantidade de expressotildees lambda eacute constante e muito inferior compa-rado com a quantidade de AICs no projeto Foi determinado que para pertencera esta classificaccedilatildeo o projeto precisa ter uma razatildeo de meacutedia de expressotildees lamb-dasnapshot por meacutedia de AICsnapshot inferior a 020 Esse paracircmetro foi esta-belecido com o objetivo de definir um padratildeo para o que pode ser considerado umprojeto com poucas expressotildees lambda

Figura 45 Classificaccedilatildeo dos projetos

31

443 Refatoraccedilatildeo de Coacutedigo

O uacuteltimo script teve como objetivo realizar uma tentativa inicial de identificar refatoraccedilatildeode coacutedigo da seguinte maneira para todos os projetos que possuem expressotildees lambdaforam identificados o mecircs imediatamente antes da introduccedilatildeo de expressotildees lambda e omecircs seguinte onde houve a primeira ocorrecircncia de lambda no projeto Assim realizou-se uma anaacutelise do tamanho em quantidade de linhas de coacutedigo de todos os meacutetodosdo projeto que no mecircs seguinte tiveram introduccedilatildeo de lambda Em seguida fez-se umacomparaccedilatildeo com os mesmos meacutetodos em relaccedilatildeo ao mecircs anterior e assim foi possiacuteveldetectar quais meacutetodos tiveram a quantidade de linhas de coacutedigo reduzidas o que seriaum indicativo natildeo necessariamente exclusivo de que uma refatoraccedilatildeo de coacutedigo possa terocorrido

Sabe-se que este meacutetodo de detecccedilatildeo de refatoraccedilatildeo de coacutedigo possui suas limitaccedilotildeesuma vez que as comparaccedilotildees para saber se um meacutetodo existe em ambas versotildees eacute feitopuramente por comparaccedilatildeo de String (nome do meacutetodo) e a classe que este pertence

444 Casos de Uso

Os meacutetodos descritos acima ajudaram a identificar alguns padrotildees e facilitar a anaacutelise dosdados Poreacutem natildeo satildeo suficientes para que se possa responder agraves questotildees de pesquisaDessa forma apoacutes a identificaccedilatildeo dos grupos de classificaccedilatildeo para os projetos foramescolhidos um projeto de cada grupo (com exceccedilatildeo do grupo dos projetos sem expressotildeeslambda) para realizar um breve estudo de caso com o objetivo de identificar e caracterizarmelhor a adoccedilatildeo de expressotildees lambda Os projetos escolhidos foram agera vertxAndroid-CleanArchitecture RxJava e guava

32

Capiacutetulo 5

Resultados Obtidos e Anaacutelise

Neste capiacutetulo seratildeo apresentados os dados obtidos e anaacutelise com o objetivo de responderagraves questotildees de pesquisa propostas Como mencionado anteriormente as perguntas seratildeorespondidas de duas maneiras algumas com informaccedilotildees gerais sobre todos os projetose outras com breve estudos de caso envolvendo cinco projetos

51 Visatildeo Geral

Dentre os repositoacuterios coletados para a anaacutelise 74 (7474) natildeo utilizaram nenhumaexpressatildeo lambda no projeto durante todo o periacuteodo analisado (Janeiro de 2013 a Abrilde 2017) restando apenas 25 repositoacuterios (2525) com expressotildees lambda Eacute interessantedestacar que apesar de a quantidade de repositoacuterios que natildeo possuem expressotildees lambdaser relativamente expressiva muitos destes repositoacuterios satildeo de projetos em Java que umdia foram populares e atualmente natildeo estatildeo sendo mais desenvolvidos (por exemplo umaplicativo que soacute funciona para Android 23 atualmente descontinuado)

Levando em consideraccedilatildeo apenas os projetos que possuem expressotildees lambda exis-tem dois tipos de dados que podem ser analisados para responder agrave primeira questatildeo depesquisa atraveacutes dos dados obtidos pelo meacutetodo anteriormente mencionado como anaacutelisetemporal e a meacutedia de lambda por snapshot mencionados no capiacutetulo anterior

Com relaccedilatildeo ao ano em que a primeira ocorrecircncia foi encontrada 6 projetos introduzi-ram expressotildees lambda jaacute em 2014 8 comeccedilaram a utilizar em 2015 7 em 2016 e apenas4 tiveram a primeira ocorrecircncia de expressotildees lambda em 2017 Dessa forma percebe-seque os projetos estatildeo relativamente bem distribuiacutedos em grupos quanto ao ano em que seintroduziu expressotildees lambda

Pela meacutedia de lambda por snapshot (lambdasnapshot) a maioria (11 projetos) possuiuma quantidade expressiva acima de 100 lambdasnapshot (com 6 projetos entre 20 e 100lambdasnapshot e 8 projetos com menos de 20 lambdasnapshot) como apresentados no

33

graacutefico da Figura 51 Isso mostra que essa nova caracteriacutestica jaacute estaacute sendo bem utilizadanos projetos que comeccedilaram a migrar para a nova versatildeo do Java

Figura 51 Graacuteficos dos projetos separados por ano de introduccedilatildeo de expressotildees lambdae meacutedia de lambda por snapshot

Com isso pode-se observar que apesar de a quantidade de projetos que possuemexpressotildees lambda natildeo ser tatildeo alta eacute possiacutevel obter resultados expressivos uma vez quea quantidade dos projetos com lambda estatildeo bem dispersos quanto ao periacuteodo em quecomeccedilaram a adotar essa caracteriacutestica e a quantidade de expressotildees lambda por snapshot

511 Projetos Selecionados

Atraveacutes dos grupos de classificaccedilatildeo identificados pela anaacutelise temporal descritos na Figura45 cinco projetos foram selecionados para uma anaacutelise detalhada levando em consideraccedilatildeoo grupo em que eles pertencem Estes projetos seratildeo apresentados a seguir

512 agera

Agera eacute uma biblioteca Android que ajuda a introduzir programaccedilatildeo funcional reativa(functional reactive programming) em projetos Android Eacute um projeto recente lanccediladoem 2016 pela Google [44] e encontra-se no grupo dos projetos que introduziram expressotildeeslambda em 2016 no mesmo ano de seu lanccedilamento contendo uma meacutedia de expressotildeeslambda de 16 lambdasnapshot

Na classificaccedilatildeo estabelecida agera pertence ao Grupo 1 onde a quantidade de ex-pressotildees lambda no projeto com o tempo aumentam juntamente com a quantidade deAICs como mostra o graacutefico de anaacutelise temporal na Figura 52

34

Figura 52 Graacuteficos de anaacutelise temporal do projeto agera

513 vertx

Eclipse Vertx eacute um conjunto de ferramentas para criaccedilatildeo de reactive applications namaacutequina virtual Java (JVM) em grande escala [45] Seu primeiro lanccedilamento aconteceuem 2011 e a primeira ocorrecircncia de expressotildees lambda no projeto aconteceu em 2014 Esteprojeto possui uma meacutedia de 2867 lambdasnapshot e dentre os projetos consideradosneste trabalho eacute o que possui a maior quantidade de expressotildees lambda

Este projeto pertence ao Grupo 2 onde a quantidade de expressotildees lambda aumen-tou consideravelmente pelos meses ultrapassando a quantidade de AICs que diminuiudrasticamente como mostra a Figura 53

35

Figura 53 Graacuteficos de anaacutelise temporal do projeto Vertx

514 Android-CleanArchitecture

Apesar de ser uma amostra de projeto Android-CleanArchitecture que tem como objetivoconstruir aplicaccedilotildees Android utilizando clean architecture foi lanccedilado em 2014 mas semanteacutem sempre atualizado [46]

A introduccedilatildeo de expressotildees lambda que aconteceu no ano de 2015 se deu de formatiacutemida com uma meacutedia de 35 lambdasnapshot De qualquer forma este projeto conseguerepresentar com seu graacutefico de anaacutelise temporal o grupo 3 composto por projetos em quea quantidade de expressotildees lambda aumentou mas sem ultrapassar AICs que diminuiacuteramdemonstrado no graacutefico da Figura 54

36

Figura 54 Graacuteficos de anaacutelise temporal do projeto Android-CleanArchitecture

515 RxJava

Dentre os repositoacuterios estudados RxJava eacute considerado o mais popular Como umaimplementaccedilatildeo de Reactive Extensions para a JVM RxJava teve seu lanccedilamento dadoem 2013 [47] Expressotildees lambda apareceram pela primeira vez no ano de 2015 comuma meacutedia de 766 lambdasnapshot

Apesar de uma meacutedia relativamente alta o tempo de vida das expressotildees lambda nesteprojeto foi bem curto caracterizando assim projetos do grupo 4 houve a introduccedilatildeo dasexpressotildees lambda no projeto poreacutem houve a remoccedilatildeo completa de todas as expressotildeeslambda previamente introduzidas desaparecendo completamente do projeto ateacute a datada coleta de dados (Figura 55)

37

Figura 55 Graacuteficos de anaacutelise temporal do projeto RxJava

516 guava

Guava eacute um conjunto de bibliotecas para Java da Google lanccedilado em 2011 A atualizaccedilatildeodo coacutedigo do projeto para Java 8 aconteceu somente em 2016 e apesar do projeto conteruma meacutedia de 281 lambdasnapshot ele foi escolhido como representante dos projetosdo Grupo 5 (Figura 56) que possuem expressotildees lambda mas de forma natildeo expressiva osuficiente quando comparado com a quantidade de AIC pelo fato de sua razatildeo de meacutedia delambdasnapshot por meacutedia de AICsnapshot ser 004 Ou seja embora o projeto tenhaexpressotildees lambda estas satildeo consideradas muito poucas quando inseridas no contextogeral deste projeto que eacute considerado um projeto grande

38

Figura 56 Graacuteficos de anaacutelise temporal do projeto Guava

52 Refatoraccedilatildeo de Coacutedigo

Com o objetivo de caracterizar melhor como as expressotildees lambda estatildeo sendo utilizadaseacute interessante identificar se estas estatildeo sendo introduzidas atraveacutes de refatoraccedilatildeo de coacutedigoou em coacutedigo novo

Os projetos classificados como pertencentes ao Grupo 2 possuem em comum o fatode expressotildees lambda aumentarem a medida que AICs diminuem ultrapassando-as eessa caracteriacutestica em comum pode indicar que nestes projetos possivelmente houve re-fatoraccedilatildeo de coacutedigo visto que AIC sendo substituiacutedo por expressotildees lambda dentro dascondiccedilotildees determinadas eacute a maneira mais comum de se identificar refatoraccedilatildeo de coacute-digo para introduccedilatildeo de expressotildees lambda [12] Os projetos que compotildeem o grupo 2representam 44 de todos os projetos estudados que possuem expressotildees lambda o quepode ser um indicativo caso a hipoacutetese de refatoraccedilatildeo de coacutedigo seja positiva de quemuitos projetos que estatildeo adotando o Java 8 estatildeo se preocupando de alguma formacom refatoraccedilatildeo se coacutedigo Fazem parte desse grupo os seguintes projetos elasticsearchjava-design-patterns PocketHub presto RxJava-Android-Samples spark vertx zipkinjava8-tutorial dropwizard e material-dialogs

39

Outra maneira de verificar possiacuteveis indicadores de refatoraccedilatildeo de coacutedigo foi atraveacutesda anaacutelise dos tamanhos (em quantidade de linhas de coacutedigo) dos meacutetodos com expressotildeeslambda no mecircs em que se introduziu expressotildees lambda e um mecircs imediatamente antesdeste Essa anaacutelise mostra que dos 25 projetos com expressotildees lambda 12 (48) projetostiveram ao menos um meacutetodo em que houve uma diminuiccedilatildeo no tamanho o que podeser considerado um indicativo de refatoraccedilatildeo de coacutedigo A Figura 57 mostra todos osprojetos em relaccedilatildeo agrave quantidade total de meacutetodos que possuem lambda no primeiro mecircsde introduccedilatildeo do mesmo em vermelho comparado com a quantidade desses meacutetodos quetiveram uma diminuiccedilatildeo no tamanho quando comparados com o coacutedigo do mecircs anteriorem azul

Figura 57 Comparaccedilatildeo entre todos os projetos com expressatildeo lambda sobre refatoraccedilatildeode coacutedigo no mecircs de introduccedilatildeo da caracteriacutestica

Ainda observando a figura 57 com relaccedilatildeo aos projetos que natildeo tiveram nenhummeacutetodo com diminuiccedilatildeo de tamanho (barra azul) percebe-se que todos os 13 projetossequer tiveram uma quantidade significativa de meacutetodos que possuem expressotildees lambda(com o maior tendo apenas 5 meacutetodos) no mecircs de introduccedilatildeo da caracteriacutestica no projetoe ao mesmo tempo jaacute existiam no mecircs em que natildeo existia lambda no projeto Essa eacuteuma observaccedilatildeo importante porque projetos como vertx sendo este o que possui a maiormeacutedia de lambdasnapshot de todos os projetos e ao mesmo tempo tendo apenas trecircsmeacutetodos que continham expressotildees lambda no mecircs da introduccedilatildeo e que existiam no mecircs

40

anterior permitem inferir que todas as outras expressotildees lambda existentes no projetopara este determinado mecircs de introduccedilatildeo encontram-se em coacutedigo novo introduzido

Eacute importante ressaltar que somente essa anaacutelise natildeo eacute exclusivamente suficiente paradeterminar se estes projetos estatildeo realmente introduzindo lambda em coacutedigo novo ourealizando refatoraccedilatildeo uma vez que como a comparaccedilatildeo aconteceu apenas no mecircs deintroduccedilatildeo com o mecircs imediatamente anterior natildeo reflete todo o ciclo de vida do pro-jeto Por exemplo algumas equipes podem escolher refatorar o coacutedigo depois de umtempo de adaptaccedilatildeo apoacutes a transiccedilatildeo para a nova versatildeo da linguagem Assim paraobter uma melhor anaacutelise sobre refatoraccedilatildeo de coacutedigo ou natildeo feita nestes projetos aleacutemde outras anaacutelises referentes aos padrotildees tipicamente adotados para implementaccedilatildeo delambda nestes projetos seratildeo apresentados a seguir os estudos de caso dos cinco projetospreviamente selecionados

Outro ponto importante eacute o fato de que apesar das informaccedilotildees quanto agraves quantida-des de filter e map terem sido incluiacutedas inicialmente no trabalho para observar possiacuteveispadrotildees de refatoraccedilatildeo de coacutedigo percebeu-se que estas natildeo satildeo utilizadas de forma con-sideraacutevel pelos projetos estudados e para fins de anaacutelises generalizadas natildeo apresentaramtanta influecircncia na utilizaccedilatildeo de expressotildees lambda quanto a quantidade de AICs noprojeto

53 Estudos de Caso

Dentre os projetos analisados verificou-se que os projetos de pequeno e meacutedio porte op-taram por refatorar de uma vez seus coacutedigos para incluir expressotildees lambda em situaccedilotildeesem que se utilizava AICs anteriormente ou em alguns poucos casos de utilizaccedilatildeo deCollection Os projetos de grande porte natildeo apresentaram nenhuma refatoraccedilatildeo de coacute-digo ou uma refatoraccedilatildeo parcial gradativa provavelmente devido agrave grande quantidade dearquivos e coacutedigo que possuem o que pode tornar o trabalho de refatoraccedilatildeo extenso ecansativo

O projeto vertx que pertence ao grupo 2 dos projetos em que a quantidade de ex-pressotildees lambda aumentaram e as de AICs diminuiacuteram com lambda ultrapassando AICsexecutou inicialmente commits em maio de 2014 com adiccedilatildeo de coacutedigo novo utilizandoexpressotildees lambda e apoacutes um mecircs realizou um commit maior com a refatoraccedilatildeo de todasas AICs para expressotildees lambda Apoacutes a refatoraccedilatildeo o projeto se preocupou em mantera utilizaccedilatildeo de expressotildees lambda ao mesmo tempo que o uso de AICs se manteve apenasaos casos de classes com interfaces natildeo funcionais A Figura 58 apresenta uma parte docommit de refatoraccedilatildeo de coacutedigo que mostra em vermelho a parte eliminada do coacutedigo(AIC) e em verde o coacutedigo novo representando a substituiccedilatildeo por uma expressatildeo lambda

41

Figura 58 Commit de refatoraccedilatildeo de coacutedigo do projeto Vertx [3]

Alguns projetos ainda natildeo se preocuparam em refatorar o coacutedigo para o uso de ex-pressotildees lambda ateacute a data deste trabalho que eacute o caso do projeto guava que apresentouum commit em 03112016 com a atualizaccedilatildeo do projeto para Java 8 Mas a partir daatualizaccedilatildeo se preocupou em utilizar as expressotildees lambda apenas na implementaccedilatildeo decoacutedigo novo O cenaacuterio em que a refatoraccedilatildeo natildeo eacute prioridade ainda eacute a realidade de vaacuteriosprojetos de grande porte visto que os dados de projetos sem nenhuma expressatildeo lambdasatildeo o maior nuacutemero neste trabalho Poreacutem projetos que jaacute adotaram a utilizaccedilatildeo do Java8 tendem a mudar isso com o passar do tempo A Figura 59 apresenta em verde umaadiccedilatildeo de coacutedigo novo com expressatildeo lambda sem a eliminaccedilatildeo de algum coacutedigo anteriora esse que estaria em vermelho

42

Figura 59 Exemplo de um arquivo do commit de adiccedilatildeo de coacutedigo novo em Java 8 doprojeto Guava [4]

Na categoria de projetos em que os AICs e expressotildees lambda aumentam proporci-onalmente (grupo 1) o projeto agera realizou um commit em 19052016 com a adiccedilatildeoda biblioteca retrolambda como dependecircncia do projeto Essa biblioteca utilizada prin-cipalmente por projetos Android permite executar coacutedigo Java 8 contendo expressotildeeslambda em Java 5 6 e 7 [48] O commit tambeacutem apresenta refatoraccedilatildeo dos AICs ad-vindos de interfaces funcionais para expressotildees lambda Apesar de o projeto continuar autilizar as expressotildees lambda em seus commits posteriores o nuacutemero de AICs tambeacutemcontinuou a aumentar visualizando os commits posteriores notou-se que esses AICs satildeorelativos a interfaces natildeo funcionais ou seja que possuem mais de um meacutetodo O projetoAndroid-CleanArchitecture eacute similar ao agera pois tambeacutem optou pela instalaccedilatildeo da bi-blioteca retrolambda para uso de expressotildees lambda em seus coacutedigos e como tambeacutem eacuteum projeto de pequeno porte houve uma pequena refatoraccedilatildeo dos AICs A Figura 510mostra a parte do commit de refatoraccedilatildeo de coacutedigo em que o desenvolvedor adiciona abiblioteca retrolambda como dependecircncia

43

Figura 510 Commit de adiccedilatildeo da biblioteca Retrolambda no projeto Agera [5]

Outro caso interessante eacute o do projeto RxJava que em 2015 optou pela refatoraccedilatildeodo coacutedigo para a utilizaccedilatildeo de expressotildees lambda quase eliminando por completo o usode AICs mas que no ano seguinte reverteu os commits de forma que eliminasse comple-tamente o uso de expressotildees lambda para manter a retrocompatibilidade com o Java 6A Figura 511 demonstra uma parte do commit de reversatildeo do coacutedigo para Java 6 emque pode ser visto em vermelho o coacutedigo anterior com expressotildees lambda e o verde como novo coacutedigo utilizando AIC novamente

44

Figura 511 Commit de remoccedilatildeo de Lambdas e volta para o uso de AICs no projetoRXJava [6]

Essa preocupaccedilatildeo com retrocompatibilidade de coacutedigo pode ser um fator crucial nadecisatildeo das equipes de desenvolvimento na hora de decidir como fazer o software co-evoluircom a linguagem sem perder a compatibilidade com versotildees anteriores

45

Capiacutetulo 6

Consideraccedilotildees Finais

Este estudo permitiu entender melhor como projetos estatildeo realizando a migraccedilatildeo para oJava 8 em especial utilizando uma nova caracteriacutestica introduzida expressatildeo lambdaApesar de a maioria dos projetos populares considerados natildeo possuiacuterem nenhuma ocor-recircncia de expressotildees lambda os projetos que tinham expressotildees lambda foram suficientespara realizar um primeiro estudo de caracterizaccedilatildeo no uso desta caracteriacutestica e com osprojetos efetivamente utilizados para estudo foi possiacutevel agrupaacute-los quanto a maneira emque as expressotildees lambda estavam sendo utilizadas quando comparadas com AICs em 5grandes grupos quando AIC e lambda aumentam proporcionalmente quando AIC dimi-nui e lambda aumenta ultrapassando AIC quando AIC diminui mas continua superior aolambda crescente expressotildees lambda que foram introduzidas e retiradas completamentedo coacutedigo e expressotildees lambda que natildeo existem em quantidades expressivas

Foi possiacutevel entatildeo realizar um estudo aprofundado levando em consideraccedilatildeo as di-ferentes maneiras com que as expressotildees lambda foram adotadas nos projetos atraveacutes daescolha de um projeto que representasse cada grupo para anaacutelise Dentre os cinco projetosestudados foi possiacutevel observar alguns padrotildees tipicamente adotados por desenvolvedorespara implementar expressotildees lambda em seus projetos como a utilizaccedilatildeo da bibliotecas(retrolambda) que permitissem uma flexibilizaccedilatildeo na utilizaccedilatildeo de expressotildees lambda oucomo lambda eacute primariamente utilizada para substituir determinados AICs ou operaccedilotildeesem Collection

Aleacutem disso foi possiacutevel observar como a refatoraccedilatildeo de coacutedigo acontece em cada umdesses projetos Observou-se como projetos menores tendem a refatorar coacutedigo maisfacilmente ao passo que projetos maiores e mais complexos fazem menos refatoraccedilatildeo oudemoram mais entre o periacuteodo em que houve a primeira migraccedilatildeo de coacutedigo para a novaversatildeo da linguagem ateacute o periacuteodo em que realmente decidem refatorar coacutedigo Aleacutem dacomplexidade do projeto influenciar na decisatildeo de migrar o projeto para uma versatildeo maisrecente da linguagem a preocupaccedilatildeo com retrocompatibilidade com versotildees anteriores da

46

linguagem tambeacutem podem ser uma barreira para que projetos comecem a evoluir o coacutedigojuntamente com a evoluccedilatildeo da linguagem

Ainda assim foi possiacutevel observar que a preocupaccedilatildeo com a co-evoluccedilatildeo do software-linguagem existe entre os desenvolvedores de projetos mas a realizaccedilatildeo da migraccedilatildeo aindaacontece lentamente devido agrave diversos fatores que precisam ser levados em consideraccedilatildeopara a manutenccedilatildeo do projeto

Para trabalhos e contribuiccedilotildees futuras seria interessante desenvolver uma ferramentaque pudesse analisar diretamente no coacutedigo-fonte as oportunidades de aplicaccedilatildeo de ex-pressotildees lambda dessa forma poderiam ser analisadas as porcentagens de conversatildeo decoacutedigo para Java 8 e obter melhores conclusotildees sobre a importacircncia que os projetos estatildeodando para a evoluccedilatildeo de seus coacutedigos Outro fator interessante seria aplicar mais Visitorsagrave ferramenta static-analysis e fazer este mesmo estudo aplicado agrave outras caracteriacutesticasda linguagem

47

Referecircncias

[1] Kagdi Huzefa Michael L Collard e Jonathan I Maletic A survey and taxonomyof approaches for mining software repositories in the context of software evolution2007 ix 3 8 9 10 11

[2] DBeaver Dbeaver - features httpdbeaverjkissorgdocsfeatures ix 29

[3] Eclipse Vertx commit Java8-ify code httpsgithubcomeclipsevertxcommit93f95e9c77419f442a42fe711b6eeaef88192fd3 ix 42

[4] Google Guava commit Release java 8 changes to guava httpsgithubcomgoogleguavacommit73e382fa877f80994817a136b0adcc4365ccd904 ix 43

[5] Google Agera commit Collapsed testapp with retrolambda httpsgithubcomgoogleageracommit5e518b7b05f9e7a34a314945f68deff7b2c3e334 ix 44

[6] ReactiveX Rxjava commit 2x full jdk 6 compatible backport + includ-ing bugfixes up to today httpsgithubcomReactiveXRxJavacommit000a174d87a901135f9665d3b11f3627fd2dc4ed ix 45

[7] Godfrey M W e D M German The past present and future of software evolutionEm 2008 Frontiers of Maintenance paacuteginas 129ndash138 Sept 2008 1 6

[8] Favre J M Languages evolve too changing the software time scale Em Principles ofSoftware Evolution Eighth International Workshop on paacuteginas 33ndash42 IEEE 20051 5 7

[9] Overbey Jeffrey L e Ralph E Johnson Regrowing a language refactoring tools allowprogramming languages to evolve Em ACM SIGPLAN Notices volume 44 paacuteginas493ndash502 ACM 2009 1 5 7 8 12

[10] Grechanik Mark Collin McMillan Luca DeFerrari Marco Comi Stefano CrespiDenys Poshyvanyk Chen Fu Qing Xie e Carlo Ghezzi An empirical investiga-tion into a large-scale java open source code repository Em Proceedings of the2010 ACM-IEEE International Symposium on Empirical Software Engineering andMeasurement ESEM rsquo10 paacuteginas 111ndash1110 New York NY USA 2010 ACMISBN 978-1-4503-0039-1 httpdoiacmorg10114518527861852801 1

[11] TIOBE Tiobe httpswwwtiobecomtiobe-index 1 14

48

[12] Gyori Alex Lyle Franklin Danny Dig e Jan Lahoda Crossing the gap from im-perative to functional programming through refactoring Em Proceedings of the 20139th Joint Meeting on Foundations of Software Engineering ESECFSE 2013 paacute-ginas 543ndash553 New York NY USA 2013 ACM ISBN 978-1-4503-2237-9 httpdoiacmorg10114524914112491461 2 11 24 39

[13] OpenJDK State of the lambda httpcropenjdkjavanet~briangoetzlambdalambda-state-4html 2

[14] Han Jiawei Micheline Kamber e Jian Pei Data Mining Concepts and TechniquesMorgan Kaufmann Publishers Inc San Francisco CA USA 3rd ediccedilatildeo 2011ISBN 0123814790 9780123814791 3

[15] Fowler Martin e Kent Beck Refactoring improving the design of existing codeAddison-Wesley Professional 1999 5 7

[16] Lehman M M J F Ramil P D Wernick D E Perry e W M Turski Met-rics and laws of software evolution - the nineties view Em Proceedings of the4th International Symposium on Software Metrics METRICS rsquo97 paacuteginas 20ndashWashington DC USA 1997 IEEE Computer Society ISBN 0-8186-8093-8 httpdlacmorgcitationcfmid=823454823901 6

[17] Hassan Ahmed E e Tao Xie Software intelligence The future of mining softwareengineering data Em Proceedings of the FSESDP Workshop on Future of SoftwareEngineering Research FoSER rsquo10 paacuteginas 161ndash166 New York NY USA 2010ACM ISBN 978-1-4503-0427-6 httpdoiacmorg101145188236218823978 9

[18] Hassan Ahmed E The road ahead for mining software repositories Em Frontiers ofSoftware Maintenance 2008 FoSM 2008 paacuteginas 48ndash57 IEEE 2008 8

[19] Berry Michael J e Gordon Linoff Data Mining Techniques For Marketing Salesand Customer Support John Wiley amp Sons Inc New York NY USA 1997ISBN 0471179809 10

[20] Parnin Chris Christian Bird e Emerson Murphy-Hill Java generics adoption hownew features are introduced championed or ignored Em Proceedings of the 8thWorking Conference on Mining Software Repositories paacuteginas 3ndash12 ACM 2011 12

[21] Oracle The java language specification httpsdocsoraclecomjavasespecsjlsse8jls8pdf 13

[22] Oracle The history of java technology httpwwworaclecomtechnetworkjavajavaseoverviewjavahistory-index-198355html 13

[23] Murphy Kieron So why did they decide to call itjava httpwwwjavaworldcomarticle2077265core-javaso-why-did-they-decide-to-call-it-java-html 13

[24] McGraw Tata Object-oriented Programming with Java Essentials and ApplicationsHill Education 13

49

[25] Oracle Differences between java ee and java se httpdocsoraclecomjavaee6firstcupdocgkhoyhtml 13

[26] Lindsey Clark S The History of Java Cambridge 14

[27] Oracle The java language environment httpwwworaclecomtechnetworkjavaintro-141325html 14

[28] Oracle Jdk 8 httpopenjdkjavanetprojectsjdk8 15 24

[29] Oracle Enhancements in java se 8 httpdocsoraclecomjavase8docstechnotesguideslanguageenhancementshtmljavase8 15 16 17

[30] Oracle Lambda expressions httpdocsoraclecomjavasetutorialjavajavaOOlambdaexpressionshtml 16 18 21

[31] Oracle Method references httpdocsoraclecomjavasetutorialjavajavaOOmethodreferenceshtml 16

[32] Oracle Default methods httpdocsoraclecomjavasetutorialjavaIandIdefaultmethodshtml 17

[33] Oracle Repeating annotations httpdocsoraclecomjavasetutorialjavaannotationsrepeatinghtml 17

[34] Oracle Type annotations httpdocsoraclecomjavasetutorialjavaannotationstype_annotationshtml 17

[35] Oracle Anonymous inner classes httpsdocsoraclecomjavasetutorialjavajavaOOanonymousclasseshtml 19

[36] Kothari CR Research Methodology Methods and Techniques New Age Interna-tional (P) Limited 2004 ISBN 9788122415223 httpsbooksgooglecombrbooksid=8c6gkbKi-F4C 22

[37] Nakakoji Kumiyo Yasuhiro Yamamoto Yoshiyuki Nishinaka Kouichi Kishida eYunwen Ye Evolution patterns of open-source software systems and communitiesEm IWPSE rsquo02 Proceedings of the International Workshop on Principles of SoftwareEvolution paacuteginas 76ndash85 New York NY USA 2002 ACM Press ISBN 1581135459httpdxdoiorg101145512035512055 23

[38] Rahman Foyzur Christian Bird e Premkumar Devanbu Clones What is that smellEmpirical Software Engineering 17(4-5)503ndash530 2012 24

[39] Chacon Scott Pro Git Apress Berkely CA USA 1st ediccedilatildeo 2009ISBN 1430218339 9781430218333 25

[40] Cavalcanti Thiago Gomes e Viniacutecius Correa de Almeida Caracterizaccedilatildeo do uso deconstruccedilotildees da linguagem java em projetos open-source Publicaccedilatildeo online 2016httpbdmunbbrhandle1048315733 27

50

[41] Parr Terence Language Implementation Patterns Create Your Own Domain-Specific and General Programming Languages Pragmatic Bookshelf 1st ediccedilatildeo 2009ISBN 193435645X 9781934356456 27

[42] Janssen Thorben 5 reasons to use jpa hibernate Publicaccedilatildeo online httpswwwsitepointcom5-reasons-to-use-jpa-hibernate 27

[43] Franklin Lyle Alex Gyori Jan Lahoda e Danny Dig Lambdaficator From imperativeto functional programming through automated refactoring Em Proceedings of the2013 International Conference on Software Engineering ICSE rsquo13 paacuteginas 1287ndash1290 Piscataway NJ USA 2013 IEEE Press ISBN 978-1-4673-3076-3 httpdlacmorgcitationcfmid=24867882486986 29

[44] Google Agera httpsgithubcomgoogleagerawiki 34

[45] Eclipse Eclipse vertx httpvertxio 35

[46] Cejas Fernando Android cleanarchitecture httpsgithubcomandroid10Android-CleanArchitecture 36

[47] ReactiveX Rxjava httpsgithubcomReactiveXRxJava 37

[48] Luontola Esko Retrolambda httpsgithubcomorfjackalretrolambda 43

51

Anexo I

Projetos utilizados

fastjson

platform_frameworks_base

netty

material-dialogs

kotlin

okhttp

tinker

AndroidUtilCode

RxJava

spring-boot

java-design-patterns

elasticsearch

ExoPlayer

kafka

vertx

realm-java

guava

zipkin

bazel

stetho

Signal-Android

glide

agera

fresco

plaid

presto

libgdx

spark

52

disruptor

lottie-android

flexbox-layout

PocketHub

zxing

spring-framework

deeplearning4j

dropwizard

interviews

BaseRecyclerViewAdapterHelper

uCrop

DanmakuFlameMaster

lottie-react-native

android-UniversalMusicPlayer

AndroidInterview-Q-A

greenDAO

retrofit

MaterialDrawer

BottomBar

druid

MPAndroidChart

Hystrix

guice

recyclerview-animators

dubbo

androidannotations

RxJava-Android-Samples

PhotoView

clojure

CircleImageView

AndroidSwipeLayout

jedis

MaterialViewPager

butterknife

junit4

RxBinding

leakcanary

SimianArmy

picasso

UltimateRecyclerView

53

AndroidViewAnimations

AppIntro

FizzBuzzEnterpriseEdition

ion

cheesesquare

physical-web

RxAndroid

Android-CleanArchitecture

Calligraphy

Android-Bootstrap

iosched

Android_Data

MaterialDesignLibrary

ListViewAnimations

EventBus

java8-tutorial

AndroidSlidingUpPanel

dagger

okhttputils

logger

HomeMirror

Material-Animations

android-Ultra-Pull-To-Refresh

android-async-http

Android-ObservableScrollView

Android-Universal-Image-Loader

ActionBarSherlock

SlidingMenu

storm

PagerSlidingTabStrip

Android-PullToRefresh

54

  • Dedicatoacuteria
  • Agradecimentos
  • Resumo
  • Abstract
  • Introduccedilatildeo
    • Contexto
    • Objetivos
      • Objetivos Gerais
      • Objetivos Especiacuteficos
        • Metodologia
        • Organizaccedilatildeo do Trabalho
          • Evoluccedilatildeo e Mineraccedilatildeo de Repositoacuterios de Software
            • Evoluccedilatildeo de Software
            • MSR Mineraccedilatildeo de dados e a Engenharia de Software
              • Classificaccedilatildeo
                • Trabalhos Relacionados
                  • Java SE 8 e JDK 8
                    • Histoacuterico
                    • Princiacutepios
                    • Evoluccedilatildeo
                    • Expressotildees Lambda
                      • Sintaxe
                      • Principais formas de uso
                          • Estudo e o Processo de Mineraccedilatildeo
                            • Questotildees de Pesquisa
                            • Fonte de Dados e Objetos de Estudo
                            • Processo de Mineraccedilatildeo
                              • static-analysis
                              • BDAnalisador
                                • Classificaccedilatildeo e Anaacutelise
                                  • Meacutedia de Lambda
                                  • Anaacutelise Temporal
                                  • Refatoraccedilatildeo de Coacutedigo
                                  • Casos de Uso
                                      • Resultados Obtidos e Anaacutelise
                                        • Visatildeo Geral
                                          • Projetos Selecionados
                                          • agera
                                          • vertx
                                          • Android-CleanArchitecture
                                          • RxJava
                                          • guava
                                            • Refatoraccedilatildeo de Coacutedigo
                                            • Estudos de Caso
                                              • Consideraccedilotildees Finais
                                              • Referecircncias
                                              • Anexo
                                              • Projetos utilizados

propriedades encontradas como por exemplo comparar duas versotildees distintas de umsoftware atraveacutes de um repositoacuterio github realizando uma investigaccedilatildeo de alto niacutevel noque diz respeito a evoluccedilatildeo do software [1]

A segunda perspectiva de metodologia que pode ser utilizada corresponde agrave mediccedilatildeodireta e anaacutelise da evoluccedilatildeo do software Ela diz respeito agraves investigaccedilotildees que estudamos mecanismos que leva um software a ser modificado de uma versatildeo para outra focandonas diferenccedilas especiacuteficas entre estas versotildees como por exemplo examinando mudanccedilasespeciacuteficas das classes arquivos funccedilotildees de cada parte do coacutedigo [1]

Assim eacute possiacutevel descrever explicitamente que este trabalho utiliza em sua maioriauma metodologia com mediccedilotildees diretas atraveacutes da anaacutelise estaacutetica de informaccedilotildees docoacutedigo fonte de diferente versotildees para analisar os diferentes padrotildees de desenvolvimentoem que expressotildees lambda (definidas no capiacutetulo seguinte) satildeo utilizadas

A Avaliaccedilatildeo

Por fim existem diversas formas para se avaliar o estudo realizado sempre levando emconsideraccedilatildeo a validade dos resultados obtidos Pode-se utilizar de meacutetricas para avaliar osdados considerando o quanto das informaccedilotildees obtidas satildeo relevantes Outra forma de seavaliar seria atraveacutes da utilizaccedilatildeo de modelos probabiliacutesticos seguindo uma abordagemde teoria da informaccedilatildeo Assim foram utilizadas determinadas meacutetricas quantitativaspara avaliar os resultados obtidos neste trabalho

23 Trabalhos Relacionados

Como ressaltado na introduccedilatildeo o foco deste trabalho encontra-se em utilizar teacutecnicas deMSR para caracterizar a adoccedilatildeo de expressotildees lambda em repositoacuterios Java Ao reali-zar um estudo sobre o estado da arte encontrou-se diversos trabalhos que utilizam deMSR para obter informaccedilotildees relevantes sobre repositoacuterios de software em diversos focose em especial trabalhos que investiguem repositoacuterios na linguagem Java Jaacute existemtambeacutem alguns trabalhos que apresentam ferramentas de refatoraccedilatildeo de coacutedigo para im-plementaccedilatildeo de expressotildees lambda com foco na evoluccedilatildeo do software Dentre os trabalhosencontrados mencionados destacam-se

bull Em um trabalho sobre utilizaccedilatildeo de refatoraccedilatildeo de coacutedigo para realizar a transiccedilatildeode coacutedigo Java para as novas caracteriacutesticas implementadas no Java 8 Gyori et alapresenta uma ferramenta que automatiza com sucesso o trabalho de conversatildeo decoacutedigo como Annonymous Inner Class para expressotildees lambda [12] O capiacutetulo aseguir descreve em detalhes estes conceitos

11

bull Regrowing a Language de Overbey apresenta um estudo sobre a importacircncia da co-evoluccedilatildeo entre a linguagem de programaccedilatildeo e os projetos de software focando naslinguagens Fortran e Java e provando como ferramentas de refatoraccedilatildeo de coacutedigoauxiliam para que o software consiga evoluir juntamente com sua linguagem deprogramaccedilatildeo [9]

bull O trabalho sobre a adoccedilatildeo de generics em coacutedigo Java feito por Parnin utiliza demineraccedilatildeo de dados para realizar uma investigaccedilatildeo empiacuterica avaliando projetos decoacutedigo aberto com o objetivo de observar como desenvolvedores destes projetos estatildeoutilizando generics em Java [20]

Os estudos mencionados focam em assuntos particulares pertinentes a este trabalhoem que de um lado tem-se trabalhos que mostram a necessidade de refatoraccedilatildeo de coacutedigopara evoluccedilatildeo de software e do outro tem-se trabalhos que mostram que eacute possiacutevel utilizarde MSR para entender melhor como a evoluccedilatildeo da linguagem de programaccedilatildeo Java temafetado projetos reais de coacutedigo aberto e como estes projetos estatildeo se adaptando a estasevoluccedilotildees

12

Capiacutetulo 3

Java SE 8 e JDK 8

Este trabalho tem como objetivo caracterizar a adoccedilatildeo de expressotildees Lambda em siste-mas Java que podem ser considerados legados pois foram concebidos em um momentoanterior a introduccedilatildeo dessa nova caracteriacutestica na linguagem Java Com o intuito de faci-litar o entendimento do leitor sobre tais construccedilotildees esse capiacutetulo apresenta informaccedilotildeeshistoacutericas referentes agrave linguagem Java desde sua criaccedilatildeo ateacute a sua ascensatildeo como umadas linguagens de programaccedilatildeo mais populares Aleacutem disso seratildeo apresentadas as novascaracteriacutesticas presentes na versatildeo Java SE 8 com destaque nas expressotildees Lambda e deque forma vieram para auxiliar no desenvolvimento de sistemas

31 Histoacuterico

Java eacute uma linguagem de programaccedilatildeo orientada a objetos para propoacutesitos gerais [21] Alinguagem nasceu com o nome de Oak no ano de 1991 com o foco em televisotildees digitais acabo mas devido agrave complexidade e poder da linguagem logo expandiu-se para os outrosdomiacutenios principalmente a Internet [22] Posteriormente a linguagem recebeu o nome deGreentalk devido agrave marca Oak jaacute ser registrada por outra empresa e o principal projeto daequipe se chamar Green Por fim o nome Java foi o mais votado pela equipe da Sun emuma reuniatildeo para decidir o mais raacutepido possiacutevel um nome definitivo para a linguagem [23]

Em 1995 em sua primeira versatildeo puacuteblica 10 a linguagem Java jaacute comeccedilava a terum crescimento em sua popularidade como Web Applet nos navegadores mais popularesfornecendo seguranccedila e rapidez nas plataformas mais utilizadas [24] A cada nova versatildeopublicada novas funcionalidades e plataformas eram adicionadas e tornavam a linguagemmais difundida no meio computacional fazendo com que em 2006 a linguagem fosse divi-dida em Java EE (foco em rede e serviccedilos web) Java ME (foco em sistemas embarcados)e Java SE (foco em desktops e servidores) [25]

13

Apoacutes anos de evoluccedilatildeo e aprimoramento atraveacutes de diversas versotildees como visto naTabela 31 hoje o Java se tornou uma das linguagens de programaccedilatildeo mais utilizadas nomundo estando em aproximadamente 15 das linhas de coacutedigo disponiacuteveis pela inter-net [11] A quantidade de plataformas suportadas pela linguagem e com o advento dosistema operacional Android sendo rodado na maior parte dos smartphones do mundoaleacutem da simplicidade em codificar no paradigma orientado a objetos foram os fatoresrelevantes para que a linguagem se popularizasse no mundo digital [26]

Tabela 31 As versotildees anteriores de java e principais caracteriacutesticasVersatildeo Principais caracteriacutesticasJava 10 JVM e JDKJava 2 Event Listeners

Kestrel (Java 3) HotSpot JVMMerlin (Java 4) Diversas novas APIs como Assertion e expressotildees regularesTiger (Java 5) Generics

Mustang (Java 6) Web ServicesDolphin (Java 7) Suporte a linguagens dinamicas

32 Princiacutepios

Com o foco em alcanccedilar a Web e participar mais ativamente do mercado virtual e e-Commerce foram projetados princiacutepios que permitissem com que a linguagem pudessealcanccedilar seus objetivos principais ao mesmo tempo que mantinha a facilidade e fami-liarizaccedilatildeo da linguagem a seus desenvolvedores [27] Dessa forma a equipe da Oracledeterminou cinco princiacutepios que caracterizariam o foco da linguagem Java

bull simples orientada a objeto e familiar projetada para ser orientada a objeto epermitir que seus desenvolvedores comecem a codificar rapidamente sem a necessi-dade de uma curva de aprendizagem acentuada

bull segura e robusta projetada para prover software confiaacutevel por meio de checagensa tempo de compilaccedilatildeo e execuccedilatildeo Haacute uma grande preocupaccedilatildeo com seguranccediladevido agrave larga utilizaccedilatildeo da linguagem em sistemas distribuiacutedos

bull de arquitetura neutra e portaacutevel projetada para ser independente de qualquerarquitetura bastando rodar a JVM dessa forma garantindo a portabilidade paravaacuterios ambientes e dispositivos

14

bull executada em alta performance projetada para fornecer a maior performancepossiacutevel em tempo de execuccedilatildeo com a utilizaccedilatildeo do garbage collector em uma threadde baixa prioridade

bull interpretada dinacircmica e threaded projetada para ser interpretada por qual-quer dispositivo que possua JVM desenvolvida garantindo um desenvolvimento raacute-pido e em ciclos O uso da classe Thread permite que a linguagem acompanhe atendecircncia do paralelismo Aleacutem disso a ligaccedilatildeo de classes eacute feita em tempo real esomente quando necessaacuteria tornando-a dinacircmica

33 Evoluccedilatildeo

A primeira versatildeo do Java 8 foi lanccedilada em 2014 [28] e apresentou diversas atualizaccedilotildeesespalhadas em categorias como linguagem seguranccedila Collections ferramentas deployentre outras Dentre a grande quantidade de mudanccedilas os destaques se encontraram nasnovas melhorias presentes na linguagem que afetaram de forma mais direta a maneiracom que os desenvolvedores passaram a tratar e organizar o coacutedigo fonte As atualizaccedilotildeesreferentes a linguagem descritas oficialmente pela Oracle [29] satildeo

1 Lambda Expressions ou apenas Expressotildees Lambda correspondem a uma novacaracteriacutestica que permite que uma pequena funcionalidade possa ser utilizada comoum argumento de um meacutetodo facilitando a escrita de accedilotildees que seratildeo feitas repetida-mente em uma Collection ou quando um processo se completa ou quando encontraum erro Eacute tambeacutem uma forma compacta de se escrever coacutedigo que previamenteera escrito com anonymous inner classes [29] A Listagem 31 mostra uma classehipoteacutetica Calculator cujo meacutetodo operateBinary() recebe como paracircmetro doisinteiros e um objeto da classe IntegerMath que representa a operaccedilatildeo que deveraacuteser realizada ou seja uma funcionalidade dinacircmica

1 pub l i c c l a s s Ca l cu la to r 2

3 i n t e r f a c e IntegerMath 4 i n t opera t i on ( i n t a i n t b) 5 6

7 pub l i c i n t operateBinary ( i n t a i n t b IntegerMath op ) 8 re turn op opera t i on (a b) 9

10

11 pub l i c s t a t i c void main ( St r ing a rgs ) 12

15

13 Calcu la to r myApp = new Ca lcu la to r ( ) 14 IntegerMath add i t i on = (a b) minusgt a + b 15 IntegerMath subt ra c t i on = (a b) minusgt a minus b 16 System out p r i n t l n ( 40 + 2 = +17 myApp operateBinary (40 2 add i t i on ) ) 18 System out p r i n t l n ( 20 minus 10 = +19 myApp operateBinary (20 10 sub t ra c t i on ) ) 20 21 22

Listagem 31 Exemplo de coacutedigo com o uso de Expressatildeo Lambda [30]

2 Method References Frequentemente expressotildees lambda criam meacutetodos anocircni-mos Algumas vezes poreacutem satildeo utilizadas para chamar um meacutetodo jaacute existentena classe Ao inveacutes de escrever a expressatildeo Lambda para esse caso pode-se optarpor utilizar um Method Reference que facilita a escrita e leitura desse uso de ex-pressatildeo Lambda [29] A Listagem 32 mostra um exemplo de um meacutetodo estaacuteticoque compara duas pessoas pelas suas idades e a Listagem 33 a utilizaccedilatildeo de MethodReference para aplicar a utilizaccedilatildeo desse meacutetodo em um array e reduzir a escrita deuma expressatildeo lambda a uma forma mais legiacutevel

1 pub l i c s t a t i c i n t compareByAge ( Person a Person b) 2 re turn a b i r thday compareTo (b b i r thday ) 3 4

Listagem 32 Exemplo de meacutetodo de uma classe Pessoa [31]

1 Arrays s o r t ( rosterAsArray Person compareByAge ) 2

Listagem 33 Exemplo de uso de Method Reference [31]

3 Default Methods satildeo meacutetodos com a palavra-chave default que servem para adi-cionar implementaccedilotildees de meacutetodos a uma interface de alguma biblioteca mantendoa compatibilidade binaacuteria com versotildees mais antigas dessa interface Tambeacutem pos-sibilita a implementaccedilatildeo de meacutetodos estaacuteticos em interfaces [29] A Listagem 34apresenta a inclusatildeo de um meacutetodo default na interface TimeClient

1 pub l i c i n t e r f a c e TimeClient 2 void setTime ( i n t hour i n t minute i n t second ) 3 void setDate ( i n t day i n t month i n t year ) 4 void setDateAndTime ( i n t day i n t month i n t year 5 i n t hour i n t minute i n t second )

16

6 LocalDateTime getLocalDateTime ( ) 7

8 s t a t i c ZoneId getZoneId ( S t r ing zoneStr ing ) 9 t ry

10 re turn ZoneId o f ( zoneStr ing ) 11 catch ( DateTimeException e ) 12 System e r r p r i n t l n ( I n v a l i d time zone + zoneStr ing

+13 us ing d e f a u l t time zone in s t ead ) 14 re turn ZoneId systemDefault ( ) 15 16 17

18 d e f a u l t ZonedDateTime getZonedDateTime ( St r ing zoneStr ing ) 19 re turn ZonedDateTime o f ( getLocalDateTime ( ) getZoneId (

zoneStr ing ) ) 20 21 22

Listagem 34 Exemplo de interface com um meacutetodo default [32]

4 Repeating Annotations permitem a implementaccedilatildeo e utilizaccedilatildeo de anotaccedilotildees deum mesmo tipo que podem ser utilizadas mais de uma vez para a mesma declara-ccedilatildeo [29] A Listagem 35 apresenta duas anotaccedilotildees iguais com paracircmetros diferentespermitindo uma customizaccedilatildeo maior na aplicaccedilatildeo de um tipo de anotaccedilatildeo

1 Schedule ( dayOfMonth= l a s t )2 Schedule (dayOfWeek= Fr i hour= 23 )3 pub l i c void doPeriodicCleanup ( ) 4

Listagem 35 Exemplo de Repeating Annotations [33]

5 Type Annotations permitem que anotaccedilotildees possam ser utilizadas em tipos aleacutemde declaraccedilotildees dessa forma pode-se garantir que um campo sempre atenda agraves suasexpectativas e evite testes desnecessaacuterios [29] A Listagem 36 mostra um exemplo derestriccedilatildeo a uma String que nunca poderaacute ser nula devido agrave anotaccedilatildeo de NonNull

1 NonNull S t r ing s t r

Listagem 36 Exemplo de Type Annotation garantindo que o campo nunca seja null [34]

17

34 Expressotildees Lambda

Uma das mudanccedilas mais interessantes implementadas no Java 8 foi a adiccedilatildeo de expressotildeeslambda As expressotildees lambda permitem que a linguagem Java possa atuar parcialmentecomo uma linguagem de programaccedilatildeo funcional onde comportamentos satildeo avaliados eaplicados diferentemente da programaccedilatildeo imperativa que foca na mudanccedila de estadosNa praacutetica um comportamento pode ser passado como paracircmetro de um meacutetodo atraveacutesde uma escrita mais reduzida e legiacutevel Os benefiacutecios de utilizar expressotildees lambda incluemuma melhora na legibilidade e organizaccedilatildeo de coacutedigo que antes era escrito com AnonymousInner Class aleacutem de permitir uma forma simples de utilizar comportamento paralelo como uso de Streams

341 Sintaxe

A sintaxe de uma expressatildeo lambda eacute dividida nas seguintes partes [30]

bull Uma lista de paracircmetros separados por viacutergulas

bull Um token representado por uma seta -gt

bull Um corpo que pode ser representado por uma expressatildeo uacutenica ou um bloco de coacutedigodentro de chaves

As Listagens 37 e 38 mostram duas formas diferentes de se aplicar expressotildees Lambdacom uma sintaxe similar A primeira aplica a expressatildeo diretamente apoacutes a seta utilizadanormalmente para trechos de coacutedigo pequenos e simples e a segunda utiliza-se de chavespara incorporar o coacutedigo e da palavra-chave return para especificar o retorno forma maisutilizada para uma quantidade maior de coacutedigo

1 p minusgt p getGender ( ) == Person Sex MALE2 ampamp p getAge ( ) gt= 183 ampamp p getAge ( ) lt= 25

Listagem 37 Exemplo de expressatildeo lambda com uma expressatildeo [30]

1 p minusgt 2 re turn p getGender ( ) == Person Sex MALE3 ampamp p getAge ( ) gt= 184 ampamp p getAge ( ) lt= 25 5

Listagem 38 Exemplo de expressatildeo lambda com um bloco de coacutedigo [30]

18

342 Principais formas de uso

Anonymous Inner Class

Antes do Java 8 a necessidade de passar funccedilotildees ou expressotildees como paracircmetro de algummeacutetodo era suprida atraveacutes de Anonymous Inner Classes A utilizaccedilatildeo desse tipo dedeclaraccedilatildeo junto com a anotaccedilatildeo de Override permite sobrescrever um meacutetodo de umainterface funcional e ao mesmo tempo passa-la como argumento para um meacutetodo Umaexpressatildeo lambda se comporta da mesma forma poreacutem a quantidade de coacutedigo escritopela Anonymous Inner Class eacute maior e pode dificultar a leitura de coacutedigo pois conteacutemmuita informaccedilatildeo natildeo utilizada para efetivo entendimento do que estaacute sendo feito naqueletrecho

A Listagem 39 apresenta a instanciaccedilatildeo da classe EventHandler internamente ao meacute-todo setOnAction() de forma que o desenvolvedor possa escrever o comportamento quedeseja passar como paracircmetro do meacutetodo atraveacutes da substituiccedilatildeo do meacutetodo handle()que jaacute existe pelo meacutetodo handle() criado e escrito pelo desenvolvedor

1 btn setOnAction (new EventHandlerltActionEvent gt() 2 Override3 pub l i c void handle ( ActionEvent event ) 4 System out p r i n t l n ( He l lo World ) 5 6 )

Listagem 39 Exemplo de uso de Anonymous Inner Class [35]

Interface funcional

Ao projetar um coacutedigo novo o desenvolvedor que optar por utilizar expressotildees lambdadeve iniciar com a criaccedilatildeo de uma interface funcional Esse tipo de interface possui umuacutenico meacutetodo abstrato permitindo que expressotildees lambda sejam usadas para sobrescrevero comportamento do meacutetodo abstrato Uma interface funcional pode possuir outros meacuteto-dos desde que sejam default Uma nova anotaccedilatildeo FunctionalInterface foi adicionadacom a atualizaccedilatildeo do Java 8 para conferir em tempo de compilaccedilatildeo se a interface satisfazos requisitos desse modelo de interface

A Listagem 310 apresenta um exemplo de interface funcional com o objetivo de permi-tir o uso de expressotildees lambda que utilizaratildeo de dois Double como paracircmetro e jaacute utilizada nova anotaccedilatildeo FunctionalInterface introduzida no Java 8

1 Funct iona l Inte r face2 pub l i c i n t e r f a c e DoubleOp 3 pub l i c Double apply ( Double a Double b)

19

4

Listagem 310 Exemplo de interface funcional

Dessa forma conforme as Listagens 311 e 312 o meacutetodo apply() pode tomar formade qualquer operaccedilatildeo entre dois Double que seraacute especificada quando a expressatildeo lambdafor montada dando o aspecto de linguagem funcional agrave linguagem e mais facilidade eliberdade ao desenvolvedor

1 pub l i c c l a s s Ca l cu la to r 2 pub l i c s t a t i c Double c a l c ( Double op1 Double op2 DoubleOp operator ) 3 re turn operator apply ( op1 op2 ) 4 5

Listagem 311 Exemplo de aplicaccedilatildeo da interface funcional

1 Double r e s u l t 1 = Ca lcu la to r c a l c (10d 50d ( a b ) minusgt a + b)

Listagem 312 Uso de expressatildeo lambda para o exemplo anterior

Collections

Dentre as atualizaccedilotildees de pacotes do Java 8 foi adicionado um meacutetodo stream() nainterface Collection Esse meacutetodo trata as Collection como streams o que significa queapesar de natildeo ser possiacutevel acessar elementos diretamente algumas novas manipulaccedilotildeessatildeo possiacuteveis Essas manipulaccedilotildees satildeo na verdade meacutetodos da interface Stream quepodem receber como paracircmetro uma expressatildeo lambda ou seja um comportamento a seraplicado agrave Collection Dentre os meacutetodos temos

bull filter() O meacutetodo filter() recebe uma expressatildeo lambda contendo uma condiccedilatildeopara filtragem da collection

bull map() O meacutetodo map() mapeia os elementos de uma Collection em outro objetocomo uma String A expressatildeo lambda passada por paracircmetro deve retornar o tipode objeto ao qual seraacute mapeado

bull forEach() O meacutetodo forEach() aplica uma operaccedilatildeo especiacutefica para cada ele-mento da Collection A expressatildeo lambda a ser passada deve conter a operaccedilatildeo aser realizada

bull min() e max() Os meacutetodos min() e max() retornam o elemento menor ou maiorda Collection dependendo da expressatildeo lambda passada como paracircmetro

20

A Listagem 313 demonstra como vaacuterias operaccedilotildees com uma Collection podem seraplicadas de uma vez de forma que lendo a expressatildeo lambda jaacute eacute possiacutevel saber oresultado da aplicaccedilatildeo do meacutetodo agrave Collection

1 r o s t e r2 stream ( )3 f i l t e r (4 p minusgt p getGender ( ) == Person Sex MALE5 ampamp p getAge ( ) gt= 186 ampamp p getAge ( ) lt= 25)7 map(p minusgt p getEmailAddress ( ) )8 forEach ( emai l minusgt System out p r i n t l n ( emai l ) )

Listagem 313 Exemplo de utilizaccedilatildeo de meacutetodos de stream com expressotildees lambda [30]

21

Capiacutetulo 4

Estudo e o Processo de Mineraccedilatildeo

A definiccedilatildeo da metodologia utilizada para realizaccedilatildeo deste trabalho eacute importante para queexista uma padronizaccedilatildeo e melhor entendimento de como os resultados foram obtidos paraque a replicaccedilatildeo do mesmo possa ser realizada em trabalhos futuros [36]

Figura 41 Processo utilizado para realizaccedilatildeo do estudo

O esquema representado na Figura 41 descreve o processo seguido para a realizaccedilatildeodeste trabalho que foi divido em trecircs grandes etapas a de planejamento definindo osobjetivos questotildees de pesquisa e meios de investigaccedilatildeo deste projeto a etapa de execuccedilatildeorealizando todo o procedimento metodoloacutegico definido para a coleta e refinamento de

22

dados e a etapa de avaliaccedilatildeo onde foram classificados e avaliados os dados coletadospara responder agraves questotildees de pesquisa

A seguir na primeira seccedilatildeo seratildeo apresentadas em detalhes as questotildees de pesquisa aserem respondidas Em seguida seraacute feito uma breve descriccedilatildeo da fonte de dados utilizada- especificamente os projetos utilizados como objetos de estudo deste trabalho e por fimtodo o restante da metodologia que foi de fato desenvolvida para obter os resultadosnecessaacuterios

41 Questotildees de Pesquisa

Com o objetivo de entender e caracterizar melhor o uso de expressotildees lambda foramdefinidas as seguintes questotildees de pesquisa a serem respondidas

bull PQ-1 Quando os projetos comeccedilaram a introduzir o uso de expressotildees lambda emseus coacutedigos e qual a meacutedia de expressotildees lambda por snapshots caso existam

bull PQ-2 Como as equipes de desenvolvimento estatildeo utilizando expressotildees lambdaatraveacutes de refatoraccedilatildeo de coacutedigo ou introduzindo apenas em coacutedigo novo

bull PQ-3 Quais satildeo os padrotildees tipicamente adotados para o uso de expressotildees lambda

A primeira pergunta de pesquisa gira em torno de como projetos populares open-sourceestatildeo se adaptando agrave introduccedilatildeo de expressotildees lambda em Java muitos projetos jaacute estatildeoutilizando as expressotildees lambda Se sim a partir de quando comeccedilaram a utilizaacute-lasdesde o iniacutecio da introduccedilatildeo das mesmas no Java 8 ou em um periacuteodo mais tardio Aleacutemdisso eacute interessante descobrir se a utilizaccedilatildeo dessa nova caracteriacutestica tem acontecido deforma expressiva ou natildeo

Em seguida para melhor entender a forma como as expressotildees lambda estatildeo sendointroduzidas em projetos eacute interessante investigar se as equipes de desenvolvimento estatildeose preocupando em refatorar coacutedigo com o objetivo de evoluir o software ou se estatildeoexperimentando utilizar expressotildees lambda apenas em coacutedigo novo introduzido

Como a introduccedilatildeo de novas funcionalidades em projetos open-source de grande escaladepende do objetivo do projeto e os padrotildees de projeto utilizados [37] espera-se obser-var diversas abordagens quanto a utilizaccedilatildeo de expressotildees lambda para entatildeo poderclassificar estes softwares quanto a abordagem utilizada

Eacute de grande importacircncia para este estudo conseguir identificar na praacutetica comoexpressotildees lambda estatildeo sendo tipicamente adotadas nestes projetos Assim a terceirapergunta de pesquisa busca identificar alguns exemplos de utilizaccedilatildeo atraveacutes da realizaccedilatildeode alguns estudos de caso

23

Eacute importante ressaltar que apesar de as expressotildees lambda serem uma alternativa aouso de AIC elas natildeo os substituem completamente Existem precondiccedilotildees para que umaAIC possa ser substituiacuteda por expressotildees lambda [12] descritas a seguir

bull AIC deve instanciar-se de uma interface

bull AIC natildeo deve possuir nenhum campo e declarar apenas um meacutetodo

bull AIC natildeo deve possuir uma referecircncia para this ou super

bull AIC natildeo deve declarar um meacutetodo recursivo

Para responder agrave primeira pergunta apenas dados gerais sobre todos os projetos seratildeonecessaacuterios ao passo que pelas perguntas 2 e 3 possuiacuterem uma natureza mais complexaseraacute necessaacuterio aleacutem de uma anaacutelise geral estatiacutestica a realizaccedilatildeo de alguns estudos decaso para obter resultados mais completos

42 Fonte de Dados e Objetos de Estudo

Para responder agraves perguntas de pesquisa estabelecidas foram selecionados os 99 projetosmais populares na linguagem Java dentro da plataforma github ateacute a data da coleta dosdados feita em Abril de 2017 Satildeo considerados populares os repositoacuterios que possuema maior quantidade possiacutevel de estrelas (stars) A decisatildeo de escolher os 99 projetos maispopulares foi por sua natureza imparcial e ao mesmo tempo para que se possa analisarprojetos que satildeo de familiaridade e conhecimento da comunidade do github e de domiacuteniopuacuteblico Os 99 projetos estatildeo listados no Anexo I

Para entender a transiccedilatildeo feita por esses projetos entre as versotildees anteriores do Java eo Java 8 com as expressotildees lambda eacute necessaacuterio analisar o coacutedigo de vaacuterias versotildees a fimde observar alguma mudanccedila para cada projeto Como satildeo 99 projetos e vaacuterios dessesprojetos possuem milhares de linhas de coacutedigo e commits seria impossiacutevel avaliar todosos commits Optou-se entatildeo por coletar snapshots mensais de cada projeto conformeprocedimento tambeacutem seguido anteriormente [38] Cada snapshots representa o estadodo projeto em um determinado mecircs e como criteacuterio de escolha padratildeo todos os snapshotsequivalem ao uacuteltimo commit realizado no determinado mecircs que este representa

O proacuteximo passo eacute determinar o periacuteodo de tempo em que esses snapshots seriamcoletados Como Java 8 (e consequentemente as expressotildees lambda) foi introduzidoapenas em meados de 2014 [28] coletar dados de projetos a partir de um periacuteodo muitoantes deste ano natildeo agregaria valor ao estudo em questatildeo Definiu-se entatildeo um periacuteodopara a coleta mensal desses snapshots atraveacutes dos anos Janeiro de 2013 um ano antesda introduccedilatildeo do Java 8 para que se pudesse identificar para todos os projetos o mecircs

24

exato em que expressotildees lambda foram introduzidas ateacute o mecircs da coleta de dados Abrilde 2017

Eacute importante ressaltar que a definiccedilatildeo dos meses foi definida do dia primeiro de ummecircs ao dia primeiro do proacuteximo mecircs e por consequecircncia alguns snapshots que deveriamrepresentar o final de determinado mecircs correspondem na verdade a commits realizadosno dia primeiro do mecircs seguinte Por exemplo pode existir casos em que o commit querepresente o mecircs de Marccedilo de 2016 seja na verdade o commit realizado no dia primeirode Abril de 2016 Isso se deve a natureza da forma como os resultados de log de commitssatildeo obtidos pelo git [39] Poreacutem isso natildeo interfere nas anaacutelises ou no propoacutesito destetrabalho uma vez que foram realizadas verificaccedilotildees e validaccedilotildees para que natildeo existamdatas repetidas (e consequentemente commits repetidos) por repositoacuterio

Neste trabalho o termo projeto e repositoacuterio foram utilizados de forma intercaladapara representar a mesma coisa o software desenvolvido que possui um repositoacuterio naplataforma github Os termos commit snapshops e versotildees tambeacutem representam a mesmacoisa uma vez que foi definido que seriam utilizados apenas um commit por mecircs pararepresentar um determinado snapshot ou versatildeo do repositoacuterio em questatildeo

Todos os 99 projetos seratildeo utilizados para a realizaccedilatildeo de uma anaacutelise geral de ca-racterizaccedilatildeo do uso de expressotildees lambda Para as anaacutelises aprofundadas foi feito umcriteacuterio de classificaccedilatildeo para que apenas alguns projetos possam ser analisados em niacutevelde coacutedigo como estudos de caso

Resumindo foram escolhidos os 99 projetos mais populares de Java no github cole-tando dados mensais de seus commits a partir do ano de 2013 ateacute a data da coleta dosdados lembrando que nem todos os projetos existem desde 2013 (projetos mais recentes)

43 Processo de Mineraccedilatildeo

A abordagem utilizada para coletar e analisar os 99 projetos escolhidos como mostra aFigura 42 foi realizada de forma automatizada utilizando scripts python e dois projetosdesenvolvidos em Java para a coleta e tratamento de dados como descrito a seguir

Primeiramente foi realizado uma coacutepia dos repositoacuterios atuais de todos os 99 projetosmais populares do github em Java Para automatizar o processo foi desenvolvido umscript em python que lista todos os projetos escolhidos clona todos os repositoacuterios emuma pasta na maacutequina local e cria um arquivo temporaacuterio com as informaccedilotildees do nomede cada repositoacuterio e seu caminho absoluto na maacutequina local

25

Figura 42 Metodologia implementada para coleta e tratamento de dados

Em seguida foi necessaacuterio realizar o checkout de todas as versotildees entre Janeiro de2013 a Abril de 2017 de cada projeto Por motivos de otimizaccedilatildeo de espaccedilo da maacutequinalocal e automatizaccedilatildeo no processo de checkout utilizou-se de um segundo script pythonque realizava as seguintes tarefas para cada mecircs em cada projeto verificar se dentreo mecircs estipulado houve algum commit para aquele projeto se sim pega-se o hash douacuteltimo commit do mecircs realiza o checkout conta-se a quantidade de linhas de coacutedigo emJava que o projeto tem utilizando a biblioteca cloc e armazena todas as informaccedilotildeespertinentes referentes a todos os projetos que naquele mecircs tiveram commits para que oprojeto static-analysis possa entatildeo ser executado sobre esses projetos naquele determinadomomento As informaccedilotildees coletadas que satildeo utilizadas pelo static-analysis correspondemao nome do projeto o hash do commit para aquela versatildeo a pasta onde o projeto estaacutearmazenado na maacutequina local a quantidade de linhas de coacutedigo Java do projeto e datareferente ao commit Essas informaccedilotildees satildeo pertinentes para que o projeto static-analysisconsiga funcionar de forma correta projeto este descrito em detalhes a seguir

431 static-analysis

O static-analysis foi um projeto desenvolvido anteriormente a este trabalho pelos alunosThiago Cavalcanti e Vinicius de Almeida cujo objetivo eacute realizar a anaacutelise estaacutetica de

26

coacutedigos-fonte Java e gerar arquivos de saiacuteda contendo informaccedilotildees de classes e meacutetodoscom suas devidas ocorrecircncias de caracteriacutesticas da linguagem [40]

A anaacutelise estaacutetica de coacutedigo consiste em analisar um coacutedigo-fonte sem a necessidadede executaacute-lo Esse tipo de anaacutelise eacute de extrema importacircncia para manter um coacutedigo dequalidade evitar futuras refatoraccedilotildees e obter informaccedilotildees estatiacutesticas de forma raacutepida epraacutetica [41]

Seguindo esse princiacutepio o static-analysis foi projetado para receber um arquivo deentrada csv seguindo o padratildeo

Tipo da Aplicaccedilatildeo Inicio do projeto Antes ou Apoacutes Java 5 Nome do ProjetoVersatildeo Caminho absolutoQuantidade de linhas de coacutedigo

Atraveacutes da informaccedilatildeo do caminho absoluto do projeto o static-analysis varre osdiretoacuterios em busca dos arquivos fonte java realiza o parse desses arquivos e utilizade Visitors para extrair as informaccedilotildees desejadas e exporta-las em arquivos csv Ouso de Visitors permite que sejam escolhidas as informaccedilotildees desejadas para a consultacomo expressotildees Lambda e AIC s aleacutem de possibilitar que sejam implementados novosVisitors conforme a linguagem evolua ou as necessidades mudem

Para este trabalho foram utilizados os Visitors de expressotildees Lambda map() filter()AICs e declaraccedilotildees de meacutetodos

432 BDAnalisador

Apoacutes obter todas as informaccedilotildees necessaacuterias geradas pelo static-analysis era preciso ma-nipular os dados de forma que facilitasse a coleta de dados para o estudo proposto Comovaacuterios arquivos em formato csv satildeo de difiacutecil manipulaccedilatildeo foi desenvolvido entatildeo umaferramenta chamada BDAnalisador Esta ferramenta eacute responsaacutevel por processar os arqui-vos em csv gerados pelo static-analysis e popular uma base de dados relacional MySQLcom as informaccedilotildees pertinentes a este estudo

O BDAnalisador foi desenvolvido com a intenccedilatildeo de tornar mais simples o trabalhocom os dados resultantes do static-analysis de forma que consultas em SQL pudessemser feitas a ponto de permitir a obtenccedilatildeo de resultados mais complexos Seguindo esseobjetivo o framework Hibernate foi escolhido como ferramenta para persistecircncia devidoa ser um framework jaacute consolidado no mercado e que de forma simples relaciona osobjetos Java ao banco de dados MySQL [42] A divisatildeo de classes foi projetada em quatroentidades Projeto Versao Classe e Metodo cada uma com seus respectivos camposcontendo as informaccedilotildees necessaacuterias para a pesquisa como pode ser visto na Figura 44Eacute importante ressaltar que a tabela de Versao guarda hashs de commits devido agrave escolhade utilizar commits para obter mais informaccedilatildeo de evoluccedilatildeo de coacutedigo em um menor

27

espaccedilo de tempo Aleacutem disso para este trabalho optou-se por persistir todos os meacutetodose classes de cada versatildeo sem se importar com a repeticcedilatildeo desses dados pois a hipoacutetesede haver grandes refatoraccedilotildees entre versotildees poderia comprometer a confiabilidade dasinformaccedilotildees

Figura 43 Diagrama de classes UML do BDAnalisador

Como visto na Figura 43 seguindo parcialmente a arquitetura MVC cada entidadepossui sua respectiva classe DAO(Data Access Object) para persistecircncia dos dados eapenas uma classe Controlador no projeto responsaacutevel pela manipulaccedilatildeo e parse dosdados dos arquivos csv gerados pelo static analysis para serem enviados agraves classes DAOO sistema inicia chamando o meacutetodo inicializar() da classe Controlador Esse meacutetodoeacute responsaacutevel por ler um arquivo de entrada csv que segue o mesmo modelo do arquivo dostatic-analysis citado na seccedilatildeo anterior O arquivo conteacutem os dados de todos os projetose suas respectivas versotildees dessa forma o meacutetodo instancia um objeto da classe Projetoe persiste o projeto no banco de dados Para cada versatildeo encontrada no arquivo deentrada o inicializar() aciona os meacutetodos responsaacuteveis por instanciar e preencher aslistas da classe Classe e Metodo Os meacutetodos responsaacuteveis por preencher as listas varremos arquivos csv gerados pelo static-analysis e fazem o parse das informaccedilotildees relevantescomo nomes dos meacutetodos e quantidades de lambdas para construir os objetos que seratildeogravados Ao final dos preenchimentos o objeto Versatildeo eacute instanciado e gravado no bancode dados atraveacutes de sua classe DAO ao mesmo tempo que grava suas respectivas Classese Metodos

28

Apoacutes vaacuterios testes e correccedilotildees de bugs o banco de dados se encontrava finalmente comas informaccedilotildees de 99 projetos Java open-source separados por um commit por mecircs desde2013 cada um com suas respectivas informaccedilotildees de classes meacutetodos e a quantidade deexpressotildees lambda filters e maps em cada meacutetodo Filter ou Filter pattern eacute o padratildeode projeto que tem como objetivo filtrar objetos de uma coleccedilatildeo (Collection) de acordocom algum criteacuterio Jaacute o map ou map pattern eacute um padratildeo que ldquomapeia os elementosde uma coleccedilatildeo aplicando uma funccedilatildeo a eles para uma nova coleccedilatildeo [43] A coleta deinformaccedilotildees sobre esses padrotildees podem ser uacuteteis para possiacuteveis anaacutelises de oportunidadesde uso de expressotildees lambda para refatoraccedilatildeo de coacutedigo

A Figura 44 mostra o esquema de como o banco de dados resultante foi gerado

Figura 44 Modelo relacional do banco de dados populado pelo BDAnalisador Imagemgerada com software DBeaver [2]

44 Classificaccedilatildeo e Anaacutelise

Com o banco de dados populado restam apenas as etapas de classificaccedilatildeo e anaacutelise pararesponder as questotildees de pesquisa propostas Para isso inicialmente houve uma tentativade se utilizar apenas queries SQL para analisar os dados de acordo com as informaccedilotildeesrelevantes Poreacutem devido ao fato de o banco de dados conter todas as informaccedilotildees detodos os projetos e todas as suas versotildees queries que possuem uma alta complexidadedemoravam muito tempo para retornar os dados

Assim com o objetivo de facilitar o trabalho alguns scripts python foram desenvolvi-dos para rodar as queries separadamente e individualmente para cada projeto de formaautomatizada a fim de melhorar o tempo de resposta para obtenccedilatildeo dos resultados

29

441 Meacutedia de Lambda

O primeiro script retorna a quantidade de expressotildees lambda (ou AICs) por n snapshotsque contenha expressotildees lambda O objetivo eacute ter uma visatildeo geral da meacutedia de expressotildeeslambda e AICs utilizadas por cada projeto e como nem todos os snapshots coletados decada projeto possuem expressotildees lambda e AICs apenas aqueles com alguma expressatildeolambda ou AIC satildeo incluiacutedos no caacutelculo da meacutedia

Mmedia =sumn qtdLambdai

n

442 Anaacutelise Temporal

O segundo script retorna para cada projeto a soma total da quantidade de expressotildeeslambda AIC map() e filter() no projeto inteiro para cada versatildeo Ou seja tem-seo total de cada uma das quatro propriedades selecionadas para cada mecircs do projetoobtendo assim uma visatildeo temporal de evoluccedilatildeo do uso das caracteriacutesticas descritas ATabela 41 ilustra parcialmente o resultado obtido para o projeto agera onde idVersaoeacute o identificador no banco de dados referente ao hash do commit mensal coletado qtd eacutea quantidade de cada uma das caracteriacutesticas escolhidas e a data do commit encontra-seno formato americano

Tabela 41 Informaccedilotildees mensais sobre o projeto ageraidVersao Data do Commit qtd lambda qtd AIC qtd maps qtd filter

823 512016 0 29 4 0755 612016 13 28 4 0686 6152016 13 29 4 0621 812016 13 29 4 0555 8162016 13 30 4 0485 922016 13 30 4 0422 10132016 14 30 4 0356 11282016 14 30 4 0295 12212016 21 30 5 0232 212017 21 30 5 0175 312017 21 30 5 0112 3312017 21 36 5 048 4242017 21 48 5 0

Os resultados obtidos com esta anaacutelise temporal permitiu a identificaccedilatildeo de padrotildees nautilizaccedilatildeo de expressotildees lambda em relaccedilatildeo a utilizaccedilatildeo de AIC por todos os projetos Foi

30

possiacutevel classificar todos os projetos em 6 grupos ilustrado na Figura 45 Primeiramenteseparou-se os projetos entre os que possuem expressotildees lambda e os que natildeo possuemDentre os que possuem identificou-se cinco categorias

1 Grupo 1 Quantidade de AICs e expressotildees lambda aumentam com o tempo pro-porcionalmente

2 Grupo 2 Quantidade de AICs diminui agrave medida que a quantidade de expressotildeeslambda aumentam e a quantidade de expressotildees lambda ultrapassa a quantidade deAIC em um determinado momento

3 Grupo 3 Quantidade de AICs diminui agrave medida que a quantidade de expressotildeeslambda aumentam mas a quantidade de AIC permanece superior agrave quantidade delambda

4 Grupo 4 Expressotildees lambda satildeo introduzidas e existem por um pequeno periacuteodode tempo mas satildeo completamente removidas posteriormente

5 Grupo 5 Quantidade de expressotildees lambda eacute constante e muito inferior compa-rado com a quantidade de AICs no projeto Foi determinado que para pertencera esta classificaccedilatildeo o projeto precisa ter uma razatildeo de meacutedia de expressotildees lamb-dasnapshot por meacutedia de AICsnapshot inferior a 020 Esse paracircmetro foi esta-belecido com o objetivo de definir um padratildeo para o que pode ser considerado umprojeto com poucas expressotildees lambda

Figura 45 Classificaccedilatildeo dos projetos

31

443 Refatoraccedilatildeo de Coacutedigo

O uacuteltimo script teve como objetivo realizar uma tentativa inicial de identificar refatoraccedilatildeode coacutedigo da seguinte maneira para todos os projetos que possuem expressotildees lambdaforam identificados o mecircs imediatamente antes da introduccedilatildeo de expressotildees lambda e omecircs seguinte onde houve a primeira ocorrecircncia de lambda no projeto Assim realizou-se uma anaacutelise do tamanho em quantidade de linhas de coacutedigo de todos os meacutetodosdo projeto que no mecircs seguinte tiveram introduccedilatildeo de lambda Em seguida fez-se umacomparaccedilatildeo com os mesmos meacutetodos em relaccedilatildeo ao mecircs anterior e assim foi possiacuteveldetectar quais meacutetodos tiveram a quantidade de linhas de coacutedigo reduzidas o que seriaum indicativo natildeo necessariamente exclusivo de que uma refatoraccedilatildeo de coacutedigo possa terocorrido

Sabe-se que este meacutetodo de detecccedilatildeo de refatoraccedilatildeo de coacutedigo possui suas limitaccedilotildeesuma vez que as comparaccedilotildees para saber se um meacutetodo existe em ambas versotildees eacute feitopuramente por comparaccedilatildeo de String (nome do meacutetodo) e a classe que este pertence

444 Casos de Uso

Os meacutetodos descritos acima ajudaram a identificar alguns padrotildees e facilitar a anaacutelise dosdados Poreacutem natildeo satildeo suficientes para que se possa responder agraves questotildees de pesquisaDessa forma apoacutes a identificaccedilatildeo dos grupos de classificaccedilatildeo para os projetos foramescolhidos um projeto de cada grupo (com exceccedilatildeo do grupo dos projetos sem expressotildeeslambda) para realizar um breve estudo de caso com o objetivo de identificar e caracterizarmelhor a adoccedilatildeo de expressotildees lambda Os projetos escolhidos foram agera vertxAndroid-CleanArchitecture RxJava e guava

32

Capiacutetulo 5

Resultados Obtidos e Anaacutelise

Neste capiacutetulo seratildeo apresentados os dados obtidos e anaacutelise com o objetivo de responderagraves questotildees de pesquisa propostas Como mencionado anteriormente as perguntas seratildeorespondidas de duas maneiras algumas com informaccedilotildees gerais sobre todos os projetose outras com breve estudos de caso envolvendo cinco projetos

51 Visatildeo Geral

Dentre os repositoacuterios coletados para a anaacutelise 74 (7474) natildeo utilizaram nenhumaexpressatildeo lambda no projeto durante todo o periacuteodo analisado (Janeiro de 2013 a Abrilde 2017) restando apenas 25 repositoacuterios (2525) com expressotildees lambda Eacute interessantedestacar que apesar de a quantidade de repositoacuterios que natildeo possuem expressotildees lambdaser relativamente expressiva muitos destes repositoacuterios satildeo de projetos em Java que umdia foram populares e atualmente natildeo estatildeo sendo mais desenvolvidos (por exemplo umaplicativo que soacute funciona para Android 23 atualmente descontinuado)

Levando em consideraccedilatildeo apenas os projetos que possuem expressotildees lambda exis-tem dois tipos de dados que podem ser analisados para responder agrave primeira questatildeo depesquisa atraveacutes dos dados obtidos pelo meacutetodo anteriormente mencionado como anaacutelisetemporal e a meacutedia de lambda por snapshot mencionados no capiacutetulo anterior

Com relaccedilatildeo ao ano em que a primeira ocorrecircncia foi encontrada 6 projetos introduzi-ram expressotildees lambda jaacute em 2014 8 comeccedilaram a utilizar em 2015 7 em 2016 e apenas4 tiveram a primeira ocorrecircncia de expressotildees lambda em 2017 Dessa forma percebe-seque os projetos estatildeo relativamente bem distribuiacutedos em grupos quanto ao ano em que seintroduziu expressotildees lambda

Pela meacutedia de lambda por snapshot (lambdasnapshot) a maioria (11 projetos) possuiuma quantidade expressiva acima de 100 lambdasnapshot (com 6 projetos entre 20 e 100lambdasnapshot e 8 projetos com menos de 20 lambdasnapshot) como apresentados no

33

graacutefico da Figura 51 Isso mostra que essa nova caracteriacutestica jaacute estaacute sendo bem utilizadanos projetos que comeccedilaram a migrar para a nova versatildeo do Java

Figura 51 Graacuteficos dos projetos separados por ano de introduccedilatildeo de expressotildees lambdae meacutedia de lambda por snapshot

Com isso pode-se observar que apesar de a quantidade de projetos que possuemexpressotildees lambda natildeo ser tatildeo alta eacute possiacutevel obter resultados expressivos uma vez quea quantidade dos projetos com lambda estatildeo bem dispersos quanto ao periacuteodo em quecomeccedilaram a adotar essa caracteriacutestica e a quantidade de expressotildees lambda por snapshot

511 Projetos Selecionados

Atraveacutes dos grupos de classificaccedilatildeo identificados pela anaacutelise temporal descritos na Figura45 cinco projetos foram selecionados para uma anaacutelise detalhada levando em consideraccedilatildeoo grupo em que eles pertencem Estes projetos seratildeo apresentados a seguir

512 agera

Agera eacute uma biblioteca Android que ajuda a introduzir programaccedilatildeo funcional reativa(functional reactive programming) em projetos Android Eacute um projeto recente lanccediladoem 2016 pela Google [44] e encontra-se no grupo dos projetos que introduziram expressotildeeslambda em 2016 no mesmo ano de seu lanccedilamento contendo uma meacutedia de expressotildeeslambda de 16 lambdasnapshot

Na classificaccedilatildeo estabelecida agera pertence ao Grupo 1 onde a quantidade de ex-pressotildees lambda no projeto com o tempo aumentam juntamente com a quantidade deAICs como mostra o graacutefico de anaacutelise temporal na Figura 52

34

Figura 52 Graacuteficos de anaacutelise temporal do projeto agera

513 vertx

Eclipse Vertx eacute um conjunto de ferramentas para criaccedilatildeo de reactive applications namaacutequina virtual Java (JVM) em grande escala [45] Seu primeiro lanccedilamento aconteceuem 2011 e a primeira ocorrecircncia de expressotildees lambda no projeto aconteceu em 2014 Esteprojeto possui uma meacutedia de 2867 lambdasnapshot e dentre os projetos consideradosneste trabalho eacute o que possui a maior quantidade de expressotildees lambda

Este projeto pertence ao Grupo 2 onde a quantidade de expressotildees lambda aumen-tou consideravelmente pelos meses ultrapassando a quantidade de AICs que diminuiudrasticamente como mostra a Figura 53

35

Figura 53 Graacuteficos de anaacutelise temporal do projeto Vertx

514 Android-CleanArchitecture

Apesar de ser uma amostra de projeto Android-CleanArchitecture que tem como objetivoconstruir aplicaccedilotildees Android utilizando clean architecture foi lanccedilado em 2014 mas semanteacutem sempre atualizado [46]

A introduccedilatildeo de expressotildees lambda que aconteceu no ano de 2015 se deu de formatiacutemida com uma meacutedia de 35 lambdasnapshot De qualquer forma este projeto conseguerepresentar com seu graacutefico de anaacutelise temporal o grupo 3 composto por projetos em quea quantidade de expressotildees lambda aumentou mas sem ultrapassar AICs que diminuiacuteramdemonstrado no graacutefico da Figura 54

36

Figura 54 Graacuteficos de anaacutelise temporal do projeto Android-CleanArchitecture

515 RxJava

Dentre os repositoacuterios estudados RxJava eacute considerado o mais popular Como umaimplementaccedilatildeo de Reactive Extensions para a JVM RxJava teve seu lanccedilamento dadoem 2013 [47] Expressotildees lambda apareceram pela primeira vez no ano de 2015 comuma meacutedia de 766 lambdasnapshot

Apesar de uma meacutedia relativamente alta o tempo de vida das expressotildees lambda nesteprojeto foi bem curto caracterizando assim projetos do grupo 4 houve a introduccedilatildeo dasexpressotildees lambda no projeto poreacutem houve a remoccedilatildeo completa de todas as expressotildeeslambda previamente introduzidas desaparecendo completamente do projeto ateacute a datada coleta de dados (Figura 55)

37

Figura 55 Graacuteficos de anaacutelise temporal do projeto RxJava

516 guava

Guava eacute um conjunto de bibliotecas para Java da Google lanccedilado em 2011 A atualizaccedilatildeodo coacutedigo do projeto para Java 8 aconteceu somente em 2016 e apesar do projeto conteruma meacutedia de 281 lambdasnapshot ele foi escolhido como representante dos projetosdo Grupo 5 (Figura 56) que possuem expressotildees lambda mas de forma natildeo expressiva osuficiente quando comparado com a quantidade de AIC pelo fato de sua razatildeo de meacutedia delambdasnapshot por meacutedia de AICsnapshot ser 004 Ou seja embora o projeto tenhaexpressotildees lambda estas satildeo consideradas muito poucas quando inseridas no contextogeral deste projeto que eacute considerado um projeto grande

38

Figura 56 Graacuteficos de anaacutelise temporal do projeto Guava

52 Refatoraccedilatildeo de Coacutedigo

Com o objetivo de caracterizar melhor como as expressotildees lambda estatildeo sendo utilizadaseacute interessante identificar se estas estatildeo sendo introduzidas atraveacutes de refatoraccedilatildeo de coacutedigoou em coacutedigo novo

Os projetos classificados como pertencentes ao Grupo 2 possuem em comum o fatode expressotildees lambda aumentarem a medida que AICs diminuem ultrapassando-as eessa caracteriacutestica em comum pode indicar que nestes projetos possivelmente houve re-fatoraccedilatildeo de coacutedigo visto que AIC sendo substituiacutedo por expressotildees lambda dentro dascondiccedilotildees determinadas eacute a maneira mais comum de se identificar refatoraccedilatildeo de coacute-digo para introduccedilatildeo de expressotildees lambda [12] Os projetos que compotildeem o grupo 2representam 44 de todos os projetos estudados que possuem expressotildees lambda o quepode ser um indicativo caso a hipoacutetese de refatoraccedilatildeo de coacutedigo seja positiva de quemuitos projetos que estatildeo adotando o Java 8 estatildeo se preocupando de alguma formacom refatoraccedilatildeo se coacutedigo Fazem parte desse grupo os seguintes projetos elasticsearchjava-design-patterns PocketHub presto RxJava-Android-Samples spark vertx zipkinjava8-tutorial dropwizard e material-dialogs

39

Outra maneira de verificar possiacuteveis indicadores de refatoraccedilatildeo de coacutedigo foi atraveacutesda anaacutelise dos tamanhos (em quantidade de linhas de coacutedigo) dos meacutetodos com expressotildeeslambda no mecircs em que se introduziu expressotildees lambda e um mecircs imediatamente antesdeste Essa anaacutelise mostra que dos 25 projetos com expressotildees lambda 12 (48) projetostiveram ao menos um meacutetodo em que houve uma diminuiccedilatildeo no tamanho o que podeser considerado um indicativo de refatoraccedilatildeo de coacutedigo A Figura 57 mostra todos osprojetos em relaccedilatildeo agrave quantidade total de meacutetodos que possuem lambda no primeiro mecircsde introduccedilatildeo do mesmo em vermelho comparado com a quantidade desses meacutetodos quetiveram uma diminuiccedilatildeo no tamanho quando comparados com o coacutedigo do mecircs anteriorem azul

Figura 57 Comparaccedilatildeo entre todos os projetos com expressatildeo lambda sobre refatoraccedilatildeode coacutedigo no mecircs de introduccedilatildeo da caracteriacutestica

Ainda observando a figura 57 com relaccedilatildeo aos projetos que natildeo tiveram nenhummeacutetodo com diminuiccedilatildeo de tamanho (barra azul) percebe-se que todos os 13 projetossequer tiveram uma quantidade significativa de meacutetodos que possuem expressotildees lambda(com o maior tendo apenas 5 meacutetodos) no mecircs de introduccedilatildeo da caracteriacutestica no projetoe ao mesmo tempo jaacute existiam no mecircs em que natildeo existia lambda no projeto Essa eacuteuma observaccedilatildeo importante porque projetos como vertx sendo este o que possui a maiormeacutedia de lambdasnapshot de todos os projetos e ao mesmo tempo tendo apenas trecircsmeacutetodos que continham expressotildees lambda no mecircs da introduccedilatildeo e que existiam no mecircs

40

anterior permitem inferir que todas as outras expressotildees lambda existentes no projetopara este determinado mecircs de introduccedilatildeo encontram-se em coacutedigo novo introduzido

Eacute importante ressaltar que somente essa anaacutelise natildeo eacute exclusivamente suficiente paradeterminar se estes projetos estatildeo realmente introduzindo lambda em coacutedigo novo ourealizando refatoraccedilatildeo uma vez que como a comparaccedilatildeo aconteceu apenas no mecircs deintroduccedilatildeo com o mecircs imediatamente anterior natildeo reflete todo o ciclo de vida do pro-jeto Por exemplo algumas equipes podem escolher refatorar o coacutedigo depois de umtempo de adaptaccedilatildeo apoacutes a transiccedilatildeo para a nova versatildeo da linguagem Assim paraobter uma melhor anaacutelise sobre refatoraccedilatildeo de coacutedigo ou natildeo feita nestes projetos aleacutemde outras anaacutelises referentes aos padrotildees tipicamente adotados para implementaccedilatildeo delambda nestes projetos seratildeo apresentados a seguir os estudos de caso dos cinco projetospreviamente selecionados

Outro ponto importante eacute o fato de que apesar das informaccedilotildees quanto agraves quantida-des de filter e map terem sido incluiacutedas inicialmente no trabalho para observar possiacuteveispadrotildees de refatoraccedilatildeo de coacutedigo percebeu-se que estas natildeo satildeo utilizadas de forma con-sideraacutevel pelos projetos estudados e para fins de anaacutelises generalizadas natildeo apresentaramtanta influecircncia na utilizaccedilatildeo de expressotildees lambda quanto a quantidade de AICs noprojeto

53 Estudos de Caso

Dentre os projetos analisados verificou-se que os projetos de pequeno e meacutedio porte op-taram por refatorar de uma vez seus coacutedigos para incluir expressotildees lambda em situaccedilotildeesem que se utilizava AICs anteriormente ou em alguns poucos casos de utilizaccedilatildeo deCollection Os projetos de grande porte natildeo apresentaram nenhuma refatoraccedilatildeo de coacute-digo ou uma refatoraccedilatildeo parcial gradativa provavelmente devido agrave grande quantidade dearquivos e coacutedigo que possuem o que pode tornar o trabalho de refatoraccedilatildeo extenso ecansativo

O projeto vertx que pertence ao grupo 2 dos projetos em que a quantidade de ex-pressotildees lambda aumentaram e as de AICs diminuiacuteram com lambda ultrapassando AICsexecutou inicialmente commits em maio de 2014 com adiccedilatildeo de coacutedigo novo utilizandoexpressotildees lambda e apoacutes um mecircs realizou um commit maior com a refatoraccedilatildeo de todasas AICs para expressotildees lambda Apoacutes a refatoraccedilatildeo o projeto se preocupou em mantera utilizaccedilatildeo de expressotildees lambda ao mesmo tempo que o uso de AICs se manteve apenasaos casos de classes com interfaces natildeo funcionais A Figura 58 apresenta uma parte docommit de refatoraccedilatildeo de coacutedigo que mostra em vermelho a parte eliminada do coacutedigo(AIC) e em verde o coacutedigo novo representando a substituiccedilatildeo por uma expressatildeo lambda

41

Figura 58 Commit de refatoraccedilatildeo de coacutedigo do projeto Vertx [3]

Alguns projetos ainda natildeo se preocuparam em refatorar o coacutedigo para o uso de ex-pressotildees lambda ateacute a data deste trabalho que eacute o caso do projeto guava que apresentouum commit em 03112016 com a atualizaccedilatildeo do projeto para Java 8 Mas a partir daatualizaccedilatildeo se preocupou em utilizar as expressotildees lambda apenas na implementaccedilatildeo decoacutedigo novo O cenaacuterio em que a refatoraccedilatildeo natildeo eacute prioridade ainda eacute a realidade de vaacuteriosprojetos de grande porte visto que os dados de projetos sem nenhuma expressatildeo lambdasatildeo o maior nuacutemero neste trabalho Poreacutem projetos que jaacute adotaram a utilizaccedilatildeo do Java8 tendem a mudar isso com o passar do tempo A Figura 59 apresenta em verde umaadiccedilatildeo de coacutedigo novo com expressatildeo lambda sem a eliminaccedilatildeo de algum coacutedigo anteriora esse que estaria em vermelho

42

Figura 59 Exemplo de um arquivo do commit de adiccedilatildeo de coacutedigo novo em Java 8 doprojeto Guava [4]

Na categoria de projetos em que os AICs e expressotildees lambda aumentam proporci-onalmente (grupo 1) o projeto agera realizou um commit em 19052016 com a adiccedilatildeoda biblioteca retrolambda como dependecircncia do projeto Essa biblioteca utilizada prin-cipalmente por projetos Android permite executar coacutedigo Java 8 contendo expressotildeeslambda em Java 5 6 e 7 [48] O commit tambeacutem apresenta refatoraccedilatildeo dos AICs ad-vindos de interfaces funcionais para expressotildees lambda Apesar de o projeto continuar autilizar as expressotildees lambda em seus commits posteriores o nuacutemero de AICs tambeacutemcontinuou a aumentar visualizando os commits posteriores notou-se que esses AICs satildeorelativos a interfaces natildeo funcionais ou seja que possuem mais de um meacutetodo O projetoAndroid-CleanArchitecture eacute similar ao agera pois tambeacutem optou pela instalaccedilatildeo da bi-blioteca retrolambda para uso de expressotildees lambda em seus coacutedigos e como tambeacutem eacuteum projeto de pequeno porte houve uma pequena refatoraccedilatildeo dos AICs A Figura 510mostra a parte do commit de refatoraccedilatildeo de coacutedigo em que o desenvolvedor adiciona abiblioteca retrolambda como dependecircncia

43

Figura 510 Commit de adiccedilatildeo da biblioteca Retrolambda no projeto Agera [5]

Outro caso interessante eacute o do projeto RxJava que em 2015 optou pela refatoraccedilatildeodo coacutedigo para a utilizaccedilatildeo de expressotildees lambda quase eliminando por completo o usode AICs mas que no ano seguinte reverteu os commits de forma que eliminasse comple-tamente o uso de expressotildees lambda para manter a retrocompatibilidade com o Java 6A Figura 511 demonstra uma parte do commit de reversatildeo do coacutedigo para Java 6 emque pode ser visto em vermelho o coacutedigo anterior com expressotildees lambda e o verde como novo coacutedigo utilizando AIC novamente

44

Figura 511 Commit de remoccedilatildeo de Lambdas e volta para o uso de AICs no projetoRXJava [6]

Essa preocupaccedilatildeo com retrocompatibilidade de coacutedigo pode ser um fator crucial nadecisatildeo das equipes de desenvolvimento na hora de decidir como fazer o software co-evoluircom a linguagem sem perder a compatibilidade com versotildees anteriores

45

Capiacutetulo 6

Consideraccedilotildees Finais

Este estudo permitiu entender melhor como projetos estatildeo realizando a migraccedilatildeo para oJava 8 em especial utilizando uma nova caracteriacutestica introduzida expressatildeo lambdaApesar de a maioria dos projetos populares considerados natildeo possuiacuterem nenhuma ocor-recircncia de expressotildees lambda os projetos que tinham expressotildees lambda foram suficientespara realizar um primeiro estudo de caracterizaccedilatildeo no uso desta caracteriacutestica e com osprojetos efetivamente utilizados para estudo foi possiacutevel agrupaacute-los quanto a maneira emque as expressotildees lambda estavam sendo utilizadas quando comparadas com AICs em 5grandes grupos quando AIC e lambda aumentam proporcionalmente quando AIC dimi-nui e lambda aumenta ultrapassando AIC quando AIC diminui mas continua superior aolambda crescente expressotildees lambda que foram introduzidas e retiradas completamentedo coacutedigo e expressotildees lambda que natildeo existem em quantidades expressivas

Foi possiacutevel entatildeo realizar um estudo aprofundado levando em consideraccedilatildeo as di-ferentes maneiras com que as expressotildees lambda foram adotadas nos projetos atraveacutes daescolha de um projeto que representasse cada grupo para anaacutelise Dentre os cinco projetosestudados foi possiacutevel observar alguns padrotildees tipicamente adotados por desenvolvedorespara implementar expressotildees lambda em seus projetos como a utilizaccedilatildeo da bibliotecas(retrolambda) que permitissem uma flexibilizaccedilatildeo na utilizaccedilatildeo de expressotildees lambda oucomo lambda eacute primariamente utilizada para substituir determinados AICs ou operaccedilotildeesem Collection

Aleacutem disso foi possiacutevel observar como a refatoraccedilatildeo de coacutedigo acontece em cada umdesses projetos Observou-se como projetos menores tendem a refatorar coacutedigo maisfacilmente ao passo que projetos maiores e mais complexos fazem menos refatoraccedilatildeo oudemoram mais entre o periacuteodo em que houve a primeira migraccedilatildeo de coacutedigo para a novaversatildeo da linguagem ateacute o periacuteodo em que realmente decidem refatorar coacutedigo Aleacutem dacomplexidade do projeto influenciar na decisatildeo de migrar o projeto para uma versatildeo maisrecente da linguagem a preocupaccedilatildeo com retrocompatibilidade com versotildees anteriores da

46

linguagem tambeacutem podem ser uma barreira para que projetos comecem a evoluir o coacutedigojuntamente com a evoluccedilatildeo da linguagem

Ainda assim foi possiacutevel observar que a preocupaccedilatildeo com a co-evoluccedilatildeo do software-linguagem existe entre os desenvolvedores de projetos mas a realizaccedilatildeo da migraccedilatildeo aindaacontece lentamente devido agrave diversos fatores que precisam ser levados em consideraccedilatildeopara a manutenccedilatildeo do projeto

Para trabalhos e contribuiccedilotildees futuras seria interessante desenvolver uma ferramentaque pudesse analisar diretamente no coacutedigo-fonte as oportunidades de aplicaccedilatildeo de ex-pressotildees lambda dessa forma poderiam ser analisadas as porcentagens de conversatildeo decoacutedigo para Java 8 e obter melhores conclusotildees sobre a importacircncia que os projetos estatildeodando para a evoluccedilatildeo de seus coacutedigos Outro fator interessante seria aplicar mais Visitorsagrave ferramenta static-analysis e fazer este mesmo estudo aplicado agrave outras caracteriacutesticasda linguagem

47

Referecircncias

[1] Kagdi Huzefa Michael L Collard e Jonathan I Maletic A survey and taxonomyof approaches for mining software repositories in the context of software evolution2007 ix 3 8 9 10 11

[2] DBeaver Dbeaver - features httpdbeaverjkissorgdocsfeatures ix 29

[3] Eclipse Vertx commit Java8-ify code httpsgithubcomeclipsevertxcommit93f95e9c77419f442a42fe711b6eeaef88192fd3 ix 42

[4] Google Guava commit Release java 8 changes to guava httpsgithubcomgoogleguavacommit73e382fa877f80994817a136b0adcc4365ccd904 ix 43

[5] Google Agera commit Collapsed testapp with retrolambda httpsgithubcomgoogleageracommit5e518b7b05f9e7a34a314945f68deff7b2c3e334 ix 44

[6] ReactiveX Rxjava commit 2x full jdk 6 compatible backport + includ-ing bugfixes up to today httpsgithubcomReactiveXRxJavacommit000a174d87a901135f9665d3b11f3627fd2dc4ed ix 45

[7] Godfrey M W e D M German The past present and future of software evolutionEm 2008 Frontiers of Maintenance paacuteginas 129ndash138 Sept 2008 1 6

[8] Favre J M Languages evolve too changing the software time scale Em Principles ofSoftware Evolution Eighth International Workshop on paacuteginas 33ndash42 IEEE 20051 5 7

[9] Overbey Jeffrey L e Ralph E Johnson Regrowing a language refactoring tools allowprogramming languages to evolve Em ACM SIGPLAN Notices volume 44 paacuteginas493ndash502 ACM 2009 1 5 7 8 12

[10] Grechanik Mark Collin McMillan Luca DeFerrari Marco Comi Stefano CrespiDenys Poshyvanyk Chen Fu Qing Xie e Carlo Ghezzi An empirical investiga-tion into a large-scale java open source code repository Em Proceedings of the2010 ACM-IEEE International Symposium on Empirical Software Engineering andMeasurement ESEM rsquo10 paacuteginas 111ndash1110 New York NY USA 2010 ACMISBN 978-1-4503-0039-1 httpdoiacmorg10114518527861852801 1

[11] TIOBE Tiobe httpswwwtiobecomtiobe-index 1 14

48

[12] Gyori Alex Lyle Franklin Danny Dig e Jan Lahoda Crossing the gap from im-perative to functional programming through refactoring Em Proceedings of the 20139th Joint Meeting on Foundations of Software Engineering ESECFSE 2013 paacute-ginas 543ndash553 New York NY USA 2013 ACM ISBN 978-1-4503-2237-9 httpdoiacmorg10114524914112491461 2 11 24 39

[13] OpenJDK State of the lambda httpcropenjdkjavanet~briangoetzlambdalambda-state-4html 2

[14] Han Jiawei Micheline Kamber e Jian Pei Data Mining Concepts and TechniquesMorgan Kaufmann Publishers Inc San Francisco CA USA 3rd ediccedilatildeo 2011ISBN 0123814790 9780123814791 3

[15] Fowler Martin e Kent Beck Refactoring improving the design of existing codeAddison-Wesley Professional 1999 5 7

[16] Lehman M M J F Ramil P D Wernick D E Perry e W M Turski Met-rics and laws of software evolution - the nineties view Em Proceedings of the4th International Symposium on Software Metrics METRICS rsquo97 paacuteginas 20ndashWashington DC USA 1997 IEEE Computer Society ISBN 0-8186-8093-8 httpdlacmorgcitationcfmid=823454823901 6

[17] Hassan Ahmed E e Tao Xie Software intelligence The future of mining softwareengineering data Em Proceedings of the FSESDP Workshop on Future of SoftwareEngineering Research FoSER rsquo10 paacuteginas 161ndash166 New York NY USA 2010ACM ISBN 978-1-4503-0427-6 httpdoiacmorg101145188236218823978 9

[18] Hassan Ahmed E The road ahead for mining software repositories Em Frontiers ofSoftware Maintenance 2008 FoSM 2008 paacuteginas 48ndash57 IEEE 2008 8

[19] Berry Michael J e Gordon Linoff Data Mining Techniques For Marketing Salesand Customer Support John Wiley amp Sons Inc New York NY USA 1997ISBN 0471179809 10

[20] Parnin Chris Christian Bird e Emerson Murphy-Hill Java generics adoption hownew features are introduced championed or ignored Em Proceedings of the 8thWorking Conference on Mining Software Repositories paacuteginas 3ndash12 ACM 2011 12

[21] Oracle The java language specification httpsdocsoraclecomjavasespecsjlsse8jls8pdf 13

[22] Oracle The history of java technology httpwwworaclecomtechnetworkjavajavaseoverviewjavahistory-index-198355html 13

[23] Murphy Kieron So why did they decide to call itjava httpwwwjavaworldcomarticle2077265core-javaso-why-did-they-decide-to-call-it-java-html 13

[24] McGraw Tata Object-oriented Programming with Java Essentials and ApplicationsHill Education 13

49

[25] Oracle Differences between java ee and java se httpdocsoraclecomjavaee6firstcupdocgkhoyhtml 13

[26] Lindsey Clark S The History of Java Cambridge 14

[27] Oracle The java language environment httpwwworaclecomtechnetworkjavaintro-141325html 14

[28] Oracle Jdk 8 httpopenjdkjavanetprojectsjdk8 15 24

[29] Oracle Enhancements in java se 8 httpdocsoraclecomjavase8docstechnotesguideslanguageenhancementshtmljavase8 15 16 17

[30] Oracle Lambda expressions httpdocsoraclecomjavasetutorialjavajavaOOlambdaexpressionshtml 16 18 21

[31] Oracle Method references httpdocsoraclecomjavasetutorialjavajavaOOmethodreferenceshtml 16

[32] Oracle Default methods httpdocsoraclecomjavasetutorialjavaIandIdefaultmethodshtml 17

[33] Oracle Repeating annotations httpdocsoraclecomjavasetutorialjavaannotationsrepeatinghtml 17

[34] Oracle Type annotations httpdocsoraclecomjavasetutorialjavaannotationstype_annotationshtml 17

[35] Oracle Anonymous inner classes httpsdocsoraclecomjavasetutorialjavajavaOOanonymousclasseshtml 19

[36] Kothari CR Research Methodology Methods and Techniques New Age Interna-tional (P) Limited 2004 ISBN 9788122415223 httpsbooksgooglecombrbooksid=8c6gkbKi-F4C 22

[37] Nakakoji Kumiyo Yasuhiro Yamamoto Yoshiyuki Nishinaka Kouichi Kishida eYunwen Ye Evolution patterns of open-source software systems and communitiesEm IWPSE rsquo02 Proceedings of the International Workshop on Principles of SoftwareEvolution paacuteginas 76ndash85 New York NY USA 2002 ACM Press ISBN 1581135459httpdxdoiorg101145512035512055 23

[38] Rahman Foyzur Christian Bird e Premkumar Devanbu Clones What is that smellEmpirical Software Engineering 17(4-5)503ndash530 2012 24

[39] Chacon Scott Pro Git Apress Berkely CA USA 1st ediccedilatildeo 2009ISBN 1430218339 9781430218333 25

[40] Cavalcanti Thiago Gomes e Viniacutecius Correa de Almeida Caracterizaccedilatildeo do uso deconstruccedilotildees da linguagem java em projetos open-source Publicaccedilatildeo online 2016httpbdmunbbrhandle1048315733 27

50

[41] Parr Terence Language Implementation Patterns Create Your Own Domain-Specific and General Programming Languages Pragmatic Bookshelf 1st ediccedilatildeo 2009ISBN 193435645X 9781934356456 27

[42] Janssen Thorben 5 reasons to use jpa hibernate Publicaccedilatildeo online httpswwwsitepointcom5-reasons-to-use-jpa-hibernate 27

[43] Franklin Lyle Alex Gyori Jan Lahoda e Danny Dig Lambdaficator From imperativeto functional programming through automated refactoring Em Proceedings of the2013 International Conference on Software Engineering ICSE rsquo13 paacuteginas 1287ndash1290 Piscataway NJ USA 2013 IEEE Press ISBN 978-1-4673-3076-3 httpdlacmorgcitationcfmid=24867882486986 29

[44] Google Agera httpsgithubcomgoogleagerawiki 34

[45] Eclipse Eclipse vertx httpvertxio 35

[46] Cejas Fernando Android cleanarchitecture httpsgithubcomandroid10Android-CleanArchitecture 36

[47] ReactiveX Rxjava httpsgithubcomReactiveXRxJava 37

[48] Luontola Esko Retrolambda httpsgithubcomorfjackalretrolambda 43

51

Anexo I

Projetos utilizados

fastjson

platform_frameworks_base

netty

material-dialogs

kotlin

okhttp

tinker

AndroidUtilCode

RxJava

spring-boot

java-design-patterns

elasticsearch

ExoPlayer

kafka

vertx

realm-java

guava

zipkin

bazel

stetho

Signal-Android

glide

agera

fresco

plaid

presto

libgdx

spark

52

disruptor

lottie-android

flexbox-layout

PocketHub

zxing

spring-framework

deeplearning4j

dropwizard

interviews

BaseRecyclerViewAdapterHelper

uCrop

DanmakuFlameMaster

lottie-react-native

android-UniversalMusicPlayer

AndroidInterview-Q-A

greenDAO

retrofit

MaterialDrawer

BottomBar

druid

MPAndroidChart

Hystrix

guice

recyclerview-animators

dubbo

androidannotations

RxJava-Android-Samples

PhotoView

clojure

CircleImageView

AndroidSwipeLayout

jedis

MaterialViewPager

butterknife

junit4

RxBinding

leakcanary

SimianArmy

picasso

UltimateRecyclerView

53

AndroidViewAnimations

AppIntro

FizzBuzzEnterpriseEdition

ion

cheesesquare

physical-web

RxAndroid

Android-CleanArchitecture

Calligraphy

Android-Bootstrap

iosched

Android_Data

MaterialDesignLibrary

ListViewAnimations

EventBus

java8-tutorial

AndroidSlidingUpPanel

dagger

okhttputils

logger

HomeMirror

Material-Animations

android-Ultra-Pull-To-Refresh

android-async-http

Android-ObservableScrollView

Android-Universal-Image-Loader

ActionBarSherlock

SlidingMenu

storm

PagerSlidingTabStrip

Android-PullToRefresh

54

  • Dedicatoacuteria
  • Agradecimentos
  • Resumo
  • Abstract
  • Introduccedilatildeo
    • Contexto
    • Objetivos
      • Objetivos Gerais
      • Objetivos Especiacuteficos
        • Metodologia
        • Organizaccedilatildeo do Trabalho
          • Evoluccedilatildeo e Mineraccedilatildeo de Repositoacuterios de Software
            • Evoluccedilatildeo de Software
            • MSR Mineraccedilatildeo de dados e a Engenharia de Software
              • Classificaccedilatildeo
                • Trabalhos Relacionados
                  • Java SE 8 e JDK 8
                    • Histoacuterico
                    • Princiacutepios
                    • Evoluccedilatildeo
                    • Expressotildees Lambda
                      • Sintaxe
                      • Principais formas de uso
                          • Estudo e o Processo de Mineraccedilatildeo
                            • Questotildees de Pesquisa
                            • Fonte de Dados e Objetos de Estudo
                            • Processo de Mineraccedilatildeo
                              • static-analysis
                              • BDAnalisador
                                • Classificaccedilatildeo e Anaacutelise
                                  • Meacutedia de Lambda
                                  • Anaacutelise Temporal
                                  • Refatoraccedilatildeo de Coacutedigo
                                  • Casos de Uso
                                      • Resultados Obtidos e Anaacutelise
                                        • Visatildeo Geral
                                          • Projetos Selecionados
                                          • agera
                                          • vertx
                                          • Android-CleanArchitecture
                                          • RxJava
                                          • guava
                                            • Refatoraccedilatildeo de Coacutedigo
                                            • Estudos de Caso
                                              • Consideraccedilotildees Finais
                                              • Referecircncias
                                              • Anexo
                                              • Projetos utilizados

bull Regrowing a Language de Overbey apresenta um estudo sobre a importacircncia da co-evoluccedilatildeo entre a linguagem de programaccedilatildeo e os projetos de software focando naslinguagens Fortran e Java e provando como ferramentas de refatoraccedilatildeo de coacutedigoauxiliam para que o software consiga evoluir juntamente com sua linguagem deprogramaccedilatildeo [9]

bull O trabalho sobre a adoccedilatildeo de generics em coacutedigo Java feito por Parnin utiliza demineraccedilatildeo de dados para realizar uma investigaccedilatildeo empiacuterica avaliando projetos decoacutedigo aberto com o objetivo de observar como desenvolvedores destes projetos estatildeoutilizando generics em Java [20]

Os estudos mencionados focam em assuntos particulares pertinentes a este trabalhoem que de um lado tem-se trabalhos que mostram a necessidade de refatoraccedilatildeo de coacutedigopara evoluccedilatildeo de software e do outro tem-se trabalhos que mostram que eacute possiacutevel utilizarde MSR para entender melhor como a evoluccedilatildeo da linguagem de programaccedilatildeo Java temafetado projetos reais de coacutedigo aberto e como estes projetos estatildeo se adaptando a estasevoluccedilotildees

12

Capiacutetulo 3

Java SE 8 e JDK 8

Este trabalho tem como objetivo caracterizar a adoccedilatildeo de expressotildees Lambda em siste-mas Java que podem ser considerados legados pois foram concebidos em um momentoanterior a introduccedilatildeo dessa nova caracteriacutestica na linguagem Java Com o intuito de faci-litar o entendimento do leitor sobre tais construccedilotildees esse capiacutetulo apresenta informaccedilotildeeshistoacutericas referentes agrave linguagem Java desde sua criaccedilatildeo ateacute a sua ascensatildeo como umadas linguagens de programaccedilatildeo mais populares Aleacutem disso seratildeo apresentadas as novascaracteriacutesticas presentes na versatildeo Java SE 8 com destaque nas expressotildees Lambda e deque forma vieram para auxiliar no desenvolvimento de sistemas

31 Histoacuterico

Java eacute uma linguagem de programaccedilatildeo orientada a objetos para propoacutesitos gerais [21] Alinguagem nasceu com o nome de Oak no ano de 1991 com o foco em televisotildees digitais acabo mas devido agrave complexidade e poder da linguagem logo expandiu-se para os outrosdomiacutenios principalmente a Internet [22] Posteriormente a linguagem recebeu o nome deGreentalk devido agrave marca Oak jaacute ser registrada por outra empresa e o principal projeto daequipe se chamar Green Por fim o nome Java foi o mais votado pela equipe da Sun emuma reuniatildeo para decidir o mais raacutepido possiacutevel um nome definitivo para a linguagem [23]

Em 1995 em sua primeira versatildeo puacuteblica 10 a linguagem Java jaacute comeccedilava a terum crescimento em sua popularidade como Web Applet nos navegadores mais popularesfornecendo seguranccedila e rapidez nas plataformas mais utilizadas [24] A cada nova versatildeopublicada novas funcionalidades e plataformas eram adicionadas e tornavam a linguagemmais difundida no meio computacional fazendo com que em 2006 a linguagem fosse divi-dida em Java EE (foco em rede e serviccedilos web) Java ME (foco em sistemas embarcados)e Java SE (foco em desktops e servidores) [25]

13

Apoacutes anos de evoluccedilatildeo e aprimoramento atraveacutes de diversas versotildees como visto naTabela 31 hoje o Java se tornou uma das linguagens de programaccedilatildeo mais utilizadas nomundo estando em aproximadamente 15 das linhas de coacutedigo disponiacuteveis pela inter-net [11] A quantidade de plataformas suportadas pela linguagem e com o advento dosistema operacional Android sendo rodado na maior parte dos smartphones do mundoaleacutem da simplicidade em codificar no paradigma orientado a objetos foram os fatoresrelevantes para que a linguagem se popularizasse no mundo digital [26]

Tabela 31 As versotildees anteriores de java e principais caracteriacutesticasVersatildeo Principais caracteriacutesticasJava 10 JVM e JDKJava 2 Event Listeners

Kestrel (Java 3) HotSpot JVMMerlin (Java 4) Diversas novas APIs como Assertion e expressotildees regularesTiger (Java 5) Generics

Mustang (Java 6) Web ServicesDolphin (Java 7) Suporte a linguagens dinamicas

32 Princiacutepios

Com o foco em alcanccedilar a Web e participar mais ativamente do mercado virtual e e-Commerce foram projetados princiacutepios que permitissem com que a linguagem pudessealcanccedilar seus objetivos principais ao mesmo tempo que mantinha a facilidade e fami-liarizaccedilatildeo da linguagem a seus desenvolvedores [27] Dessa forma a equipe da Oracledeterminou cinco princiacutepios que caracterizariam o foco da linguagem Java

bull simples orientada a objeto e familiar projetada para ser orientada a objeto epermitir que seus desenvolvedores comecem a codificar rapidamente sem a necessi-dade de uma curva de aprendizagem acentuada

bull segura e robusta projetada para prover software confiaacutevel por meio de checagensa tempo de compilaccedilatildeo e execuccedilatildeo Haacute uma grande preocupaccedilatildeo com seguranccediladevido agrave larga utilizaccedilatildeo da linguagem em sistemas distribuiacutedos

bull de arquitetura neutra e portaacutevel projetada para ser independente de qualquerarquitetura bastando rodar a JVM dessa forma garantindo a portabilidade paravaacuterios ambientes e dispositivos

14

bull executada em alta performance projetada para fornecer a maior performancepossiacutevel em tempo de execuccedilatildeo com a utilizaccedilatildeo do garbage collector em uma threadde baixa prioridade

bull interpretada dinacircmica e threaded projetada para ser interpretada por qual-quer dispositivo que possua JVM desenvolvida garantindo um desenvolvimento raacute-pido e em ciclos O uso da classe Thread permite que a linguagem acompanhe atendecircncia do paralelismo Aleacutem disso a ligaccedilatildeo de classes eacute feita em tempo real esomente quando necessaacuteria tornando-a dinacircmica

33 Evoluccedilatildeo

A primeira versatildeo do Java 8 foi lanccedilada em 2014 [28] e apresentou diversas atualizaccedilotildeesespalhadas em categorias como linguagem seguranccedila Collections ferramentas deployentre outras Dentre a grande quantidade de mudanccedilas os destaques se encontraram nasnovas melhorias presentes na linguagem que afetaram de forma mais direta a maneiracom que os desenvolvedores passaram a tratar e organizar o coacutedigo fonte As atualizaccedilotildeesreferentes a linguagem descritas oficialmente pela Oracle [29] satildeo

1 Lambda Expressions ou apenas Expressotildees Lambda correspondem a uma novacaracteriacutestica que permite que uma pequena funcionalidade possa ser utilizada comoum argumento de um meacutetodo facilitando a escrita de accedilotildees que seratildeo feitas repetida-mente em uma Collection ou quando um processo se completa ou quando encontraum erro Eacute tambeacutem uma forma compacta de se escrever coacutedigo que previamenteera escrito com anonymous inner classes [29] A Listagem 31 mostra uma classehipoteacutetica Calculator cujo meacutetodo operateBinary() recebe como paracircmetro doisinteiros e um objeto da classe IntegerMath que representa a operaccedilatildeo que deveraacuteser realizada ou seja uma funcionalidade dinacircmica

1 pub l i c c l a s s Ca l cu la to r 2

3 i n t e r f a c e IntegerMath 4 i n t opera t i on ( i n t a i n t b) 5 6

7 pub l i c i n t operateBinary ( i n t a i n t b IntegerMath op ) 8 re turn op opera t i on (a b) 9

10

11 pub l i c s t a t i c void main ( St r ing a rgs ) 12

15

13 Calcu la to r myApp = new Ca lcu la to r ( ) 14 IntegerMath add i t i on = (a b) minusgt a + b 15 IntegerMath subt ra c t i on = (a b) minusgt a minus b 16 System out p r i n t l n ( 40 + 2 = +17 myApp operateBinary (40 2 add i t i on ) ) 18 System out p r i n t l n ( 20 minus 10 = +19 myApp operateBinary (20 10 sub t ra c t i on ) ) 20 21 22

Listagem 31 Exemplo de coacutedigo com o uso de Expressatildeo Lambda [30]

2 Method References Frequentemente expressotildees lambda criam meacutetodos anocircni-mos Algumas vezes poreacutem satildeo utilizadas para chamar um meacutetodo jaacute existentena classe Ao inveacutes de escrever a expressatildeo Lambda para esse caso pode-se optarpor utilizar um Method Reference que facilita a escrita e leitura desse uso de ex-pressatildeo Lambda [29] A Listagem 32 mostra um exemplo de um meacutetodo estaacuteticoque compara duas pessoas pelas suas idades e a Listagem 33 a utilizaccedilatildeo de MethodReference para aplicar a utilizaccedilatildeo desse meacutetodo em um array e reduzir a escrita deuma expressatildeo lambda a uma forma mais legiacutevel

1 pub l i c s t a t i c i n t compareByAge ( Person a Person b) 2 re turn a b i r thday compareTo (b b i r thday ) 3 4

Listagem 32 Exemplo de meacutetodo de uma classe Pessoa [31]

1 Arrays s o r t ( rosterAsArray Person compareByAge ) 2

Listagem 33 Exemplo de uso de Method Reference [31]

3 Default Methods satildeo meacutetodos com a palavra-chave default que servem para adi-cionar implementaccedilotildees de meacutetodos a uma interface de alguma biblioteca mantendoa compatibilidade binaacuteria com versotildees mais antigas dessa interface Tambeacutem pos-sibilita a implementaccedilatildeo de meacutetodos estaacuteticos em interfaces [29] A Listagem 34apresenta a inclusatildeo de um meacutetodo default na interface TimeClient

1 pub l i c i n t e r f a c e TimeClient 2 void setTime ( i n t hour i n t minute i n t second ) 3 void setDate ( i n t day i n t month i n t year ) 4 void setDateAndTime ( i n t day i n t month i n t year 5 i n t hour i n t minute i n t second )

16

6 LocalDateTime getLocalDateTime ( ) 7

8 s t a t i c ZoneId getZoneId ( S t r ing zoneStr ing ) 9 t ry

10 re turn ZoneId o f ( zoneStr ing ) 11 catch ( DateTimeException e ) 12 System e r r p r i n t l n ( I n v a l i d time zone + zoneStr ing

+13 us ing d e f a u l t time zone in s t ead ) 14 re turn ZoneId systemDefault ( ) 15 16 17

18 d e f a u l t ZonedDateTime getZonedDateTime ( St r ing zoneStr ing ) 19 re turn ZonedDateTime o f ( getLocalDateTime ( ) getZoneId (

zoneStr ing ) ) 20 21 22

Listagem 34 Exemplo de interface com um meacutetodo default [32]

4 Repeating Annotations permitem a implementaccedilatildeo e utilizaccedilatildeo de anotaccedilotildees deum mesmo tipo que podem ser utilizadas mais de uma vez para a mesma declara-ccedilatildeo [29] A Listagem 35 apresenta duas anotaccedilotildees iguais com paracircmetros diferentespermitindo uma customizaccedilatildeo maior na aplicaccedilatildeo de um tipo de anotaccedilatildeo

1 Schedule ( dayOfMonth= l a s t )2 Schedule (dayOfWeek= Fr i hour= 23 )3 pub l i c void doPeriodicCleanup ( ) 4

Listagem 35 Exemplo de Repeating Annotations [33]

5 Type Annotations permitem que anotaccedilotildees possam ser utilizadas em tipos aleacutemde declaraccedilotildees dessa forma pode-se garantir que um campo sempre atenda agraves suasexpectativas e evite testes desnecessaacuterios [29] A Listagem 36 mostra um exemplo derestriccedilatildeo a uma String que nunca poderaacute ser nula devido agrave anotaccedilatildeo de NonNull

1 NonNull S t r ing s t r

Listagem 36 Exemplo de Type Annotation garantindo que o campo nunca seja null [34]

17

34 Expressotildees Lambda

Uma das mudanccedilas mais interessantes implementadas no Java 8 foi a adiccedilatildeo de expressotildeeslambda As expressotildees lambda permitem que a linguagem Java possa atuar parcialmentecomo uma linguagem de programaccedilatildeo funcional onde comportamentos satildeo avaliados eaplicados diferentemente da programaccedilatildeo imperativa que foca na mudanccedila de estadosNa praacutetica um comportamento pode ser passado como paracircmetro de um meacutetodo atraveacutesde uma escrita mais reduzida e legiacutevel Os benefiacutecios de utilizar expressotildees lambda incluemuma melhora na legibilidade e organizaccedilatildeo de coacutedigo que antes era escrito com AnonymousInner Class aleacutem de permitir uma forma simples de utilizar comportamento paralelo como uso de Streams

341 Sintaxe

A sintaxe de uma expressatildeo lambda eacute dividida nas seguintes partes [30]

bull Uma lista de paracircmetros separados por viacutergulas

bull Um token representado por uma seta -gt

bull Um corpo que pode ser representado por uma expressatildeo uacutenica ou um bloco de coacutedigodentro de chaves

As Listagens 37 e 38 mostram duas formas diferentes de se aplicar expressotildees Lambdacom uma sintaxe similar A primeira aplica a expressatildeo diretamente apoacutes a seta utilizadanormalmente para trechos de coacutedigo pequenos e simples e a segunda utiliza-se de chavespara incorporar o coacutedigo e da palavra-chave return para especificar o retorno forma maisutilizada para uma quantidade maior de coacutedigo

1 p minusgt p getGender ( ) == Person Sex MALE2 ampamp p getAge ( ) gt= 183 ampamp p getAge ( ) lt= 25

Listagem 37 Exemplo de expressatildeo lambda com uma expressatildeo [30]

1 p minusgt 2 re turn p getGender ( ) == Person Sex MALE3 ampamp p getAge ( ) gt= 184 ampamp p getAge ( ) lt= 25 5

Listagem 38 Exemplo de expressatildeo lambda com um bloco de coacutedigo [30]

18

342 Principais formas de uso

Anonymous Inner Class

Antes do Java 8 a necessidade de passar funccedilotildees ou expressotildees como paracircmetro de algummeacutetodo era suprida atraveacutes de Anonymous Inner Classes A utilizaccedilatildeo desse tipo dedeclaraccedilatildeo junto com a anotaccedilatildeo de Override permite sobrescrever um meacutetodo de umainterface funcional e ao mesmo tempo passa-la como argumento para um meacutetodo Umaexpressatildeo lambda se comporta da mesma forma poreacutem a quantidade de coacutedigo escritopela Anonymous Inner Class eacute maior e pode dificultar a leitura de coacutedigo pois conteacutemmuita informaccedilatildeo natildeo utilizada para efetivo entendimento do que estaacute sendo feito naqueletrecho

A Listagem 39 apresenta a instanciaccedilatildeo da classe EventHandler internamente ao meacute-todo setOnAction() de forma que o desenvolvedor possa escrever o comportamento quedeseja passar como paracircmetro do meacutetodo atraveacutes da substituiccedilatildeo do meacutetodo handle()que jaacute existe pelo meacutetodo handle() criado e escrito pelo desenvolvedor

1 btn setOnAction (new EventHandlerltActionEvent gt() 2 Override3 pub l i c void handle ( ActionEvent event ) 4 System out p r i n t l n ( He l lo World ) 5 6 )

Listagem 39 Exemplo de uso de Anonymous Inner Class [35]

Interface funcional

Ao projetar um coacutedigo novo o desenvolvedor que optar por utilizar expressotildees lambdadeve iniciar com a criaccedilatildeo de uma interface funcional Esse tipo de interface possui umuacutenico meacutetodo abstrato permitindo que expressotildees lambda sejam usadas para sobrescrevero comportamento do meacutetodo abstrato Uma interface funcional pode possuir outros meacuteto-dos desde que sejam default Uma nova anotaccedilatildeo FunctionalInterface foi adicionadacom a atualizaccedilatildeo do Java 8 para conferir em tempo de compilaccedilatildeo se a interface satisfazos requisitos desse modelo de interface

A Listagem 310 apresenta um exemplo de interface funcional com o objetivo de permi-tir o uso de expressotildees lambda que utilizaratildeo de dois Double como paracircmetro e jaacute utilizada nova anotaccedilatildeo FunctionalInterface introduzida no Java 8

1 Funct iona l Inte r face2 pub l i c i n t e r f a c e DoubleOp 3 pub l i c Double apply ( Double a Double b)

19

4

Listagem 310 Exemplo de interface funcional

Dessa forma conforme as Listagens 311 e 312 o meacutetodo apply() pode tomar formade qualquer operaccedilatildeo entre dois Double que seraacute especificada quando a expressatildeo lambdafor montada dando o aspecto de linguagem funcional agrave linguagem e mais facilidade eliberdade ao desenvolvedor

1 pub l i c c l a s s Ca l cu la to r 2 pub l i c s t a t i c Double c a l c ( Double op1 Double op2 DoubleOp operator ) 3 re turn operator apply ( op1 op2 ) 4 5

Listagem 311 Exemplo de aplicaccedilatildeo da interface funcional

1 Double r e s u l t 1 = Ca lcu la to r c a l c (10d 50d ( a b ) minusgt a + b)

Listagem 312 Uso de expressatildeo lambda para o exemplo anterior

Collections

Dentre as atualizaccedilotildees de pacotes do Java 8 foi adicionado um meacutetodo stream() nainterface Collection Esse meacutetodo trata as Collection como streams o que significa queapesar de natildeo ser possiacutevel acessar elementos diretamente algumas novas manipulaccedilotildeessatildeo possiacuteveis Essas manipulaccedilotildees satildeo na verdade meacutetodos da interface Stream quepodem receber como paracircmetro uma expressatildeo lambda ou seja um comportamento a seraplicado agrave Collection Dentre os meacutetodos temos

bull filter() O meacutetodo filter() recebe uma expressatildeo lambda contendo uma condiccedilatildeopara filtragem da collection

bull map() O meacutetodo map() mapeia os elementos de uma Collection em outro objetocomo uma String A expressatildeo lambda passada por paracircmetro deve retornar o tipode objeto ao qual seraacute mapeado

bull forEach() O meacutetodo forEach() aplica uma operaccedilatildeo especiacutefica para cada ele-mento da Collection A expressatildeo lambda a ser passada deve conter a operaccedilatildeo aser realizada

bull min() e max() Os meacutetodos min() e max() retornam o elemento menor ou maiorda Collection dependendo da expressatildeo lambda passada como paracircmetro

20

A Listagem 313 demonstra como vaacuterias operaccedilotildees com uma Collection podem seraplicadas de uma vez de forma que lendo a expressatildeo lambda jaacute eacute possiacutevel saber oresultado da aplicaccedilatildeo do meacutetodo agrave Collection

1 r o s t e r2 stream ( )3 f i l t e r (4 p minusgt p getGender ( ) == Person Sex MALE5 ampamp p getAge ( ) gt= 186 ampamp p getAge ( ) lt= 25)7 map(p minusgt p getEmailAddress ( ) )8 forEach ( emai l minusgt System out p r i n t l n ( emai l ) )

Listagem 313 Exemplo de utilizaccedilatildeo de meacutetodos de stream com expressotildees lambda [30]

21

Capiacutetulo 4

Estudo e o Processo de Mineraccedilatildeo

A definiccedilatildeo da metodologia utilizada para realizaccedilatildeo deste trabalho eacute importante para queexista uma padronizaccedilatildeo e melhor entendimento de como os resultados foram obtidos paraque a replicaccedilatildeo do mesmo possa ser realizada em trabalhos futuros [36]

Figura 41 Processo utilizado para realizaccedilatildeo do estudo

O esquema representado na Figura 41 descreve o processo seguido para a realizaccedilatildeodeste trabalho que foi divido em trecircs grandes etapas a de planejamento definindo osobjetivos questotildees de pesquisa e meios de investigaccedilatildeo deste projeto a etapa de execuccedilatildeorealizando todo o procedimento metodoloacutegico definido para a coleta e refinamento de

22

dados e a etapa de avaliaccedilatildeo onde foram classificados e avaliados os dados coletadospara responder agraves questotildees de pesquisa

A seguir na primeira seccedilatildeo seratildeo apresentadas em detalhes as questotildees de pesquisa aserem respondidas Em seguida seraacute feito uma breve descriccedilatildeo da fonte de dados utilizada- especificamente os projetos utilizados como objetos de estudo deste trabalho e por fimtodo o restante da metodologia que foi de fato desenvolvida para obter os resultadosnecessaacuterios

41 Questotildees de Pesquisa

Com o objetivo de entender e caracterizar melhor o uso de expressotildees lambda foramdefinidas as seguintes questotildees de pesquisa a serem respondidas

bull PQ-1 Quando os projetos comeccedilaram a introduzir o uso de expressotildees lambda emseus coacutedigos e qual a meacutedia de expressotildees lambda por snapshots caso existam

bull PQ-2 Como as equipes de desenvolvimento estatildeo utilizando expressotildees lambdaatraveacutes de refatoraccedilatildeo de coacutedigo ou introduzindo apenas em coacutedigo novo

bull PQ-3 Quais satildeo os padrotildees tipicamente adotados para o uso de expressotildees lambda

A primeira pergunta de pesquisa gira em torno de como projetos populares open-sourceestatildeo se adaptando agrave introduccedilatildeo de expressotildees lambda em Java muitos projetos jaacute estatildeoutilizando as expressotildees lambda Se sim a partir de quando comeccedilaram a utilizaacute-lasdesde o iniacutecio da introduccedilatildeo das mesmas no Java 8 ou em um periacuteodo mais tardio Aleacutemdisso eacute interessante descobrir se a utilizaccedilatildeo dessa nova caracteriacutestica tem acontecido deforma expressiva ou natildeo

Em seguida para melhor entender a forma como as expressotildees lambda estatildeo sendointroduzidas em projetos eacute interessante investigar se as equipes de desenvolvimento estatildeose preocupando em refatorar coacutedigo com o objetivo de evoluir o software ou se estatildeoexperimentando utilizar expressotildees lambda apenas em coacutedigo novo introduzido

Como a introduccedilatildeo de novas funcionalidades em projetos open-source de grande escaladepende do objetivo do projeto e os padrotildees de projeto utilizados [37] espera-se obser-var diversas abordagens quanto a utilizaccedilatildeo de expressotildees lambda para entatildeo poderclassificar estes softwares quanto a abordagem utilizada

Eacute de grande importacircncia para este estudo conseguir identificar na praacutetica comoexpressotildees lambda estatildeo sendo tipicamente adotadas nestes projetos Assim a terceirapergunta de pesquisa busca identificar alguns exemplos de utilizaccedilatildeo atraveacutes da realizaccedilatildeode alguns estudos de caso

23

Eacute importante ressaltar que apesar de as expressotildees lambda serem uma alternativa aouso de AIC elas natildeo os substituem completamente Existem precondiccedilotildees para que umaAIC possa ser substituiacuteda por expressotildees lambda [12] descritas a seguir

bull AIC deve instanciar-se de uma interface

bull AIC natildeo deve possuir nenhum campo e declarar apenas um meacutetodo

bull AIC natildeo deve possuir uma referecircncia para this ou super

bull AIC natildeo deve declarar um meacutetodo recursivo

Para responder agrave primeira pergunta apenas dados gerais sobre todos os projetos seratildeonecessaacuterios ao passo que pelas perguntas 2 e 3 possuiacuterem uma natureza mais complexaseraacute necessaacuterio aleacutem de uma anaacutelise geral estatiacutestica a realizaccedilatildeo de alguns estudos decaso para obter resultados mais completos

42 Fonte de Dados e Objetos de Estudo

Para responder agraves perguntas de pesquisa estabelecidas foram selecionados os 99 projetosmais populares na linguagem Java dentro da plataforma github ateacute a data da coleta dosdados feita em Abril de 2017 Satildeo considerados populares os repositoacuterios que possuema maior quantidade possiacutevel de estrelas (stars) A decisatildeo de escolher os 99 projetos maispopulares foi por sua natureza imparcial e ao mesmo tempo para que se possa analisarprojetos que satildeo de familiaridade e conhecimento da comunidade do github e de domiacuteniopuacuteblico Os 99 projetos estatildeo listados no Anexo I

Para entender a transiccedilatildeo feita por esses projetos entre as versotildees anteriores do Java eo Java 8 com as expressotildees lambda eacute necessaacuterio analisar o coacutedigo de vaacuterias versotildees a fimde observar alguma mudanccedila para cada projeto Como satildeo 99 projetos e vaacuterios dessesprojetos possuem milhares de linhas de coacutedigo e commits seria impossiacutevel avaliar todosos commits Optou-se entatildeo por coletar snapshots mensais de cada projeto conformeprocedimento tambeacutem seguido anteriormente [38] Cada snapshots representa o estadodo projeto em um determinado mecircs e como criteacuterio de escolha padratildeo todos os snapshotsequivalem ao uacuteltimo commit realizado no determinado mecircs que este representa

O proacuteximo passo eacute determinar o periacuteodo de tempo em que esses snapshots seriamcoletados Como Java 8 (e consequentemente as expressotildees lambda) foi introduzidoapenas em meados de 2014 [28] coletar dados de projetos a partir de um periacuteodo muitoantes deste ano natildeo agregaria valor ao estudo em questatildeo Definiu-se entatildeo um periacuteodopara a coleta mensal desses snapshots atraveacutes dos anos Janeiro de 2013 um ano antesda introduccedilatildeo do Java 8 para que se pudesse identificar para todos os projetos o mecircs

24

exato em que expressotildees lambda foram introduzidas ateacute o mecircs da coleta de dados Abrilde 2017

Eacute importante ressaltar que a definiccedilatildeo dos meses foi definida do dia primeiro de ummecircs ao dia primeiro do proacuteximo mecircs e por consequecircncia alguns snapshots que deveriamrepresentar o final de determinado mecircs correspondem na verdade a commits realizadosno dia primeiro do mecircs seguinte Por exemplo pode existir casos em que o commit querepresente o mecircs de Marccedilo de 2016 seja na verdade o commit realizado no dia primeirode Abril de 2016 Isso se deve a natureza da forma como os resultados de log de commitssatildeo obtidos pelo git [39] Poreacutem isso natildeo interfere nas anaacutelises ou no propoacutesito destetrabalho uma vez que foram realizadas verificaccedilotildees e validaccedilotildees para que natildeo existamdatas repetidas (e consequentemente commits repetidos) por repositoacuterio

Neste trabalho o termo projeto e repositoacuterio foram utilizados de forma intercaladapara representar a mesma coisa o software desenvolvido que possui um repositoacuterio naplataforma github Os termos commit snapshops e versotildees tambeacutem representam a mesmacoisa uma vez que foi definido que seriam utilizados apenas um commit por mecircs pararepresentar um determinado snapshot ou versatildeo do repositoacuterio em questatildeo

Todos os 99 projetos seratildeo utilizados para a realizaccedilatildeo de uma anaacutelise geral de ca-racterizaccedilatildeo do uso de expressotildees lambda Para as anaacutelises aprofundadas foi feito umcriteacuterio de classificaccedilatildeo para que apenas alguns projetos possam ser analisados em niacutevelde coacutedigo como estudos de caso

Resumindo foram escolhidos os 99 projetos mais populares de Java no github cole-tando dados mensais de seus commits a partir do ano de 2013 ateacute a data da coleta dosdados lembrando que nem todos os projetos existem desde 2013 (projetos mais recentes)

43 Processo de Mineraccedilatildeo

A abordagem utilizada para coletar e analisar os 99 projetos escolhidos como mostra aFigura 42 foi realizada de forma automatizada utilizando scripts python e dois projetosdesenvolvidos em Java para a coleta e tratamento de dados como descrito a seguir

Primeiramente foi realizado uma coacutepia dos repositoacuterios atuais de todos os 99 projetosmais populares do github em Java Para automatizar o processo foi desenvolvido umscript em python que lista todos os projetos escolhidos clona todos os repositoacuterios emuma pasta na maacutequina local e cria um arquivo temporaacuterio com as informaccedilotildees do nomede cada repositoacuterio e seu caminho absoluto na maacutequina local

25

Figura 42 Metodologia implementada para coleta e tratamento de dados

Em seguida foi necessaacuterio realizar o checkout de todas as versotildees entre Janeiro de2013 a Abril de 2017 de cada projeto Por motivos de otimizaccedilatildeo de espaccedilo da maacutequinalocal e automatizaccedilatildeo no processo de checkout utilizou-se de um segundo script pythonque realizava as seguintes tarefas para cada mecircs em cada projeto verificar se dentreo mecircs estipulado houve algum commit para aquele projeto se sim pega-se o hash douacuteltimo commit do mecircs realiza o checkout conta-se a quantidade de linhas de coacutedigo emJava que o projeto tem utilizando a biblioteca cloc e armazena todas as informaccedilotildeespertinentes referentes a todos os projetos que naquele mecircs tiveram commits para que oprojeto static-analysis possa entatildeo ser executado sobre esses projetos naquele determinadomomento As informaccedilotildees coletadas que satildeo utilizadas pelo static-analysis correspondemao nome do projeto o hash do commit para aquela versatildeo a pasta onde o projeto estaacutearmazenado na maacutequina local a quantidade de linhas de coacutedigo Java do projeto e datareferente ao commit Essas informaccedilotildees satildeo pertinentes para que o projeto static-analysisconsiga funcionar de forma correta projeto este descrito em detalhes a seguir

431 static-analysis

O static-analysis foi um projeto desenvolvido anteriormente a este trabalho pelos alunosThiago Cavalcanti e Vinicius de Almeida cujo objetivo eacute realizar a anaacutelise estaacutetica de

26

coacutedigos-fonte Java e gerar arquivos de saiacuteda contendo informaccedilotildees de classes e meacutetodoscom suas devidas ocorrecircncias de caracteriacutesticas da linguagem [40]

A anaacutelise estaacutetica de coacutedigo consiste em analisar um coacutedigo-fonte sem a necessidadede executaacute-lo Esse tipo de anaacutelise eacute de extrema importacircncia para manter um coacutedigo dequalidade evitar futuras refatoraccedilotildees e obter informaccedilotildees estatiacutesticas de forma raacutepida epraacutetica [41]

Seguindo esse princiacutepio o static-analysis foi projetado para receber um arquivo deentrada csv seguindo o padratildeo

Tipo da Aplicaccedilatildeo Inicio do projeto Antes ou Apoacutes Java 5 Nome do ProjetoVersatildeo Caminho absolutoQuantidade de linhas de coacutedigo

Atraveacutes da informaccedilatildeo do caminho absoluto do projeto o static-analysis varre osdiretoacuterios em busca dos arquivos fonte java realiza o parse desses arquivos e utilizade Visitors para extrair as informaccedilotildees desejadas e exporta-las em arquivos csv Ouso de Visitors permite que sejam escolhidas as informaccedilotildees desejadas para a consultacomo expressotildees Lambda e AIC s aleacutem de possibilitar que sejam implementados novosVisitors conforme a linguagem evolua ou as necessidades mudem

Para este trabalho foram utilizados os Visitors de expressotildees Lambda map() filter()AICs e declaraccedilotildees de meacutetodos

432 BDAnalisador

Apoacutes obter todas as informaccedilotildees necessaacuterias geradas pelo static-analysis era preciso ma-nipular os dados de forma que facilitasse a coleta de dados para o estudo proposto Comovaacuterios arquivos em formato csv satildeo de difiacutecil manipulaccedilatildeo foi desenvolvido entatildeo umaferramenta chamada BDAnalisador Esta ferramenta eacute responsaacutevel por processar os arqui-vos em csv gerados pelo static-analysis e popular uma base de dados relacional MySQLcom as informaccedilotildees pertinentes a este estudo

O BDAnalisador foi desenvolvido com a intenccedilatildeo de tornar mais simples o trabalhocom os dados resultantes do static-analysis de forma que consultas em SQL pudessemser feitas a ponto de permitir a obtenccedilatildeo de resultados mais complexos Seguindo esseobjetivo o framework Hibernate foi escolhido como ferramenta para persistecircncia devidoa ser um framework jaacute consolidado no mercado e que de forma simples relaciona osobjetos Java ao banco de dados MySQL [42] A divisatildeo de classes foi projetada em quatroentidades Projeto Versao Classe e Metodo cada uma com seus respectivos camposcontendo as informaccedilotildees necessaacuterias para a pesquisa como pode ser visto na Figura 44Eacute importante ressaltar que a tabela de Versao guarda hashs de commits devido agrave escolhade utilizar commits para obter mais informaccedilatildeo de evoluccedilatildeo de coacutedigo em um menor

27

espaccedilo de tempo Aleacutem disso para este trabalho optou-se por persistir todos os meacutetodose classes de cada versatildeo sem se importar com a repeticcedilatildeo desses dados pois a hipoacutetesede haver grandes refatoraccedilotildees entre versotildees poderia comprometer a confiabilidade dasinformaccedilotildees

Figura 43 Diagrama de classes UML do BDAnalisador

Como visto na Figura 43 seguindo parcialmente a arquitetura MVC cada entidadepossui sua respectiva classe DAO(Data Access Object) para persistecircncia dos dados eapenas uma classe Controlador no projeto responsaacutevel pela manipulaccedilatildeo e parse dosdados dos arquivos csv gerados pelo static analysis para serem enviados agraves classes DAOO sistema inicia chamando o meacutetodo inicializar() da classe Controlador Esse meacutetodoeacute responsaacutevel por ler um arquivo de entrada csv que segue o mesmo modelo do arquivo dostatic-analysis citado na seccedilatildeo anterior O arquivo conteacutem os dados de todos os projetose suas respectivas versotildees dessa forma o meacutetodo instancia um objeto da classe Projetoe persiste o projeto no banco de dados Para cada versatildeo encontrada no arquivo deentrada o inicializar() aciona os meacutetodos responsaacuteveis por instanciar e preencher aslistas da classe Classe e Metodo Os meacutetodos responsaacuteveis por preencher as listas varremos arquivos csv gerados pelo static-analysis e fazem o parse das informaccedilotildees relevantescomo nomes dos meacutetodos e quantidades de lambdas para construir os objetos que seratildeogravados Ao final dos preenchimentos o objeto Versatildeo eacute instanciado e gravado no bancode dados atraveacutes de sua classe DAO ao mesmo tempo que grava suas respectivas Classese Metodos

28

Apoacutes vaacuterios testes e correccedilotildees de bugs o banco de dados se encontrava finalmente comas informaccedilotildees de 99 projetos Java open-source separados por um commit por mecircs desde2013 cada um com suas respectivas informaccedilotildees de classes meacutetodos e a quantidade deexpressotildees lambda filters e maps em cada meacutetodo Filter ou Filter pattern eacute o padratildeode projeto que tem como objetivo filtrar objetos de uma coleccedilatildeo (Collection) de acordocom algum criteacuterio Jaacute o map ou map pattern eacute um padratildeo que ldquomapeia os elementosde uma coleccedilatildeo aplicando uma funccedilatildeo a eles para uma nova coleccedilatildeo [43] A coleta deinformaccedilotildees sobre esses padrotildees podem ser uacuteteis para possiacuteveis anaacutelises de oportunidadesde uso de expressotildees lambda para refatoraccedilatildeo de coacutedigo

A Figura 44 mostra o esquema de como o banco de dados resultante foi gerado

Figura 44 Modelo relacional do banco de dados populado pelo BDAnalisador Imagemgerada com software DBeaver [2]

44 Classificaccedilatildeo e Anaacutelise

Com o banco de dados populado restam apenas as etapas de classificaccedilatildeo e anaacutelise pararesponder as questotildees de pesquisa propostas Para isso inicialmente houve uma tentativade se utilizar apenas queries SQL para analisar os dados de acordo com as informaccedilotildeesrelevantes Poreacutem devido ao fato de o banco de dados conter todas as informaccedilotildees detodos os projetos e todas as suas versotildees queries que possuem uma alta complexidadedemoravam muito tempo para retornar os dados

Assim com o objetivo de facilitar o trabalho alguns scripts python foram desenvolvi-dos para rodar as queries separadamente e individualmente para cada projeto de formaautomatizada a fim de melhorar o tempo de resposta para obtenccedilatildeo dos resultados

29

441 Meacutedia de Lambda

O primeiro script retorna a quantidade de expressotildees lambda (ou AICs) por n snapshotsque contenha expressotildees lambda O objetivo eacute ter uma visatildeo geral da meacutedia de expressotildeeslambda e AICs utilizadas por cada projeto e como nem todos os snapshots coletados decada projeto possuem expressotildees lambda e AICs apenas aqueles com alguma expressatildeolambda ou AIC satildeo incluiacutedos no caacutelculo da meacutedia

Mmedia =sumn qtdLambdai

n

442 Anaacutelise Temporal

O segundo script retorna para cada projeto a soma total da quantidade de expressotildeeslambda AIC map() e filter() no projeto inteiro para cada versatildeo Ou seja tem-seo total de cada uma das quatro propriedades selecionadas para cada mecircs do projetoobtendo assim uma visatildeo temporal de evoluccedilatildeo do uso das caracteriacutesticas descritas ATabela 41 ilustra parcialmente o resultado obtido para o projeto agera onde idVersaoeacute o identificador no banco de dados referente ao hash do commit mensal coletado qtd eacutea quantidade de cada uma das caracteriacutesticas escolhidas e a data do commit encontra-seno formato americano

Tabela 41 Informaccedilotildees mensais sobre o projeto ageraidVersao Data do Commit qtd lambda qtd AIC qtd maps qtd filter

823 512016 0 29 4 0755 612016 13 28 4 0686 6152016 13 29 4 0621 812016 13 29 4 0555 8162016 13 30 4 0485 922016 13 30 4 0422 10132016 14 30 4 0356 11282016 14 30 4 0295 12212016 21 30 5 0232 212017 21 30 5 0175 312017 21 30 5 0112 3312017 21 36 5 048 4242017 21 48 5 0

Os resultados obtidos com esta anaacutelise temporal permitiu a identificaccedilatildeo de padrotildees nautilizaccedilatildeo de expressotildees lambda em relaccedilatildeo a utilizaccedilatildeo de AIC por todos os projetos Foi

30

possiacutevel classificar todos os projetos em 6 grupos ilustrado na Figura 45 Primeiramenteseparou-se os projetos entre os que possuem expressotildees lambda e os que natildeo possuemDentre os que possuem identificou-se cinco categorias

1 Grupo 1 Quantidade de AICs e expressotildees lambda aumentam com o tempo pro-porcionalmente

2 Grupo 2 Quantidade de AICs diminui agrave medida que a quantidade de expressotildeeslambda aumentam e a quantidade de expressotildees lambda ultrapassa a quantidade deAIC em um determinado momento

3 Grupo 3 Quantidade de AICs diminui agrave medida que a quantidade de expressotildeeslambda aumentam mas a quantidade de AIC permanece superior agrave quantidade delambda

4 Grupo 4 Expressotildees lambda satildeo introduzidas e existem por um pequeno periacuteodode tempo mas satildeo completamente removidas posteriormente

5 Grupo 5 Quantidade de expressotildees lambda eacute constante e muito inferior compa-rado com a quantidade de AICs no projeto Foi determinado que para pertencera esta classificaccedilatildeo o projeto precisa ter uma razatildeo de meacutedia de expressotildees lamb-dasnapshot por meacutedia de AICsnapshot inferior a 020 Esse paracircmetro foi esta-belecido com o objetivo de definir um padratildeo para o que pode ser considerado umprojeto com poucas expressotildees lambda

Figura 45 Classificaccedilatildeo dos projetos

31

443 Refatoraccedilatildeo de Coacutedigo

O uacuteltimo script teve como objetivo realizar uma tentativa inicial de identificar refatoraccedilatildeode coacutedigo da seguinte maneira para todos os projetos que possuem expressotildees lambdaforam identificados o mecircs imediatamente antes da introduccedilatildeo de expressotildees lambda e omecircs seguinte onde houve a primeira ocorrecircncia de lambda no projeto Assim realizou-se uma anaacutelise do tamanho em quantidade de linhas de coacutedigo de todos os meacutetodosdo projeto que no mecircs seguinte tiveram introduccedilatildeo de lambda Em seguida fez-se umacomparaccedilatildeo com os mesmos meacutetodos em relaccedilatildeo ao mecircs anterior e assim foi possiacuteveldetectar quais meacutetodos tiveram a quantidade de linhas de coacutedigo reduzidas o que seriaum indicativo natildeo necessariamente exclusivo de que uma refatoraccedilatildeo de coacutedigo possa terocorrido

Sabe-se que este meacutetodo de detecccedilatildeo de refatoraccedilatildeo de coacutedigo possui suas limitaccedilotildeesuma vez que as comparaccedilotildees para saber se um meacutetodo existe em ambas versotildees eacute feitopuramente por comparaccedilatildeo de String (nome do meacutetodo) e a classe que este pertence

444 Casos de Uso

Os meacutetodos descritos acima ajudaram a identificar alguns padrotildees e facilitar a anaacutelise dosdados Poreacutem natildeo satildeo suficientes para que se possa responder agraves questotildees de pesquisaDessa forma apoacutes a identificaccedilatildeo dos grupos de classificaccedilatildeo para os projetos foramescolhidos um projeto de cada grupo (com exceccedilatildeo do grupo dos projetos sem expressotildeeslambda) para realizar um breve estudo de caso com o objetivo de identificar e caracterizarmelhor a adoccedilatildeo de expressotildees lambda Os projetos escolhidos foram agera vertxAndroid-CleanArchitecture RxJava e guava

32

Capiacutetulo 5

Resultados Obtidos e Anaacutelise

Neste capiacutetulo seratildeo apresentados os dados obtidos e anaacutelise com o objetivo de responderagraves questotildees de pesquisa propostas Como mencionado anteriormente as perguntas seratildeorespondidas de duas maneiras algumas com informaccedilotildees gerais sobre todos os projetose outras com breve estudos de caso envolvendo cinco projetos

51 Visatildeo Geral

Dentre os repositoacuterios coletados para a anaacutelise 74 (7474) natildeo utilizaram nenhumaexpressatildeo lambda no projeto durante todo o periacuteodo analisado (Janeiro de 2013 a Abrilde 2017) restando apenas 25 repositoacuterios (2525) com expressotildees lambda Eacute interessantedestacar que apesar de a quantidade de repositoacuterios que natildeo possuem expressotildees lambdaser relativamente expressiva muitos destes repositoacuterios satildeo de projetos em Java que umdia foram populares e atualmente natildeo estatildeo sendo mais desenvolvidos (por exemplo umaplicativo que soacute funciona para Android 23 atualmente descontinuado)

Levando em consideraccedilatildeo apenas os projetos que possuem expressotildees lambda exis-tem dois tipos de dados que podem ser analisados para responder agrave primeira questatildeo depesquisa atraveacutes dos dados obtidos pelo meacutetodo anteriormente mencionado como anaacutelisetemporal e a meacutedia de lambda por snapshot mencionados no capiacutetulo anterior

Com relaccedilatildeo ao ano em que a primeira ocorrecircncia foi encontrada 6 projetos introduzi-ram expressotildees lambda jaacute em 2014 8 comeccedilaram a utilizar em 2015 7 em 2016 e apenas4 tiveram a primeira ocorrecircncia de expressotildees lambda em 2017 Dessa forma percebe-seque os projetos estatildeo relativamente bem distribuiacutedos em grupos quanto ao ano em que seintroduziu expressotildees lambda

Pela meacutedia de lambda por snapshot (lambdasnapshot) a maioria (11 projetos) possuiuma quantidade expressiva acima de 100 lambdasnapshot (com 6 projetos entre 20 e 100lambdasnapshot e 8 projetos com menos de 20 lambdasnapshot) como apresentados no

33

graacutefico da Figura 51 Isso mostra que essa nova caracteriacutestica jaacute estaacute sendo bem utilizadanos projetos que comeccedilaram a migrar para a nova versatildeo do Java

Figura 51 Graacuteficos dos projetos separados por ano de introduccedilatildeo de expressotildees lambdae meacutedia de lambda por snapshot

Com isso pode-se observar que apesar de a quantidade de projetos que possuemexpressotildees lambda natildeo ser tatildeo alta eacute possiacutevel obter resultados expressivos uma vez quea quantidade dos projetos com lambda estatildeo bem dispersos quanto ao periacuteodo em quecomeccedilaram a adotar essa caracteriacutestica e a quantidade de expressotildees lambda por snapshot

511 Projetos Selecionados

Atraveacutes dos grupos de classificaccedilatildeo identificados pela anaacutelise temporal descritos na Figura45 cinco projetos foram selecionados para uma anaacutelise detalhada levando em consideraccedilatildeoo grupo em que eles pertencem Estes projetos seratildeo apresentados a seguir

512 agera

Agera eacute uma biblioteca Android que ajuda a introduzir programaccedilatildeo funcional reativa(functional reactive programming) em projetos Android Eacute um projeto recente lanccediladoem 2016 pela Google [44] e encontra-se no grupo dos projetos que introduziram expressotildeeslambda em 2016 no mesmo ano de seu lanccedilamento contendo uma meacutedia de expressotildeeslambda de 16 lambdasnapshot

Na classificaccedilatildeo estabelecida agera pertence ao Grupo 1 onde a quantidade de ex-pressotildees lambda no projeto com o tempo aumentam juntamente com a quantidade deAICs como mostra o graacutefico de anaacutelise temporal na Figura 52

34

Figura 52 Graacuteficos de anaacutelise temporal do projeto agera

513 vertx

Eclipse Vertx eacute um conjunto de ferramentas para criaccedilatildeo de reactive applications namaacutequina virtual Java (JVM) em grande escala [45] Seu primeiro lanccedilamento aconteceuem 2011 e a primeira ocorrecircncia de expressotildees lambda no projeto aconteceu em 2014 Esteprojeto possui uma meacutedia de 2867 lambdasnapshot e dentre os projetos consideradosneste trabalho eacute o que possui a maior quantidade de expressotildees lambda

Este projeto pertence ao Grupo 2 onde a quantidade de expressotildees lambda aumen-tou consideravelmente pelos meses ultrapassando a quantidade de AICs que diminuiudrasticamente como mostra a Figura 53

35

Figura 53 Graacuteficos de anaacutelise temporal do projeto Vertx

514 Android-CleanArchitecture

Apesar de ser uma amostra de projeto Android-CleanArchitecture que tem como objetivoconstruir aplicaccedilotildees Android utilizando clean architecture foi lanccedilado em 2014 mas semanteacutem sempre atualizado [46]

A introduccedilatildeo de expressotildees lambda que aconteceu no ano de 2015 se deu de formatiacutemida com uma meacutedia de 35 lambdasnapshot De qualquer forma este projeto conseguerepresentar com seu graacutefico de anaacutelise temporal o grupo 3 composto por projetos em quea quantidade de expressotildees lambda aumentou mas sem ultrapassar AICs que diminuiacuteramdemonstrado no graacutefico da Figura 54

36

Figura 54 Graacuteficos de anaacutelise temporal do projeto Android-CleanArchitecture

515 RxJava

Dentre os repositoacuterios estudados RxJava eacute considerado o mais popular Como umaimplementaccedilatildeo de Reactive Extensions para a JVM RxJava teve seu lanccedilamento dadoem 2013 [47] Expressotildees lambda apareceram pela primeira vez no ano de 2015 comuma meacutedia de 766 lambdasnapshot

Apesar de uma meacutedia relativamente alta o tempo de vida das expressotildees lambda nesteprojeto foi bem curto caracterizando assim projetos do grupo 4 houve a introduccedilatildeo dasexpressotildees lambda no projeto poreacutem houve a remoccedilatildeo completa de todas as expressotildeeslambda previamente introduzidas desaparecendo completamente do projeto ateacute a datada coleta de dados (Figura 55)

37

Figura 55 Graacuteficos de anaacutelise temporal do projeto RxJava

516 guava

Guava eacute um conjunto de bibliotecas para Java da Google lanccedilado em 2011 A atualizaccedilatildeodo coacutedigo do projeto para Java 8 aconteceu somente em 2016 e apesar do projeto conteruma meacutedia de 281 lambdasnapshot ele foi escolhido como representante dos projetosdo Grupo 5 (Figura 56) que possuem expressotildees lambda mas de forma natildeo expressiva osuficiente quando comparado com a quantidade de AIC pelo fato de sua razatildeo de meacutedia delambdasnapshot por meacutedia de AICsnapshot ser 004 Ou seja embora o projeto tenhaexpressotildees lambda estas satildeo consideradas muito poucas quando inseridas no contextogeral deste projeto que eacute considerado um projeto grande

38

Figura 56 Graacuteficos de anaacutelise temporal do projeto Guava

52 Refatoraccedilatildeo de Coacutedigo

Com o objetivo de caracterizar melhor como as expressotildees lambda estatildeo sendo utilizadaseacute interessante identificar se estas estatildeo sendo introduzidas atraveacutes de refatoraccedilatildeo de coacutedigoou em coacutedigo novo

Os projetos classificados como pertencentes ao Grupo 2 possuem em comum o fatode expressotildees lambda aumentarem a medida que AICs diminuem ultrapassando-as eessa caracteriacutestica em comum pode indicar que nestes projetos possivelmente houve re-fatoraccedilatildeo de coacutedigo visto que AIC sendo substituiacutedo por expressotildees lambda dentro dascondiccedilotildees determinadas eacute a maneira mais comum de se identificar refatoraccedilatildeo de coacute-digo para introduccedilatildeo de expressotildees lambda [12] Os projetos que compotildeem o grupo 2representam 44 de todos os projetos estudados que possuem expressotildees lambda o quepode ser um indicativo caso a hipoacutetese de refatoraccedilatildeo de coacutedigo seja positiva de quemuitos projetos que estatildeo adotando o Java 8 estatildeo se preocupando de alguma formacom refatoraccedilatildeo se coacutedigo Fazem parte desse grupo os seguintes projetos elasticsearchjava-design-patterns PocketHub presto RxJava-Android-Samples spark vertx zipkinjava8-tutorial dropwizard e material-dialogs

39

Outra maneira de verificar possiacuteveis indicadores de refatoraccedilatildeo de coacutedigo foi atraveacutesda anaacutelise dos tamanhos (em quantidade de linhas de coacutedigo) dos meacutetodos com expressotildeeslambda no mecircs em que se introduziu expressotildees lambda e um mecircs imediatamente antesdeste Essa anaacutelise mostra que dos 25 projetos com expressotildees lambda 12 (48) projetostiveram ao menos um meacutetodo em que houve uma diminuiccedilatildeo no tamanho o que podeser considerado um indicativo de refatoraccedilatildeo de coacutedigo A Figura 57 mostra todos osprojetos em relaccedilatildeo agrave quantidade total de meacutetodos que possuem lambda no primeiro mecircsde introduccedilatildeo do mesmo em vermelho comparado com a quantidade desses meacutetodos quetiveram uma diminuiccedilatildeo no tamanho quando comparados com o coacutedigo do mecircs anteriorem azul

Figura 57 Comparaccedilatildeo entre todos os projetos com expressatildeo lambda sobre refatoraccedilatildeode coacutedigo no mecircs de introduccedilatildeo da caracteriacutestica

Ainda observando a figura 57 com relaccedilatildeo aos projetos que natildeo tiveram nenhummeacutetodo com diminuiccedilatildeo de tamanho (barra azul) percebe-se que todos os 13 projetossequer tiveram uma quantidade significativa de meacutetodos que possuem expressotildees lambda(com o maior tendo apenas 5 meacutetodos) no mecircs de introduccedilatildeo da caracteriacutestica no projetoe ao mesmo tempo jaacute existiam no mecircs em que natildeo existia lambda no projeto Essa eacuteuma observaccedilatildeo importante porque projetos como vertx sendo este o que possui a maiormeacutedia de lambdasnapshot de todos os projetos e ao mesmo tempo tendo apenas trecircsmeacutetodos que continham expressotildees lambda no mecircs da introduccedilatildeo e que existiam no mecircs

40

anterior permitem inferir que todas as outras expressotildees lambda existentes no projetopara este determinado mecircs de introduccedilatildeo encontram-se em coacutedigo novo introduzido

Eacute importante ressaltar que somente essa anaacutelise natildeo eacute exclusivamente suficiente paradeterminar se estes projetos estatildeo realmente introduzindo lambda em coacutedigo novo ourealizando refatoraccedilatildeo uma vez que como a comparaccedilatildeo aconteceu apenas no mecircs deintroduccedilatildeo com o mecircs imediatamente anterior natildeo reflete todo o ciclo de vida do pro-jeto Por exemplo algumas equipes podem escolher refatorar o coacutedigo depois de umtempo de adaptaccedilatildeo apoacutes a transiccedilatildeo para a nova versatildeo da linguagem Assim paraobter uma melhor anaacutelise sobre refatoraccedilatildeo de coacutedigo ou natildeo feita nestes projetos aleacutemde outras anaacutelises referentes aos padrotildees tipicamente adotados para implementaccedilatildeo delambda nestes projetos seratildeo apresentados a seguir os estudos de caso dos cinco projetospreviamente selecionados

Outro ponto importante eacute o fato de que apesar das informaccedilotildees quanto agraves quantida-des de filter e map terem sido incluiacutedas inicialmente no trabalho para observar possiacuteveispadrotildees de refatoraccedilatildeo de coacutedigo percebeu-se que estas natildeo satildeo utilizadas de forma con-sideraacutevel pelos projetos estudados e para fins de anaacutelises generalizadas natildeo apresentaramtanta influecircncia na utilizaccedilatildeo de expressotildees lambda quanto a quantidade de AICs noprojeto

53 Estudos de Caso

Dentre os projetos analisados verificou-se que os projetos de pequeno e meacutedio porte op-taram por refatorar de uma vez seus coacutedigos para incluir expressotildees lambda em situaccedilotildeesem que se utilizava AICs anteriormente ou em alguns poucos casos de utilizaccedilatildeo deCollection Os projetos de grande porte natildeo apresentaram nenhuma refatoraccedilatildeo de coacute-digo ou uma refatoraccedilatildeo parcial gradativa provavelmente devido agrave grande quantidade dearquivos e coacutedigo que possuem o que pode tornar o trabalho de refatoraccedilatildeo extenso ecansativo

O projeto vertx que pertence ao grupo 2 dos projetos em que a quantidade de ex-pressotildees lambda aumentaram e as de AICs diminuiacuteram com lambda ultrapassando AICsexecutou inicialmente commits em maio de 2014 com adiccedilatildeo de coacutedigo novo utilizandoexpressotildees lambda e apoacutes um mecircs realizou um commit maior com a refatoraccedilatildeo de todasas AICs para expressotildees lambda Apoacutes a refatoraccedilatildeo o projeto se preocupou em mantera utilizaccedilatildeo de expressotildees lambda ao mesmo tempo que o uso de AICs se manteve apenasaos casos de classes com interfaces natildeo funcionais A Figura 58 apresenta uma parte docommit de refatoraccedilatildeo de coacutedigo que mostra em vermelho a parte eliminada do coacutedigo(AIC) e em verde o coacutedigo novo representando a substituiccedilatildeo por uma expressatildeo lambda

41

Figura 58 Commit de refatoraccedilatildeo de coacutedigo do projeto Vertx [3]

Alguns projetos ainda natildeo se preocuparam em refatorar o coacutedigo para o uso de ex-pressotildees lambda ateacute a data deste trabalho que eacute o caso do projeto guava que apresentouum commit em 03112016 com a atualizaccedilatildeo do projeto para Java 8 Mas a partir daatualizaccedilatildeo se preocupou em utilizar as expressotildees lambda apenas na implementaccedilatildeo decoacutedigo novo O cenaacuterio em que a refatoraccedilatildeo natildeo eacute prioridade ainda eacute a realidade de vaacuteriosprojetos de grande porte visto que os dados de projetos sem nenhuma expressatildeo lambdasatildeo o maior nuacutemero neste trabalho Poreacutem projetos que jaacute adotaram a utilizaccedilatildeo do Java8 tendem a mudar isso com o passar do tempo A Figura 59 apresenta em verde umaadiccedilatildeo de coacutedigo novo com expressatildeo lambda sem a eliminaccedilatildeo de algum coacutedigo anteriora esse que estaria em vermelho

42

Figura 59 Exemplo de um arquivo do commit de adiccedilatildeo de coacutedigo novo em Java 8 doprojeto Guava [4]

Na categoria de projetos em que os AICs e expressotildees lambda aumentam proporci-onalmente (grupo 1) o projeto agera realizou um commit em 19052016 com a adiccedilatildeoda biblioteca retrolambda como dependecircncia do projeto Essa biblioteca utilizada prin-cipalmente por projetos Android permite executar coacutedigo Java 8 contendo expressotildeeslambda em Java 5 6 e 7 [48] O commit tambeacutem apresenta refatoraccedilatildeo dos AICs ad-vindos de interfaces funcionais para expressotildees lambda Apesar de o projeto continuar autilizar as expressotildees lambda em seus commits posteriores o nuacutemero de AICs tambeacutemcontinuou a aumentar visualizando os commits posteriores notou-se que esses AICs satildeorelativos a interfaces natildeo funcionais ou seja que possuem mais de um meacutetodo O projetoAndroid-CleanArchitecture eacute similar ao agera pois tambeacutem optou pela instalaccedilatildeo da bi-blioteca retrolambda para uso de expressotildees lambda em seus coacutedigos e como tambeacutem eacuteum projeto de pequeno porte houve uma pequena refatoraccedilatildeo dos AICs A Figura 510mostra a parte do commit de refatoraccedilatildeo de coacutedigo em que o desenvolvedor adiciona abiblioteca retrolambda como dependecircncia

43

Figura 510 Commit de adiccedilatildeo da biblioteca Retrolambda no projeto Agera [5]

Outro caso interessante eacute o do projeto RxJava que em 2015 optou pela refatoraccedilatildeodo coacutedigo para a utilizaccedilatildeo de expressotildees lambda quase eliminando por completo o usode AICs mas que no ano seguinte reverteu os commits de forma que eliminasse comple-tamente o uso de expressotildees lambda para manter a retrocompatibilidade com o Java 6A Figura 511 demonstra uma parte do commit de reversatildeo do coacutedigo para Java 6 emque pode ser visto em vermelho o coacutedigo anterior com expressotildees lambda e o verde como novo coacutedigo utilizando AIC novamente

44

Figura 511 Commit de remoccedilatildeo de Lambdas e volta para o uso de AICs no projetoRXJava [6]

Essa preocupaccedilatildeo com retrocompatibilidade de coacutedigo pode ser um fator crucial nadecisatildeo das equipes de desenvolvimento na hora de decidir como fazer o software co-evoluircom a linguagem sem perder a compatibilidade com versotildees anteriores

45

Capiacutetulo 6

Consideraccedilotildees Finais

Este estudo permitiu entender melhor como projetos estatildeo realizando a migraccedilatildeo para oJava 8 em especial utilizando uma nova caracteriacutestica introduzida expressatildeo lambdaApesar de a maioria dos projetos populares considerados natildeo possuiacuterem nenhuma ocor-recircncia de expressotildees lambda os projetos que tinham expressotildees lambda foram suficientespara realizar um primeiro estudo de caracterizaccedilatildeo no uso desta caracteriacutestica e com osprojetos efetivamente utilizados para estudo foi possiacutevel agrupaacute-los quanto a maneira emque as expressotildees lambda estavam sendo utilizadas quando comparadas com AICs em 5grandes grupos quando AIC e lambda aumentam proporcionalmente quando AIC dimi-nui e lambda aumenta ultrapassando AIC quando AIC diminui mas continua superior aolambda crescente expressotildees lambda que foram introduzidas e retiradas completamentedo coacutedigo e expressotildees lambda que natildeo existem em quantidades expressivas

Foi possiacutevel entatildeo realizar um estudo aprofundado levando em consideraccedilatildeo as di-ferentes maneiras com que as expressotildees lambda foram adotadas nos projetos atraveacutes daescolha de um projeto que representasse cada grupo para anaacutelise Dentre os cinco projetosestudados foi possiacutevel observar alguns padrotildees tipicamente adotados por desenvolvedorespara implementar expressotildees lambda em seus projetos como a utilizaccedilatildeo da bibliotecas(retrolambda) que permitissem uma flexibilizaccedilatildeo na utilizaccedilatildeo de expressotildees lambda oucomo lambda eacute primariamente utilizada para substituir determinados AICs ou operaccedilotildeesem Collection

Aleacutem disso foi possiacutevel observar como a refatoraccedilatildeo de coacutedigo acontece em cada umdesses projetos Observou-se como projetos menores tendem a refatorar coacutedigo maisfacilmente ao passo que projetos maiores e mais complexos fazem menos refatoraccedilatildeo oudemoram mais entre o periacuteodo em que houve a primeira migraccedilatildeo de coacutedigo para a novaversatildeo da linguagem ateacute o periacuteodo em que realmente decidem refatorar coacutedigo Aleacutem dacomplexidade do projeto influenciar na decisatildeo de migrar o projeto para uma versatildeo maisrecente da linguagem a preocupaccedilatildeo com retrocompatibilidade com versotildees anteriores da

46

linguagem tambeacutem podem ser uma barreira para que projetos comecem a evoluir o coacutedigojuntamente com a evoluccedilatildeo da linguagem

Ainda assim foi possiacutevel observar que a preocupaccedilatildeo com a co-evoluccedilatildeo do software-linguagem existe entre os desenvolvedores de projetos mas a realizaccedilatildeo da migraccedilatildeo aindaacontece lentamente devido agrave diversos fatores que precisam ser levados em consideraccedilatildeopara a manutenccedilatildeo do projeto

Para trabalhos e contribuiccedilotildees futuras seria interessante desenvolver uma ferramentaque pudesse analisar diretamente no coacutedigo-fonte as oportunidades de aplicaccedilatildeo de ex-pressotildees lambda dessa forma poderiam ser analisadas as porcentagens de conversatildeo decoacutedigo para Java 8 e obter melhores conclusotildees sobre a importacircncia que os projetos estatildeodando para a evoluccedilatildeo de seus coacutedigos Outro fator interessante seria aplicar mais Visitorsagrave ferramenta static-analysis e fazer este mesmo estudo aplicado agrave outras caracteriacutesticasda linguagem

47

Referecircncias

[1] Kagdi Huzefa Michael L Collard e Jonathan I Maletic A survey and taxonomyof approaches for mining software repositories in the context of software evolution2007 ix 3 8 9 10 11

[2] DBeaver Dbeaver - features httpdbeaverjkissorgdocsfeatures ix 29

[3] Eclipse Vertx commit Java8-ify code httpsgithubcomeclipsevertxcommit93f95e9c77419f442a42fe711b6eeaef88192fd3 ix 42

[4] Google Guava commit Release java 8 changes to guava httpsgithubcomgoogleguavacommit73e382fa877f80994817a136b0adcc4365ccd904 ix 43

[5] Google Agera commit Collapsed testapp with retrolambda httpsgithubcomgoogleageracommit5e518b7b05f9e7a34a314945f68deff7b2c3e334 ix 44

[6] ReactiveX Rxjava commit 2x full jdk 6 compatible backport + includ-ing bugfixes up to today httpsgithubcomReactiveXRxJavacommit000a174d87a901135f9665d3b11f3627fd2dc4ed ix 45

[7] Godfrey M W e D M German The past present and future of software evolutionEm 2008 Frontiers of Maintenance paacuteginas 129ndash138 Sept 2008 1 6

[8] Favre J M Languages evolve too changing the software time scale Em Principles ofSoftware Evolution Eighth International Workshop on paacuteginas 33ndash42 IEEE 20051 5 7

[9] Overbey Jeffrey L e Ralph E Johnson Regrowing a language refactoring tools allowprogramming languages to evolve Em ACM SIGPLAN Notices volume 44 paacuteginas493ndash502 ACM 2009 1 5 7 8 12

[10] Grechanik Mark Collin McMillan Luca DeFerrari Marco Comi Stefano CrespiDenys Poshyvanyk Chen Fu Qing Xie e Carlo Ghezzi An empirical investiga-tion into a large-scale java open source code repository Em Proceedings of the2010 ACM-IEEE International Symposium on Empirical Software Engineering andMeasurement ESEM rsquo10 paacuteginas 111ndash1110 New York NY USA 2010 ACMISBN 978-1-4503-0039-1 httpdoiacmorg10114518527861852801 1

[11] TIOBE Tiobe httpswwwtiobecomtiobe-index 1 14

48

[12] Gyori Alex Lyle Franklin Danny Dig e Jan Lahoda Crossing the gap from im-perative to functional programming through refactoring Em Proceedings of the 20139th Joint Meeting on Foundations of Software Engineering ESECFSE 2013 paacute-ginas 543ndash553 New York NY USA 2013 ACM ISBN 978-1-4503-2237-9 httpdoiacmorg10114524914112491461 2 11 24 39

[13] OpenJDK State of the lambda httpcropenjdkjavanet~briangoetzlambdalambda-state-4html 2

[14] Han Jiawei Micheline Kamber e Jian Pei Data Mining Concepts and TechniquesMorgan Kaufmann Publishers Inc San Francisco CA USA 3rd ediccedilatildeo 2011ISBN 0123814790 9780123814791 3

[15] Fowler Martin e Kent Beck Refactoring improving the design of existing codeAddison-Wesley Professional 1999 5 7

[16] Lehman M M J F Ramil P D Wernick D E Perry e W M Turski Met-rics and laws of software evolution - the nineties view Em Proceedings of the4th International Symposium on Software Metrics METRICS rsquo97 paacuteginas 20ndashWashington DC USA 1997 IEEE Computer Society ISBN 0-8186-8093-8 httpdlacmorgcitationcfmid=823454823901 6

[17] Hassan Ahmed E e Tao Xie Software intelligence The future of mining softwareengineering data Em Proceedings of the FSESDP Workshop on Future of SoftwareEngineering Research FoSER rsquo10 paacuteginas 161ndash166 New York NY USA 2010ACM ISBN 978-1-4503-0427-6 httpdoiacmorg101145188236218823978 9

[18] Hassan Ahmed E The road ahead for mining software repositories Em Frontiers ofSoftware Maintenance 2008 FoSM 2008 paacuteginas 48ndash57 IEEE 2008 8

[19] Berry Michael J e Gordon Linoff Data Mining Techniques For Marketing Salesand Customer Support John Wiley amp Sons Inc New York NY USA 1997ISBN 0471179809 10

[20] Parnin Chris Christian Bird e Emerson Murphy-Hill Java generics adoption hownew features are introduced championed or ignored Em Proceedings of the 8thWorking Conference on Mining Software Repositories paacuteginas 3ndash12 ACM 2011 12

[21] Oracle The java language specification httpsdocsoraclecomjavasespecsjlsse8jls8pdf 13

[22] Oracle The history of java technology httpwwworaclecomtechnetworkjavajavaseoverviewjavahistory-index-198355html 13

[23] Murphy Kieron So why did they decide to call itjava httpwwwjavaworldcomarticle2077265core-javaso-why-did-they-decide-to-call-it-java-html 13

[24] McGraw Tata Object-oriented Programming with Java Essentials and ApplicationsHill Education 13

49

[25] Oracle Differences between java ee and java se httpdocsoraclecomjavaee6firstcupdocgkhoyhtml 13

[26] Lindsey Clark S The History of Java Cambridge 14

[27] Oracle The java language environment httpwwworaclecomtechnetworkjavaintro-141325html 14

[28] Oracle Jdk 8 httpopenjdkjavanetprojectsjdk8 15 24

[29] Oracle Enhancements in java se 8 httpdocsoraclecomjavase8docstechnotesguideslanguageenhancementshtmljavase8 15 16 17

[30] Oracle Lambda expressions httpdocsoraclecomjavasetutorialjavajavaOOlambdaexpressionshtml 16 18 21

[31] Oracle Method references httpdocsoraclecomjavasetutorialjavajavaOOmethodreferenceshtml 16

[32] Oracle Default methods httpdocsoraclecomjavasetutorialjavaIandIdefaultmethodshtml 17

[33] Oracle Repeating annotations httpdocsoraclecomjavasetutorialjavaannotationsrepeatinghtml 17

[34] Oracle Type annotations httpdocsoraclecomjavasetutorialjavaannotationstype_annotationshtml 17

[35] Oracle Anonymous inner classes httpsdocsoraclecomjavasetutorialjavajavaOOanonymousclasseshtml 19

[36] Kothari CR Research Methodology Methods and Techniques New Age Interna-tional (P) Limited 2004 ISBN 9788122415223 httpsbooksgooglecombrbooksid=8c6gkbKi-F4C 22

[37] Nakakoji Kumiyo Yasuhiro Yamamoto Yoshiyuki Nishinaka Kouichi Kishida eYunwen Ye Evolution patterns of open-source software systems and communitiesEm IWPSE rsquo02 Proceedings of the International Workshop on Principles of SoftwareEvolution paacuteginas 76ndash85 New York NY USA 2002 ACM Press ISBN 1581135459httpdxdoiorg101145512035512055 23

[38] Rahman Foyzur Christian Bird e Premkumar Devanbu Clones What is that smellEmpirical Software Engineering 17(4-5)503ndash530 2012 24

[39] Chacon Scott Pro Git Apress Berkely CA USA 1st ediccedilatildeo 2009ISBN 1430218339 9781430218333 25

[40] Cavalcanti Thiago Gomes e Viniacutecius Correa de Almeida Caracterizaccedilatildeo do uso deconstruccedilotildees da linguagem java em projetos open-source Publicaccedilatildeo online 2016httpbdmunbbrhandle1048315733 27

50

[41] Parr Terence Language Implementation Patterns Create Your Own Domain-Specific and General Programming Languages Pragmatic Bookshelf 1st ediccedilatildeo 2009ISBN 193435645X 9781934356456 27

[42] Janssen Thorben 5 reasons to use jpa hibernate Publicaccedilatildeo online httpswwwsitepointcom5-reasons-to-use-jpa-hibernate 27

[43] Franklin Lyle Alex Gyori Jan Lahoda e Danny Dig Lambdaficator From imperativeto functional programming through automated refactoring Em Proceedings of the2013 International Conference on Software Engineering ICSE rsquo13 paacuteginas 1287ndash1290 Piscataway NJ USA 2013 IEEE Press ISBN 978-1-4673-3076-3 httpdlacmorgcitationcfmid=24867882486986 29

[44] Google Agera httpsgithubcomgoogleagerawiki 34

[45] Eclipse Eclipse vertx httpvertxio 35

[46] Cejas Fernando Android cleanarchitecture httpsgithubcomandroid10Android-CleanArchitecture 36

[47] ReactiveX Rxjava httpsgithubcomReactiveXRxJava 37

[48] Luontola Esko Retrolambda httpsgithubcomorfjackalretrolambda 43

51

Anexo I

Projetos utilizados

fastjson

platform_frameworks_base

netty

material-dialogs

kotlin

okhttp

tinker

AndroidUtilCode

RxJava

spring-boot

java-design-patterns

elasticsearch

ExoPlayer

kafka

vertx

realm-java

guava

zipkin

bazel

stetho

Signal-Android

glide

agera

fresco

plaid

presto

libgdx

spark

52

disruptor

lottie-android

flexbox-layout

PocketHub

zxing

spring-framework

deeplearning4j

dropwizard

interviews

BaseRecyclerViewAdapterHelper

uCrop

DanmakuFlameMaster

lottie-react-native

android-UniversalMusicPlayer

AndroidInterview-Q-A

greenDAO

retrofit

MaterialDrawer

BottomBar

druid

MPAndroidChart

Hystrix

guice

recyclerview-animators

dubbo

androidannotations

RxJava-Android-Samples

PhotoView

clojure

CircleImageView

AndroidSwipeLayout

jedis

MaterialViewPager

butterknife

junit4

RxBinding

leakcanary

SimianArmy

picasso

UltimateRecyclerView

53

AndroidViewAnimations

AppIntro

FizzBuzzEnterpriseEdition

ion

cheesesquare

physical-web

RxAndroid

Android-CleanArchitecture

Calligraphy

Android-Bootstrap

iosched

Android_Data

MaterialDesignLibrary

ListViewAnimations

EventBus

java8-tutorial

AndroidSlidingUpPanel

dagger

okhttputils

logger

HomeMirror

Material-Animations

android-Ultra-Pull-To-Refresh

android-async-http

Android-ObservableScrollView

Android-Universal-Image-Loader

ActionBarSherlock

SlidingMenu

storm

PagerSlidingTabStrip

Android-PullToRefresh

54

  • Dedicatoacuteria
  • Agradecimentos
  • Resumo
  • Abstract
  • Introduccedilatildeo
    • Contexto
    • Objetivos
      • Objetivos Gerais
      • Objetivos Especiacuteficos
        • Metodologia
        • Organizaccedilatildeo do Trabalho
          • Evoluccedilatildeo e Mineraccedilatildeo de Repositoacuterios de Software
            • Evoluccedilatildeo de Software
            • MSR Mineraccedilatildeo de dados e a Engenharia de Software
              • Classificaccedilatildeo
                • Trabalhos Relacionados
                  • Java SE 8 e JDK 8
                    • Histoacuterico
                    • Princiacutepios
                    • Evoluccedilatildeo
                    • Expressotildees Lambda
                      • Sintaxe
                      • Principais formas de uso
                          • Estudo e o Processo de Mineraccedilatildeo
                            • Questotildees de Pesquisa
                            • Fonte de Dados e Objetos de Estudo
                            • Processo de Mineraccedilatildeo
                              • static-analysis
                              • BDAnalisador
                                • Classificaccedilatildeo e Anaacutelise
                                  • Meacutedia de Lambda
                                  • Anaacutelise Temporal
                                  • Refatoraccedilatildeo de Coacutedigo
                                  • Casos de Uso
                                      • Resultados Obtidos e Anaacutelise
                                        • Visatildeo Geral
                                          • Projetos Selecionados
                                          • agera
                                          • vertx
                                          • Android-CleanArchitecture
                                          • RxJava
                                          • guava
                                            • Refatoraccedilatildeo de Coacutedigo
                                            • Estudos de Caso
                                              • Consideraccedilotildees Finais
                                              • Referecircncias
                                              • Anexo
                                              • Projetos utilizados

Capiacutetulo 3

Java SE 8 e JDK 8

Este trabalho tem como objetivo caracterizar a adoccedilatildeo de expressotildees Lambda em siste-mas Java que podem ser considerados legados pois foram concebidos em um momentoanterior a introduccedilatildeo dessa nova caracteriacutestica na linguagem Java Com o intuito de faci-litar o entendimento do leitor sobre tais construccedilotildees esse capiacutetulo apresenta informaccedilotildeeshistoacutericas referentes agrave linguagem Java desde sua criaccedilatildeo ateacute a sua ascensatildeo como umadas linguagens de programaccedilatildeo mais populares Aleacutem disso seratildeo apresentadas as novascaracteriacutesticas presentes na versatildeo Java SE 8 com destaque nas expressotildees Lambda e deque forma vieram para auxiliar no desenvolvimento de sistemas

31 Histoacuterico

Java eacute uma linguagem de programaccedilatildeo orientada a objetos para propoacutesitos gerais [21] Alinguagem nasceu com o nome de Oak no ano de 1991 com o foco em televisotildees digitais acabo mas devido agrave complexidade e poder da linguagem logo expandiu-se para os outrosdomiacutenios principalmente a Internet [22] Posteriormente a linguagem recebeu o nome deGreentalk devido agrave marca Oak jaacute ser registrada por outra empresa e o principal projeto daequipe se chamar Green Por fim o nome Java foi o mais votado pela equipe da Sun emuma reuniatildeo para decidir o mais raacutepido possiacutevel um nome definitivo para a linguagem [23]

Em 1995 em sua primeira versatildeo puacuteblica 10 a linguagem Java jaacute comeccedilava a terum crescimento em sua popularidade como Web Applet nos navegadores mais popularesfornecendo seguranccedila e rapidez nas plataformas mais utilizadas [24] A cada nova versatildeopublicada novas funcionalidades e plataformas eram adicionadas e tornavam a linguagemmais difundida no meio computacional fazendo com que em 2006 a linguagem fosse divi-dida em Java EE (foco em rede e serviccedilos web) Java ME (foco em sistemas embarcados)e Java SE (foco em desktops e servidores) [25]

13

Apoacutes anos de evoluccedilatildeo e aprimoramento atraveacutes de diversas versotildees como visto naTabela 31 hoje o Java se tornou uma das linguagens de programaccedilatildeo mais utilizadas nomundo estando em aproximadamente 15 das linhas de coacutedigo disponiacuteveis pela inter-net [11] A quantidade de plataformas suportadas pela linguagem e com o advento dosistema operacional Android sendo rodado na maior parte dos smartphones do mundoaleacutem da simplicidade em codificar no paradigma orientado a objetos foram os fatoresrelevantes para que a linguagem se popularizasse no mundo digital [26]

Tabela 31 As versotildees anteriores de java e principais caracteriacutesticasVersatildeo Principais caracteriacutesticasJava 10 JVM e JDKJava 2 Event Listeners

Kestrel (Java 3) HotSpot JVMMerlin (Java 4) Diversas novas APIs como Assertion e expressotildees regularesTiger (Java 5) Generics

Mustang (Java 6) Web ServicesDolphin (Java 7) Suporte a linguagens dinamicas

32 Princiacutepios

Com o foco em alcanccedilar a Web e participar mais ativamente do mercado virtual e e-Commerce foram projetados princiacutepios que permitissem com que a linguagem pudessealcanccedilar seus objetivos principais ao mesmo tempo que mantinha a facilidade e fami-liarizaccedilatildeo da linguagem a seus desenvolvedores [27] Dessa forma a equipe da Oracledeterminou cinco princiacutepios que caracterizariam o foco da linguagem Java

bull simples orientada a objeto e familiar projetada para ser orientada a objeto epermitir que seus desenvolvedores comecem a codificar rapidamente sem a necessi-dade de uma curva de aprendizagem acentuada

bull segura e robusta projetada para prover software confiaacutevel por meio de checagensa tempo de compilaccedilatildeo e execuccedilatildeo Haacute uma grande preocupaccedilatildeo com seguranccediladevido agrave larga utilizaccedilatildeo da linguagem em sistemas distribuiacutedos

bull de arquitetura neutra e portaacutevel projetada para ser independente de qualquerarquitetura bastando rodar a JVM dessa forma garantindo a portabilidade paravaacuterios ambientes e dispositivos

14

bull executada em alta performance projetada para fornecer a maior performancepossiacutevel em tempo de execuccedilatildeo com a utilizaccedilatildeo do garbage collector em uma threadde baixa prioridade

bull interpretada dinacircmica e threaded projetada para ser interpretada por qual-quer dispositivo que possua JVM desenvolvida garantindo um desenvolvimento raacute-pido e em ciclos O uso da classe Thread permite que a linguagem acompanhe atendecircncia do paralelismo Aleacutem disso a ligaccedilatildeo de classes eacute feita em tempo real esomente quando necessaacuteria tornando-a dinacircmica

33 Evoluccedilatildeo

A primeira versatildeo do Java 8 foi lanccedilada em 2014 [28] e apresentou diversas atualizaccedilotildeesespalhadas em categorias como linguagem seguranccedila Collections ferramentas deployentre outras Dentre a grande quantidade de mudanccedilas os destaques se encontraram nasnovas melhorias presentes na linguagem que afetaram de forma mais direta a maneiracom que os desenvolvedores passaram a tratar e organizar o coacutedigo fonte As atualizaccedilotildeesreferentes a linguagem descritas oficialmente pela Oracle [29] satildeo

1 Lambda Expressions ou apenas Expressotildees Lambda correspondem a uma novacaracteriacutestica que permite que uma pequena funcionalidade possa ser utilizada comoum argumento de um meacutetodo facilitando a escrita de accedilotildees que seratildeo feitas repetida-mente em uma Collection ou quando um processo se completa ou quando encontraum erro Eacute tambeacutem uma forma compacta de se escrever coacutedigo que previamenteera escrito com anonymous inner classes [29] A Listagem 31 mostra uma classehipoteacutetica Calculator cujo meacutetodo operateBinary() recebe como paracircmetro doisinteiros e um objeto da classe IntegerMath que representa a operaccedilatildeo que deveraacuteser realizada ou seja uma funcionalidade dinacircmica

1 pub l i c c l a s s Ca l cu la to r 2

3 i n t e r f a c e IntegerMath 4 i n t opera t i on ( i n t a i n t b) 5 6

7 pub l i c i n t operateBinary ( i n t a i n t b IntegerMath op ) 8 re turn op opera t i on (a b) 9

10

11 pub l i c s t a t i c void main ( St r ing a rgs ) 12

15

13 Calcu la to r myApp = new Ca lcu la to r ( ) 14 IntegerMath add i t i on = (a b) minusgt a + b 15 IntegerMath subt ra c t i on = (a b) minusgt a minus b 16 System out p r i n t l n ( 40 + 2 = +17 myApp operateBinary (40 2 add i t i on ) ) 18 System out p r i n t l n ( 20 minus 10 = +19 myApp operateBinary (20 10 sub t ra c t i on ) ) 20 21 22

Listagem 31 Exemplo de coacutedigo com o uso de Expressatildeo Lambda [30]

2 Method References Frequentemente expressotildees lambda criam meacutetodos anocircni-mos Algumas vezes poreacutem satildeo utilizadas para chamar um meacutetodo jaacute existentena classe Ao inveacutes de escrever a expressatildeo Lambda para esse caso pode-se optarpor utilizar um Method Reference que facilita a escrita e leitura desse uso de ex-pressatildeo Lambda [29] A Listagem 32 mostra um exemplo de um meacutetodo estaacuteticoque compara duas pessoas pelas suas idades e a Listagem 33 a utilizaccedilatildeo de MethodReference para aplicar a utilizaccedilatildeo desse meacutetodo em um array e reduzir a escrita deuma expressatildeo lambda a uma forma mais legiacutevel

1 pub l i c s t a t i c i n t compareByAge ( Person a Person b) 2 re turn a b i r thday compareTo (b b i r thday ) 3 4

Listagem 32 Exemplo de meacutetodo de uma classe Pessoa [31]

1 Arrays s o r t ( rosterAsArray Person compareByAge ) 2

Listagem 33 Exemplo de uso de Method Reference [31]

3 Default Methods satildeo meacutetodos com a palavra-chave default que servem para adi-cionar implementaccedilotildees de meacutetodos a uma interface de alguma biblioteca mantendoa compatibilidade binaacuteria com versotildees mais antigas dessa interface Tambeacutem pos-sibilita a implementaccedilatildeo de meacutetodos estaacuteticos em interfaces [29] A Listagem 34apresenta a inclusatildeo de um meacutetodo default na interface TimeClient

1 pub l i c i n t e r f a c e TimeClient 2 void setTime ( i n t hour i n t minute i n t second ) 3 void setDate ( i n t day i n t month i n t year ) 4 void setDateAndTime ( i n t day i n t month i n t year 5 i n t hour i n t minute i n t second )

16

6 LocalDateTime getLocalDateTime ( ) 7

8 s t a t i c ZoneId getZoneId ( S t r ing zoneStr ing ) 9 t ry

10 re turn ZoneId o f ( zoneStr ing ) 11 catch ( DateTimeException e ) 12 System e r r p r i n t l n ( I n v a l i d time zone + zoneStr ing

+13 us ing d e f a u l t time zone in s t ead ) 14 re turn ZoneId systemDefault ( ) 15 16 17

18 d e f a u l t ZonedDateTime getZonedDateTime ( St r ing zoneStr ing ) 19 re turn ZonedDateTime o f ( getLocalDateTime ( ) getZoneId (

zoneStr ing ) ) 20 21 22

Listagem 34 Exemplo de interface com um meacutetodo default [32]

4 Repeating Annotations permitem a implementaccedilatildeo e utilizaccedilatildeo de anotaccedilotildees deum mesmo tipo que podem ser utilizadas mais de uma vez para a mesma declara-ccedilatildeo [29] A Listagem 35 apresenta duas anotaccedilotildees iguais com paracircmetros diferentespermitindo uma customizaccedilatildeo maior na aplicaccedilatildeo de um tipo de anotaccedilatildeo

1 Schedule ( dayOfMonth= l a s t )2 Schedule (dayOfWeek= Fr i hour= 23 )3 pub l i c void doPeriodicCleanup ( ) 4

Listagem 35 Exemplo de Repeating Annotations [33]

5 Type Annotations permitem que anotaccedilotildees possam ser utilizadas em tipos aleacutemde declaraccedilotildees dessa forma pode-se garantir que um campo sempre atenda agraves suasexpectativas e evite testes desnecessaacuterios [29] A Listagem 36 mostra um exemplo derestriccedilatildeo a uma String que nunca poderaacute ser nula devido agrave anotaccedilatildeo de NonNull

1 NonNull S t r ing s t r

Listagem 36 Exemplo de Type Annotation garantindo que o campo nunca seja null [34]

17

34 Expressotildees Lambda

Uma das mudanccedilas mais interessantes implementadas no Java 8 foi a adiccedilatildeo de expressotildeeslambda As expressotildees lambda permitem que a linguagem Java possa atuar parcialmentecomo uma linguagem de programaccedilatildeo funcional onde comportamentos satildeo avaliados eaplicados diferentemente da programaccedilatildeo imperativa que foca na mudanccedila de estadosNa praacutetica um comportamento pode ser passado como paracircmetro de um meacutetodo atraveacutesde uma escrita mais reduzida e legiacutevel Os benefiacutecios de utilizar expressotildees lambda incluemuma melhora na legibilidade e organizaccedilatildeo de coacutedigo que antes era escrito com AnonymousInner Class aleacutem de permitir uma forma simples de utilizar comportamento paralelo como uso de Streams

341 Sintaxe

A sintaxe de uma expressatildeo lambda eacute dividida nas seguintes partes [30]

bull Uma lista de paracircmetros separados por viacutergulas

bull Um token representado por uma seta -gt

bull Um corpo que pode ser representado por uma expressatildeo uacutenica ou um bloco de coacutedigodentro de chaves

As Listagens 37 e 38 mostram duas formas diferentes de se aplicar expressotildees Lambdacom uma sintaxe similar A primeira aplica a expressatildeo diretamente apoacutes a seta utilizadanormalmente para trechos de coacutedigo pequenos e simples e a segunda utiliza-se de chavespara incorporar o coacutedigo e da palavra-chave return para especificar o retorno forma maisutilizada para uma quantidade maior de coacutedigo

1 p minusgt p getGender ( ) == Person Sex MALE2 ampamp p getAge ( ) gt= 183 ampamp p getAge ( ) lt= 25

Listagem 37 Exemplo de expressatildeo lambda com uma expressatildeo [30]

1 p minusgt 2 re turn p getGender ( ) == Person Sex MALE3 ampamp p getAge ( ) gt= 184 ampamp p getAge ( ) lt= 25 5

Listagem 38 Exemplo de expressatildeo lambda com um bloco de coacutedigo [30]

18

342 Principais formas de uso

Anonymous Inner Class

Antes do Java 8 a necessidade de passar funccedilotildees ou expressotildees como paracircmetro de algummeacutetodo era suprida atraveacutes de Anonymous Inner Classes A utilizaccedilatildeo desse tipo dedeclaraccedilatildeo junto com a anotaccedilatildeo de Override permite sobrescrever um meacutetodo de umainterface funcional e ao mesmo tempo passa-la como argumento para um meacutetodo Umaexpressatildeo lambda se comporta da mesma forma poreacutem a quantidade de coacutedigo escritopela Anonymous Inner Class eacute maior e pode dificultar a leitura de coacutedigo pois conteacutemmuita informaccedilatildeo natildeo utilizada para efetivo entendimento do que estaacute sendo feito naqueletrecho

A Listagem 39 apresenta a instanciaccedilatildeo da classe EventHandler internamente ao meacute-todo setOnAction() de forma que o desenvolvedor possa escrever o comportamento quedeseja passar como paracircmetro do meacutetodo atraveacutes da substituiccedilatildeo do meacutetodo handle()que jaacute existe pelo meacutetodo handle() criado e escrito pelo desenvolvedor

1 btn setOnAction (new EventHandlerltActionEvent gt() 2 Override3 pub l i c void handle ( ActionEvent event ) 4 System out p r i n t l n ( He l lo World ) 5 6 )

Listagem 39 Exemplo de uso de Anonymous Inner Class [35]

Interface funcional

Ao projetar um coacutedigo novo o desenvolvedor que optar por utilizar expressotildees lambdadeve iniciar com a criaccedilatildeo de uma interface funcional Esse tipo de interface possui umuacutenico meacutetodo abstrato permitindo que expressotildees lambda sejam usadas para sobrescrevero comportamento do meacutetodo abstrato Uma interface funcional pode possuir outros meacuteto-dos desde que sejam default Uma nova anotaccedilatildeo FunctionalInterface foi adicionadacom a atualizaccedilatildeo do Java 8 para conferir em tempo de compilaccedilatildeo se a interface satisfazos requisitos desse modelo de interface

A Listagem 310 apresenta um exemplo de interface funcional com o objetivo de permi-tir o uso de expressotildees lambda que utilizaratildeo de dois Double como paracircmetro e jaacute utilizada nova anotaccedilatildeo FunctionalInterface introduzida no Java 8

1 Funct iona l Inte r face2 pub l i c i n t e r f a c e DoubleOp 3 pub l i c Double apply ( Double a Double b)

19

4

Listagem 310 Exemplo de interface funcional

Dessa forma conforme as Listagens 311 e 312 o meacutetodo apply() pode tomar formade qualquer operaccedilatildeo entre dois Double que seraacute especificada quando a expressatildeo lambdafor montada dando o aspecto de linguagem funcional agrave linguagem e mais facilidade eliberdade ao desenvolvedor

1 pub l i c c l a s s Ca l cu la to r 2 pub l i c s t a t i c Double c a l c ( Double op1 Double op2 DoubleOp operator ) 3 re turn operator apply ( op1 op2 ) 4 5

Listagem 311 Exemplo de aplicaccedilatildeo da interface funcional

1 Double r e s u l t 1 = Ca lcu la to r c a l c (10d 50d ( a b ) minusgt a + b)

Listagem 312 Uso de expressatildeo lambda para o exemplo anterior

Collections

Dentre as atualizaccedilotildees de pacotes do Java 8 foi adicionado um meacutetodo stream() nainterface Collection Esse meacutetodo trata as Collection como streams o que significa queapesar de natildeo ser possiacutevel acessar elementos diretamente algumas novas manipulaccedilotildeessatildeo possiacuteveis Essas manipulaccedilotildees satildeo na verdade meacutetodos da interface Stream quepodem receber como paracircmetro uma expressatildeo lambda ou seja um comportamento a seraplicado agrave Collection Dentre os meacutetodos temos

bull filter() O meacutetodo filter() recebe uma expressatildeo lambda contendo uma condiccedilatildeopara filtragem da collection

bull map() O meacutetodo map() mapeia os elementos de uma Collection em outro objetocomo uma String A expressatildeo lambda passada por paracircmetro deve retornar o tipode objeto ao qual seraacute mapeado

bull forEach() O meacutetodo forEach() aplica uma operaccedilatildeo especiacutefica para cada ele-mento da Collection A expressatildeo lambda a ser passada deve conter a operaccedilatildeo aser realizada

bull min() e max() Os meacutetodos min() e max() retornam o elemento menor ou maiorda Collection dependendo da expressatildeo lambda passada como paracircmetro

20

A Listagem 313 demonstra como vaacuterias operaccedilotildees com uma Collection podem seraplicadas de uma vez de forma que lendo a expressatildeo lambda jaacute eacute possiacutevel saber oresultado da aplicaccedilatildeo do meacutetodo agrave Collection

1 r o s t e r2 stream ( )3 f i l t e r (4 p minusgt p getGender ( ) == Person Sex MALE5 ampamp p getAge ( ) gt= 186 ampamp p getAge ( ) lt= 25)7 map(p minusgt p getEmailAddress ( ) )8 forEach ( emai l minusgt System out p r i n t l n ( emai l ) )

Listagem 313 Exemplo de utilizaccedilatildeo de meacutetodos de stream com expressotildees lambda [30]

21

Capiacutetulo 4

Estudo e o Processo de Mineraccedilatildeo

A definiccedilatildeo da metodologia utilizada para realizaccedilatildeo deste trabalho eacute importante para queexista uma padronizaccedilatildeo e melhor entendimento de como os resultados foram obtidos paraque a replicaccedilatildeo do mesmo possa ser realizada em trabalhos futuros [36]

Figura 41 Processo utilizado para realizaccedilatildeo do estudo

O esquema representado na Figura 41 descreve o processo seguido para a realizaccedilatildeodeste trabalho que foi divido em trecircs grandes etapas a de planejamento definindo osobjetivos questotildees de pesquisa e meios de investigaccedilatildeo deste projeto a etapa de execuccedilatildeorealizando todo o procedimento metodoloacutegico definido para a coleta e refinamento de

22

dados e a etapa de avaliaccedilatildeo onde foram classificados e avaliados os dados coletadospara responder agraves questotildees de pesquisa

A seguir na primeira seccedilatildeo seratildeo apresentadas em detalhes as questotildees de pesquisa aserem respondidas Em seguida seraacute feito uma breve descriccedilatildeo da fonte de dados utilizada- especificamente os projetos utilizados como objetos de estudo deste trabalho e por fimtodo o restante da metodologia que foi de fato desenvolvida para obter os resultadosnecessaacuterios

41 Questotildees de Pesquisa

Com o objetivo de entender e caracterizar melhor o uso de expressotildees lambda foramdefinidas as seguintes questotildees de pesquisa a serem respondidas

bull PQ-1 Quando os projetos comeccedilaram a introduzir o uso de expressotildees lambda emseus coacutedigos e qual a meacutedia de expressotildees lambda por snapshots caso existam

bull PQ-2 Como as equipes de desenvolvimento estatildeo utilizando expressotildees lambdaatraveacutes de refatoraccedilatildeo de coacutedigo ou introduzindo apenas em coacutedigo novo

bull PQ-3 Quais satildeo os padrotildees tipicamente adotados para o uso de expressotildees lambda

A primeira pergunta de pesquisa gira em torno de como projetos populares open-sourceestatildeo se adaptando agrave introduccedilatildeo de expressotildees lambda em Java muitos projetos jaacute estatildeoutilizando as expressotildees lambda Se sim a partir de quando comeccedilaram a utilizaacute-lasdesde o iniacutecio da introduccedilatildeo das mesmas no Java 8 ou em um periacuteodo mais tardio Aleacutemdisso eacute interessante descobrir se a utilizaccedilatildeo dessa nova caracteriacutestica tem acontecido deforma expressiva ou natildeo

Em seguida para melhor entender a forma como as expressotildees lambda estatildeo sendointroduzidas em projetos eacute interessante investigar se as equipes de desenvolvimento estatildeose preocupando em refatorar coacutedigo com o objetivo de evoluir o software ou se estatildeoexperimentando utilizar expressotildees lambda apenas em coacutedigo novo introduzido

Como a introduccedilatildeo de novas funcionalidades em projetos open-source de grande escaladepende do objetivo do projeto e os padrotildees de projeto utilizados [37] espera-se obser-var diversas abordagens quanto a utilizaccedilatildeo de expressotildees lambda para entatildeo poderclassificar estes softwares quanto a abordagem utilizada

Eacute de grande importacircncia para este estudo conseguir identificar na praacutetica comoexpressotildees lambda estatildeo sendo tipicamente adotadas nestes projetos Assim a terceirapergunta de pesquisa busca identificar alguns exemplos de utilizaccedilatildeo atraveacutes da realizaccedilatildeode alguns estudos de caso

23

Eacute importante ressaltar que apesar de as expressotildees lambda serem uma alternativa aouso de AIC elas natildeo os substituem completamente Existem precondiccedilotildees para que umaAIC possa ser substituiacuteda por expressotildees lambda [12] descritas a seguir

bull AIC deve instanciar-se de uma interface

bull AIC natildeo deve possuir nenhum campo e declarar apenas um meacutetodo

bull AIC natildeo deve possuir uma referecircncia para this ou super

bull AIC natildeo deve declarar um meacutetodo recursivo

Para responder agrave primeira pergunta apenas dados gerais sobre todos os projetos seratildeonecessaacuterios ao passo que pelas perguntas 2 e 3 possuiacuterem uma natureza mais complexaseraacute necessaacuterio aleacutem de uma anaacutelise geral estatiacutestica a realizaccedilatildeo de alguns estudos decaso para obter resultados mais completos

42 Fonte de Dados e Objetos de Estudo

Para responder agraves perguntas de pesquisa estabelecidas foram selecionados os 99 projetosmais populares na linguagem Java dentro da plataforma github ateacute a data da coleta dosdados feita em Abril de 2017 Satildeo considerados populares os repositoacuterios que possuema maior quantidade possiacutevel de estrelas (stars) A decisatildeo de escolher os 99 projetos maispopulares foi por sua natureza imparcial e ao mesmo tempo para que se possa analisarprojetos que satildeo de familiaridade e conhecimento da comunidade do github e de domiacuteniopuacuteblico Os 99 projetos estatildeo listados no Anexo I

Para entender a transiccedilatildeo feita por esses projetos entre as versotildees anteriores do Java eo Java 8 com as expressotildees lambda eacute necessaacuterio analisar o coacutedigo de vaacuterias versotildees a fimde observar alguma mudanccedila para cada projeto Como satildeo 99 projetos e vaacuterios dessesprojetos possuem milhares de linhas de coacutedigo e commits seria impossiacutevel avaliar todosos commits Optou-se entatildeo por coletar snapshots mensais de cada projeto conformeprocedimento tambeacutem seguido anteriormente [38] Cada snapshots representa o estadodo projeto em um determinado mecircs e como criteacuterio de escolha padratildeo todos os snapshotsequivalem ao uacuteltimo commit realizado no determinado mecircs que este representa

O proacuteximo passo eacute determinar o periacuteodo de tempo em que esses snapshots seriamcoletados Como Java 8 (e consequentemente as expressotildees lambda) foi introduzidoapenas em meados de 2014 [28] coletar dados de projetos a partir de um periacuteodo muitoantes deste ano natildeo agregaria valor ao estudo em questatildeo Definiu-se entatildeo um periacuteodopara a coleta mensal desses snapshots atraveacutes dos anos Janeiro de 2013 um ano antesda introduccedilatildeo do Java 8 para que se pudesse identificar para todos os projetos o mecircs

24

exato em que expressotildees lambda foram introduzidas ateacute o mecircs da coleta de dados Abrilde 2017

Eacute importante ressaltar que a definiccedilatildeo dos meses foi definida do dia primeiro de ummecircs ao dia primeiro do proacuteximo mecircs e por consequecircncia alguns snapshots que deveriamrepresentar o final de determinado mecircs correspondem na verdade a commits realizadosno dia primeiro do mecircs seguinte Por exemplo pode existir casos em que o commit querepresente o mecircs de Marccedilo de 2016 seja na verdade o commit realizado no dia primeirode Abril de 2016 Isso se deve a natureza da forma como os resultados de log de commitssatildeo obtidos pelo git [39] Poreacutem isso natildeo interfere nas anaacutelises ou no propoacutesito destetrabalho uma vez que foram realizadas verificaccedilotildees e validaccedilotildees para que natildeo existamdatas repetidas (e consequentemente commits repetidos) por repositoacuterio

Neste trabalho o termo projeto e repositoacuterio foram utilizados de forma intercaladapara representar a mesma coisa o software desenvolvido que possui um repositoacuterio naplataforma github Os termos commit snapshops e versotildees tambeacutem representam a mesmacoisa uma vez que foi definido que seriam utilizados apenas um commit por mecircs pararepresentar um determinado snapshot ou versatildeo do repositoacuterio em questatildeo

Todos os 99 projetos seratildeo utilizados para a realizaccedilatildeo de uma anaacutelise geral de ca-racterizaccedilatildeo do uso de expressotildees lambda Para as anaacutelises aprofundadas foi feito umcriteacuterio de classificaccedilatildeo para que apenas alguns projetos possam ser analisados em niacutevelde coacutedigo como estudos de caso

Resumindo foram escolhidos os 99 projetos mais populares de Java no github cole-tando dados mensais de seus commits a partir do ano de 2013 ateacute a data da coleta dosdados lembrando que nem todos os projetos existem desde 2013 (projetos mais recentes)

43 Processo de Mineraccedilatildeo

A abordagem utilizada para coletar e analisar os 99 projetos escolhidos como mostra aFigura 42 foi realizada de forma automatizada utilizando scripts python e dois projetosdesenvolvidos em Java para a coleta e tratamento de dados como descrito a seguir

Primeiramente foi realizado uma coacutepia dos repositoacuterios atuais de todos os 99 projetosmais populares do github em Java Para automatizar o processo foi desenvolvido umscript em python que lista todos os projetos escolhidos clona todos os repositoacuterios emuma pasta na maacutequina local e cria um arquivo temporaacuterio com as informaccedilotildees do nomede cada repositoacuterio e seu caminho absoluto na maacutequina local

25

Figura 42 Metodologia implementada para coleta e tratamento de dados

Em seguida foi necessaacuterio realizar o checkout de todas as versotildees entre Janeiro de2013 a Abril de 2017 de cada projeto Por motivos de otimizaccedilatildeo de espaccedilo da maacutequinalocal e automatizaccedilatildeo no processo de checkout utilizou-se de um segundo script pythonque realizava as seguintes tarefas para cada mecircs em cada projeto verificar se dentreo mecircs estipulado houve algum commit para aquele projeto se sim pega-se o hash douacuteltimo commit do mecircs realiza o checkout conta-se a quantidade de linhas de coacutedigo emJava que o projeto tem utilizando a biblioteca cloc e armazena todas as informaccedilotildeespertinentes referentes a todos os projetos que naquele mecircs tiveram commits para que oprojeto static-analysis possa entatildeo ser executado sobre esses projetos naquele determinadomomento As informaccedilotildees coletadas que satildeo utilizadas pelo static-analysis correspondemao nome do projeto o hash do commit para aquela versatildeo a pasta onde o projeto estaacutearmazenado na maacutequina local a quantidade de linhas de coacutedigo Java do projeto e datareferente ao commit Essas informaccedilotildees satildeo pertinentes para que o projeto static-analysisconsiga funcionar de forma correta projeto este descrito em detalhes a seguir

431 static-analysis

O static-analysis foi um projeto desenvolvido anteriormente a este trabalho pelos alunosThiago Cavalcanti e Vinicius de Almeida cujo objetivo eacute realizar a anaacutelise estaacutetica de

26

coacutedigos-fonte Java e gerar arquivos de saiacuteda contendo informaccedilotildees de classes e meacutetodoscom suas devidas ocorrecircncias de caracteriacutesticas da linguagem [40]

A anaacutelise estaacutetica de coacutedigo consiste em analisar um coacutedigo-fonte sem a necessidadede executaacute-lo Esse tipo de anaacutelise eacute de extrema importacircncia para manter um coacutedigo dequalidade evitar futuras refatoraccedilotildees e obter informaccedilotildees estatiacutesticas de forma raacutepida epraacutetica [41]

Seguindo esse princiacutepio o static-analysis foi projetado para receber um arquivo deentrada csv seguindo o padratildeo

Tipo da Aplicaccedilatildeo Inicio do projeto Antes ou Apoacutes Java 5 Nome do ProjetoVersatildeo Caminho absolutoQuantidade de linhas de coacutedigo

Atraveacutes da informaccedilatildeo do caminho absoluto do projeto o static-analysis varre osdiretoacuterios em busca dos arquivos fonte java realiza o parse desses arquivos e utilizade Visitors para extrair as informaccedilotildees desejadas e exporta-las em arquivos csv Ouso de Visitors permite que sejam escolhidas as informaccedilotildees desejadas para a consultacomo expressotildees Lambda e AIC s aleacutem de possibilitar que sejam implementados novosVisitors conforme a linguagem evolua ou as necessidades mudem

Para este trabalho foram utilizados os Visitors de expressotildees Lambda map() filter()AICs e declaraccedilotildees de meacutetodos

432 BDAnalisador

Apoacutes obter todas as informaccedilotildees necessaacuterias geradas pelo static-analysis era preciso ma-nipular os dados de forma que facilitasse a coleta de dados para o estudo proposto Comovaacuterios arquivos em formato csv satildeo de difiacutecil manipulaccedilatildeo foi desenvolvido entatildeo umaferramenta chamada BDAnalisador Esta ferramenta eacute responsaacutevel por processar os arqui-vos em csv gerados pelo static-analysis e popular uma base de dados relacional MySQLcom as informaccedilotildees pertinentes a este estudo

O BDAnalisador foi desenvolvido com a intenccedilatildeo de tornar mais simples o trabalhocom os dados resultantes do static-analysis de forma que consultas em SQL pudessemser feitas a ponto de permitir a obtenccedilatildeo de resultados mais complexos Seguindo esseobjetivo o framework Hibernate foi escolhido como ferramenta para persistecircncia devidoa ser um framework jaacute consolidado no mercado e que de forma simples relaciona osobjetos Java ao banco de dados MySQL [42] A divisatildeo de classes foi projetada em quatroentidades Projeto Versao Classe e Metodo cada uma com seus respectivos camposcontendo as informaccedilotildees necessaacuterias para a pesquisa como pode ser visto na Figura 44Eacute importante ressaltar que a tabela de Versao guarda hashs de commits devido agrave escolhade utilizar commits para obter mais informaccedilatildeo de evoluccedilatildeo de coacutedigo em um menor

27

espaccedilo de tempo Aleacutem disso para este trabalho optou-se por persistir todos os meacutetodose classes de cada versatildeo sem se importar com a repeticcedilatildeo desses dados pois a hipoacutetesede haver grandes refatoraccedilotildees entre versotildees poderia comprometer a confiabilidade dasinformaccedilotildees

Figura 43 Diagrama de classes UML do BDAnalisador

Como visto na Figura 43 seguindo parcialmente a arquitetura MVC cada entidadepossui sua respectiva classe DAO(Data Access Object) para persistecircncia dos dados eapenas uma classe Controlador no projeto responsaacutevel pela manipulaccedilatildeo e parse dosdados dos arquivos csv gerados pelo static analysis para serem enviados agraves classes DAOO sistema inicia chamando o meacutetodo inicializar() da classe Controlador Esse meacutetodoeacute responsaacutevel por ler um arquivo de entrada csv que segue o mesmo modelo do arquivo dostatic-analysis citado na seccedilatildeo anterior O arquivo conteacutem os dados de todos os projetose suas respectivas versotildees dessa forma o meacutetodo instancia um objeto da classe Projetoe persiste o projeto no banco de dados Para cada versatildeo encontrada no arquivo deentrada o inicializar() aciona os meacutetodos responsaacuteveis por instanciar e preencher aslistas da classe Classe e Metodo Os meacutetodos responsaacuteveis por preencher as listas varremos arquivos csv gerados pelo static-analysis e fazem o parse das informaccedilotildees relevantescomo nomes dos meacutetodos e quantidades de lambdas para construir os objetos que seratildeogravados Ao final dos preenchimentos o objeto Versatildeo eacute instanciado e gravado no bancode dados atraveacutes de sua classe DAO ao mesmo tempo que grava suas respectivas Classese Metodos

28

Apoacutes vaacuterios testes e correccedilotildees de bugs o banco de dados se encontrava finalmente comas informaccedilotildees de 99 projetos Java open-source separados por um commit por mecircs desde2013 cada um com suas respectivas informaccedilotildees de classes meacutetodos e a quantidade deexpressotildees lambda filters e maps em cada meacutetodo Filter ou Filter pattern eacute o padratildeode projeto que tem como objetivo filtrar objetos de uma coleccedilatildeo (Collection) de acordocom algum criteacuterio Jaacute o map ou map pattern eacute um padratildeo que ldquomapeia os elementosde uma coleccedilatildeo aplicando uma funccedilatildeo a eles para uma nova coleccedilatildeo [43] A coleta deinformaccedilotildees sobre esses padrotildees podem ser uacuteteis para possiacuteveis anaacutelises de oportunidadesde uso de expressotildees lambda para refatoraccedilatildeo de coacutedigo

A Figura 44 mostra o esquema de como o banco de dados resultante foi gerado

Figura 44 Modelo relacional do banco de dados populado pelo BDAnalisador Imagemgerada com software DBeaver [2]

44 Classificaccedilatildeo e Anaacutelise

Com o banco de dados populado restam apenas as etapas de classificaccedilatildeo e anaacutelise pararesponder as questotildees de pesquisa propostas Para isso inicialmente houve uma tentativade se utilizar apenas queries SQL para analisar os dados de acordo com as informaccedilotildeesrelevantes Poreacutem devido ao fato de o banco de dados conter todas as informaccedilotildees detodos os projetos e todas as suas versotildees queries que possuem uma alta complexidadedemoravam muito tempo para retornar os dados

Assim com o objetivo de facilitar o trabalho alguns scripts python foram desenvolvi-dos para rodar as queries separadamente e individualmente para cada projeto de formaautomatizada a fim de melhorar o tempo de resposta para obtenccedilatildeo dos resultados

29

441 Meacutedia de Lambda

O primeiro script retorna a quantidade de expressotildees lambda (ou AICs) por n snapshotsque contenha expressotildees lambda O objetivo eacute ter uma visatildeo geral da meacutedia de expressotildeeslambda e AICs utilizadas por cada projeto e como nem todos os snapshots coletados decada projeto possuem expressotildees lambda e AICs apenas aqueles com alguma expressatildeolambda ou AIC satildeo incluiacutedos no caacutelculo da meacutedia

Mmedia =sumn qtdLambdai

n

442 Anaacutelise Temporal

O segundo script retorna para cada projeto a soma total da quantidade de expressotildeeslambda AIC map() e filter() no projeto inteiro para cada versatildeo Ou seja tem-seo total de cada uma das quatro propriedades selecionadas para cada mecircs do projetoobtendo assim uma visatildeo temporal de evoluccedilatildeo do uso das caracteriacutesticas descritas ATabela 41 ilustra parcialmente o resultado obtido para o projeto agera onde idVersaoeacute o identificador no banco de dados referente ao hash do commit mensal coletado qtd eacutea quantidade de cada uma das caracteriacutesticas escolhidas e a data do commit encontra-seno formato americano

Tabela 41 Informaccedilotildees mensais sobre o projeto ageraidVersao Data do Commit qtd lambda qtd AIC qtd maps qtd filter

823 512016 0 29 4 0755 612016 13 28 4 0686 6152016 13 29 4 0621 812016 13 29 4 0555 8162016 13 30 4 0485 922016 13 30 4 0422 10132016 14 30 4 0356 11282016 14 30 4 0295 12212016 21 30 5 0232 212017 21 30 5 0175 312017 21 30 5 0112 3312017 21 36 5 048 4242017 21 48 5 0

Os resultados obtidos com esta anaacutelise temporal permitiu a identificaccedilatildeo de padrotildees nautilizaccedilatildeo de expressotildees lambda em relaccedilatildeo a utilizaccedilatildeo de AIC por todos os projetos Foi

30

possiacutevel classificar todos os projetos em 6 grupos ilustrado na Figura 45 Primeiramenteseparou-se os projetos entre os que possuem expressotildees lambda e os que natildeo possuemDentre os que possuem identificou-se cinco categorias

1 Grupo 1 Quantidade de AICs e expressotildees lambda aumentam com o tempo pro-porcionalmente

2 Grupo 2 Quantidade de AICs diminui agrave medida que a quantidade de expressotildeeslambda aumentam e a quantidade de expressotildees lambda ultrapassa a quantidade deAIC em um determinado momento

3 Grupo 3 Quantidade de AICs diminui agrave medida que a quantidade de expressotildeeslambda aumentam mas a quantidade de AIC permanece superior agrave quantidade delambda

4 Grupo 4 Expressotildees lambda satildeo introduzidas e existem por um pequeno periacuteodode tempo mas satildeo completamente removidas posteriormente

5 Grupo 5 Quantidade de expressotildees lambda eacute constante e muito inferior compa-rado com a quantidade de AICs no projeto Foi determinado que para pertencera esta classificaccedilatildeo o projeto precisa ter uma razatildeo de meacutedia de expressotildees lamb-dasnapshot por meacutedia de AICsnapshot inferior a 020 Esse paracircmetro foi esta-belecido com o objetivo de definir um padratildeo para o que pode ser considerado umprojeto com poucas expressotildees lambda

Figura 45 Classificaccedilatildeo dos projetos

31

443 Refatoraccedilatildeo de Coacutedigo

O uacuteltimo script teve como objetivo realizar uma tentativa inicial de identificar refatoraccedilatildeode coacutedigo da seguinte maneira para todos os projetos que possuem expressotildees lambdaforam identificados o mecircs imediatamente antes da introduccedilatildeo de expressotildees lambda e omecircs seguinte onde houve a primeira ocorrecircncia de lambda no projeto Assim realizou-se uma anaacutelise do tamanho em quantidade de linhas de coacutedigo de todos os meacutetodosdo projeto que no mecircs seguinte tiveram introduccedilatildeo de lambda Em seguida fez-se umacomparaccedilatildeo com os mesmos meacutetodos em relaccedilatildeo ao mecircs anterior e assim foi possiacuteveldetectar quais meacutetodos tiveram a quantidade de linhas de coacutedigo reduzidas o que seriaum indicativo natildeo necessariamente exclusivo de que uma refatoraccedilatildeo de coacutedigo possa terocorrido

Sabe-se que este meacutetodo de detecccedilatildeo de refatoraccedilatildeo de coacutedigo possui suas limitaccedilotildeesuma vez que as comparaccedilotildees para saber se um meacutetodo existe em ambas versotildees eacute feitopuramente por comparaccedilatildeo de String (nome do meacutetodo) e a classe que este pertence

444 Casos de Uso

Os meacutetodos descritos acima ajudaram a identificar alguns padrotildees e facilitar a anaacutelise dosdados Poreacutem natildeo satildeo suficientes para que se possa responder agraves questotildees de pesquisaDessa forma apoacutes a identificaccedilatildeo dos grupos de classificaccedilatildeo para os projetos foramescolhidos um projeto de cada grupo (com exceccedilatildeo do grupo dos projetos sem expressotildeeslambda) para realizar um breve estudo de caso com o objetivo de identificar e caracterizarmelhor a adoccedilatildeo de expressotildees lambda Os projetos escolhidos foram agera vertxAndroid-CleanArchitecture RxJava e guava

32

Capiacutetulo 5

Resultados Obtidos e Anaacutelise

Neste capiacutetulo seratildeo apresentados os dados obtidos e anaacutelise com o objetivo de responderagraves questotildees de pesquisa propostas Como mencionado anteriormente as perguntas seratildeorespondidas de duas maneiras algumas com informaccedilotildees gerais sobre todos os projetose outras com breve estudos de caso envolvendo cinco projetos

51 Visatildeo Geral

Dentre os repositoacuterios coletados para a anaacutelise 74 (7474) natildeo utilizaram nenhumaexpressatildeo lambda no projeto durante todo o periacuteodo analisado (Janeiro de 2013 a Abrilde 2017) restando apenas 25 repositoacuterios (2525) com expressotildees lambda Eacute interessantedestacar que apesar de a quantidade de repositoacuterios que natildeo possuem expressotildees lambdaser relativamente expressiva muitos destes repositoacuterios satildeo de projetos em Java que umdia foram populares e atualmente natildeo estatildeo sendo mais desenvolvidos (por exemplo umaplicativo que soacute funciona para Android 23 atualmente descontinuado)

Levando em consideraccedilatildeo apenas os projetos que possuem expressotildees lambda exis-tem dois tipos de dados que podem ser analisados para responder agrave primeira questatildeo depesquisa atraveacutes dos dados obtidos pelo meacutetodo anteriormente mencionado como anaacutelisetemporal e a meacutedia de lambda por snapshot mencionados no capiacutetulo anterior

Com relaccedilatildeo ao ano em que a primeira ocorrecircncia foi encontrada 6 projetos introduzi-ram expressotildees lambda jaacute em 2014 8 comeccedilaram a utilizar em 2015 7 em 2016 e apenas4 tiveram a primeira ocorrecircncia de expressotildees lambda em 2017 Dessa forma percebe-seque os projetos estatildeo relativamente bem distribuiacutedos em grupos quanto ao ano em que seintroduziu expressotildees lambda

Pela meacutedia de lambda por snapshot (lambdasnapshot) a maioria (11 projetos) possuiuma quantidade expressiva acima de 100 lambdasnapshot (com 6 projetos entre 20 e 100lambdasnapshot e 8 projetos com menos de 20 lambdasnapshot) como apresentados no

33

graacutefico da Figura 51 Isso mostra que essa nova caracteriacutestica jaacute estaacute sendo bem utilizadanos projetos que comeccedilaram a migrar para a nova versatildeo do Java

Figura 51 Graacuteficos dos projetos separados por ano de introduccedilatildeo de expressotildees lambdae meacutedia de lambda por snapshot

Com isso pode-se observar que apesar de a quantidade de projetos que possuemexpressotildees lambda natildeo ser tatildeo alta eacute possiacutevel obter resultados expressivos uma vez quea quantidade dos projetos com lambda estatildeo bem dispersos quanto ao periacuteodo em quecomeccedilaram a adotar essa caracteriacutestica e a quantidade de expressotildees lambda por snapshot

511 Projetos Selecionados

Atraveacutes dos grupos de classificaccedilatildeo identificados pela anaacutelise temporal descritos na Figura45 cinco projetos foram selecionados para uma anaacutelise detalhada levando em consideraccedilatildeoo grupo em que eles pertencem Estes projetos seratildeo apresentados a seguir

512 agera

Agera eacute uma biblioteca Android que ajuda a introduzir programaccedilatildeo funcional reativa(functional reactive programming) em projetos Android Eacute um projeto recente lanccediladoem 2016 pela Google [44] e encontra-se no grupo dos projetos que introduziram expressotildeeslambda em 2016 no mesmo ano de seu lanccedilamento contendo uma meacutedia de expressotildeeslambda de 16 lambdasnapshot

Na classificaccedilatildeo estabelecida agera pertence ao Grupo 1 onde a quantidade de ex-pressotildees lambda no projeto com o tempo aumentam juntamente com a quantidade deAICs como mostra o graacutefico de anaacutelise temporal na Figura 52

34

Figura 52 Graacuteficos de anaacutelise temporal do projeto agera

513 vertx

Eclipse Vertx eacute um conjunto de ferramentas para criaccedilatildeo de reactive applications namaacutequina virtual Java (JVM) em grande escala [45] Seu primeiro lanccedilamento aconteceuem 2011 e a primeira ocorrecircncia de expressotildees lambda no projeto aconteceu em 2014 Esteprojeto possui uma meacutedia de 2867 lambdasnapshot e dentre os projetos consideradosneste trabalho eacute o que possui a maior quantidade de expressotildees lambda

Este projeto pertence ao Grupo 2 onde a quantidade de expressotildees lambda aumen-tou consideravelmente pelos meses ultrapassando a quantidade de AICs que diminuiudrasticamente como mostra a Figura 53

35

Figura 53 Graacuteficos de anaacutelise temporal do projeto Vertx

514 Android-CleanArchitecture

Apesar de ser uma amostra de projeto Android-CleanArchitecture que tem como objetivoconstruir aplicaccedilotildees Android utilizando clean architecture foi lanccedilado em 2014 mas semanteacutem sempre atualizado [46]

A introduccedilatildeo de expressotildees lambda que aconteceu no ano de 2015 se deu de formatiacutemida com uma meacutedia de 35 lambdasnapshot De qualquer forma este projeto conseguerepresentar com seu graacutefico de anaacutelise temporal o grupo 3 composto por projetos em quea quantidade de expressotildees lambda aumentou mas sem ultrapassar AICs que diminuiacuteramdemonstrado no graacutefico da Figura 54

36

Figura 54 Graacuteficos de anaacutelise temporal do projeto Android-CleanArchitecture

515 RxJava

Dentre os repositoacuterios estudados RxJava eacute considerado o mais popular Como umaimplementaccedilatildeo de Reactive Extensions para a JVM RxJava teve seu lanccedilamento dadoem 2013 [47] Expressotildees lambda apareceram pela primeira vez no ano de 2015 comuma meacutedia de 766 lambdasnapshot

Apesar de uma meacutedia relativamente alta o tempo de vida das expressotildees lambda nesteprojeto foi bem curto caracterizando assim projetos do grupo 4 houve a introduccedilatildeo dasexpressotildees lambda no projeto poreacutem houve a remoccedilatildeo completa de todas as expressotildeeslambda previamente introduzidas desaparecendo completamente do projeto ateacute a datada coleta de dados (Figura 55)

37

Figura 55 Graacuteficos de anaacutelise temporal do projeto RxJava

516 guava

Guava eacute um conjunto de bibliotecas para Java da Google lanccedilado em 2011 A atualizaccedilatildeodo coacutedigo do projeto para Java 8 aconteceu somente em 2016 e apesar do projeto conteruma meacutedia de 281 lambdasnapshot ele foi escolhido como representante dos projetosdo Grupo 5 (Figura 56) que possuem expressotildees lambda mas de forma natildeo expressiva osuficiente quando comparado com a quantidade de AIC pelo fato de sua razatildeo de meacutedia delambdasnapshot por meacutedia de AICsnapshot ser 004 Ou seja embora o projeto tenhaexpressotildees lambda estas satildeo consideradas muito poucas quando inseridas no contextogeral deste projeto que eacute considerado um projeto grande

38

Figura 56 Graacuteficos de anaacutelise temporal do projeto Guava

52 Refatoraccedilatildeo de Coacutedigo

Com o objetivo de caracterizar melhor como as expressotildees lambda estatildeo sendo utilizadaseacute interessante identificar se estas estatildeo sendo introduzidas atraveacutes de refatoraccedilatildeo de coacutedigoou em coacutedigo novo

Os projetos classificados como pertencentes ao Grupo 2 possuem em comum o fatode expressotildees lambda aumentarem a medida que AICs diminuem ultrapassando-as eessa caracteriacutestica em comum pode indicar que nestes projetos possivelmente houve re-fatoraccedilatildeo de coacutedigo visto que AIC sendo substituiacutedo por expressotildees lambda dentro dascondiccedilotildees determinadas eacute a maneira mais comum de se identificar refatoraccedilatildeo de coacute-digo para introduccedilatildeo de expressotildees lambda [12] Os projetos que compotildeem o grupo 2representam 44 de todos os projetos estudados que possuem expressotildees lambda o quepode ser um indicativo caso a hipoacutetese de refatoraccedilatildeo de coacutedigo seja positiva de quemuitos projetos que estatildeo adotando o Java 8 estatildeo se preocupando de alguma formacom refatoraccedilatildeo se coacutedigo Fazem parte desse grupo os seguintes projetos elasticsearchjava-design-patterns PocketHub presto RxJava-Android-Samples spark vertx zipkinjava8-tutorial dropwizard e material-dialogs

39

Outra maneira de verificar possiacuteveis indicadores de refatoraccedilatildeo de coacutedigo foi atraveacutesda anaacutelise dos tamanhos (em quantidade de linhas de coacutedigo) dos meacutetodos com expressotildeeslambda no mecircs em que se introduziu expressotildees lambda e um mecircs imediatamente antesdeste Essa anaacutelise mostra que dos 25 projetos com expressotildees lambda 12 (48) projetostiveram ao menos um meacutetodo em que houve uma diminuiccedilatildeo no tamanho o que podeser considerado um indicativo de refatoraccedilatildeo de coacutedigo A Figura 57 mostra todos osprojetos em relaccedilatildeo agrave quantidade total de meacutetodos que possuem lambda no primeiro mecircsde introduccedilatildeo do mesmo em vermelho comparado com a quantidade desses meacutetodos quetiveram uma diminuiccedilatildeo no tamanho quando comparados com o coacutedigo do mecircs anteriorem azul

Figura 57 Comparaccedilatildeo entre todos os projetos com expressatildeo lambda sobre refatoraccedilatildeode coacutedigo no mecircs de introduccedilatildeo da caracteriacutestica

Ainda observando a figura 57 com relaccedilatildeo aos projetos que natildeo tiveram nenhummeacutetodo com diminuiccedilatildeo de tamanho (barra azul) percebe-se que todos os 13 projetossequer tiveram uma quantidade significativa de meacutetodos que possuem expressotildees lambda(com o maior tendo apenas 5 meacutetodos) no mecircs de introduccedilatildeo da caracteriacutestica no projetoe ao mesmo tempo jaacute existiam no mecircs em que natildeo existia lambda no projeto Essa eacuteuma observaccedilatildeo importante porque projetos como vertx sendo este o que possui a maiormeacutedia de lambdasnapshot de todos os projetos e ao mesmo tempo tendo apenas trecircsmeacutetodos que continham expressotildees lambda no mecircs da introduccedilatildeo e que existiam no mecircs

40

anterior permitem inferir que todas as outras expressotildees lambda existentes no projetopara este determinado mecircs de introduccedilatildeo encontram-se em coacutedigo novo introduzido

Eacute importante ressaltar que somente essa anaacutelise natildeo eacute exclusivamente suficiente paradeterminar se estes projetos estatildeo realmente introduzindo lambda em coacutedigo novo ourealizando refatoraccedilatildeo uma vez que como a comparaccedilatildeo aconteceu apenas no mecircs deintroduccedilatildeo com o mecircs imediatamente anterior natildeo reflete todo o ciclo de vida do pro-jeto Por exemplo algumas equipes podem escolher refatorar o coacutedigo depois de umtempo de adaptaccedilatildeo apoacutes a transiccedilatildeo para a nova versatildeo da linguagem Assim paraobter uma melhor anaacutelise sobre refatoraccedilatildeo de coacutedigo ou natildeo feita nestes projetos aleacutemde outras anaacutelises referentes aos padrotildees tipicamente adotados para implementaccedilatildeo delambda nestes projetos seratildeo apresentados a seguir os estudos de caso dos cinco projetospreviamente selecionados

Outro ponto importante eacute o fato de que apesar das informaccedilotildees quanto agraves quantida-des de filter e map terem sido incluiacutedas inicialmente no trabalho para observar possiacuteveispadrotildees de refatoraccedilatildeo de coacutedigo percebeu-se que estas natildeo satildeo utilizadas de forma con-sideraacutevel pelos projetos estudados e para fins de anaacutelises generalizadas natildeo apresentaramtanta influecircncia na utilizaccedilatildeo de expressotildees lambda quanto a quantidade de AICs noprojeto

53 Estudos de Caso

Dentre os projetos analisados verificou-se que os projetos de pequeno e meacutedio porte op-taram por refatorar de uma vez seus coacutedigos para incluir expressotildees lambda em situaccedilotildeesem que se utilizava AICs anteriormente ou em alguns poucos casos de utilizaccedilatildeo deCollection Os projetos de grande porte natildeo apresentaram nenhuma refatoraccedilatildeo de coacute-digo ou uma refatoraccedilatildeo parcial gradativa provavelmente devido agrave grande quantidade dearquivos e coacutedigo que possuem o que pode tornar o trabalho de refatoraccedilatildeo extenso ecansativo

O projeto vertx que pertence ao grupo 2 dos projetos em que a quantidade de ex-pressotildees lambda aumentaram e as de AICs diminuiacuteram com lambda ultrapassando AICsexecutou inicialmente commits em maio de 2014 com adiccedilatildeo de coacutedigo novo utilizandoexpressotildees lambda e apoacutes um mecircs realizou um commit maior com a refatoraccedilatildeo de todasas AICs para expressotildees lambda Apoacutes a refatoraccedilatildeo o projeto se preocupou em mantera utilizaccedilatildeo de expressotildees lambda ao mesmo tempo que o uso de AICs se manteve apenasaos casos de classes com interfaces natildeo funcionais A Figura 58 apresenta uma parte docommit de refatoraccedilatildeo de coacutedigo que mostra em vermelho a parte eliminada do coacutedigo(AIC) e em verde o coacutedigo novo representando a substituiccedilatildeo por uma expressatildeo lambda

41

Figura 58 Commit de refatoraccedilatildeo de coacutedigo do projeto Vertx [3]

Alguns projetos ainda natildeo se preocuparam em refatorar o coacutedigo para o uso de ex-pressotildees lambda ateacute a data deste trabalho que eacute o caso do projeto guava que apresentouum commit em 03112016 com a atualizaccedilatildeo do projeto para Java 8 Mas a partir daatualizaccedilatildeo se preocupou em utilizar as expressotildees lambda apenas na implementaccedilatildeo decoacutedigo novo O cenaacuterio em que a refatoraccedilatildeo natildeo eacute prioridade ainda eacute a realidade de vaacuteriosprojetos de grande porte visto que os dados de projetos sem nenhuma expressatildeo lambdasatildeo o maior nuacutemero neste trabalho Poreacutem projetos que jaacute adotaram a utilizaccedilatildeo do Java8 tendem a mudar isso com o passar do tempo A Figura 59 apresenta em verde umaadiccedilatildeo de coacutedigo novo com expressatildeo lambda sem a eliminaccedilatildeo de algum coacutedigo anteriora esse que estaria em vermelho

42

Figura 59 Exemplo de um arquivo do commit de adiccedilatildeo de coacutedigo novo em Java 8 doprojeto Guava [4]

Na categoria de projetos em que os AICs e expressotildees lambda aumentam proporci-onalmente (grupo 1) o projeto agera realizou um commit em 19052016 com a adiccedilatildeoda biblioteca retrolambda como dependecircncia do projeto Essa biblioteca utilizada prin-cipalmente por projetos Android permite executar coacutedigo Java 8 contendo expressotildeeslambda em Java 5 6 e 7 [48] O commit tambeacutem apresenta refatoraccedilatildeo dos AICs ad-vindos de interfaces funcionais para expressotildees lambda Apesar de o projeto continuar autilizar as expressotildees lambda em seus commits posteriores o nuacutemero de AICs tambeacutemcontinuou a aumentar visualizando os commits posteriores notou-se que esses AICs satildeorelativos a interfaces natildeo funcionais ou seja que possuem mais de um meacutetodo O projetoAndroid-CleanArchitecture eacute similar ao agera pois tambeacutem optou pela instalaccedilatildeo da bi-blioteca retrolambda para uso de expressotildees lambda em seus coacutedigos e como tambeacutem eacuteum projeto de pequeno porte houve uma pequena refatoraccedilatildeo dos AICs A Figura 510mostra a parte do commit de refatoraccedilatildeo de coacutedigo em que o desenvolvedor adiciona abiblioteca retrolambda como dependecircncia

43

Figura 510 Commit de adiccedilatildeo da biblioteca Retrolambda no projeto Agera [5]

Outro caso interessante eacute o do projeto RxJava que em 2015 optou pela refatoraccedilatildeodo coacutedigo para a utilizaccedilatildeo de expressotildees lambda quase eliminando por completo o usode AICs mas que no ano seguinte reverteu os commits de forma que eliminasse comple-tamente o uso de expressotildees lambda para manter a retrocompatibilidade com o Java 6A Figura 511 demonstra uma parte do commit de reversatildeo do coacutedigo para Java 6 emque pode ser visto em vermelho o coacutedigo anterior com expressotildees lambda e o verde como novo coacutedigo utilizando AIC novamente

44

Figura 511 Commit de remoccedilatildeo de Lambdas e volta para o uso de AICs no projetoRXJava [6]

Essa preocupaccedilatildeo com retrocompatibilidade de coacutedigo pode ser um fator crucial nadecisatildeo das equipes de desenvolvimento na hora de decidir como fazer o software co-evoluircom a linguagem sem perder a compatibilidade com versotildees anteriores

45

Capiacutetulo 6

Consideraccedilotildees Finais

Este estudo permitiu entender melhor como projetos estatildeo realizando a migraccedilatildeo para oJava 8 em especial utilizando uma nova caracteriacutestica introduzida expressatildeo lambdaApesar de a maioria dos projetos populares considerados natildeo possuiacuterem nenhuma ocor-recircncia de expressotildees lambda os projetos que tinham expressotildees lambda foram suficientespara realizar um primeiro estudo de caracterizaccedilatildeo no uso desta caracteriacutestica e com osprojetos efetivamente utilizados para estudo foi possiacutevel agrupaacute-los quanto a maneira emque as expressotildees lambda estavam sendo utilizadas quando comparadas com AICs em 5grandes grupos quando AIC e lambda aumentam proporcionalmente quando AIC dimi-nui e lambda aumenta ultrapassando AIC quando AIC diminui mas continua superior aolambda crescente expressotildees lambda que foram introduzidas e retiradas completamentedo coacutedigo e expressotildees lambda que natildeo existem em quantidades expressivas

Foi possiacutevel entatildeo realizar um estudo aprofundado levando em consideraccedilatildeo as di-ferentes maneiras com que as expressotildees lambda foram adotadas nos projetos atraveacutes daescolha de um projeto que representasse cada grupo para anaacutelise Dentre os cinco projetosestudados foi possiacutevel observar alguns padrotildees tipicamente adotados por desenvolvedorespara implementar expressotildees lambda em seus projetos como a utilizaccedilatildeo da bibliotecas(retrolambda) que permitissem uma flexibilizaccedilatildeo na utilizaccedilatildeo de expressotildees lambda oucomo lambda eacute primariamente utilizada para substituir determinados AICs ou operaccedilotildeesem Collection

Aleacutem disso foi possiacutevel observar como a refatoraccedilatildeo de coacutedigo acontece em cada umdesses projetos Observou-se como projetos menores tendem a refatorar coacutedigo maisfacilmente ao passo que projetos maiores e mais complexos fazem menos refatoraccedilatildeo oudemoram mais entre o periacuteodo em que houve a primeira migraccedilatildeo de coacutedigo para a novaversatildeo da linguagem ateacute o periacuteodo em que realmente decidem refatorar coacutedigo Aleacutem dacomplexidade do projeto influenciar na decisatildeo de migrar o projeto para uma versatildeo maisrecente da linguagem a preocupaccedilatildeo com retrocompatibilidade com versotildees anteriores da

46

linguagem tambeacutem podem ser uma barreira para que projetos comecem a evoluir o coacutedigojuntamente com a evoluccedilatildeo da linguagem

Ainda assim foi possiacutevel observar que a preocupaccedilatildeo com a co-evoluccedilatildeo do software-linguagem existe entre os desenvolvedores de projetos mas a realizaccedilatildeo da migraccedilatildeo aindaacontece lentamente devido agrave diversos fatores que precisam ser levados em consideraccedilatildeopara a manutenccedilatildeo do projeto

Para trabalhos e contribuiccedilotildees futuras seria interessante desenvolver uma ferramentaque pudesse analisar diretamente no coacutedigo-fonte as oportunidades de aplicaccedilatildeo de ex-pressotildees lambda dessa forma poderiam ser analisadas as porcentagens de conversatildeo decoacutedigo para Java 8 e obter melhores conclusotildees sobre a importacircncia que os projetos estatildeodando para a evoluccedilatildeo de seus coacutedigos Outro fator interessante seria aplicar mais Visitorsagrave ferramenta static-analysis e fazer este mesmo estudo aplicado agrave outras caracteriacutesticasda linguagem

47

Referecircncias

[1] Kagdi Huzefa Michael L Collard e Jonathan I Maletic A survey and taxonomyof approaches for mining software repositories in the context of software evolution2007 ix 3 8 9 10 11

[2] DBeaver Dbeaver - features httpdbeaverjkissorgdocsfeatures ix 29

[3] Eclipse Vertx commit Java8-ify code httpsgithubcomeclipsevertxcommit93f95e9c77419f442a42fe711b6eeaef88192fd3 ix 42

[4] Google Guava commit Release java 8 changes to guava httpsgithubcomgoogleguavacommit73e382fa877f80994817a136b0adcc4365ccd904 ix 43

[5] Google Agera commit Collapsed testapp with retrolambda httpsgithubcomgoogleageracommit5e518b7b05f9e7a34a314945f68deff7b2c3e334 ix 44

[6] ReactiveX Rxjava commit 2x full jdk 6 compatible backport + includ-ing bugfixes up to today httpsgithubcomReactiveXRxJavacommit000a174d87a901135f9665d3b11f3627fd2dc4ed ix 45

[7] Godfrey M W e D M German The past present and future of software evolutionEm 2008 Frontiers of Maintenance paacuteginas 129ndash138 Sept 2008 1 6

[8] Favre J M Languages evolve too changing the software time scale Em Principles ofSoftware Evolution Eighth International Workshop on paacuteginas 33ndash42 IEEE 20051 5 7

[9] Overbey Jeffrey L e Ralph E Johnson Regrowing a language refactoring tools allowprogramming languages to evolve Em ACM SIGPLAN Notices volume 44 paacuteginas493ndash502 ACM 2009 1 5 7 8 12

[10] Grechanik Mark Collin McMillan Luca DeFerrari Marco Comi Stefano CrespiDenys Poshyvanyk Chen Fu Qing Xie e Carlo Ghezzi An empirical investiga-tion into a large-scale java open source code repository Em Proceedings of the2010 ACM-IEEE International Symposium on Empirical Software Engineering andMeasurement ESEM rsquo10 paacuteginas 111ndash1110 New York NY USA 2010 ACMISBN 978-1-4503-0039-1 httpdoiacmorg10114518527861852801 1

[11] TIOBE Tiobe httpswwwtiobecomtiobe-index 1 14

48

[12] Gyori Alex Lyle Franklin Danny Dig e Jan Lahoda Crossing the gap from im-perative to functional programming through refactoring Em Proceedings of the 20139th Joint Meeting on Foundations of Software Engineering ESECFSE 2013 paacute-ginas 543ndash553 New York NY USA 2013 ACM ISBN 978-1-4503-2237-9 httpdoiacmorg10114524914112491461 2 11 24 39

[13] OpenJDK State of the lambda httpcropenjdkjavanet~briangoetzlambdalambda-state-4html 2

[14] Han Jiawei Micheline Kamber e Jian Pei Data Mining Concepts and TechniquesMorgan Kaufmann Publishers Inc San Francisco CA USA 3rd ediccedilatildeo 2011ISBN 0123814790 9780123814791 3

[15] Fowler Martin e Kent Beck Refactoring improving the design of existing codeAddison-Wesley Professional 1999 5 7

[16] Lehman M M J F Ramil P D Wernick D E Perry e W M Turski Met-rics and laws of software evolution - the nineties view Em Proceedings of the4th International Symposium on Software Metrics METRICS rsquo97 paacuteginas 20ndashWashington DC USA 1997 IEEE Computer Society ISBN 0-8186-8093-8 httpdlacmorgcitationcfmid=823454823901 6

[17] Hassan Ahmed E e Tao Xie Software intelligence The future of mining softwareengineering data Em Proceedings of the FSESDP Workshop on Future of SoftwareEngineering Research FoSER rsquo10 paacuteginas 161ndash166 New York NY USA 2010ACM ISBN 978-1-4503-0427-6 httpdoiacmorg101145188236218823978 9

[18] Hassan Ahmed E The road ahead for mining software repositories Em Frontiers ofSoftware Maintenance 2008 FoSM 2008 paacuteginas 48ndash57 IEEE 2008 8

[19] Berry Michael J e Gordon Linoff Data Mining Techniques For Marketing Salesand Customer Support John Wiley amp Sons Inc New York NY USA 1997ISBN 0471179809 10

[20] Parnin Chris Christian Bird e Emerson Murphy-Hill Java generics adoption hownew features are introduced championed or ignored Em Proceedings of the 8thWorking Conference on Mining Software Repositories paacuteginas 3ndash12 ACM 2011 12

[21] Oracle The java language specification httpsdocsoraclecomjavasespecsjlsse8jls8pdf 13

[22] Oracle The history of java technology httpwwworaclecomtechnetworkjavajavaseoverviewjavahistory-index-198355html 13

[23] Murphy Kieron So why did they decide to call itjava httpwwwjavaworldcomarticle2077265core-javaso-why-did-they-decide-to-call-it-java-html 13

[24] McGraw Tata Object-oriented Programming with Java Essentials and ApplicationsHill Education 13

49

[25] Oracle Differences between java ee and java se httpdocsoraclecomjavaee6firstcupdocgkhoyhtml 13

[26] Lindsey Clark S The History of Java Cambridge 14

[27] Oracle The java language environment httpwwworaclecomtechnetworkjavaintro-141325html 14

[28] Oracle Jdk 8 httpopenjdkjavanetprojectsjdk8 15 24

[29] Oracle Enhancements in java se 8 httpdocsoraclecomjavase8docstechnotesguideslanguageenhancementshtmljavase8 15 16 17

[30] Oracle Lambda expressions httpdocsoraclecomjavasetutorialjavajavaOOlambdaexpressionshtml 16 18 21

[31] Oracle Method references httpdocsoraclecomjavasetutorialjavajavaOOmethodreferenceshtml 16

[32] Oracle Default methods httpdocsoraclecomjavasetutorialjavaIandIdefaultmethodshtml 17

[33] Oracle Repeating annotations httpdocsoraclecomjavasetutorialjavaannotationsrepeatinghtml 17

[34] Oracle Type annotations httpdocsoraclecomjavasetutorialjavaannotationstype_annotationshtml 17

[35] Oracle Anonymous inner classes httpsdocsoraclecomjavasetutorialjavajavaOOanonymousclasseshtml 19

[36] Kothari CR Research Methodology Methods and Techniques New Age Interna-tional (P) Limited 2004 ISBN 9788122415223 httpsbooksgooglecombrbooksid=8c6gkbKi-F4C 22

[37] Nakakoji Kumiyo Yasuhiro Yamamoto Yoshiyuki Nishinaka Kouichi Kishida eYunwen Ye Evolution patterns of open-source software systems and communitiesEm IWPSE rsquo02 Proceedings of the International Workshop on Principles of SoftwareEvolution paacuteginas 76ndash85 New York NY USA 2002 ACM Press ISBN 1581135459httpdxdoiorg101145512035512055 23

[38] Rahman Foyzur Christian Bird e Premkumar Devanbu Clones What is that smellEmpirical Software Engineering 17(4-5)503ndash530 2012 24

[39] Chacon Scott Pro Git Apress Berkely CA USA 1st ediccedilatildeo 2009ISBN 1430218339 9781430218333 25

[40] Cavalcanti Thiago Gomes e Viniacutecius Correa de Almeida Caracterizaccedilatildeo do uso deconstruccedilotildees da linguagem java em projetos open-source Publicaccedilatildeo online 2016httpbdmunbbrhandle1048315733 27

50

[41] Parr Terence Language Implementation Patterns Create Your Own Domain-Specific and General Programming Languages Pragmatic Bookshelf 1st ediccedilatildeo 2009ISBN 193435645X 9781934356456 27

[42] Janssen Thorben 5 reasons to use jpa hibernate Publicaccedilatildeo online httpswwwsitepointcom5-reasons-to-use-jpa-hibernate 27

[43] Franklin Lyle Alex Gyori Jan Lahoda e Danny Dig Lambdaficator From imperativeto functional programming through automated refactoring Em Proceedings of the2013 International Conference on Software Engineering ICSE rsquo13 paacuteginas 1287ndash1290 Piscataway NJ USA 2013 IEEE Press ISBN 978-1-4673-3076-3 httpdlacmorgcitationcfmid=24867882486986 29

[44] Google Agera httpsgithubcomgoogleagerawiki 34

[45] Eclipse Eclipse vertx httpvertxio 35

[46] Cejas Fernando Android cleanarchitecture httpsgithubcomandroid10Android-CleanArchitecture 36

[47] ReactiveX Rxjava httpsgithubcomReactiveXRxJava 37

[48] Luontola Esko Retrolambda httpsgithubcomorfjackalretrolambda 43

51

Anexo I

Projetos utilizados

fastjson

platform_frameworks_base

netty

material-dialogs

kotlin

okhttp

tinker

AndroidUtilCode

RxJava

spring-boot

java-design-patterns

elasticsearch

ExoPlayer

kafka

vertx

realm-java

guava

zipkin

bazel

stetho

Signal-Android

glide

agera

fresco

plaid

presto

libgdx

spark

52

disruptor

lottie-android

flexbox-layout

PocketHub

zxing

spring-framework

deeplearning4j

dropwizard

interviews

BaseRecyclerViewAdapterHelper

uCrop

DanmakuFlameMaster

lottie-react-native

android-UniversalMusicPlayer

AndroidInterview-Q-A

greenDAO

retrofit

MaterialDrawer

BottomBar

druid

MPAndroidChart

Hystrix

guice

recyclerview-animators

dubbo

androidannotations

RxJava-Android-Samples

PhotoView

clojure

CircleImageView

AndroidSwipeLayout

jedis

MaterialViewPager

butterknife

junit4

RxBinding

leakcanary

SimianArmy

picasso

UltimateRecyclerView

53

AndroidViewAnimations

AppIntro

FizzBuzzEnterpriseEdition

ion

cheesesquare

physical-web

RxAndroid

Android-CleanArchitecture

Calligraphy

Android-Bootstrap

iosched

Android_Data

MaterialDesignLibrary

ListViewAnimations

EventBus

java8-tutorial

AndroidSlidingUpPanel

dagger

okhttputils

logger

HomeMirror

Material-Animations

android-Ultra-Pull-To-Refresh

android-async-http

Android-ObservableScrollView

Android-Universal-Image-Loader

ActionBarSherlock

SlidingMenu

storm

PagerSlidingTabStrip

Android-PullToRefresh

54

  • Dedicatoacuteria
  • Agradecimentos
  • Resumo
  • Abstract
  • Introduccedilatildeo
    • Contexto
    • Objetivos
      • Objetivos Gerais
      • Objetivos Especiacuteficos
        • Metodologia
        • Organizaccedilatildeo do Trabalho
          • Evoluccedilatildeo e Mineraccedilatildeo de Repositoacuterios de Software
            • Evoluccedilatildeo de Software
            • MSR Mineraccedilatildeo de dados e a Engenharia de Software
              • Classificaccedilatildeo
                • Trabalhos Relacionados
                  • Java SE 8 e JDK 8
                    • Histoacuterico
                    • Princiacutepios
                    • Evoluccedilatildeo
                    • Expressotildees Lambda
                      • Sintaxe
                      • Principais formas de uso
                          • Estudo e o Processo de Mineraccedilatildeo
                            • Questotildees de Pesquisa
                            • Fonte de Dados e Objetos de Estudo
                            • Processo de Mineraccedilatildeo
                              • static-analysis
                              • BDAnalisador
                                • Classificaccedilatildeo e Anaacutelise
                                  • Meacutedia de Lambda
                                  • Anaacutelise Temporal
                                  • Refatoraccedilatildeo de Coacutedigo
                                  • Casos de Uso
                                      • Resultados Obtidos e Anaacutelise
                                        • Visatildeo Geral
                                          • Projetos Selecionados
                                          • agera
                                          • vertx
                                          • Android-CleanArchitecture
                                          • RxJava
                                          • guava
                                            • Refatoraccedilatildeo de Coacutedigo
                                            • Estudos de Caso
                                              • Consideraccedilotildees Finais
                                              • Referecircncias
                                              • Anexo
                                              • Projetos utilizados

Apoacutes anos de evoluccedilatildeo e aprimoramento atraveacutes de diversas versotildees como visto naTabela 31 hoje o Java se tornou uma das linguagens de programaccedilatildeo mais utilizadas nomundo estando em aproximadamente 15 das linhas de coacutedigo disponiacuteveis pela inter-net [11] A quantidade de plataformas suportadas pela linguagem e com o advento dosistema operacional Android sendo rodado na maior parte dos smartphones do mundoaleacutem da simplicidade em codificar no paradigma orientado a objetos foram os fatoresrelevantes para que a linguagem se popularizasse no mundo digital [26]

Tabela 31 As versotildees anteriores de java e principais caracteriacutesticasVersatildeo Principais caracteriacutesticasJava 10 JVM e JDKJava 2 Event Listeners

Kestrel (Java 3) HotSpot JVMMerlin (Java 4) Diversas novas APIs como Assertion e expressotildees regularesTiger (Java 5) Generics

Mustang (Java 6) Web ServicesDolphin (Java 7) Suporte a linguagens dinamicas

32 Princiacutepios

Com o foco em alcanccedilar a Web e participar mais ativamente do mercado virtual e e-Commerce foram projetados princiacutepios que permitissem com que a linguagem pudessealcanccedilar seus objetivos principais ao mesmo tempo que mantinha a facilidade e fami-liarizaccedilatildeo da linguagem a seus desenvolvedores [27] Dessa forma a equipe da Oracledeterminou cinco princiacutepios que caracterizariam o foco da linguagem Java

bull simples orientada a objeto e familiar projetada para ser orientada a objeto epermitir que seus desenvolvedores comecem a codificar rapidamente sem a necessi-dade de uma curva de aprendizagem acentuada

bull segura e robusta projetada para prover software confiaacutevel por meio de checagensa tempo de compilaccedilatildeo e execuccedilatildeo Haacute uma grande preocupaccedilatildeo com seguranccediladevido agrave larga utilizaccedilatildeo da linguagem em sistemas distribuiacutedos

bull de arquitetura neutra e portaacutevel projetada para ser independente de qualquerarquitetura bastando rodar a JVM dessa forma garantindo a portabilidade paravaacuterios ambientes e dispositivos

14

bull executada em alta performance projetada para fornecer a maior performancepossiacutevel em tempo de execuccedilatildeo com a utilizaccedilatildeo do garbage collector em uma threadde baixa prioridade

bull interpretada dinacircmica e threaded projetada para ser interpretada por qual-quer dispositivo que possua JVM desenvolvida garantindo um desenvolvimento raacute-pido e em ciclos O uso da classe Thread permite que a linguagem acompanhe atendecircncia do paralelismo Aleacutem disso a ligaccedilatildeo de classes eacute feita em tempo real esomente quando necessaacuteria tornando-a dinacircmica

33 Evoluccedilatildeo

A primeira versatildeo do Java 8 foi lanccedilada em 2014 [28] e apresentou diversas atualizaccedilotildeesespalhadas em categorias como linguagem seguranccedila Collections ferramentas deployentre outras Dentre a grande quantidade de mudanccedilas os destaques se encontraram nasnovas melhorias presentes na linguagem que afetaram de forma mais direta a maneiracom que os desenvolvedores passaram a tratar e organizar o coacutedigo fonte As atualizaccedilotildeesreferentes a linguagem descritas oficialmente pela Oracle [29] satildeo

1 Lambda Expressions ou apenas Expressotildees Lambda correspondem a uma novacaracteriacutestica que permite que uma pequena funcionalidade possa ser utilizada comoum argumento de um meacutetodo facilitando a escrita de accedilotildees que seratildeo feitas repetida-mente em uma Collection ou quando um processo se completa ou quando encontraum erro Eacute tambeacutem uma forma compacta de se escrever coacutedigo que previamenteera escrito com anonymous inner classes [29] A Listagem 31 mostra uma classehipoteacutetica Calculator cujo meacutetodo operateBinary() recebe como paracircmetro doisinteiros e um objeto da classe IntegerMath que representa a operaccedilatildeo que deveraacuteser realizada ou seja uma funcionalidade dinacircmica

1 pub l i c c l a s s Ca l cu la to r 2

3 i n t e r f a c e IntegerMath 4 i n t opera t i on ( i n t a i n t b) 5 6

7 pub l i c i n t operateBinary ( i n t a i n t b IntegerMath op ) 8 re turn op opera t i on (a b) 9

10

11 pub l i c s t a t i c void main ( St r ing a rgs ) 12

15

13 Calcu la to r myApp = new Ca lcu la to r ( ) 14 IntegerMath add i t i on = (a b) minusgt a + b 15 IntegerMath subt ra c t i on = (a b) minusgt a minus b 16 System out p r i n t l n ( 40 + 2 = +17 myApp operateBinary (40 2 add i t i on ) ) 18 System out p r i n t l n ( 20 minus 10 = +19 myApp operateBinary (20 10 sub t ra c t i on ) ) 20 21 22

Listagem 31 Exemplo de coacutedigo com o uso de Expressatildeo Lambda [30]

2 Method References Frequentemente expressotildees lambda criam meacutetodos anocircni-mos Algumas vezes poreacutem satildeo utilizadas para chamar um meacutetodo jaacute existentena classe Ao inveacutes de escrever a expressatildeo Lambda para esse caso pode-se optarpor utilizar um Method Reference que facilita a escrita e leitura desse uso de ex-pressatildeo Lambda [29] A Listagem 32 mostra um exemplo de um meacutetodo estaacuteticoque compara duas pessoas pelas suas idades e a Listagem 33 a utilizaccedilatildeo de MethodReference para aplicar a utilizaccedilatildeo desse meacutetodo em um array e reduzir a escrita deuma expressatildeo lambda a uma forma mais legiacutevel

1 pub l i c s t a t i c i n t compareByAge ( Person a Person b) 2 re turn a b i r thday compareTo (b b i r thday ) 3 4

Listagem 32 Exemplo de meacutetodo de uma classe Pessoa [31]

1 Arrays s o r t ( rosterAsArray Person compareByAge ) 2

Listagem 33 Exemplo de uso de Method Reference [31]

3 Default Methods satildeo meacutetodos com a palavra-chave default que servem para adi-cionar implementaccedilotildees de meacutetodos a uma interface de alguma biblioteca mantendoa compatibilidade binaacuteria com versotildees mais antigas dessa interface Tambeacutem pos-sibilita a implementaccedilatildeo de meacutetodos estaacuteticos em interfaces [29] A Listagem 34apresenta a inclusatildeo de um meacutetodo default na interface TimeClient

1 pub l i c i n t e r f a c e TimeClient 2 void setTime ( i n t hour i n t minute i n t second ) 3 void setDate ( i n t day i n t month i n t year ) 4 void setDateAndTime ( i n t day i n t month i n t year 5 i n t hour i n t minute i n t second )

16

6 LocalDateTime getLocalDateTime ( ) 7

8 s t a t i c ZoneId getZoneId ( S t r ing zoneStr ing ) 9 t ry

10 re turn ZoneId o f ( zoneStr ing ) 11 catch ( DateTimeException e ) 12 System e r r p r i n t l n ( I n v a l i d time zone + zoneStr ing

+13 us ing d e f a u l t time zone in s t ead ) 14 re turn ZoneId systemDefault ( ) 15 16 17

18 d e f a u l t ZonedDateTime getZonedDateTime ( St r ing zoneStr ing ) 19 re turn ZonedDateTime o f ( getLocalDateTime ( ) getZoneId (

zoneStr ing ) ) 20 21 22

Listagem 34 Exemplo de interface com um meacutetodo default [32]

4 Repeating Annotations permitem a implementaccedilatildeo e utilizaccedilatildeo de anotaccedilotildees deum mesmo tipo que podem ser utilizadas mais de uma vez para a mesma declara-ccedilatildeo [29] A Listagem 35 apresenta duas anotaccedilotildees iguais com paracircmetros diferentespermitindo uma customizaccedilatildeo maior na aplicaccedilatildeo de um tipo de anotaccedilatildeo

1 Schedule ( dayOfMonth= l a s t )2 Schedule (dayOfWeek= Fr i hour= 23 )3 pub l i c void doPeriodicCleanup ( ) 4

Listagem 35 Exemplo de Repeating Annotations [33]

5 Type Annotations permitem que anotaccedilotildees possam ser utilizadas em tipos aleacutemde declaraccedilotildees dessa forma pode-se garantir que um campo sempre atenda agraves suasexpectativas e evite testes desnecessaacuterios [29] A Listagem 36 mostra um exemplo derestriccedilatildeo a uma String que nunca poderaacute ser nula devido agrave anotaccedilatildeo de NonNull

1 NonNull S t r ing s t r

Listagem 36 Exemplo de Type Annotation garantindo que o campo nunca seja null [34]

17

34 Expressotildees Lambda

Uma das mudanccedilas mais interessantes implementadas no Java 8 foi a adiccedilatildeo de expressotildeeslambda As expressotildees lambda permitem que a linguagem Java possa atuar parcialmentecomo uma linguagem de programaccedilatildeo funcional onde comportamentos satildeo avaliados eaplicados diferentemente da programaccedilatildeo imperativa que foca na mudanccedila de estadosNa praacutetica um comportamento pode ser passado como paracircmetro de um meacutetodo atraveacutesde uma escrita mais reduzida e legiacutevel Os benefiacutecios de utilizar expressotildees lambda incluemuma melhora na legibilidade e organizaccedilatildeo de coacutedigo que antes era escrito com AnonymousInner Class aleacutem de permitir uma forma simples de utilizar comportamento paralelo como uso de Streams

341 Sintaxe

A sintaxe de uma expressatildeo lambda eacute dividida nas seguintes partes [30]

bull Uma lista de paracircmetros separados por viacutergulas

bull Um token representado por uma seta -gt

bull Um corpo que pode ser representado por uma expressatildeo uacutenica ou um bloco de coacutedigodentro de chaves

As Listagens 37 e 38 mostram duas formas diferentes de se aplicar expressotildees Lambdacom uma sintaxe similar A primeira aplica a expressatildeo diretamente apoacutes a seta utilizadanormalmente para trechos de coacutedigo pequenos e simples e a segunda utiliza-se de chavespara incorporar o coacutedigo e da palavra-chave return para especificar o retorno forma maisutilizada para uma quantidade maior de coacutedigo

1 p minusgt p getGender ( ) == Person Sex MALE2 ampamp p getAge ( ) gt= 183 ampamp p getAge ( ) lt= 25

Listagem 37 Exemplo de expressatildeo lambda com uma expressatildeo [30]

1 p minusgt 2 re turn p getGender ( ) == Person Sex MALE3 ampamp p getAge ( ) gt= 184 ampamp p getAge ( ) lt= 25 5

Listagem 38 Exemplo de expressatildeo lambda com um bloco de coacutedigo [30]

18

342 Principais formas de uso

Anonymous Inner Class

Antes do Java 8 a necessidade de passar funccedilotildees ou expressotildees como paracircmetro de algummeacutetodo era suprida atraveacutes de Anonymous Inner Classes A utilizaccedilatildeo desse tipo dedeclaraccedilatildeo junto com a anotaccedilatildeo de Override permite sobrescrever um meacutetodo de umainterface funcional e ao mesmo tempo passa-la como argumento para um meacutetodo Umaexpressatildeo lambda se comporta da mesma forma poreacutem a quantidade de coacutedigo escritopela Anonymous Inner Class eacute maior e pode dificultar a leitura de coacutedigo pois conteacutemmuita informaccedilatildeo natildeo utilizada para efetivo entendimento do que estaacute sendo feito naqueletrecho

A Listagem 39 apresenta a instanciaccedilatildeo da classe EventHandler internamente ao meacute-todo setOnAction() de forma que o desenvolvedor possa escrever o comportamento quedeseja passar como paracircmetro do meacutetodo atraveacutes da substituiccedilatildeo do meacutetodo handle()que jaacute existe pelo meacutetodo handle() criado e escrito pelo desenvolvedor

1 btn setOnAction (new EventHandlerltActionEvent gt() 2 Override3 pub l i c void handle ( ActionEvent event ) 4 System out p r i n t l n ( He l lo World ) 5 6 )

Listagem 39 Exemplo de uso de Anonymous Inner Class [35]

Interface funcional

Ao projetar um coacutedigo novo o desenvolvedor que optar por utilizar expressotildees lambdadeve iniciar com a criaccedilatildeo de uma interface funcional Esse tipo de interface possui umuacutenico meacutetodo abstrato permitindo que expressotildees lambda sejam usadas para sobrescrevero comportamento do meacutetodo abstrato Uma interface funcional pode possuir outros meacuteto-dos desde que sejam default Uma nova anotaccedilatildeo FunctionalInterface foi adicionadacom a atualizaccedilatildeo do Java 8 para conferir em tempo de compilaccedilatildeo se a interface satisfazos requisitos desse modelo de interface

A Listagem 310 apresenta um exemplo de interface funcional com o objetivo de permi-tir o uso de expressotildees lambda que utilizaratildeo de dois Double como paracircmetro e jaacute utilizada nova anotaccedilatildeo FunctionalInterface introduzida no Java 8

1 Funct iona l Inte r face2 pub l i c i n t e r f a c e DoubleOp 3 pub l i c Double apply ( Double a Double b)

19

4

Listagem 310 Exemplo de interface funcional

Dessa forma conforme as Listagens 311 e 312 o meacutetodo apply() pode tomar formade qualquer operaccedilatildeo entre dois Double que seraacute especificada quando a expressatildeo lambdafor montada dando o aspecto de linguagem funcional agrave linguagem e mais facilidade eliberdade ao desenvolvedor

1 pub l i c c l a s s Ca l cu la to r 2 pub l i c s t a t i c Double c a l c ( Double op1 Double op2 DoubleOp operator ) 3 re turn operator apply ( op1 op2 ) 4 5

Listagem 311 Exemplo de aplicaccedilatildeo da interface funcional

1 Double r e s u l t 1 = Ca lcu la to r c a l c (10d 50d ( a b ) minusgt a + b)

Listagem 312 Uso de expressatildeo lambda para o exemplo anterior

Collections

Dentre as atualizaccedilotildees de pacotes do Java 8 foi adicionado um meacutetodo stream() nainterface Collection Esse meacutetodo trata as Collection como streams o que significa queapesar de natildeo ser possiacutevel acessar elementos diretamente algumas novas manipulaccedilotildeessatildeo possiacuteveis Essas manipulaccedilotildees satildeo na verdade meacutetodos da interface Stream quepodem receber como paracircmetro uma expressatildeo lambda ou seja um comportamento a seraplicado agrave Collection Dentre os meacutetodos temos

bull filter() O meacutetodo filter() recebe uma expressatildeo lambda contendo uma condiccedilatildeopara filtragem da collection

bull map() O meacutetodo map() mapeia os elementos de uma Collection em outro objetocomo uma String A expressatildeo lambda passada por paracircmetro deve retornar o tipode objeto ao qual seraacute mapeado

bull forEach() O meacutetodo forEach() aplica uma operaccedilatildeo especiacutefica para cada ele-mento da Collection A expressatildeo lambda a ser passada deve conter a operaccedilatildeo aser realizada

bull min() e max() Os meacutetodos min() e max() retornam o elemento menor ou maiorda Collection dependendo da expressatildeo lambda passada como paracircmetro

20

A Listagem 313 demonstra como vaacuterias operaccedilotildees com uma Collection podem seraplicadas de uma vez de forma que lendo a expressatildeo lambda jaacute eacute possiacutevel saber oresultado da aplicaccedilatildeo do meacutetodo agrave Collection

1 r o s t e r2 stream ( )3 f i l t e r (4 p minusgt p getGender ( ) == Person Sex MALE5 ampamp p getAge ( ) gt= 186 ampamp p getAge ( ) lt= 25)7 map(p minusgt p getEmailAddress ( ) )8 forEach ( emai l minusgt System out p r i n t l n ( emai l ) )

Listagem 313 Exemplo de utilizaccedilatildeo de meacutetodos de stream com expressotildees lambda [30]

21

Capiacutetulo 4

Estudo e o Processo de Mineraccedilatildeo

A definiccedilatildeo da metodologia utilizada para realizaccedilatildeo deste trabalho eacute importante para queexista uma padronizaccedilatildeo e melhor entendimento de como os resultados foram obtidos paraque a replicaccedilatildeo do mesmo possa ser realizada em trabalhos futuros [36]

Figura 41 Processo utilizado para realizaccedilatildeo do estudo

O esquema representado na Figura 41 descreve o processo seguido para a realizaccedilatildeodeste trabalho que foi divido em trecircs grandes etapas a de planejamento definindo osobjetivos questotildees de pesquisa e meios de investigaccedilatildeo deste projeto a etapa de execuccedilatildeorealizando todo o procedimento metodoloacutegico definido para a coleta e refinamento de

22

dados e a etapa de avaliaccedilatildeo onde foram classificados e avaliados os dados coletadospara responder agraves questotildees de pesquisa

A seguir na primeira seccedilatildeo seratildeo apresentadas em detalhes as questotildees de pesquisa aserem respondidas Em seguida seraacute feito uma breve descriccedilatildeo da fonte de dados utilizada- especificamente os projetos utilizados como objetos de estudo deste trabalho e por fimtodo o restante da metodologia que foi de fato desenvolvida para obter os resultadosnecessaacuterios

41 Questotildees de Pesquisa

Com o objetivo de entender e caracterizar melhor o uso de expressotildees lambda foramdefinidas as seguintes questotildees de pesquisa a serem respondidas

bull PQ-1 Quando os projetos comeccedilaram a introduzir o uso de expressotildees lambda emseus coacutedigos e qual a meacutedia de expressotildees lambda por snapshots caso existam

bull PQ-2 Como as equipes de desenvolvimento estatildeo utilizando expressotildees lambdaatraveacutes de refatoraccedilatildeo de coacutedigo ou introduzindo apenas em coacutedigo novo

bull PQ-3 Quais satildeo os padrotildees tipicamente adotados para o uso de expressotildees lambda

A primeira pergunta de pesquisa gira em torno de como projetos populares open-sourceestatildeo se adaptando agrave introduccedilatildeo de expressotildees lambda em Java muitos projetos jaacute estatildeoutilizando as expressotildees lambda Se sim a partir de quando comeccedilaram a utilizaacute-lasdesde o iniacutecio da introduccedilatildeo das mesmas no Java 8 ou em um periacuteodo mais tardio Aleacutemdisso eacute interessante descobrir se a utilizaccedilatildeo dessa nova caracteriacutestica tem acontecido deforma expressiva ou natildeo

Em seguida para melhor entender a forma como as expressotildees lambda estatildeo sendointroduzidas em projetos eacute interessante investigar se as equipes de desenvolvimento estatildeose preocupando em refatorar coacutedigo com o objetivo de evoluir o software ou se estatildeoexperimentando utilizar expressotildees lambda apenas em coacutedigo novo introduzido

Como a introduccedilatildeo de novas funcionalidades em projetos open-source de grande escaladepende do objetivo do projeto e os padrotildees de projeto utilizados [37] espera-se obser-var diversas abordagens quanto a utilizaccedilatildeo de expressotildees lambda para entatildeo poderclassificar estes softwares quanto a abordagem utilizada

Eacute de grande importacircncia para este estudo conseguir identificar na praacutetica comoexpressotildees lambda estatildeo sendo tipicamente adotadas nestes projetos Assim a terceirapergunta de pesquisa busca identificar alguns exemplos de utilizaccedilatildeo atraveacutes da realizaccedilatildeode alguns estudos de caso

23

Eacute importante ressaltar que apesar de as expressotildees lambda serem uma alternativa aouso de AIC elas natildeo os substituem completamente Existem precondiccedilotildees para que umaAIC possa ser substituiacuteda por expressotildees lambda [12] descritas a seguir

bull AIC deve instanciar-se de uma interface

bull AIC natildeo deve possuir nenhum campo e declarar apenas um meacutetodo

bull AIC natildeo deve possuir uma referecircncia para this ou super

bull AIC natildeo deve declarar um meacutetodo recursivo

Para responder agrave primeira pergunta apenas dados gerais sobre todos os projetos seratildeonecessaacuterios ao passo que pelas perguntas 2 e 3 possuiacuterem uma natureza mais complexaseraacute necessaacuterio aleacutem de uma anaacutelise geral estatiacutestica a realizaccedilatildeo de alguns estudos decaso para obter resultados mais completos

42 Fonte de Dados e Objetos de Estudo

Para responder agraves perguntas de pesquisa estabelecidas foram selecionados os 99 projetosmais populares na linguagem Java dentro da plataforma github ateacute a data da coleta dosdados feita em Abril de 2017 Satildeo considerados populares os repositoacuterios que possuema maior quantidade possiacutevel de estrelas (stars) A decisatildeo de escolher os 99 projetos maispopulares foi por sua natureza imparcial e ao mesmo tempo para que se possa analisarprojetos que satildeo de familiaridade e conhecimento da comunidade do github e de domiacuteniopuacuteblico Os 99 projetos estatildeo listados no Anexo I

Para entender a transiccedilatildeo feita por esses projetos entre as versotildees anteriores do Java eo Java 8 com as expressotildees lambda eacute necessaacuterio analisar o coacutedigo de vaacuterias versotildees a fimde observar alguma mudanccedila para cada projeto Como satildeo 99 projetos e vaacuterios dessesprojetos possuem milhares de linhas de coacutedigo e commits seria impossiacutevel avaliar todosos commits Optou-se entatildeo por coletar snapshots mensais de cada projeto conformeprocedimento tambeacutem seguido anteriormente [38] Cada snapshots representa o estadodo projeto em um determinado mecircs e como criteacuterio de escolha padratildeo todos os snapshotsequivalem ao uacuteltimo commit realizado no determinado mecircs que este representa

O proacuteximo passo eacute determinar o periacuteodo de tempo em que esses snapshots seriamcoletados Como Java 8 (e consequentemente as expressotildees lambda) foi introduzidoapenas em meados de 2014 [28] coletar dados de projetos a partir de um periacuteodo muitoantes deste ano natildeo agregaria valor ao estudo em questatildeo Definiu-se entatildeo um periacuteodopara a coleta mensal desses snapshots atraveacutes dos anos Janeiro de 2013 um ano antesda introduccedilatildeo do Java 8 para que se pudesse identificar para todos os projetos o mecircs

24

exato em que expressotildees lambda foram introduzidas ateacute o mecircs da coleta de dados Abrilde 2017

Eacute importante ressaltar que a definiccedilatildeo dos meses foi definida do dia primeiro de ummecircs ao dia primeiro do proacuteximo mecircs e por consequecircncia alguns snapshots que deveriamrepresentar o final de determinado mecircs correspondem na verdade a commits realizadosno dia primeiro do mecircs seguinte Por exemplo pode existir casos em que o commit querepresente o mecircs de Marccedilo de 2016 seja na verdade o commit realizado no dia primeirode Abril de 2016 Isso se deve a natureza da forma como os resultados de log de commitssatildeo obtidos pelo git [39] Poreacutem isso natildeo interfere nas anaacutelises ou no propoacutesito destetrabalho uma vez que foram realizadas verificaccedilotildees e validaccedilotildees para que natildeo existamdatas repetidas (e consequentemente commits repetidos) por repositoacuterio

Neste trabalho o termo projeto e repositoacuterio foram utilizados de forma intercaladapara representar a mesma coisa o software desenvolvido que possui um repositoacuterio naplataforma github Os termos commit snapshops e versotildees tambeacutem representam a mesmacoisa uma vez que foi definido que seriam utilizados apenas um commit por mecircs pararepresentar um determinado snapshot ou versatildeo do repositoacuterio em questatildeo

Todos os 99 projetos seratildeo utilizados para a realizaccedilatildeo de uma anaacutelise geral de ca-racterizaccedilatildeo do uso de expressotildees lambda Para as anaacutelises aprofundadas foi feito umcriteacuterio de classificaccedilatildeo para que apenas alguns projetos possam ser analisados em niacutevelde coacutedigo como estudos de caso

Resumindo foram escolhidos os 99 projetos mais populares de Java no github cole-tando dados mensais de seus commits a partir do ano de 2013 ateacute a data da coleta dosdados lembrando que nem todos os projetos existem desde 2013 (projetos mais recentes)

43 Processo de Mineraccedilatildeo

A abordagem utilizada para coletar e analisar os 99 projetos escolhidos como mostra aFigura 42 foi realizada de forma automatizada utilizando scripts python e dois projetosdesenvolvidos em Java para a coleta e tratamento de dados como descrito a seguir

Primeiramente foi realizado uma coacutepia dos repositoacuterios atuais de todos os 99 projetosmais populares do github em Java Para automatizar o processo foi desenvolvido umscript em python que lista todos os projetos escolhidos clona todos os repositoacuterios emuma pasta na maacutequina local e cria um arquivo temporaacuterio com as informaccedilotildees do nomede cada repositoacuterio e seu caminho absoluto na maacutequina local

25

Figura 42 Metodologia implementada para coleta e tratamento de dados

Em seguida foi necessaacuterio realizar o checkout de todas as versotildees entre Janeiro de2013 a Abril de 2017 de cada projeto Por motivos de otimizaccedilatildeo de espaccedilo da maacutequinalocal e automatizaccedilatildeo no processo de checkout utilizou-se de um segundo script pythonque realizava as seguintes tarefas para cada mecircs em cada projeto verificar se dentreo mecircs estipulado houve algum commit para aquele projeto se sim pega-se o hash douacuteltimo commit do mecircs realiza o checkout conta-se a quantidade de linhas de coacutedigo emJava que o projeto tem utilizando a biblioteca cloc e armazena todas as informaccedilotildeespertinentes referentes a todos os projetos que naquele mecircs tiveram commits para que oprojeto static-analysis possa entatildeo ser executado sobre esses projetos naquele determinadomomento As informaccedilotildees coletadas que satildeo utilizadas pelo static-analysis correspondemao nome do projeto o hash do commit para aquela versatildeo a pasta onde o projeto estaacutearmazenado na maacutequina local a quantidade de linhas de coacutedigo Java do projeto e datareferente ao commit Essas informaccedilotildees satildeo pertinentes para que o projeto static-analysisconsiga funcionar de forma correta projeto este descrito em detalhes a seguir

431 static-analysis

O static-analysis foi um projeto desenvolvido anteriormente a este trabalho pelos alunosThiago Cavalcanti e Vinicius de Almeida cujo objetivo eacute realizar a anaacutelise estaacutetica de

26

coacutedigos-fonte Java e gerar arquivos de saiacuteda contendo informaccedilotildees de classes e meacutetodoscom suas devidas ocorrecircncias de caracteriacutesticas da linguagem [40]

A anaacutelise estaacutetica de coacutedigo consiste em analisar um coacutedigo-fonte sem a necessidadede executaacute-lo Esse tipo de anaacutelise eacute de extrema importacircncia para manter um coacutedigo dequalidade evitar futuras refatoraccedilotildees e obter informaccedilotildees estatiacutesticas de forma raacutepida epraacutetica [41]

Seguindo esse princiacutepio o static-analysis foi projetado para receber um arquivo deentrada csv seguindo o padratildeo

Tipo da Aplicaccedilatildeo Inicio do projeto Antes ou Apoacutes Java 5 Nome do ProjetoVersatildeo Caminho absolutoQuantidade de linhas de coacutedigo

Atraveacutes da informaccedilatildeo do caminho absoluto do projeto o static-analysis varre osdiretoacuterios em busca dos arquivos fonte java realiza o parse desses arquivos e utilizade Visitors para extrair as informaccedilotildees desejadas e exporta-las em arquivos csv Ouso de Visitors permite que sejam escolhidas as informaccedilotildees desejadas para a consultacomo expressotildees Lambda e AIC s aleacutem de possibilitar que sejam implementados novosVisitors conforme a linguagem evolua ou as necessidades mudem

Para este trabalho foram utilizados os Visitors de expressotildees Lambda map() filter()AICs e declaraccedilotildees de meacutetodos

432 BDAnalisador

Apoacutes obter todas as informaccedilotildees necessaacuterias geradas pelo static-analysis era preciso ma-nipular os dados de forma que facilitasse a coleta de dados para o estudo proposto Comovaacuterios arquivos em formato csv satildeo de difiacutecil manipulaccedilatildeo foi desenvolvido entatildeo umaferramenta chamada BDAnalisador Esta ferramenta eacute responsaacutevel por processar os arqui-vos em csv gerados pelo static-analysis e popular uma base de dados relacional MySQLcom as informaccedilotildees pertinentes a este estudo

O BDAnalisador foi desenvolvido com a intenccedilatildeo de tornar mais simples o trabalhocom os dados resultantes do static-analysis de forma que consultas em SQL pudessemser feitas a ponto de permitir a obtenccedilatildeo de resultados mais complexos Seguindo esseobjetivo o framework Hibernate foi escolhido como ferramenta para persistecircncia devidoa ser um framework jaacute consolidado no mercado e que de forma simples relaciona osobjetos Java ao banco de dados MySQL [42] A divisatildeo de classes foi projetada em quatroentidades Projeto Versao Classe e Metodo cada uma com seus respectivos camposcontendo as informaccedilotildees necessaacuterias para a pesquisa como pode ser visto na Figura 44Eacute importante ressaltar que a tabela de Versao guarda hashs de commits devido agrave escolhade utilizar commits para obter mais informaccedilatildeo de evoluccedilatildeo de coacutedigo em um menor

27

espaccedilo de tempo Aleacutem disso para este trabalho optou-se por persistir todos os meacutetodose classes de cada versatildeo sem se importar com a repeticcedilatildeo desses dados pois a hipoacutetesede haver grandes refatoraccedilotildees entre versotildees poderia comprometer a confiabilidade dasinformaccedilotildees

Figura 43 Diagrama de classes UML do BDAnalisador

Como visto na Figura 43 seguindo parcialmente a arquitetura MVC cada entidadepossui sua respectiva classe DAO(Data Access Object) para persistecircncia dos dados eapenas uma classe Controlador no projeto responsaacutevel pela manipulaccedilatildeo e parse dosdados dos arquivos csv gerados pelo static analysis para serem enviados agraves classes DAOO sistema inicia chamando o meacutetodo inicializar() da classe Controlador Esse meacutetodoeacute responsaacutevel por ler um arquivo de entrada csv que segue o mesmo modelo do arquivo dostatic-analysis citado na seccedilatildeo anterior O arquivo conteacutem os dados de todos os projetose suas respectivas versotildees dessa forma o meacutetodo instancia um objeto da classe Projetoe persiste o projeto no banco de dados Para cada versatildeo encontrada no arquivo deentrada o inicializar() aciona os meacutetodos responsaacuteveis por instanciar e preencher aslistas da classe Classe e Metodo Os meacutetodos responsaacuteveis por preencher as listas varremos arquivos csv gerados pelo static-analysis e fazem o parse das informaccedilotildees relevantescomo nomes dos meacutetodos e quantidades de lambdas para construir os objetos que seratildeogravados Ao final dos preenchimentos o objeto Versatildeo eacute instanciado e gravado no bancode dados atraveacutes de sua classe DAO ao mesmo tempo que grava suas respectivas Classese Metodos

28

Apoacutes vaacuterios testes e correccedilotildees de bugs o banco de dados se encontrava finalmente comas informaccedilotildees de 99 projetos Java open-source separados por um commit por mecircs desde2013 cada um com suas respectivas informaccedilotildees de classes meacutetodos e a quantidade deexpressotildees lambda filters e maps em cada meacutetodo Filter ou Filter pattern eacute o padratildeode projeto que tem como objetivo filtrar objetos de uma coleccedilatildeo (Collection) de acordocom algum criteacuterio Jaacute o map ou map pattern eacute um padratildeo que ldquomapeia os elementosde uma coleccedilatildeo aplicando uma funccedilatildeo a eles para uma nova coleccedilatildeo [43] A coleta deinformaccedilotildees sobre esses padrotildees podem ser uacuteteis para possiacuteveis anaacutelises de oportunidadesde uso de expressotildees lambda para refatoraccedilatildeo de coacutedigo

A Figura 44 mostra o esquema de como o banco de dados resultante foi gerado

Figura 44 Modelo relacional do banco de dados populado pelo BDAnalisador Imagemgerada com software DBeaver [2]

44 Classificaccedilatildeo e Anaacutelise

Com o banco de dados populado restam apenas as etapas de classificaccedilatildeo e anaacutelise pararesponder as questotildees de pesquisa propostas Para isso inicialmente houve uma tentativade se utilizar apenas queries SQL para analisar os dados de acordo com as informaccedilotildeesrelevantes Poreacutem devido ao fato de o banco de dados conter todas as informaccedilotildees detodos os projetos e todas as suas versotildees queries que possuem uma alta complexidadedemoravam muito tempo para retornar os dados

Assim com o objetivo de facilitar o trabalho alguns scripts python foram desenvolvi-dos para rodar as queries separadamente e individualmente para cada projeto de formaautomatizada a fim de melhorar o tempo de resposta para obtenccedilatildeo dos resultados

29

441 Meacutedia de Lambda

O primeiro script retorna a quantidade de expressotildees lambda (ou AICs) por n snapshotsque contenha expressotildees lambda O objetivo eacute ter uma visatildeo geral da meacutedia de expressotildeeslambda e AICs utilizadas por cada projeto e como nem todos os snapshots coletados decada projeto possuem expressotildees lambda e AICs apenas aqueles com alguma expressatildeolambda ou AIC satildeo incluiacutedos no caacutelculo da meacutedia

Mmedia =sumn qtdLambdai

n

442 Anaacutelise Temporal

O segundo script retorna para cada projeto a soma total da quantidade de expressotildeeslambda AIC map() e filter() no projeto inteiro para cada versatildeo Ou seja tem-seo total de cada uma das quatro propriedades selecionadas para cada mecircs do projetoobtendo assim uma visatildeo temporal de evoluccedilatildeo do uso das caracteriacutesticas descritas ATabela 41 ilustra parcialmente o resultado obtido para o projeto agera onde idVersaoeacute o identificador no banco de dados referente ao hash do commit mensal coletado qtd eacutea quantidade de cada uma das caracteriacutesticas escolhidas e a data do commit encontra-seno formato americano

Tabela 41 Informaccedilotildees mensais sobre o projeto ageraidVersao Data do Commit qtd lambda qtd AIC qtd maps qtd filter

823 512016 0 29 4 0755 612016 13 28 4 0686 6152016 13 29 4 0621 812016 13 29 4 0555 8162016 13 30 4 0485 922016 13 30 4 0422 10132016 14 30 4 0356 11282016 14 30 4 0295 12212016 21 30 5 0232 212017 21 30 5 0175 312017 21 30 5 0112 3312017 21 36 5 048 4242017 21 48 5 0

Os resultados obtidos com esta anaacutelise temporal permitiu a identificaccedilatildeo de padrotildees nautilizaccedilatildeo de expressotildees lambda em relaccedilatildeo a utilizaccedilatildeo de AIC por todos os projetos Foi

30

possiacutevel classificar todos os projetos em 6 grupos ilustrado na Figura 45 Primeiramenteseparou-se os projetos entre os que possuem expressotildees lambda e os que natildeo possuemDentre os que possuem identificou-se cinco categorias

1 Grupo 1 Quantidade de AICs e expressotildees lambda aumentam com o tempo pro-porcionalmente

2 Grupo 2 Quantidade de AICs diminui agrave medida que a quantidade de expressotildeeslambda aumentam e a quantidade de expressotildees lambda ultrapassa a quantidade deAIC em um determinado momento

3 Grupo 3 Quantidade de AICs diminui agrave medida que a quantidade de expressotildeeslambda aumentam mas a quantidade de AIC permanece superior agrave quantidade delambda

4 Grupo 4 Expressotildees lambda satildeo introduzidas e existem por um pequeno periacuteodode tempo mas satildeo completamente removidas posteriormente

5 Grupo 5 Quantidade de expressotildees lambda eacute constante e muito inferior compa-rado com a quantidade de AICs no projeto Foi determinado que para pertencera esta classificaccedilatildeo o projeto precisa ter uma razatildeo de meacutedia de expressotildees lamb-dasnapshot por meacutedia de AICsnapshot inferior a 020 Esse paracircmetro foi esta-belecido com o objetivo de definir um padratildeo para o que pode ser considerado umprojeto com poucas expressotildees lambda

Figura 45 Classificaccedilatildeo dos projetos

31

443 Refatoraccedilatildeo de Coacutedigo

O uacuteltimo script teve como objetivo realizar uma tentativa inicial de identificar refatoraccedilatildeode coacutedigo da seguinte maneira para todos os projetos que possuem expressotildees lambdaforam identificados o mecircs imediatamente antes da introduccedilatildeo de expressotildees lambda e omecircs seguinte onde houve a primeira ocorrecircncia de lambda no projeto Assim realizou-se uma anaacutelise do tamanho em quantidade de linhas de coacutedigo de todos os meacutetodosdo projeto que no mecircs seguinte tiveram introduccedilatildeo de lambda Em seguida fez-se umacomparaccedilatildeo com os mesmos meacutetodos em relaccedilatildeo ao mecircs anterior e assim foi possiacuteveldetectar quais meacutetodos tiveram a quantidade de linhas de coacutedigo reduzidas o que seriaum indicativo natildeo necessariamente exclusivo de que uma refatoraccedilatildeo de coacutedigo possa terocorrido

Sabe-se que este meacutetodo de detecccedilatildeo de refatoraccedilatildeo de coacutedigo possui suas limitaccedilotildeesuma vez que as comparaccedilotildees para saber se um meacutetodo existe em ambas versotildees eacute feitopuramente por comparaccedilatildeo de String (nome do meacutetodo) e a classe que este pertence

444 Casos de Uso

Os meacutetodos descritos acima ajudaram a identificar alguns padrotildees e facilitar a anaacutelise dosdados Poreacutem natildeo satildeo suficientes para que se possa responder agraves questotildees de pesquisaDessa forma apoacutes a identificaccedilatildeo dos grupos de classificaccedilatildeo para os projetos foramescolhidos um projeto de cada grupo (com exceccedilatildeo do grupo dos projetos sem expressotildeeslambda) para realizar um breve estudo de caso com o objetivo de identificar e caracterizarmelhor a adoccedilatildeo de expressotildees lambda Os projetos escolhidos foram agera vertxAndroid-CleanArchitecture RxJava e guava

32

Capiacutetulo 5

Resultados Obtidos e Anaacutelise

Neste capiacutetulo seratildeo apresentados os dados obtidos e anaacutelise com o objetivo de responderagraves questotildees de pesquisa propostas Como mencionado anteriormente as perguntas seratildeorespondidas de duas maneiras algumas com informaccedilotildees gerais sobre todos os projetose outras com breve estudos de caso envolvendo cinco projetos

51 Visatildeo Geral

Dentre os repositoacuterios coletados para a anaacutelise 74 (7474) natildeo utilizaram nenhumaexpressatildeo lambda no projeto durante todo o periacuteodo analisado (Janeiro de 2013 a Abrilde 2017) restando apenas 25 repositoacuterios (2525) com expressotildees lambda Eacute interessantedestacar que apesar de a quantidade de repositoacuterios que natildeo possuem expressotildees lambdaser relativamente expressiva muitos destes repositoacuterios satildeo de projetos em Java que umdia foram populares e atualmente natildeo estatildeo sendo mais desenvolvidos (por exemplo umaplicativo que soacute funciona para Android 23 atualmente descontinuado)

Levando em consideraccedilatildeo apenas os projetos que possuem expressotildees lambda exis-tem dois tipos de dados que podem ser analisados para responder agrave primeira questatildeo depesquisa atraveacutes dos dados obtidos pelo meacutetodo anteriormente mencionado como anaacutelisetemporal e a meacutedia de lambda por snapshot mencionados no capiacutetulo anterior

Com relaccedilatildeo ao ano em que a primeira ocorrecircncia foi encontrada 6 projetos introduzi-ram expressotildees lambda jaacute em 2014 8 comeccedilaram a utilizar em 2015 7 em 2016 e apenas4 tiveram a primeira ocorrecircncia de expressotildees lambda em 2017 Dessa forma percebe-seque os projetos estatildeo relativamente bem distribuiacutedos em grupos quanto ao ano em que seintroduziu expressotildees lambda

Pela meacutedia de lambda por snapshot (lambdasnapshot) a maioria (11 projetos) possuiuma quantidade expressiva acima de 100 lambdasnapshot (com 6 projetos entre 20 e 100lambdasnapshot e 8 projetos com menos de 20 lambdasnapshot) como apresentados no

33

graacutefico da Figura 51 Isso mostra que essa nova caracteriacutestica jaacute estaacute sendo bem utilizadanos projetos que comeccedilaram a migrar para a nova versatildeo do Java

Figura 51 Graacuteficos dos projetos separados por ano de introduccedilatildeo de expressotildees lambdae meacutedia de lambda por snapshot

Com isso pode-se observar que apesar de a quantidade de projetos que possuemexpressotildees lambda natildeo ser tatildeo alta eacute possiacutevel obter resultados expressivos uma vez quea quantidade dos projetos com lambda estatildeo bem dispersos quanto ao periacuteodo em quecomeccedilaram a adotar essa caracteriacutestica e a quantidade de expressotildees lambda por snapshot

511 Projetos Selecionados

Atraveacutes dos grupos de classificaccedilatildeo identificados pela anaacutelise temporal descritos na Figura45 cinco projetos foram selecionados para uma anaacutelise detalhada levando em consideraccedilatildeoo grupo em que eles pertencem Estes projetos seratildeo apresentados a seguir

512 agera

Agera eacute uma biblioteca Android que ajuda a introduzir programaccedilatildeo funcional reativa(functional reactive programming) em projetos Android Eacute um projeto recente lanccediladoem 2016 pela Google [44] e encontra-se no grupo dos projetos que introduziram expressotildeeslambda em 2016 no mesmo ano de seu lanccedilamento contendo uma meacutedia de expressotildeeslambda de 16 lambdasnapshot

Na classificaccedilatildeo estabelecida agera pertence ao Grupo 1 onde a quantidade de ex-pressotildees lambda no projeto com o tempo aumentam juntamente com a quantidade deAICs como mostra o graacutefico de anaacutelise temporal na Figura 52

34

Figura 52 Graacuteficos de anaacutelise temporal do projeto agera

513 vertx

Eclipse Vertx eacute um conjunto de ferramentas para criaccedilatildeo de reactive applications namaacutequina virtual Java (JVM) em grande escala [45] Seu primeiro lanccedilamento aconteceuem 2011 e a primeira ocorrecircncia de expressotildees lambda no projeto aconteceu em 2014 Esteprojeto possui uma meacutedia de 2867 lambdasnapshot e dentre os projetos consideradosneste trabalho eacute o que possui a maior quantidade de expressotildees lambda

Este projeto pertence ao Grupo 2 onde a quantidade de expressotildees lambda aumen-tou consideravelmente pelos meses ultrapassando a quantidade de AICs que diminuiudrasticamente como mostra a Figura 53

35

Figura 53 Graacuteficos de anaacutelise temporal do projeto Vertx

514 Android-CleanArchitecture

Apesar de ser uma amostra de projeto Android-CleanArchitecture que tem como objetivoconstruir aplicaccedilotildees Android utilizando clean architecture foi lanccedilado em 2014 mas semanteacutem sempre atualizado [46]

A introduccedilatildeo de expressotildees lambda que aconteceu no ano de 2015 se deu de formatiacutemida com uma meacutedia de 35 lambdasnapshot De qualquer forma este projeto conseguerepresentar com seu graacutefico de anaacutelise temporal o grupo 3 composto por projetos em quea quantidade de expressotildees lambda aumentou mas sem ultrapassar AICs que diminuiacuteramdemonstrado no graacutefico da Figura 54

36

Figura 54 Graacuteficos de anaacutelise temporal do projeto Android-CleanArchitecture

515 RxJava

Dentre os repositoacuterios estudados RxJava eacute considerado o mais popular Como umaimplementaccedilatildeo de Reactive Extensions para a JVM RxJava teve seu lanccedilamento dadoem 2013 [47] Expressotildees lambda apareceram pela primeira vez no ano de 2015 comuma meacutedia de 766 lambdasnapshot

Apesar de uma meacutedia relativamente alta o tempo de vida das expressotildees lambda nesteprojeto foi bem curto caracterizando assim projetos do grupo 4 houve a introduccedilatildeo dasexpressotildees lambda no projeto poreacutem houve a remoccedilatildeo completa de todas as expressotildeeslambda previamente introduzidas desaparecendo completamente do projeto ateacute a datada coleta de dados (Figura 55)

37

Figura 55 Graacuteficos de anaacutelise temporal do projeto RxJava

516 guava

Guava eacute um conjunto de bibliotecas para Java da Google lanccedilado em 2011 A atualizaccedilatildeodo coacutedigo do projeto para Java 8 aconteceu somente em 2016 e apesar do projeto conteruma meacutedia de 281 lambdasnapshot ele foi escolhido como representante dos projetosdo Grupo 5 (Figura 56) que possuem expressotildees lambda mas de forma natildeo expressiva osuficiente quando comparado com a quantidade de AIC pelo fato de sua razatildeo de meacutedia delambdasnapshot por meacutedia de AICsnapshot ser 004 Ou seja embora o projeto tenhaexpressotildees lambda estas satildeo consideradas muito poucas quando inseridas no contextogeral deste projeto que eacute considerado um projeto grande

38

Figura 56 Graacuteficos de anaacutelise temporal do projeto Guava

52 Refatoraccedilatildeo de Coacutedigo

Com o objetivo de caracterizar melhor como as expressotildees lambda estatildeo sendo utilizadaseacute interessante identificar se estas estatildeo sendo introduzidas atraveacutes de refatoraccedilatildeo de coacutedigoou em coacutedigo novo

Os projetos classificados como pertencentes ao Grupo 2 possuem em comum o fatode expressotildees lambda aumentarem a medida que AICs diminuem ultrapassando-as eessa caracteriacutestica em comum pode indicar que nestes projetos possivelmente houve re-fatoraccedilatildeo de coacutedigo visto que AIC sendo substituiacutedo por expressotildees lambda dentro dascondiccedilotildees determinadas eacute a maneira mais comum de se identificar refatoraccedilatildeo de coacute-digo para introduccedilatildeo de expressotildees lambda [12] Os projetos que compotildeem o grupo 2representam 44 de todos os projetos estudados que possuem expressotildees lambda o quepode ser um indicativo caso a hipoacutetese de refatoraccedilatildeo de coacutedigo seja positiva de quemuitos projetos que estatildeo adotando o Java 8 estatildeo se preocupando de alguma formacom refatoraccedilatildeo se coacutedigo Fazem parte desse grupo os seguintes projetos elasticsearchjava-design-patterns PocketHub presto RxJava-Android-Samples spark vertx zipkinjava8-tutorial dropwizard e material-dialogs

39

Outra maneira de verificar possiacuteveis indicadores de refatoraccedilatildeo de coacutedigo foi atraveacutesda anaacutelise dos tamanhos (em quantidade de linhas de coacutedigo) dos meacutetodos com expressotildeeslambda no mecircs em que se introduziu expressotildees lambda e um mecircs imediatamente antesdeste Essa anaacutelise mostra que dos 25 projetos com expressotildees lambda 12 (48) projetostiveram ao menos um meacutetodo em que houve uma diminuiccedilatildeo no tamanho o que podeser considerado um indicativo de refatoraccedilatildeo de coacutedigo A Figura 57 mostra todos osprojetos em relaccedilatildeo agrave quantidade total de meacutetodos que possuem lambda no primeiro mecircsde introduccedilatildeo do mesmo em vermelho comparado com a quantidade desses meacutetodos quetiveram uma diminuiccedilatildeo no tamanho quando comparados com o coacutedigo do mecircs anteriorem azul

Figura 57 Comparaccedilatildeo entre todos os projetos com expressatildeo lambda sobre refatoraccedilatildeode coacutedigo no mecircs de introduccedilatildeo da caracteriacutestica

Ainda observando a figura 57 com relaccedilatildeo aos projetos que natildeo tiveram nenhummeacutetodo com diminuiccedilatildeo de tamanho (barra azul) percebe-se que todos os 13 projetossequer tiveram uma quantidade significativa de meacutetodos que possuem expressotildees lambda(com o maior tendo apenas 5 meacutetodos) no mecircs de introduccedilatildeo da caracteriacutestica no projetoe ao mesmo tempo jaacute existiam no mecircs em que natildeo existia lambda no projeto Essa eacuteuma observaccedilatildeo importante porque projetos como vertx sendo este o que possui a maiormeacutedia de lambdasnapshot de todos os projetos e ao mesmo tempo tendo apenas trecircsmeacutetodos que continham expressotildees lambda no mecircs da introduccedilatildeo e que existiam no mecircs

40

anterior permitem inferir que todas as outras expressotildees lambda existentes no projetopara este determinado mecircs de introduccedilatildeo encontram-se em coacutedigo novo introduzido

Eacute importante ressaltar que somente essa anaacutelise natildeo eacute exclusivamente suficiente paradeterminar se estes projetos estatildeo realmente introduzindo lambda em coacutedigo novo ourealizando refatoraccedilatildeo uma vez que como a comparaccedilatildeo aconteceu apenas no mecircs deintroduccedilatildeo com o mecircs imediatamente anterior natildeo reflete todo o ciclo de vida do pro-jeto Por exemplo algumas equipes podem escolher refatorar o coacutedigo depois de umtempo de adaptaccedilatildeo apoacutes a transiccedilatildeo para a nova versatildeo da linguagem Assim paraobter uma melhor anaacutelise sobre refatoraccedilatildeo de coacutedigo ou natildeo feita nestes projetos aleacutemde outras anaacutelises referentes aos padrotildees tipicamente adotados para implementaccedilatildeo delambda nestes projetos seratildeo apresentados a seguir os estudos de caso dos cinco projetospreviamente selecionados

Outro ponto importante eacute o fato de que apesar das informaccedilotildees quanto agraves quantida-des de filter e map terem sido incluiacutedas inicialmente no trabalho para observar possiacuteveispadrotildees de refatoraccedilatildeo de coacutedigo percebeu-se que estas natildeo satildeo utilizadas de forma con-sideraacutevel pelos projetos estudados e para fins de anaacutelises generalizadas natildeo apresentaramtanta influecircncia na utilizaccedilatildeo de expressotildees lambda quanto a quantidade de AICs noprojeto

53 Estudos de Caso

Dentre os projetos analisados verificou-se que os projetos de pequeno e meacutedio porte op-taram por refatorar de uma vez seus coacutedigos para incluir expressotildees lambda em situaccedilotildeesem que se utilizava AICs anteriormente ou em alguns poucos casos de utilizaccedilatildeo deCollection Os projetos de grande porte natildeo apresentaram nenhuma refatoraccedilatildeo de coacute-digo ou uma refatoraccedilatildeo parcial gradativa provavelmente devido agrave grande quantidade dearquivos e coacutedigo que possuem o que pode tornar o trabalho de refatoraccedilatildeo extenso ecansativo

O projeto vertx que pertence ao grupo 2 dos projetos em que a quantidade de ex-pressotildees lambda aumentaram e as de AICs diminuiacuteram com lambda ultrapassando AICsexecutou inicialmente commits em maio de 2014 com adiccedilatildeo de coacutedigo novo utilizandoexpressotildees lambda e apoacutes um mecircs realizou um commit maior com a refatoraccedilatildeo de todasas AICs para expressotildees lambda Apoacutes a refatoraccedilatildeo o projeto se preocupou em mantera utilizaccedilatildeo de expressotildees lambda ao mesmo tempo que o uso de AICs se manteve apenasaos casos de classes com interfaces natildeo funcionais A Figura 58 apresenta uma parte docommit de refatoraccedilatildeo de coacutedigo que mostra em vermelho a parte eliminada do coacutedigo(AIC) e em verde o coacutedigo novo representando a substituiccedilatildeo por uma expressatildeo lambda

41

Figura 58 Commit de refatoraccedilatildeo de coacutedigo do projeto Vertx [3]

Alguns projetos ainda natildeo se preocuparam em refatorar o coacutedigo para o uso de ex-pressotildees lambda ateacute a data deste trabalho que eacute o caso do projeto guava que apresentouum commit em 03112016 com a atualizaccedilatildeo do projeto para Java 8 Mas a partir daatualizaccedilatildeo se preocupou em utilizar as expressotildees lambda apenas na implementaccedilatildeo decoacutedigo novo O cenaacuterio em que a refatoraccedilatildeo natildeo eacute prioridade ainda eacute a realidade de vaacuteriosprojetos de grande porte visto que os dados de projetos sem nenhuma expressatildeo lambdasatildeo o maior nuacutemero neste trabalho Poreacutem projetos que jaacute adotaram a utilizaccedilatildeo do Java8 tendem a mudar isso com o passar do tempo A Figura 59 apresenta em verde umaadiccedilatildeo de coacutedigo novo com expressatildeo lambda sem a eliminaccedilatildeo de algum coacutedigo anteriora esse que estaria em vermelho

42

Figura 59 Exemplo de um arquivo do commit de adiccedilatildeo de coacutedigo novo em Java 8 doprojeto Guava [4]

Na categoria de projetos em que os AICs e expressotildees lambda aumentam proporci-onalmente (grupo 1) o projeto agera realizou um commit em 19052016 com a adiccedilatildeoda biblioteca retrolambda como dependecircncia do projeto Essa biblioteca utilizada prin-cipalmente por projetos Android permite executar coacutedigo Java 8 contendo expressotildeeslambda em Java 5 6 e 7 [48] O commit tambeacutem apresenta refatoraccedilatildeo dos AICs ad-vindos de interfaces funcionais para expressotildees lambda Apesar de o projeto continuar autilizar as expressotildees lambda em seus commits posteriores o nuacutemero de AICs tambeacutemcontinuou a aumentar visualizando os commits posteriores notou-se que esses AICs satildeorelativos a interfaces natildeo funcionais ou seja que possuem mais de um meacutetodo O projetoAndroid-CleanArchitecture eacute similar ao agera pois tambeacutem optou pela instalaccedilatildeo da bi-blioteca retrolambda para uso de expressotildees lambda em seus coacutedigos e como tambeacutem eacuteum projeto de pequeno porte houve uma pequena refatoraccedilatildeo dos AICs A Figura 510mostra a parte do commit de refatoraccedilatildeo de coacutedigo em que o desenvolvedor adiciona abiblioteca retrolambda como dependecircncia

43

Figura 510 Commit de adiccedilatildeo da biblioteca Retrolambda no projeto Agera [5]

Outro caso interessante eacute o do projeto RxJava que em 2015 optou pela refatoraccedilatildeodo coacutedigo para a utilizaccedilatildeo de expressotildees lambda quase eliminando por completo o usode AICs mas que no ano seguinte reverteu os commits de forma que eliminasse comple-tamente o uso de expressotildees lambda para manter a retrocompatibilidade com o Java 6A Figura 511 demonstra uma parte do commit de reversatildeo do coacutedigo para Java 6 emque pode ser visto em vermelho o coacutedigo anterior com expressotildees lambda e o verde como novo coacutedigo utilizando AIC novamente

44

Figura 511 Commit de remoccedilatildeo de Lambdas e volta para o uso de AICs no projetoRXJava [6]

Essa preocupaccedilatildeo com retrocompatibilidade de coacutedigo pode ser um fator crucial nadecisatildeo das equipes de desenvolvimento na hora de decidir como fazer o software co-evoluircom a linguagem sem perder a compatibilidade com versotildees anteriores

45

Capiacutetulo 6

Consideraccedilotildees Finais

Este estudo permitiu entender melhor como projetos estatildeo realizando a migraccedilatildeo para oJava 8 em especial utilizando uma nova caracteriacutestica introduzida expressatildeo lambdaApesar de a maioria dos projetos populares considerados natildeo possuiacuterem nenhuma ocor-recircncia de expressotildees lambda os projetos que tinham expressotildees lambda foram suficientespara realizar um primeiro estudo de caracterizaccedilatildeo no uso desta caracteriacutestica e com osprojetos efetivamente utilizados para estudo foi possiacutevel agrupaacute-los quanto a maneira emque as expressotildees lambda estavam sendo utilizadas quando comparadas com AICs em 5grandes grupos quando AIC e lambda aumentam proporcionalmente quando AIC dimi-nui e lambda aumenta ultrapassando AIC quando AIC diminui mas continua superior aolambda crescente expressotildees lambda que foram introduzidas e retiradas completamentedo coacutedigo e expressotildees lambda que natildeo existem em quantidades expressivas

Foi possiacutevel entatildeo realizar um estudo aprofundado levando em consideraccedilatildeo as di-ferentes maneiras com que as expressotildees lambda foram adotadas nos projetos atraveacutes daescolha de um projeto que representasse cada grupo para anaacutelise Dentre os cinco projetosestudados foi possiacutevel observar alguns padrotildees tipicamente adotados por desenvolvedorespara implementar expressotildees lambda em seus projetos como a utilizaccedilatildeo da bibliotecas(retrolambda) que permitissem uma flexibilizaccedilatildeo na utilizaccedilatildeo de expressotildees lambda oucomo lambda eacute primariamente utilizada para substituir determinados AICs ou operaccedilotildeesem Collection

Aleacutem disso foi possiacutevel observar como a refatoraccedilatildeo de coacutedigo acontece em cada umdesses projetos Observou-se como projetos menores tendem a refatorar coacutedigo maisfacilmente ao passo que projetos maiores e mais complexos fazem menos refatoraccedilatildeo oudemoram mais entre o periacuteodo em que houve a primeira migraccedilatildeo de coacutedigo para a novaversatildeo da linguagem ateacute o periacuteodo em que realmente decidem refatorar coacutedigo Aleacutem dacomplexidade do projeto influenciar na decisatildeo de migrar o projeto para uma versatildeo maisrecente da linguagem a preocupaccedilatildeo com retrocompatibilidade com versotildees anteriores da

46

linguagem tambeacutem podem ser uma barreira para que projetos comecem a evoluir o coacutedigojuntamente com a evoluccedilatildeo da linguagem

Ainda assim foi possiacutevel observar que a preocupaccedilatildeo com a co-evoluccedilatildeo do software-linguagem existe entre os desenvolvedores de projetos mas a realizaccedilatildeo da migraccedilatildeo aindaacontece lentamente devido agrave diversos fatores que precisam ser levados em consideraccedilatildeopara a manutenccedilatildeo do projeto

Para trabalhos e contribuiccedilotildees futuras seria interessante desenvolver uma ferramentaque pudesse analisar diretamente no coacutedigo-fonte as oportunidades de aplicaccedilatildeo de ex-pressotildees lambda dessa forma poderiam ser analisadas as porcentagens de conversatildeo decoacutedigo para Java 8 e obter melhores conclusotildees sobre a importacircncia que os projetos estatildeodando para a evoluccedilatildeo de seus coacutedigos Outro fator interessante seria aplicar mais Visitorsagrave ferramenta static-analysis e fazer este mesmo estudo aplicado agrave outras caracteriacutesticasda linguagem

47

Referecircncias

[1] Kagdi Huzefa Michael L Collard e Jonathan I Maletic A survey and taxonomyof approaches for mining software repositories in the context of software evolution2007 ix 3 8 9 10 11

[2] DBeaver Dbeaver - features httpdbeaverjkissorgdocsfeatures ix 29

[3] Eclipse Vertx commit Java8-ify code httpsgithubcomeclipsevertxcommit93f95e9c77419f442a42fe711b6eeaef88192fd3 ix 42

[4] Google Guava commit Release java 8 changes to guava httpsgithubcomgoogleguavacommit73e382fa877f80994817a136b0adcc4365ccd904 ix 43

[5] Google Agera commit Collapsed testapp with retrolambda httpsgithubcomgoogleageracommit5e518b7b05f9e7a34a314945f68deff7b2c3e334 ix 44

[6] ReactiveX Rxjava commit 2x full jdk 6 compatible backport + includ-ing bugfixes up to today httpsgithubcomReactiveXRxJavacommit000a174d87a901135f9665d3b11f3627fd2dc4ed ix 45

[7] Godfrey M W e D M German The past present and future of software evolutionEm 2008 Frontiers of Maintenance paacuteginas 129ndash138 Sept 2008 1 6

[8] Favre J M Languages evolve too changing the software time scale Em Principles ofSoftware Evolution Eighth International Workshop on paacuteginas 33ndash42 IEEE 20051 5 7

[9] Overbey Jeffrey L e Ralph E Johnson Regrowing a language refactoring tools allowprogramming languages to evolve Em ACM SIGPLAN Notices volume 44 paacuteginas493ndash502 ACM 2009 1 5 7 8 12

[10] Grechanik Mark Collin McMillan Luca DeFerrari Marco Comi Stefano CrespiDenys Poshyvanyk Chen Fu Qing Xie e Carlo Ghezzi An empirical investiga-tion into a large-scale java open source code repository Em Proceedings of the2010 ACM-IEEE International Symposium on Empirical Software Engineering andMeasurement ESEM rsquo10 paacuteginas 111ndash1110 New York NY USA 2010 ACMISBN 978-1-4503-0039-1 httpdoiacmorg10114518527861852801 1

[11] TIOBE Tiobe httpswwwtiobecomtiobe-index 1 14

48

[12] Gyori Alex Lyle Franklin Danny Dig e Jan Lahoda Crossing the gap from im-perative to functional programming through refactoring Em Proceedings of the 20139th Joint Meeting on Foundations of Software Engineering ESECFSE 2013 paacute-ginas 543ndash553 New York NY USA 2013 ACM ISBN 978-1-4503-2237-9 httpdoiacmorg10114524914112491461 2 11 24 39

[13] OpenJDK State of the lambda httpcropenjdkjavanet~briangoetzlambdalambda-state-4html 2

[14] Han Jiawei Micheline Kamber e Jian Pei Data Mining Concepts and TechniquesMorgan Kaufmann Publishers Inc San Francisco CA USA 3rd ediccedilatildeo 2011ISBN 0123814790 9780123814791 3

[15] Fowler Martin e Kent Beck Refactoring improving the design of existing codeAddison-Wesley Professional 1999 5 7

[16] Lehman M M J F Ramil P D Wernick D E Perry e W M Turski Met-rics and laws of software evolution - the nineties view Em Proceedings of the4th International Symposium on Software Metrics METRICS rsquo97 paacuteginas 20ndashWashington DC USA 1997 IEEE Computer Society ISBN 0-8186-8093-8 httpdlacmorgcitationcfmid=823454823901 6

[17] Hassan Ahmed E e Tao Xie Software intelligence The future of mining softwareengineering data Em Proceedings of the FSESDP Workshop on Future of SoftwareEngineering Research FoSER rsquo10 paacuteginas 161ndash166 New York NY USA 2010ACM ISBN 978-1-4503-0427-6 httpdoiacmorg101145188236218823978 9

[18] Hassan Ahmed E The road ahead for mining software repositories Em Frontiers ofSoftware Maintenance 2008 FoSM 2008 paacuteginas 48ndash57 IEEE 2008 8

[19] Berry Michael J e Gordon Linoff Data Mining Techniques For Marketing Salesand Customer Support John Wiley amp Sons Inc New York NY USA 1997ISBN 0471179809 10

[20] Parnin Chris Christian Bird e Emerson Murphy-Hill Java generics adoption hownew features are introduced championed or ignored Em Proceedings of the 8thWorking Conference on Mining Software Repositories paacuteginas 3ndash12 ACM 2011 12

[21] Oracle The java language specification httpsdocsoraclecomjavasespecsjlsse8jls8pdf 13

[22] Oracle The history of java technology httpwwworaclecomtechnetworkjavajavaseoverviewjavahistory-index-198355html 13

[23] Murphy Kieron So why did they decide to call itjava httpwwwjavaworldcomarticle2077265core-javaso-why-did-they-decide-to-call-it-java-html 13

[24] McGraw Tata Object-oriented Programming with Java Essentials and ApplicationsHill Education 13

49

[25] Oracle Differences between java ee and java se httpdocsoraclecomjavaee6firstcupdocgkhoyhtml 13

[26] Lindsey Clark S The History of Java Cambridge 14

[27] Oracle The java language environment httpwwworaclecomtechnetworkjavaintro-141325html 14

[28] Oracle Jdk 8 httpopenjdkjavanetprojectsjdk8 15 24

[29] Oracle Enhancements in java se 8 httpdocsoraclecomjavase8docstechnotesguideslanguageenhancementshtmljavase8 15 16 17

[30] Oracle Lambda expressions httpdocsoraclecomjavasetutorialjavajavaOOlambdaexpressionshtml 16 18 21

[31] Oracle Method references httpdocsoraclecomjavasetutorialjavajavaOOmethodreferenceshtml 16

[32] Oracle Default methods httpdocsoraclecomjavasetutorialjavaIandIdefaultmethodshtml 17

[33] Oracle Repeating annotations httpdocsoraclecomjavasetutorialjavaannotationsrepeatinghtml 17

[34] Oracle Type annotations httpdocsoraclecomjavasetutorialjavaannotationstype_annotationshtml 17

[35] Oracle Anonymous inner classes httpsdocsoraclecomjavasetutorialjavajavaOOanonymousclasseshtml 19

[36] Kothari CR Research Methodology Methods and Techniques New Age Interna-tional (P) Limited 2004 ISBN 9788122415223 httpsbooksgooglecombrbooksid=8c6gkbKi-F4C 22

[37] Nakakoji Kumiyo Yasuhiro Yamamoto Yoshiyuki Nishinaka Kouichi Kishida eYunwen Ye Evolution patterns of open-source software systems and communitiesEm IWPSE rsquo02 Proceedings of the International Workshop on Principles of SoftwareEvolution paacuteginas 76ndash85 New York NY USA 2002 ACM Press ISBN 1581135459httpdxdoiorg101145512035512055 23

[38] Rahman Foyzur Christian Bird e Premkumar Devanbu Clones What is that smellEmpirical Software Engineering 17(4-5)503ndash530 2012 24

[39] Chacon Scott Pro Git Apress Berkely CA USA 1st ediccedilatildeo 2009ISBN 1430218339 9781430218333 25

[40] Cavalcanti Thiago Gomes e Viniacutecius Correa de Almeida Caracterizaccedilatildeo do uso deconstruccedilotildees da linguagem java em projetos open-source Publicaccedilatildeo online 2016httpbdmunbbrhandle1048315733 27

50

[41] Parr Terence Language Implementation Patterns Create Your Own Domain-Specific and General Programming Languages Pragmatic Bookshelf 1st ediccedilatildeo 2009ISBN 193435645X 9781934356456 27

[42] Janssen Thorben 5 reasons to use jpa hibernate Publicaccedilatildeo online httpswwwsitepointcom5-reasons-to-use-jpa-hibernate 27

[43] Franklin Lyle Alex Gyori Jan Lahoda e Danny Dig Lambdaficator From imperativeto functional programming through automated refactoring Em Proceedings of the2013 International Conference on Software Engineering ICSE rsquo13 paacuteginas 1287ndash1290 Piscataway NJ USA 2013 IEEE Press ISBN 978-1-4673-3076-3 httpdlacmorgcitationcfmid=24867882486986 29

[44] Google Agera httpsgithubcomgoogleagerawiki 34

[45] Eclipse Eclipse vertx httpvertxio 35

[46] Cejas Fernando Android cleanarchitecture httpsgithubcomandroid10Android-CleanArchitecture 36

[47] ReactiveX Rxjava httpsgithubcomReactiveXRxJava 37

[48] Luontola Esko Retrolambda httpsgithubcomorfjackalretrolambda 43

51

Anexo I

Projetos utilizados

fastjson

platform_frameworks_base

netty

material-dialogs

kotlin

okhttp

tinker

AndroidUtilCode

RxJava

spring-boot

java-design-patterns

elasticsearch

ExoPlayer

kafka

vertx

realm-java

guava

zipkin

bazel

stetho

Signal-Android

glide

agera

fresco

plaid

presto

libgdx

spark

52

disruptor

lottie-android

flexbox-layout

PocketHub

zxing

spring-framework

deeplearning4j

dropwizard

interviews

BaseRecyclerViewAdapterHelper

uCrop

DanmakuFlameMaster

lottie-react-native

android-UniversalMusicPlayer

AndroidInterview-Q-A

greenDAO

retrofit

MaterialDrawer

BottomBar

druid

MPAndroidChart

Hystrix

guice

recyclerview-animators

dubbo

androidannotations

RxJava-Android-Samples

PhotoView

clojure

CircleImageView

AndroidSwipeLayout

jedis

MaterialViewPager

butterknife

junit4

RxBinding

leakcanary

SimianArmy

picasso

UltimateRecyclerView

53

AndroidViewAnimations

AppIntro

FizzBuzzEnterpriseEdition

ion

cheesesquare

physical-web

RxAndroid

Android-CleanArchitecture

Calligraphy

Android-Bootstrap

iosched

Android_Data

MaterialDesignLibrary

ListViewAnimations

EventBus

java8-tutorial

AndroidSlidingUpPanel

dagger

okhttputils

logger

HomeMirror

Material-Animations

android-Ultra-Pull-To-Refresh

android-async-http

Android-ObservableScrollView

Android-Universal-Image-Loader

ActionBarSherlock

SlidingMenu

storm

PagerSlidingTabStrip

Android-PullToRefresh

54

  • Dedicatoacuteria
  • Agradecimentos
  • Resumo
  • Abstract
  • Introduccedilatildeo
    • Contexto
    • Objetivos
      • Objetivos Gerais
      • Objetivos Especiacuteficos
        • Metodologia
        • Organizaccedilatildeo do Trabalho
          • Evoluccedilatildeo e Mineraccedilatildeo de Repositoacuterios de Software
            • Evoluccedilatildeo de Software
            • MSR Mineraccedilatildeo de dados e a Engenharia de Software
              • Classificaccedilatildeo
                • Trabalhos Relacionados
                  • Java SE 8 e JDK 8
                    • Histoacuterico
                    • Princiacutepios
                    • Evoluccedilatildeo
                    • Expressotildees Lambda
                      • Sintaxe
                      • Principais formas de uso
                          • Estudo e o Processo de Mineraccedilatildeo
                            • Questotildees de Pesquisa
                            • Fonte de Dados e Objetos de Estudo
                            • Processo de Mineraccedilatildeo
                              • static-analysis
                              • BDAnalisador
                                • Classificaccedilatildeo e Anaacutelise
                                  • Meacutedia de Lambda
                                  • Anaacutelise Temporal
                                  • Refatoraccedilatildeo de Coacutedigo
                                  • Casos de Uso
                                      • Resultados Obtidos e Anaacutelise
                                        • Visatildeo Geral
                                          • Projetos Selecionados
                                          • agera
                                          • vertx
                                          • Android-CleanArchitecture
                                          • RxJava
                                          • guava
                                            • Refatoraccedilatildeo de Coacutedigo
                                            • Estudos de Caso
                                              • Consideraccedilotildees Finais
                                              • Referecircncias
                                              • Anexo
                                              • Projetos utilizados

bull executada em alta performance projetada para fornecer a maior performancepossiacutevel em tempo de execuccedilatildeo com a utilizaccedilatildeo do garbage collector em uma threadde baixa prioridade

bull interpretada dinacircmica e threaded projetada para ser interpretada por qual-quer dispositivo que possua JVM desenvolvida garantindo um desenvolvimento raacute-pido e em ciclos O uso da classe Thread permite que a linguagem acompanhe atendecircncia do paralelismo Aleacutem disso a ligaccedilatildeo de classes eacute feita em tempo real esomente quando necessaacuteria tornando-a dinacircmica

33 Evoluccedilatildeo

A primeira versatildeo do Java 8 foi lanccedilada em 2014 [28] e apresentou diversas atualizaccedilotildeesespalhadas em categorias como linguagem seguranccedila Collections ferramentas deployentre outras Dentre a grande quantidade de mudanccedilas os destaques se encontraram nasnovas melhorias presentes na linguagem que afetaram de forma mais direta a maneiracom que os desenvolvedores passaram a tratar e organizar o coacutedigo fonte As atualizaccedilotildeesreferentes a linguagem descritas oficialmente pela Oracle [29] satildeo

1 Lambda Expressions ou apenas Expressotildees Lambda correspondem a uma novacaracteriacutestica que permite que uma pequena funcionalidade possa ser utilizada comoum argumento de um meacutetodo facilitando a escrita de accedilotildees que seratildeo feitas repetida-mente em uma Collection ou quando um processo se completa ou quando encontraum erro Eacute tambeacutem uma forma compacta de se escrever coacutedigo que previamenteera escrito com anonymous inner classes [29] A Listagem 31 mostra uma classehipoteacutetica Calculator cujo meacutetodo operateBinary() recebe como paracircmetro doisinteiros e um objeto da classe IntegerMath que representa a operaccedilatildeo que deveraacuteser realizada ou seja uma funcionalidade dinacircmica

1 pub l i c c l a s s Ca l cu la to r 2

3 i n t e r f a c e IntegerMath 4 i n t opera t i on ( i n t a i n t b) 5 6

7 pub l i c i n t operateBinary ( i n t a i n t b IntegerMath op ) 8 re turn op opera t i on (a b) 9

10

11 pub l i c s t a t i c void main ( St r ing a rgs ) 12

15

13 Calcu la to r myApp = new Ca lcu la to r ( ) 14 IntegerMath add i t i on = (a b) minusgt a + b 15 IntegerMath subt ra c t i on = (a b) minusgt a minus b 16 System out p r i n t l n ( 40 + 2 = +17 myApp operateBinary (40 2 add i t i on ) ) 18 System out p r i n t l n ( 20 minus 10 = +19 myApp operateBinary (20 10 sub t ra c t i on ) ) 20 21 22

Listagem 31 Exemplo de coacutedigo com o uso de Expressatildeo Lambda [30]

2 Method References Frequentemente expressotildees lambda criam meacutetodos anocircni-mos Algumas vezes poreacutem satildeo utilizadas para chamar um meacutetodo jaacute existentena classe Ao inveacutes de escrever a expressatildeo Lambda para esse caso pode-se optarpor utilizar um Method Reference que facilita a escrita e leitura desse uso de ex-pressatildeo Lambda [29] A Listagem 32 mostra um exemplo de um meacutetodo estaacuteticoque compara duas pessoas pelas suas idades e a Listagem 33 a utilizaccedilatildeo de MethodReference para aplicar a utilizaccedilatildeo desse meacutetodo em um array e reduzir a escrita deuma expressatildeo lambda a uma forma mais legiacutevel

1 pub l i c s t a t i c i n t compareByAge ( Person a Person b) 2 re turn a b i r thday compareTo (b b i r thday ) 3 4

Listagem 32 Exemplo de meacutetodo de uma classe Pessoa [31]

1 Arrays s o r t ( rosterAsArray Person compareByAge ) 2

Listagem 33 Exemplo de uso de Method Reference [31]

3 Default Methods satildeo meacutetodos com a palavra-chave default que servem para adi-cionar implementaccedilotildees de meacutetodos a uma interface de alguma biblioteca mantendoa compatibilidade binaacuteria com versotildees mais antigas dessa interface Tambeacutem pos-sibilita a implementaccedilatildeo de meacutetodos estaacuteticos em interfaces [29] A Listagem 34apresenta a inclusatildeo de um meacutetodo default na interface TimeClient

1 pub l i c i n t e r f a c e TimeClient 2 void setTime ( i n t hour i n t minute i n t second ) 3 void setDate ( i n t day i n t month i n t year ) 4 void setDateAndTime ( i n t day i n t month i n t year 5 i n t hour i n t minute i n t second )

16

6 LocalDateTime getLocalDateTime ( ) 7

8 s t a t i c ZoneId getZoneId ( S t r ing zoneStr ing ) 9 t ry

10 re turn ZoneId o f ( zoneStr ing ) 11 catch ( DateTimeException e ) 12 System e r r p r i n t l n ( I n v a l i d time zone + zoneStr ing

+13 us ing d e f a u l t time zone in s t ead ) 14 re turn ZoneId systemDefault ( ) 15 16 17

18 d e f a u l t ZonedDateTime getZonedDateTime ( St r ing zoneStr ing ) 19 re turn ZonedDateTime o f ( getLocalDateTime ( ) getZoneId (

zoneStr ing ) ) 20 21 22

Listagem 34 Exemplo de interface com um meacutetodo default [32]

4 Repeating Annotations permitem a implementaccedilatildeo e utilizaccedilatildeo de anotaccedilotildees deum mesmo tipo que podem ser utilizadas mais de uma vez para a mesma declara-ccedilatildeo [29] A Listagem 35 apresenta duas anotaccedilotildees iguais com paracircmetros diferentespermitindo uma customizaccedilatildeo maior na aplicaccedilatildeo de um tipo de anotaccedilatildeo

1 Schedule ( dayOfMonth= l a s t )2 Schedule (dayOfWeek= Fr i hour= 23 )3 pub l i c void doPeriodicCleanup ( ) 4

Listagem 35 Exemplo de Repeating Annotations [33]

5 Type Annotations permitem que anotaccedilotildees possam ser utilizadas em tipos aleacutemde declaraccedilotildees dessa forma pode-se garantir que um campo sempre atenda agraves suasexpectativas e evite testes desnecessaacuterios [29] A Listagem 36 mostra um exemplo derestriccedilatildeo a uma String que nunca poderaacute ser nula devido agrave anotaccedilatildeo de NonNull

1 NonNull S t r ing s t r

Listagem 36 Exemplo de Type Annotation garantindo que o campo nunca seja null [34]

17

34 Expressotildees Lambda

Uma das mudanccedilas mais interessantes implementadas no Java 8 foi a adiccedilatildeo de expressotildeeslambda As expressotildees lambda permitem que a linguagem Java possa atuar parcialmentecomo uma linguagem de programaccedilatildeo funcional onde comportamentos satildeo avaliados eaplicados diferentemente da programaccedilatildeo imperativa que foca na mudanccedila de estadosNa praacutetica um comportamento pode ser passado como paracircmetro de um meacutetodo atraveacutesde uma escrita mais reduzida e legiacutevel Os benefiacutecios de utilizar expressotildees lambda incluemuma melhora na legibilidade e organizaccedilatildeo de coacutedigo que antes era escrito com AnonymousInner Class aleacutem de permitir uma forma simples de utilizar comportamento paralelo como uso de Streams

341 Sintaxe

A sintaxe de uma expressatildeo lambda eacute dividida nas seguintes partes [30]

bull Uma lista de paracircmetros separados por viacutergulas

bull Um token representado por uma seta -gt

bull Um corpo que pode ser representado por uma expressatildeo uacutenica ou um bloco de coacutedigodentro de chaves

As Listagens 37 e 38 mostram duas formas diferentes de se aplicar expressotildees Lambdacom uma sintaxe similar A primeira aplica a expressatildeo diretamente apoacutes a seta utilizadanormalmente para trechos de coacutedigo pequenos e simples e a segunda utiliza-se de chavespara incorporar o coacutedigo e da palavra-chave return para especificar o retorno forma maisutilizada para uma quantidade maior de coacutedigo

1 p minusgt p getGender ( ) == Person Sex MALE2 ampamp p getAge ( ) gt= 183 ampamp p getAge ( ) lt= 25

Listagem 37 Exemplo de expressatildeo lambda com uma expressatildeo [30]

1 p minusgt 2 re turn p getGender ( ) == Person Sex MALE3 ampamp p getAge ( ) gt= 184 ampamp p getAge ( ) lt= 25 5

Listagem 38 Exemplo de expressatildeo lambda com um bloco de coacutedigo [30]

18

342 Principais formas de uso

Anonymous Inner Class

Antes do Java 8 a necessidade de passar funccedilotildees ou expressotildees como paracircmetro de algummeacutetodo era suprida atraveacutes de Anonymous Inner Classes A utilizaccedilatildeo desse tipo dedeclaraccedilatildeo junto com a anotaccedilatildeo de Override permite sobrescrever um meacutetodo de umainterface funcional e ao mesmo tempo passa-la como argumento para um meacutetodo Umaexpressatildeo lambda se comporta da mesma forma poreacutem a quantidade de coacutedigo escritopela Anonymous Inner Class eacute maior e pode dificultar a leitura de coacutedigo pois conteacutemmuita informaccedilatildeo natildeo utilizada para efetivo entendimento do que estaacute sendo feito naqueletrecho

A Listagem 39 apresenta a instanciaccedilatildeo da classe EventHandler internamente ao meacute-todo setOnAction() de forma que o desenvolvedor possa escrever o comportamento quedeseja passar como paracircmetro do meacutetodo atraveacutes da substituiccedilatildeo do meacutetodo handle()que jaacute existe pelo meacutetodo handle() criado e escrito pelo desenvolvedor

1 btn setOnAction (new EventHandlerltActionEvent gt() 2 Override3 pub l i c void handle ( ActionEvent event ) 4 System out p r i n t l n ( He l lo World ) 5 6 )

Listagem 39 Exemplo de uso de Anonymous Inner Class [35]

Interface funcional

Ao projetar um coacutedigo novo o desenvolvedor que optar por utilizar expressotildees lambdadeve iniciar com a criaccedilatildeo de uma interface funcional Esse tipo de interface possui umuacutenico meacutetodo abstrato permitindo que expressotildees lambda sejam usadas para sobrescrevero comportamento do meacutetodo abstrato Uma interface funcional pode possuir outros meacuteto-dos desde que sejam default Uma nova anotaccedilatildeo FunctionalInterface foi adicionadacom a atualizaccedilatildeo do Java 8 para conferir em tempo de compilaccedilatildeo se a interface satisfazos requisitos desse modelo de interface

A Listagem 310 apresenta um exemplo de interface funcional com o objetivo de permi-tir o uso de expressotildees lambda que utilizaratildeo de dois Double como paracircmetro e jaacute utilizada nova anotaccedilatildeo FunctionalInterface introduzida no Java 8

1 Funct iona l Inte r face2 pub l i c i n t e r f a c e DoubleOp 3 pub l i c Double apply ( Double a Double b)

19

4

Listagem 310 Exemplo de interface funcional

Dessa forma conforme as Listagens 311 e 312 o meacutetodo apply() pode tomar formade qualquer operaccedilatildeo entre dois Double que seraacute especificada quando a expressatildeo lambdafor montada dando o aspecto de linguagem funcional agrave linguagem e mais facilidade eliberdade ao desenvolvedor

1 pub l i c c l a s s Ca l cu la to r 2 pub l i c s t a t i c Double c a l c ( Double op1 Double op2 DoubleOp operator ) 3 re turn operator apply ( op1 op2 ) 4 5

Listagem 311 Exemplo de aplicaccedilatildeo da interface funcional

1 Double r e s u l t 1 = Ca lcu la to r c a l c (10d 50d ( a b ) minusgt a + b)

Listagem 312 Uso de expressatildeo lambda para o exemplo anterior

Collections

Dentre as atualizaccedilotildees de pacotes do Java 8 foi adicionado um meacutetodo stream() nainterface Collection Esse meacutetodo trata as Collection como streams o que significa queapesar de natildeo ser possiacutevel acessar elementos diretamente algumas novas manipulaccedilotildeessatildeo possiacuteveis Essas manipulaccedilotildees satildeo na verdade meacutetodos da interface Stream quepodem receber como paracircmetro uma expressatildeo lambda ou seja um comportamento a seraplicado agrave Collection Dentre os meacutetodos temos

bull filter() O meacutetodo filter() recebe uma expressatildeo lambda contendo uma condiccedilatildeopara filtragem da collection

bull map() O meacutetodo map() mapeia os elementos de uma Collection em outro objetocomo uma String A expressatildeo lambda passada por paracircmetro deve retornar o tipode objeto ao qual seraacute mapeado

bull forEach() O meacutetodo forEach() aplica uma operaccedilatildeo especiacutefica para cada ele-mento da Collection A expressatildeo lambda a ser passada deve conter a operaccedilatildeo aser realizada

bull min() e max() Os meacutetodos min() e max() retornam o elemento menor ou maiorda Collection dependendo da expressatildeo lambda passada como paracircmetro

20

A Listagem 313 demonstra como vaacuterias operaccedilotildees com uma Collection podem seraplicadas de uma vez de forma que lendo a expressatildeo lambda jaacute eacute possiacutevel saber oresultado da aplicaccedilatildeo do meacutetodo agrave Collection

1 r o s t e r2 stream ( )3 f i l t e r (4 p minusgt p getGender ( ) == Person Sex MALE5 ampamp p getAge ( ) gt= 186 ampamp p getAge ( ) lt= 25)7 map(p minusgt p getEmailAddress ( ) )8 forEach ( emai l minusgt System out p r i n t l n ( emai l ) )

Listagem 313 Exemplo de utilizaccedilatildeo de meacutetodos de stream com expressotildees lambda [30]

21

Capiacutetulo 4

Estudo e o Processo de Mineraccedilatildeo

A definiccedilatildeo da metodologia utilizada para realizaccedilatildeo deste trabalho eacute importante para queexista uma padronizaccedilatildeo e melhor entendimento de como os resultados foram obtidos paraque a replicaccedilatildeo do mesmo possa ser realizada em trabalhos futuros [36]

Figura 41 Processo utilizado para realizaccedilatildeo do estudo

O esquema representado na Figura 41 descreve o processo seguido para a realizaccedilatildeodeste trabalho que foi divido em trecircs grandes etapas a de planejamento definindo osobjetivos questotildees de pesquisa e meios de investigaccedilatildeo deste projeto a etapa de execuccedilatildeorealizando todo o procedimento metodoloacutegico definido para a coleta e refinamento de

22

dados e a etapa de avaliaccedilatildeo onde foram classificados e avaliados os dados coletadospara responder agraves questotildees de pesquisa

A seguir na primeira seccedilatildeo seratildeo apresentadas em detalhes as questotildees de pesquisa aserem respondidas Em seguida seraacute feito uma breve descriccedilatildeo da fonte de dados utilizada- especificamente os projetos utilizados como objetos de estudo deste trabalho e por fimtodo o restante da metodologia que foi de fato desenvolvida para obter os resultadosnecessaacuterios

41 Questotildees de Pesquisa

Com o objetivo de entender e caracterizar melhor o uso de expressotildees lambda foramdefinidas as seguintes questotildees de pesquisa a serem respondidas

bull PQ-1 Quando os projetos comeccedilaram a introduzir o uso de expressotildees lambda emseus coacutedigos e qual a meacutedia de expressotildees lambda por snapshots caso existam

bull PQ-2 Como as equipes de desenvolvimento estatildeo utilizando expressotildees lambdaatraveacutes de refatoraccedilatildeo de coacutedigo ou introduzindo apenas em coacutedigo novo

bull PQ-3 Quais satildeo os padrotildees tipicamente adotados para o uso de expressotildees lambda

A primeira pergunta de pesquisa gira em torno de como projetos populares open-sourceestatildeo se adaptando agrave introduccedilatildeo de expressotildees lambda em Java muitos projetos jaacute estatildeoutilizando as expressotildees lambda Se sim a partir de quando comeccedilaram a utilizaacute-lasdesde o iniacutecio da introduccedilatildeo das mesmas no Java 8 ou em um periacuteodo mais tardio Aleacutemdisso eacute interessante descobrir se a utilizaccedilatildeo dessa nova caracteriacutestica tem acontecido deforma expressiva ou natildeo

Em seguida para melhor entender a forma como as expressotildees lambda estatildeo sendointroduzidas em projetos eacute interessante investigar se as equipes de desenvolvimento estatildeose preocupando em refatorar coacutedigo com o objetivo de evoluir o software ou se estatildeoexperimentando utilizar expressotildees lambda apenas em coacutedigo novo introduzido

Como a introduccedilatildeo de novas funcionalidades em projetos open-source de grande escaladepende do objetivo do projeto e os padrotildees de projeto utilizados [37] espera-se obser-var diversas abordagens quanto a utilizaccedilatildeo de expressotildees lambda para entatildeo poderclassificar estes softwares quanto a abordagem utilizada

Eacute de grande importacircncia para este estudo conseguir identificar na praacutetica comoexpressotildees lambda estatildeo sendo tipicamente adotadas nestes projetos Assim a terceirapergunta de pesquisa busca identificar alguns exemplos de utilizaccedilatildeo atraveacutes da realizaccedilatildeode alguns estudos de caso

23

Eacute importante ressaltar que apesar de as expressotildees lambda serem uma alternativa aouso de AIC elas natildeo os substituem completamente Existem precondiccedilotildees para que umaAIC possa ser substituiacuteda por expressotildees lambda [12] descritas a seguir

bull AIC deve instanciar-se de uma interface

bull AIC natildeo deve possuir nenhum campo e declarar apenas um meacutetodo

bull AIC natildeo deve possuir uma referecircncia para this ou super

bull AIC natildeo deve declarar um meacutetodo recursivo

Para responder agrave primeira pergunta apenas dados gerais sobre todos os projetos seratildeonecessaacuterios ao passo que pelas perguntas 2 e 3 possuiacuterem uma natureza mais complexaseraacute necessaacuterio aleacutem de uma anaacutelise geral estatiacutestica a realizaccedilatildeo de alguns estudos decaso para obter resultados mais completos

42 Fonte de Dados e Objetos de Estudo

Para responder agraves perguntas de pesquisa estabelecidas foram selecionados os 99 projetosmais populares na linguagem Java dentro da plataforma github ateacute a data da coleta dosdados feita em Abril de 2017 Satildeo considerados populares os repositoacuterios que possuema maior quantidade possiacutevel de estrelas (stars) A decisatildeo de escolher os 99 projetos maispopulares foi por sua natureza imparcial e ao mesmo tempo para que se possa analisarprojetos que satildeo de familiaridade e conhecimento da comunidade do github e de domiacuteniopuacuteblico Os 99 projetos estatildeo listados no Anexo I

Para entender a transiccedilatildeo feita por esses projetos entre as versotildees anteriores do Java eo Java 8 com as expressotildees lambda eacute necessaacuterio analisar o coacutedigo de vaacuterias versotildees a fimde observar alguma mudanccedila para cada projeto Como satildeo 99 projetos e vaacuterios dessesprojetos possuem milhares de linhas de coacutedigo e commits seria impossiacutevel avaliar todosos commits Optou-se entatildeo por coletar snapshots mensais de cada projeto conformeprocedimento tambeacutem seguido anteriormente [38] Cada snapshots representa o estadodo projeto em um determinado mecircs e como criteacuterio de escolha padratildeo todos os snapshotsequivalem ao uacuteltimo commit realizado no determinado mecircs que este representa

O proacuteximo passo eacute determinar o periacuteodo de tempo em que esses snapshots seriamcoletados Como Java 8 (e consequentemente as expressotildees lambda) foi introduzidoapenas em meados de 2014 [28] coletar dados de projetos a partir de um periacuteodo muitoantes deste ano natildeo agregaria valor ao estudo em questatildeo Definiu-se entatildeo um periacuteodopara a coleta mensal desses snapshots atraveacutes dos anos Janeiro de 2013 um ano antesda introduccedilatildeo do Java 8 para que se pudesse identificar para todos os projetos o mecircs

24

exato em que expressotildees lambda foram introduzidas ateacute o mecircs da coleta de dados Abrilde 2017

Eacute importante ressaltar que a definiccedilatildeo dos meses foi definida do dia primeiro de ummecircs ao dia primeiro do proacuteximo mecircs e por consequecircncia alguns snapshots que deveriamrepresentar o final de determinado mecircs correspondem na verdade a commits realizadosno dia primeiro do mecircs seguinte Por exemplo pode existir casos em que o commit querepresente o mecircs de Marccedilo de 2016 seja na verdade o commit realizado no dia primeirode Abril de 2016 Isso se deve a natureza da forma como os resultados de log de commitssatildeo obtidos pelo git [39] Poreacutem isso natildeo interfere nas anaacutelises ou no propoacutesito destetrabalho uma vez que foram realizadas verificaccedilotildees e validaccedilotildees para que natildeo existamdatas repetidas (e consequentemente commits repetidos) por repositoacuterio

Neste trabalho o termo projeto e repositoacuterio foram utilizados de forma intercaladapara representar a mesma coisa o software desenvolvido que possui um repositoacuterio naplataforma github Os termos commit snapshops e versotildees tambeacutem representam a mesmacoisa uma vez que foi definido que seriam utilizados apenas um commit por mecircs pararepresentar um determinado snapshot ou versatildeo do repositoacuterio em questatildeo

Todos os 99 projetos seratildeo utilizados para a realizaccedilatildeo de uma anaacutelise geral de ca-racterizaccedilatildeo do uso de expressotildees lambda Para as anaacutelises aprofundadas foi feito umcriteacuterio de classificaccedilatildeo para que apenas alguns projetos possam ser analisados em niacutevelde coacutedigo como estudos de caso

Resumindo foram escolhidos os 99 projetos mais populares de Java no github cole-tando dados mensais de seus commits a partir do ano de 2013 ateacute a data da coleta dosdados lembrando que nem todos os projetos existem desde 2013 (projetos mais recentes)

43 Processo de Mineraccedilatildeo

A abordagem utilizada para coletar e analisar os 99 projetos escolhidos como mostra aFigura 42 foi realizada de forma automatizada utilizando scripts python e dois projetosdesenvolvidos em Java para a coleta e tratamento de dados como descrito a seguir

Primeiramente foi realizado uma coacutepia dos repositoacuterios atuais de todos os 99 projetosmais populares do github em Java Para automatizar o processo foi desenvolvido umscript em python que lista todos os projetos escolhidos clona todos os repositoacuterios emuma pasta na maacutequina local e cria um arquivo temporaacuterio com as informaccedilotildees do nomede cada repositoacuterio e seu caminho absoluto na maacutequina local

25

Figura 42 Metodologia implementada para coleta e tratamento de dados

Em seguida foi necessaacuterio realizar o checkout de todas as versotildees entre Janeiro de2013 a Abril de 2017 de cada projeto Por motivos de otimizaccedilatildeo de espaccedilo da maacutequinalocal e automatizaccedilatildeo no processo de checkout utilizou-se de um segundo script pythonque realizava as seguintes tarefas para cada mecircs em cada projeto verificar se dentreo mecircs estipulado houve algum commit para aquele projeto se sim pega-se o hash douacuteltimo commit do mecircs realiza o checkout conta-se a quantidade de linhas de coacutedigo emJava que o projeto tem utilizando a biblioteca cloc e armazena todas as informaccedilotildeespertinentes referentes a todos os projetos que naquele mecircs tiveram commits para que oprojeto static-analysis possa entatildeo ser executado sobre esses projetos naquele determinadomomento As informaccedilotildees coletadas que satildeo utilizadas pelo static-analysis correspondemao nome do projeto o hash do commit para aquela versatildeo a pasta onde o projeto estaacutearmazenado na maacutequina local a quantidade de linhas de coacutedigo Java do projeto e datareferente ao commit Essas informaccedilotildees satildeo pertinentes para que o projeto static-analysisconsiga funcionar de forma correta projeto este descrito em detalhes a seguir

431 static-analysis

O static-analysis foi um projeto desenvolvido anteriormente a este trabalho pelos alunosThiago Cavalcanti e Vinicius de Almeida cujo objetivo eacute realizar a anaacutelise estaacutetica de

26

coacutedigos-fonte Java e gerar arquivos de saiacuteda contendo informaccedilotildees de classes e meacutetodoscom suas devidas ocorrecircncias de caracteriacutesticas da linguagem [40]

A anaacutelise estaacutetica de coacutedigo consiste em analisar um coacutedigo-fonte sem a necessidadede executaacute-lo Esse tipo de anaacutelise eacute de extrema importacircncia para manter um coacutedigo dequalidade evitar futuras refatoraccedilotildees e obter informaccedilotildees estatiacutesticas de forma raacutepida epraacutetica [41]

Seguindo esse princiacutepio o static-analysis foi projetado para receber um arquivo deentrada csv seguindo o padratildeo

Tipo da Aplicaccedilatildeo Inicio do projeto Antes ou Apoacutes Java 5 Nome do ProjetoVersatildeo Caminho absolutoQuantidade de linhas de coacutedigo

Atraveacutes da informaccedilatildeo do caminho absoluto do projeto o static-analysis varre osdiretoacuterios em busca dos arquivos fonte java realiza o parse desses arquivos e utilizade Visitors para extrair as informaccedilotildees desejadas e exporta-las em arquivos csv Ouso de Visitors permite que sejam escolhidas as informaccedilotildees desejadas para a consultacomo expressotildees Lambda e AIC s aleacutem de possibilitar que sejam implementados novosVisitors conforme a linguagem evolua ou as necessidades mudem

Para este trabalho foram utilizados os Visitors de expressotildees Lambda map() filter()AICs e declaraccedilotildees de meacutetodos

432 BDAnalisador

Apoacutes obter todas as informaccedilotildees necessaacuterias geradas pelo static-analysis era preciso ma-nipular os dados de forma que facilitasse a coleta de dados para o estudo proposto Comovaacuterios arquivos em formato csv satildeo de difiacutecil manipulaccedilatildeo foi desenvolvido entatildeo umaferramenta chamada BDAnalisador Esta ferramenta eacute responsaacutevel por processar os arqui-vos em csv gerados pelo static-analysis e popular uma base de dados relacional MySQLcom as informaccedilotildees pertinentes a este estudo

O BDAnalisador foi desenvolvido com a intenccedilatildeo de tornar mais simples o trabalhocom os dados resultantes do static-analysis de forma que consultas em SQL pudessemser feitas a ponto de permitir a obtenccedilatildeo de resultados mais complexos Seguindo esseobjetivo o framework Hibernate foi escolhido como ferramenta para persistecircncia devidoa ser um framework jaacute consolidado no mercado e que de forma simples relaciona osobjetos Java ao banco de dados MySQL [42] A divisatildeo de classes foi projetada em quatroentidades Projeto Versao Classe e Metodo cada uma com seus respectivos camposcontendo as informaccedilotildees necessaacuterias para a pesquisa como pode ser visto na Figura 44Eacute importante ressaltar que a tabela de Versao guarda hashs de commits devido agrave escolhade utilizar commits para obter mais informaccedilatildeo de evoluccedilatildeo de coacutedigo em um menor

27

espaccedilo de tempo Aleacutem disso para este trabalho optou-se por persistir todos os meacutetodose classes de cada versatildeo sem se importar com a repeticcedilatildeo desses dados pois a hipoacutetesede haver grandes refatoraccedilotildees entre versotildees poderia comprometer a confiabilidade dasinformaccedilotildees

Figura 43 Diagrama de classes UML do BDAnalisador

Como visto na Figura 43 seguindo parcialmente a arquitetura MVC cada entidadepossui sua respectiva classe DAO(Data Access Object) para persistecircncia dos dados eapenas uma classe Controlador no projeto responsaacutevel pela manipulaccedilatildeo e parse dosdados dos arquivos csv gerados pelo static analysis para serem enviados agraves classes DAOO sistema inicia chamando o meacutetodo inicializar() da classe Controlador Esse meacutetodoeacute responsaacutevel por ler um arquivo de entrada csv que segue o mesmo modelo do arquivo dostatic-analysis citado na seccedilatildeo anterior O arquivo conteacutem os dados de todos os projetose suas respectivas versotildees dessa forma o meacutetodo instancia um objeto da classe Projetoe persiste o projeto no banco de dados Para cada versatildeo encontrada no arquivo deentrada o inicializar() aciona os meacutetodos responsaacuteveis por instanciar e preencher aslistas da classe Classe e Metodo Os meacutetodos responsaacuteveis por preencher as listas varremos arquivos csv gerados pelo static-analysis e fazem o parse das informaccedilotildees relevantescomo nomes dos meacutetodos e quantidades de lambdas para construir os objetos que seratildeogravados Ao final dos preenchimentos o objeto Versatildeo eacute instanciado e gravado no bancode dados atraveacutes de sua classe DAO ao mesmo tempo que grava suas respectivas Classese Metodos

28

Apoacutes vaacuterios testes e correccedilotildees de bugs o banco de dados se encontrava finalmente comas informaccedilotildees de 99 projetos Java open-source separados por um commit por mecircs desde2013 cada um com suas respectivas informaccedilotildees de classes meacutetodos e a quantidade deexpressotildees lambda filters e maps em cada meacutetodo Filter ou Filter pattern eacute o padratildeode projeto que tem como objetivo filtrar objetos de uma coleccedilatildeo (Collection) de acordocom algum criteacuterio Jaacute o map ou map pattern eacute um padratildeo que ldquomapeia os elementosde uma coleccedilatildeo aplicando uma funccedilatildeo a eles para uma nova coleccedilatildeo [43] A coleta deinformaccedilotildees sobre esses padrotildees podem ser uacuteteis para possiacuteveis anaacutelises de oportunidadesde uso de expressotildees lambda para refatoraccedilatildeo de coacutedigo

A Figura 44 mostra o esquema de como o banco de dados resultante foi gerado

Figura 44 Modelo relacional do banco de dados populado pelo BDAnalisador Imagemgerada com software DBeaver [2]

44 Classificaccedilatildeo e Anaacutelise

Com o banco de dados populado restam apenas as etapas de classificaccedilatildeo e anaacutelise pararesponder as questotildees de pesquisa propostas Para isso inicialmente houve uma tentativade se utilizar apenas queries SQL para analisar os dados de acordo com as informaccedilotildeesrelevantes Poreacutem devido ao fato de o banco de dados conter todas as informaccedilotildees detodos os projetos e todas as suas versotildees queries que possuem uma alta complexidadedemoravam muito tempo para retornar os dados

Assim com o objetivo de facilitar o trabalho alguns scripts python foram desenvolvi-dos para rodar as queries separadamente e individualmente para cada projeto de formaautomatizada a fim de melhorar o tempo de resposta para obtenccedilatildeo dos resultados

29

441 Meacutedia de Lambda

O primeiro script retorna a quantidade de expressotildees lambda (ou AICs) por n snapshotsque contenha expressotildees lambda O objetivo eacute ter uma visatildeo geral da meacutedia de expressotildeeslambda e AICs utilizadas por cada projeto e como nem todos os snapshots coletados decada projeto possuem expressotildees lambda e AICs apenas aqueles com alguma expressatildeolambda ou AIC satildeo incluiacutedos no caacutelculo da meacutedia

Mmedia =sumn qtdLambdai

n

442 Anaacutelise Temporal

O segundo script retorna para cada projeto a soma total da quantidade de expressotildeeslambda AIC map() e filter() no projeto inteiro para cada versatildeo Ou seja tem-seo total de cada uma das quatro propriedades selecionadas para cada mecircs do projetoobtendo assim uma visatildeo temporal de evoluccedilatildeo do uso das caracteriacutesticas descritas ATabela 41 ilustra parcialmente o resultado obtido para o projeto agera onde idVersaoeacute o identificador no banco de dados referente ao hash do commit mensal coletado qtd eacutea quantidade de cada uma das caracteriacutesticas escolhidas e a data do commit encontra-seno formato americano

Tabela 41 Informaccedilotildees mensais sobre o projeto ageraidVersao Data do Commit qtd lambda qtd AIC qtd maps qtd filter

823 512016 0 29 4 0755 612016 13 28 4 0686 6152016 13 29 4 0621 812016 13 29 4 0555 8162016 13 30 4 0485 922016 13 30 4 0422 10132016 14 30 4 0356 11282016 14 30 4 0295 12212016 21 30 5 0232 212017 21 30 5 0175 312017 21 30 5 0112 3312017 21 36 5 048 4242017 21 48 5 0

Os resultados obtidos com esta anaacutelise temporal permitiu a identificaccedilatildeo de padrotildees nautilizaccedilatildeo de expressotildees lambda em relaccedilatildeo a utilizaccedilatildeo de AIC por todos os projetos Foi

30

possiacutevel classificar todos os projetos em 6 grupos ilustrado na Figura 45 Primeiramenteseparou-se os projetos entre os que possuem expressotildees lambda e os que natildeo possuemDentre os que possuem identificou-se cinco categorias

1 Grupo 1 Quantidade de AICs e expressotildees lambda aumentam com o tempo pro-porcionalmente

2 Grupo 2 Quantidade de AICs diminui agrave medida que a quantidade de expressotildeeslambda aumentam e a quantidade de expressotildees lambda ultrapassa a quantidade deAIC em um determinado momento

3 Grupo 3 Quantidade de AICs diminui agrave medida que a quantidade de expressotildeeslambda aumentam mas a quantidade de AIC permanece superior agrave quantidade delambda

4 Grupo 4 Expressotildees lambda satildeo introduzidas e existem por um pequeno periacuteodode tempo mas satildeo completamente removidas posteriormente

5 Grupo 5 Quantidade de expressotildees lambda eacute constante e muito inferior compa-rado com a quantidade de AICs no projeto Foi determinado que para pertencera esta classificaccedilatildeo o projeto precisa ter uma razatildeo de meacutedia de expressotildees lamb-dasnapshot por meacutedia de AICsnapshot inferior a 020 Esse paracircmetro foi esta-belecido com o objetivo de definir um padratildeo para o que pode ser considerado umprojeto com poucas expressotildees lambda

Figura 45 Classificaccedilatildeo dos projetos

31

443 Refatoraccedilatildeo de Coacutedigo

O uacuteltimo script teve como objetivo realizar uma tentativa inicial de identificar refatoraccedilatildeode coacutedigo da seguinte maneira para todos os projetos que possuem expressotildees lambdaforam identificados o mecircs imediatamente antes da introduccedilatildeo de expressotildees lambda e omecircs seguinte onde houve a primeira ocorrecircncia de lambda no projeto Assim realizou-se uma anaacutelise do tamanho em quantidade de linhas de coacutedigo de todos os meacutetodosdo projeto que no mecircs seguinte tiveram introduccedilatildeo de lambda Em seguida fez-se umacomparaccedilatildeo com os mesmos meacutetodos em relaccedilatildeo ao mecircs anterior e assim foi possiacuteveldetectar quais meacutetodos tiveram a quantidade de linhas de coacutedigo reduzidas o que seriaum indicativo natildeo necessariamente exclusivo de que uma refatoraccedilatildeo de coacutedigo possa terocorrido

Sabe-se que este meacutetodo de detecccedilatildeo de refatoraccedilatildeo de coacutedigo possui suas limitaccedilotildeesuma vez que as comparaccedilotildees para saber se um meacutetodo existe em ambas versotildees eacute feitopuramente por comparaccedilatildeo de String (nome do meacutetodo) e a classe que este pertence

444 Casos de Uso

Os meacutetodos descritos acima ajudaram a identificar alguns padrotildees e facilitar a anaacutelise dosdados Poreacutem natildeo satildeo suficientes para que se possa responder agraves questotildees de pesquisaDessa forma apoacutes a identificaccedilatildeo dos grupos de classificaccedilatildeo para os projetos foramescolhidos um projeto de cada grupo (com exceccedilatildeo do grupo dos projetos sem expressotildeeslambda) para realizar um breve estudo de caso com o objetivo de identificar e caracterizarmelhor a adoccedilatildeo de expressotildees lambda Os projetos escolhidos foram agera vertxAndroid-CleanArchitecture RxJava e guava

32

Capiacutetulo 5

Resultados Obtidos e Anaacutelise

Neste capiacutetulo seratildeo apresentados os dados obtidos e anaacutelise com o objetivo de responderagraves questotildees de pesquisa propostas Como mencionado anteriormente as perguntas seratildeorespondidas de duas maneiras algumas com informaccedilotildees gerais sobre todos os projetose outras com breve estudos de caso envolvendo cinco projetos

51 Visatildeo Geral

Dentre os repositoacuterios coletados para a anaacutelise 74 (7474) natildeo utilizaram nenhumaexpressatildeo lambda no projeto durante todo o periacuteodo analisado (Janeiro de 2013 a Abrilde 2017) restando apenas 25 repositoacuterios (2525) com expressotildees lambda Eacute interessantedestacar que apesar de a quantidade de repositoacuterios que natildeo possuem expressotildees lambdaser relativamente expressiva muitos destes repositoacuterios satildeo de projetos em Java que umdia foram populares e atualmente natildeo estatildeo sendo mais desenvolvidos (por exemplo umaplicativo que soacute funciona para Android 23 atualmente descontinuado)

Levando em consideraccedilatildeo apenas os projetos que possuem expressotildees lambda exis-tem dois tipos de dados que podem ser analisados para responder agrave primeira questatildeo depesquisa atraveacutes dos dados obtidos pelo meacutetodo anteriormente mencionado como anaacutelisetemporal e a meacutedia de lambda por snapshot mencionados no capiacutetulo anterior

Com relaccedilatildeo ao ano em que a primeira ocorrecircncia foi encontrada 6 projetos introduzi-ram expressotildees lambda jaacute em 2014 8 comeccedilaram a utilizar em 2015 7 em 2016 e apenas4 tiveram a primeira ocorrecircncia de expressotildees lambda em 2017 Dessa forma percebe-seque os projetos estatildeo relativamente bem distribuiacutedos em grupos quanto ao ano em que seintroduziu expressotildees lambda

Pela meacutedia de lambda por snapshot (lambdasnapshot) a maioria (11 projetos) possuiuma quantidade expressiva acima de 100 lambdasnapshot (com 6 projetos entre 20 e 100lambdasnapshot e 8 projetos com menos de 20 lambdasnapshot) como apresentados no

33

graacutefico da Figura 51 Isso mostra que essa nova caracteriacutestica jaacute estaacute sendo bem utilizadanos projetos que comeccedilaram a migrar para a nova versatildeo do Java

Figura 51 Graacuteficos dos projetos separados por ano de introduccedilatildeo de expressotildees lambdae meacutedia de lambda por snapshot

Com isso pode-se observar que apesar de a quantidade de projetos que possuemexpressotildees lambda natildeo ser tatildeo alta eacute possiacutevel obter resultados expressivos uma vez quea quantidade dos projetos com lambda estatildeo bem dispersos quanto ao periacuteodo em quecomeccedilaram a adotar essa caracteriacutestica e a quantidade de expressotildees lambda por snapshot

511 Projetos Selecionados

Atraveacutes dos grupos de classificaccedilatildeo identificados pela anaacutelise temporal descritos na Figura45 cinco projetos foram selecionados para uma anaacutelise detalhada levando em consideraccedilatildeoo grupo em que eles pertencem Estes projetos seratildeo apresentados a seguir

512 agera

Agera eacute uma biblioteca Android que ajuda a introduzir programaccedilatildeo funcional reativa(functional reactive programming) em projetos Android Eacute um projeto recente lanccediladoem 2016 pela Google [44] e encontra-se no grupo dos projetos que introduziram expressotildeeslambda em 2016 no mesmo ano de seu lanccedilamento contendo uma meacutedia de expressotildeeslambda de 16 lambdasnapshot

Na classificaccedilatildeo estabelecida agera pertence ao Grupo 1 onde a quantidade de ex-pressotildees lambda no projeto com o tempo aumentam juntamente com a quantidade deAICs como mostra o graacutefico de anaacutelise temporal na Figura 52

34

Figura 52 Graacuteficos de anaacutelise temporal do projeto agera

513 vertx

Eclipse Vertx eacute um conjunto de ferramentas para criaccedilatildeo de reactive applications namaacutequina virtual Java (JVM) em grande escala [45] Seu primeiro lanccedilamento aconteceuem 2011 e a primeira ocorrecircncia de expressotildees lambda no projeto aconteceu em 2014 Esteprojeto possui uma meacutedia de 2867 lambdasnapshot e dentre os projetos consideradosneste trabalho eacute o que possui a maior quantidade de expressotildees lambda

Este projeto pertence ao Grupo 2 onde a quantidade de expressotildees lambda aumen-tou consideravelmente pelos meses ultrapassando a quantidade de AICs que diminuiudrasticamente como mostra a Figura 53

35

Figura 53 Graacuteficos de anaacutelise temporal do projeto Vertx

514 Android-CleanArchitecture

Apesar de ser uma amostra de projeto Android-CleanArchitecture que tem como objetivoconstruir aplicaccedilotildees Android utilizando clean architecture foi lanccedilado em 2014 mas semanteacutem sempre atualizado [46]

A introduccedilatildeo de expressotildees lambda que aconteceu no ano de 2015 se deu de formatiacutemida com uma meacutedia de 35 lambdasnapshot De qualquer forma este projeto conseguerepresentar com seu graacutefico de anaacutelise temporal o grupo 3 composto por projetos em quea quantidade de expressotildees lambda aumentou mas sem ultrapassar AICs que diminuiacuteramdemonstrado no graacutefico da Figura 54

36

Figura 54 Graacuteficos de anaacutelise temporal do projeto Android-CleanArchitecture

515 RxJava

Dentre os repositoacuterios estudados RxJava eacute considerado o mais popular Como umaimplementaccedilatildeo de Reactive Extensions para a JVM RxJava teve seu lanccedilamento dadoem 2013 [47] Expressotildees lambda apareceram pela primeira vez no ano de 2015 comuma meacutedia de 766 lambdasnapshot

Apesar de uma meacutedia relativamente alta o tempo de vida das expressotildees lambda nesteprojeto foi bem curto caracterizando assim projetos do grupo 4 houve a introduccedilatildeo dasexpressotildees lambda no projeto poreacutem houve a remoccedilatildeo completa de todas as expressotildeeslambda previamente introduzidas desaparecendo completamente do projeto ateacute a datada coleta de dados (Figura 55)

37

Figura 55 Graacuteficos de anaacutelise temporal do projeto RxJava

516 guava

Guava eacute um conjunto de bibliotecas para Java da Google lanccedilado em 2011 A atualizaccedilatildeodo coacutedigo do projeto para Java 8 aconteceu somente em 2016 e apesar do projeto conteruma meacutedia de 281 lambdasnapshot ele foi escolhido como representante dos projetosdo Grupo 5 (Figura 56) que possuem expressotildees lambda mas de forma natildeo expressiva osuficiente quando comparado com a quantidade de AIC pelo fato de sua razatildeo de meacutedia delambdasnapshot por meacutedia de AICsnapshot ser 004 Ou seja embora o projeto tenhaexpressotildees lambda estas satildeo consideradas muito poucas quando inseridas no contextogeral deste projeto que eacute considerado um projeto grande

38

Figura 56 Graacuteficos de anaacutelise temporal do projeto Guava

52 Refatoraccedilatildeo de Coacutedigo

Com o objetivo de caracterizar melhor como as expressotildees lambda estatildeo sendo utilizadaseacute interessante identificar se estas estatildeo sendo introduzidas atraveacutes de refatoraccedilatildeo de coacutedigoou em coacutedigo novo

Os projetos classificados como pertencentes ao Grupo 2 possuem em comum o fatode expressotildees lambda aumentarem a medida que AICs diminuem ultrapassando-as eessa caracteriacutestica em comum pode indicar que nestes projetos possivelmente houve re-fatoraccedilatildeo de coacutedigo visto que AIC sendo substituiacutedo por expressotildees lambda dentro dascondiccedilotildees determinadas eacute a maneira mais comum de se identificar refatoraccedilatildeo de coacute-digo para introduccedilatildeo de expressotildees lambda [12] Os projetos que compotildeem o grupo 2representam 44 de todos os projetos estudados que possuem expressotildees lambda o quepode ser um indicativo caso a hipoacutetese de refatoraccedilatildeo de coacutedigo seja positiva de quemuitos projetos que estatildeo adotando o Java 8 estatildeo se preocupando de alguma formacom refatoraccedilatildeo se coacutedigo Fazem parte desse grupo os seguintes projetos elasticsearchjava-design-patterns PocketHub presto RxJava-Android-Samples spark vertx zipkinjava8-tutorial dropwizard e material-dialogs

39

Outra maneira de verificar possiacuteveis indicadores de refatoraccedilatildeo de coacutedigo foi atraveacutesda anaacutelise dos tamanhos (em quantidade de linhas de coacutedigo) dos meacutetodos com expressotildeeslambda no mecircs em que se introduziu expressotildees lambda e um mecircs imediatamente antesdeste Essa anaacutelise mostra que dos 25 projetos com expressotildees lambda 12 (48) projetostiveram ao menos um meacutetodo em que houve uma diminuiccedilatildeo no tamanho o que podeser considerado um indicativo de refatoraccedilatildeo de coacutedigo A Figura 57 mostra todos osprojetos em relaccedilatildeo agrave quantidade total de meacutetodos que possuem lambda no primeiro mecircsde introduccedilatildeo do mesmo em vermelho comparado com a quantidade desses meacutetodos quetiveram uma diminuiccedilatildeo no tamanho quando comparados com o coacutedigo do mecircs anteriorem azul

Figura 57 Comparaccedilatildeo entre todos os projetos com expressatildeo lambda sobre refatoraccedilatildeode coacutedigo no mecircs de introduccedilatildeo da caracteriacutestica

Ainda observando a figura 57 com relaccedilatildeo aos projetos que natildeo tiveram nenhummeacutetodo com diminuiccedilatildeo de tamanho (barra azul) percebe-se que todos os 13 projetossequer tiveram uma quantidade significativa de meacutetodos que possuem expressotildees lambda(com o maior tendo apenas 5 meacutetodos) no mecircs de introduccedilatildeo da caracteriacutestica no projetoe ao mesmo tempo jaacute existiam no mecircs em que natildeo existia lambda no projeto Essa eacuteuma observaccedilatildeo importante porque projetos como vertx sendo este o que possui a maiormeacutedia de lambdasnapshot de todos os projetos e ao mesmo tempo tendo apenas trecircsmeacutetodos que continham expressotildees lambda no mecircs da introduccedilatildeo e que existiam no mecircs

40

anterior permitem inferir que todas as outras expressotildees lambda existentes no projetopara este determinado mecircs de introduccedilatildeo encontram-se em coacutedigo novo introduzido

Eacute importante ressaltar que somente essa anaacutelise natildeo eacute exclusivamente suficiente paradeterminar se estes projetos estatildeo realmente introduzindo lambda em coacutedigo novo ourealizando refatoraccedilatildeo uma vez que como a comparaccedilatildeo aconteceu apenas no mecircs deintroduccedilatildeo com o mecircs imediatamente anterior natildeo reflete todo o ciclo de vida do pro-jeto Por exemplo algumas equipes podem escolher refatorar o coacutedigo depois de umtempo de adaptaccedilatildeo apoacutes a transiccedilatildeo para a nova versatildeo da linguagem Assim paraobter uma melhor anaacutelise sobre refatoraccedilatildeo de coacutedigo ou natildeo feita nestes projetos aleacutemde outras anaacutelises referentes aos padrotildees tipicamente adotados para implementaccedilatildeo delambda nestes projetos seratildeo apresentados a seguir os estudos de caso dos cinco projetospreviamente selecionados

Outro ponto importante eacute o fato de que apesar das informaccedilotildees quanto agraves quantida-des de filter e map terem sido incluiacutedas inicialmente no trabalho para observar possiacuteveispadrotildees de refatoraccedilatildeo de coacutedigo percebeu-se que estas natildeo satildeo utilizadas de forma con-sideraacutevel pelos projetos estudados e para fins de anaacutelises generalizadas natildeo apresentaramtanta influecircncia na utilizaccedilatildeo de expressotildees lambda quanto a quantidade de AICs noprojeto

53 Estudos de Caso

Dentre os projetos analisados verificou-se que os projetos de pequeno e meacutedio porte op-taram por refatorar de uma vez seus coacutedigos para incluir expressotildees lambda em situaccedilotildeesem que se utilizava AICs anteriormente ou em alguns poucos casos de utilizaccedilatildeo deCollection Os projetos de grande porte natildeo apresentaram nenhuma refatoraccedilatildeo de coacute-digo ou uma refatoraccedilatildeo parcial gradativa provavelmente devido agrave grande quantidade dearquivos e coacutedigo que possuem o que pode tornar o trabalho de refatoraccedilatildeo extenso ecansativo

O projeto vertx que pertence ao grupo 2 dos projetos em que a quantidade de ex-pressotildees lambda aumentaram e as de AICs diminuiacuteram com lambda ultrapassando AICsexecutou inicialmente commits em maio de 2014 com adiccedilatildeo de coacutedigo novo utilizandoexpressotildees lambda e apoacutes um mecircs realizou um commit maior com a refatoraccedilatildeo de todasas AICs para expressotildees lambda Apoacutes a refatoraccedilatildeo o projeto se preocupou em mantera utilizaccedilatildeo de expressotildees lambda ao mesmo tempo que o uso de AICs se manteve apenasaos casos de classes com interfaces natildeo funcionais A Figura 58 apresenta uma parte docommit de refatoraccedilatildeo de coacutedigo que mostra em vermelho a parte eliminada do coacutedigo(AIC) e em verde o coacutedigo novo representando a substituiccedilatildeo por uma expressatildeo lambda

41

Figura 58 Commit de refatoraccedilatildeo de coacutedigo do projeto Vertx [3]

Alguns projetos ainda natildeo se preocuparam em refatorar o coacutedigo para o uso de ex-pressotildees lambda ateacute a data deste trabalho que eacute o caso do projeto guava que apresentouum commit em 03112016 com a atualizaccedilatildeo do projeto para Java 8 Mas a partir daatualizaccedilatildeo se preocupou em utilizar as expressotildees lambda apenas na implementaccedilatildeo decoacutedigo novo O cenaacuterio em que a refatoraccedilatildeo natildeo eacute prioridade ainda eacute a realidade de vaacuteriosprojetos de grande porte visto que os dados de projetos sem nenhuma expressatildeo lambdasatildeo o maior nuacutemero neste trabalho Poreacutem projetos que jaacute adotaram a utilizaccedilatildeo do Java8 tendem a mudar isso com o passar do tempo A Figura 59 apresenta em verde umaadiccedilatildeo de coacutedigo novo com expressatildeo lambda sem a eliminaccedilatildeo de algum coacutedigo anteriora esse que estaria em vermelho

42

Figura 59 Exemplo de um arquivo do commit de adiccedilatildeo de coacutedigo novo em Java 8 doprojeto Guava [4]

Na categoria de projetos em que os AICs e expressotildees lambda aumentam proporci-onalmente (grupo 1) o projeto agera realizou um commit em 19052016 com a adiccedilatildeoda biblioteca retrolambda como dependecircncia do projeto Essa biblioteca utilizada prin-cipalmente por projetos Android permite executar coacutedigo Java 8 contendo expressotildeeslambda em Java 5 6 e 7 [48] O commit tambeacutem apresenta refatoraccedilatildeo dos AICs ad-vindos de interfaces funcionais para expressotildees lambda Apesar de o projeto continuar autilizar as expressotildees lambda em seus commits posteriores o nuacutemero de AICs tambeacutemcontinuou a aumentar visualizando os commits posteriores notou-se que esses AICs satildeorelativos a interfaces natildeo funcionais ou seja que possuem mais de um meacutetodo O projetoAndroid-CleanArchitecture eacute similar ao agera pois tambeacutem optou pela instalaccedilatildeo da bi-blioteca retrolambda para uso de expressotildees lambda em seus coacutedigos e como tambeacutem eacuteum projeto de pequeno porte houve uma pequena refatoraccedilatildeo dos AICs A Figura 510mostra a parte do commit de refatoraccedilatildeo de coacutedigo em que o desenvolvedor adiciona abiblioteca retrolambda como dependecircncia

43

Figura 510 Commit de adiccedilatildeo da biblioteca Retrolambda no projeto Agera [5]

Outro caso interessante eacute o do projeto RxJava que em 2015 optou pela refatoraccedilatildeodo coacutedigo para a utilizaccedilatildeo de expressotildees lambda quase eliminando por completo o usode AICs mas que no ano seguinte reverteu os commits de forma que eliminasse comple-tamente o uso de expressotildees lambda para manter a retrocompatibilidade com o Java 6A Figura 511 demonstra uma parte do commit de reversatildeo do coacutedigo para Java 6 emque pode ser visto em vermelho o coacutedigo anterior com expressotildees lambda e o verde como novo coacutedigo utilizando AIC novamente

44

Figura 511 Commit de remoccedilatildeo de Lambdas e volta para o uso de AICs no projetoRXJava [6]

Essa preocupaccedilatildeo com retrocompatibilidade de coacutedigo pode ser um fator crucial nadecisatildeo das equipes de desenvolvimento na hora de decidir como fazer o software co-evoluircom a linguagem sem perder a compatibilidade com versotildees anteriores

45

Capiacutetulo 6

Consideraccedilotildees Finais

Este estudo permitiu entender melhor como projetos estatildeo realizando a migraccedilatildeo para oJava 8 em especial utilizando uma nova caracteriacutestica introduzida expressatildeo lambdaApesar de a maioria dos projetos populares considerados natildeo possuiacuterem nenhuma ocor-recircncia de expressotildees lambda os projetos que tinham expressotildees lambda foram suficientespara realizar um primeiro estudo de caracterizaccedilatildeo no uso desta caracteriacutestica e com osprojetos efetivamente utilizados para estudo foi possiacutevel agrupaacute-los quanto a maneira emque as expressotildees lambda estavam sendo utilizadas quando comparadas com AICs em 5grandes grupos quando AIC e lambda aumentam proporcionalmente quando AIC dimi-nui e lambda aumenta ultrapassando AIC quando AIC diminui mas continua superior aolambda crescente expressotildees lambda que foram introduzidas e retiradas completamentedo coacutedigo e expressotildees lambda que natildeo existem em quantidades expressivas

Foi possiacutevel entatildeo realizar um estudo aprofundado levando em consideraccedilatildeo as di-ferentes maneiras com que as expressotildees lambda foram adotadas nos projetos atraveacutes daescolha de um projeto que representasse cada grupo para anaacutelise Dentre os cinco projetosestudados foi possiacutevel observar alguns padrotildees tipicamente adotados por desenvolvedorespara implementar expressotildees lambda em seus projetos como a utilizaccedilatildeo da bibliotecas(retrolambda) que permitissem uma flexibilizaccedilatildeo na utilizaccedilatildeo de expressotildees lambda oucomo lambda eacute primariamente utilizada para substituir determinados AICs ou operaccedilotildeesem Collection

Aleacutem disso foi possiacutevel observar como a refatoraccedilatildeo de coacutedigo acontece em cada umdesses projetos Observou-se como projetos menores tendem a refatorar coacutedigo maisfacilmente ao passo que projetos maiores e mais complexos fazem menos refatoraccedilatildeo oudemoram mais entre o periacuteodo em que houve a primeira migraccedilatildeo de coacutedigo para a novaversatildeo da linguagem ateacute o periacuteodo em que realmente decidem refatorar coacutedigo Aleacutem dacomplexidade do projeto influenciar na decisatildeo de migrar o projeto para uma versatildeo maisrecente da linguagem a preocupaccedilatildeo com retrocompatibilidade com versotildees anteriores da

46

linguagem tambeacutem podem ser uma barreira para que projetos comecem a evoluir o coacutedigojuntamente com a evoluccedilatildeo da linguagem

Ainda assim foi possiacutevel observar que a preocupaccedilatildeo com a co-evoluccedilatildeo do software-linguagem existe entre os desenvolvedores de projetos mas a realizaccedilatildeo da migraccedilatildeo aindaacontece lentamente devido agrave diversos fatores que precisam ser levados em consideraccedilatildeopara a manutenccedilatildeo do projeto

Para trabalhos e contribuiccedilotildees futuras seria interessante desenvolver uma ferramentaque pudesse analisar diretamente no coacutedigo-fonte as oportunidades de aplicaccedilatildeo de ex-pressotildees lambda dessa forma poderiam ser analisadas as porcentagens de conversatildeo decoacutedigo para Java 8 e obter melhores conclusotildees sobre a importacircncia que os projetos estatildeodando para a evoluccedilatildeo de seus coacutedigos Outro fator interessante seria aplicar mais Visitorsagrave ferramenta static-analysis e fazer este mesmo estudo aplicado agrave outras caracteriacutesticasda linguagem

47

Referecircncias

[1] Kagdi Huzefa Michael L Collard e Jonathan I Maletic A survey and taxonomyof approaches for mining software repositories in the context of software evolution2007 ix 3 8 9 10 11

[2] DBeaver Dbeaver - features httpdbeaverjkissorgdocsfeatures ix 29

[3] Eclipse Vertx commit Java8-ify code httpsgithubcomeclipsevertxcommit93f95e9c77419f442a42fe711b6eeaef88192fd3 ix 42

[4] Google Guava commit Release java 8 changes to guava httpsgithubcomgoogleguavacommit73e382fa877f80994817a136b0adcc4365ccd904 ix 43

[5] Google Agera commit Collapsed testapp with retrolambda httpsgithubcomgoogleageracommit5e518b7b05f9e7a34a314945f68deff7b2c3e334 ix 44

[6] ReactiveX Rxjava commit 2x full jdk 6 compatible backport + includ-ing bugfixes up to today httpsgithubcomReactiveXRxJavacommit000a174d87a901135f9665d3b11f3627fd2dc4ed ix 45

[7] Godfrey M W e D M German The past present and future of software evolutionEm 2008 Frontiers of Maintenance paacuteginas 129ndash138 Sept 2008 1 6

[8] Favre J M Languages evolve too changing the software time scale Em Principles ofSoftware Evolution Eighth International Workshop on paacuteginas 33ndash42 IEEE 20051 5 7

[9] Overbey Jeffrey L e Ralph E Johnson Regrowing a language refactoring tools allowprogramming languages to evolve Em ACM SIGPLAN Notices volume 44 paacuteginas493ndash502 ACM 2009 1 5 7 8 12

[10] Grechanik Mark Collin McMillan Luca DeFerrari Marco Comi Stefano CrespiDenys Poshyvanyk Chen Fu Qing Xie e Carlo Ghezzi An empirical investiga-tion into a large-scale java open source code repository Em Proceedings of the2010 ACM-IEEE International Symposium on Empirical Software Engineering andMeasurement ESEM rsquo10 paacuteginas 111ndash1110 New York NY USA 2010 ACMISBN 978-1-4503-0039-1 httpdoiacmorg10114518527861852801 1

[11] TIOBE Tiobe httpswwwtiobecomtiobe-index 1 14

48

[12] Gyori Alex Lyle Franklin Danny Dig e Jan Lahoda Crossing the gap from im-perative to functional programming through refactoring Em Proceedings of the 20139th Joint Meeting on Foundations of Software Engineering ESECFSE 2013 paacute-ginas 543ndash553 New York NY USA 2013 ACM ISBN 978-1-4503-2237-9 httpdoiacmorg10114524914112491461 2 11 24 39

[13] OpenJDK State of the lambda httpcropenjdkjavanet~briangoetzlambdalambda-state-4html 2

[14] Han Jiawei Micheline Kamber e Jian Pei Data Mining Concepts and TechniquesMorgan Kaufmann Publishers Inc San Francisco CA USA 3rd ediccedilatildeo 2011ISBN 0123814790 9780123814791 3

[15] Fowler Martin e Kent Beck Refactoring improving the design of existing codeAddison-Wesley Professional 1999 5 7

[16] Lehman M M J F Ramil P D Wernick D E Perry e W M Turski Met-rics and laws of software evolution - the nineties view Em Proceedings of the4th International Symposium on Software Metrics METRICS rsquo97 paacuteginas 20ndashWashington DC USA 1997 IEEE Computer Society ISBN 0-8186-8093-8 httpdlacmorgcitationcfmid=823454823901 6

[17] Hassan Ahmed E e Tao Xie Software intelligence The future of mining softwareengineering data Em Proceedings of the FSESDP Workshop on Future of SoftwareEngineering Research FoSER rsquo10 paacuteginas 161ndash166 New York NY USA 2010ACM ISBN 978-1-4503-0427-6 httpdoiacmorg101145188236218823978 9

[18] Hassan Ahmed E The road ahead for mining software repositories Em Frontiers ofSoftware Maintenance 2008 FoSM 2008 paacuteginas 48ndash57 IEEE 2008 8

[19] Berry Michael J e Gordon Linoff Data Mining Techniques For Marketing Salesand Customer Support John Wiley amp Sons Inc New York NY USA 1997ISBN 0471179809 10

[20] Parnin Chris Christian Bird e Emerson Murphy-Hill Java generics adoption hownew features are introduced championed or ignored Em Proceedings of the 8thWorking Conference on Mining Software Repositories paacuteginas 3ndash12 ACM 2011 12

[21] Oracle The java language specification httpsdocsoraclecomjavasespecsjlsse8jls8pdf 13

[22] Oracle The history of java technology httpwwworaclecomtechnetworkjavajavaseoverviewjavahistory-index-198355html 13

[23] Murphy Kieron So why did they decide to call itjava httpwwwjavaworldcomarticle2077265core-javaso-why-did-they-decide-to-call-it-java-html 13

[24] McGraw Tata Object-oriented Programming with Java Essentials and ApplicationsHill Education 13

49

[25] Oracle Differences between java ee and java se httpdocsoraclecomjavaee6firstcupdocgkhoyhtml 13

[26] Lindsey Clark S The History of Java Cambridge 14

[27] Oracle The java language environment httpwwworaclecomtechnetworkjavaintro-141325html 14

[28] Oracle Jdk 8 httpopenjdkjavanetprojectsjdk8 15 24

[29] Oracle Enhancements in java se 8 httpdocsoraclecomjavase8docstechnotesguideslanguageenhancementshtmljavase8 15 16 17

[30] Oracle Lambda expressions httpdocsoraclecomjavasetutorialjavajavaOOlambdaexpressionshtml 16 18 21

[31] Oracle Method references httpdocsoraclecomjavasetutorialjavajavaOOmethodreferenceshtml 16

[32] Oracle Default methods httpdocsoraclecomjavasetutorialjavaIandIdefaultmethodshtml 17

[33] Oracle Repeating annotations httpdocsoraclecomjavasetutorialjavaannotationsrepeatinghtml 17

[34] Oracle Type annotations httpdocsoraclecomjavasetutorialjavaannotationstype_annotationshtml 17

[35] Oracle Anonymous inner classes httpsdocsoraclecomjavasetutorialjavajavaOOanonymousclasseshtml 19

[36] Kothari CR Research Methodology Methods and Techniques New Age Interna-tional (P) Limited 2004 ISBN 9788122415223 httpsbooksgooglecombrbooksid=8c6gkbKi-F4C 22

[37] Nakakoji Kumiyo Yasuhiro Yamamoto Yoshiyuki Nishinaka Kouichi Kishida eYunwen Ye Evolution patterns of open-source software systems and communitiesEm IWPSE rsquo02 Proceedings of the International Workshop on Principles of SoftwareEvolution paacuteginas 76ndash85 New York NY USA 2002 ACM Press ISBN 1581135459httpdxdoiorg101145512035512055 23

[38] Rahman Foyzur Christian Bird e Premkumar Devanbu Clones What is that smellEmpirical Software Engineering 17(4-5)503ndash530 2012 24

[39] Chacon Scott Pro Git Apress Berkely CA USA 1st ediccedilatildeo 2009ISBN 1430218339 9781430218333 25

[40] Cavalcanti Thiago Gomes e Viniacutecius Correa de Almeida Caracterizaccedilatildeo do uso deconstruccedilotildees da linguagem java em projetos open-source Publicaccedilatildeo online 2016httpbdmunbbrhandle1048315733 27

50

[41] Parr Terence Language Implementation Patterns Create Your Own Domain-Specific and General Programming Languages Pragmatic Bookshelf 1st ediccedilatildeo 2009ISBN 193435645X 9781934356456 27

[42] Janssen Thorben 5 reasons to use jpa hibernate Publicaccedilatildeo online httpswwwsitepointcom5-reasons-to-use-jpa-hibernate 27

[43] Franklin Lyle Alex Gyori Jan Lahoda e Danny Dig Lambdaficator From imperativeto functional programming through automated refactoring Em Proceedings of the2013 International Conference on Software Engineering ICSE rsquo13 paacuteginas 1287ndash1290 Piscataway NJ USA 2013 IEEE Press ISBN 978-1-4673-3076-3 httpdlacmorgcitationcfmid=24867882486986 29

[44] Google Agera httpsgithubcomgoogleagerawiki 34

[45] Eclipse Eclipse vertx httpvertxio 35

[46] Cejas Fernando Android cleanarchitecture httpsgithubcomandroid10Android-CleanArchitecture 36

[47] ReactiveX Rxjava httpsgithubcomReactiveXRxJava 37

[48] Luontola Esko Retrolambda httpsgithubcomorfjackalretrolambda 43

51

Anexo I

Projetos utilizados

fastjson

platform_frameworks_base

netty

material-dialogs

kotlin

okhttp

tinker

AndroidUtilCode

RxJava

spring-boot

java-design-patterns

elasticsearch

ExoPlayer

kafka

vertx

realm-java

guava

zipkin

bazel

stetho

Signal-Android

glide

agera

fresco

plaid

presto

libgdx

spark

52

disruptor

lottie-android

flexbox-layout

PocketHub

zxing

spring-framework

deeplearning4j

dropwizard

interviews

BaseRecyclerViewAdapterHelper

uCrop

DanmakuFlameMaster

lottie-react-native

android-UniversalMusicPlayer

AndroidInterview-Q-A

greenDAO

retrofit

MaterialDrawer

BottomBar

druid

MPAndroidChart

Hystrix

guice

recyclerview-animators

dubbo

androidannotations

RxJava-Android-Samples

PhotoView

clojure

CircleImageView

AndroidSwipeLayout

jedis

MaterialViewPager

butterknife

junit4

RxBinding

leakcanary

SimianArmy

picasso

UltimateRecyclerView

53

AndroidViewAnimations

AppIntro

FizzBuzzEnterpriseEdition

ion

cheesesquare

physical-web

RxAndroid

Android-CleanArchitecture

Calligraphy

Android-Bootstrap

iosched

Android_Data

MaterialDesignLibrary

ListViewAnimations

EventBus

java8-tutorial

AndroidSlidingUpPanel

dagger

okhttputils

logger

HomeMirror

Material-Animations

android-Ultra-Pull-To-Refresh

android-async-http

Android-ObservableScrollView

Android-Universal-Image-Loader

ActionBarSherlock

SlidingMenu

storm

PagerSlidingTabStrip

Android-PullToRefresh

54

  • Dedicatoacuteria
  • Agradecimentos
  • Resumo
  • Abstract
  • Introduccedilatildeo
    • Contexto
    • Objetivos
      • Objetivos Gerais
      • Objetivos Especiacuteficos
        • Metodologia
        • Organizaccedilatildeo do Trabalho
          • Evoluccedilatildeo e Mineraccedilatildeo de Repositoacuterios de Software
            • Evoluccedilatildeo de Software
            • MSR Mineraccedilatildeo de dados e a Engenharia de Software
              • Classificaccedilatildeo
                • Trabalhos Relacionados
                  • Java SE 8 e JDK 8
                    • Histoacuterico
                    • Princiacutepios
                    • Evoluccedilatildeo
                    • Expressotildees Lambda
                      • Sintaxe
                      • Principais formas de uso
                          • Estudo e o Processo de Mineraccedilatildeo
                            • Questotildees de Pesquisa
                            • Fonte de Dados e Objetos de Estudo
                            • Processo de Mineraccedilatildeo
                              • static-analysis
                              • BDAnalisador
                                • Classificaccedilatildeo e Anaacutelise
                                  • Meacutedia de Lambda
                                  • Anaacutelise Temporal
                                  • Refatoraccedilatildeo de Coacutedigo
                                  • Casos de Uso
                                      • Resultados Obtidos e Anaacutelise
                                        • Visatildeo Geral
                                          • Projetos Selecionados
                                          • agera
                                          • vertx
                                          • Android-CleanArchitecture
                                          • RxJava
                                          • guava
                                            • Refatoraccedilatildeo de Coacutedigo
                                            • Estudos de Caso
                                              • Consideraccedilotildees Finais
                                              • Referecircncias
                                              • Anexo
                                              • Projetos utilizados

13 Calcu la to r myApp = new Ca lcu la to r ( ) 14 IntegerMath add i t i on = (a b) minusgt a + b 15 IntegerMath subt ra c t i on = (a b) minusgt a minus b 16 System out p r i n t l n ( 40 + 2 = +17 myApp operateBinary (40 2 add i t i on ) ) 18 System out p r i n t l n ( 20 minus 10 = +19 myApp operateBinary (20 10 sub t ra c t i on ) ) 20 21 22

Listagem 31 Exemplo de coacutedigo com o uso de Expressatildeo Lambda [30]

2 Method References Frequentemente expressotildees lambda criam meacutetodos anocircni-mos Algumas vezes poreacutem satildeo utilizadas para chamar um meacutetodo jaacute existentena classe Ao inveacutes de escrever a expressatildeo Lambda para esse caso pode-se optarpor utilizar um Method Reference que facilita a escrita e leitura desse uso de ex-pressatildeo Lambda [29] A Listagem 32 mostra um exemplo de um meacutetodo estaacuteticoque compara duas pessoas pelas suas idades e a Listagem 33 a utilizaccedilatildeo de MethodReference para aplicar a utilizaccedilatildeo desse meacutetodo em um array e reduzir a escrita deuma expressatildeo lambda a uma forma mais legiacutevel

1 pub l i c s t a t i c i n t compareByAge ( Person a Person b) 2 re turn a b i r thday compareTo (b b i r thday ) 3 4

Listagem 32 Exemplo de meacutetodo de uma classe Pessoa [31]

1 Arrays s o r t ( rosterAsArray Person compareByAge ) 2

Listagem 33 Exemplo de uso de Method Reference [31]

3 Default Methods satildeo meacutetodos com a palavra-chave default que servem para adi-cionar implementaccedilotildees de meacutetodos a uma interface de alguma biblioteca mantendoa compatibilidade binaacuteria com versotildees mais antigas dessa interface Tambeacutem pos-sibilita a implementaccedilatildeo de meacutetodos estaacuteticos em interfaces [29] A Listagem 34apresenta a inclusatildeo de um meacutetodo default na interface TimeClient

1 pub l i c i n t e r f a c e TimeClient 2 void setTime ( i n t hour i n t minute i n t second ) 3 void setDate ( i n t day i n t month i n t year ) 4 void setDateAndTime ( i n t day i n t month i n t year 5 i n t hour i n t minute i n t second )

16

6 LocalDateTime getLocalDateTime ( ) 7

8 s t a t i c ZoneId getZoneId ( S t r ing zoneStr ing ) 9 t ry

10 re turn ZoneId o f ( zoneStr ing ) 11 catch ( DateTimeException e ) 12 System e r r p r i n t l n ( I n v a l i d time zone + zoneStr ing

+13 us ing d e f a u l t time zone in s t ead ) 14 re turn ZoneId systemDefault ( ) 15 16 17

18 d e f a u l t ZonedDateTime getZonedDateTime ( St r ing zoneStr ing ) 19 re turn ZonedDateTime o f ( getLocalDateTime ( ) getZoneId (

zoneStr ing ) ) 20 21 22

Listagem 34 Exemplo de interface com um meacutetodo default [32]

4 Repeating Annotations permitem a implementaccedilatildeo e utilizaccedilatildeo de anotaccedilotildees deum mesmo tipo que podem ser utilizadas mais de uma vez para a mesma declara-ccedilatildeo [29] A Listagem 35 apresenta duas anotaccedilotildees iguais com paracircmetros diferentespermitindo uma customizaccedilatildeo maior na aplicaccedilatildeo de um tipo de anotaccedilatildeo

1 Schedule ( dayOfMonth= l a s t )2 Schedule (dayOfWeek= Fr i hour= 23 )3 pub l i c void doPeriodicCleanup ( ) 4

Listagem 35 Exemplo de Repeating Annotations [33]

5 Type Annotations permitem que anotaccedilotildees possam ser utilizadas em tipos aleacutemde declaraccedilotildees dessa forma pode-se garantir que um campo sempre atenda agraves suasexpectativas e evite testes desnecessaacuterios [29] A Listagem 36 mostra um exemplo derestriccedilatildeo a uma String que nunca poderaacute ser nula devido agrave anotaccedilatildeo de NonNull

1 NonNull S t r ing s t r

Listagem 36 Exemplo de Type Annotation garantindo que o campo nunca seja null [34]

17

34 Expressotildees Lambda

Uma das mudanccedilas mais interessantes implementadas no Java 8 foi a adiccedilatildeo de expressotildeeslambda As expressotildees lambda permitem que a linguagem Java possa atuar parcialmentecomo uma linguagem de programaccedilatildeo funcional onde comportamentos satildeo avaliados eaplicados diferentemente da programaccedilatildeo imperativa que foca na mudanccedila de estadosNa praacutetica um comportamento pode ser passado como paracircmetro de um meacutetodo atraveacutesde uma escrita mais reduzida e legiacutevel Os benefiacutecios de utilizar expressotildees lambda incluemuma melhora na legibilidade e organizaccedilatildeo de coacutedigo que antes era escrito com AnonymousInner Class aleacutem de permitir uma forma simples de utilizar comportamento paralelo como uso de Streams

341 Sintaxe

A sintaxe de uma expressatildeo lambda eacute dividida nas seguintes partes [30]

bull Uma lista de paracircmetros separados por viacutergulas

bull Um token representado por uma seta -gt

bull Um corpo que pode ser representado por uma expressatildeo uacutenica ou um bloco de coacutedigodentro de chaves

As Listagens 37 e 38 mostram duas formas diferentes de se aplicar expressotildees Lambdacom uma sintaxe similar A primeira aplica a expressatildeo diretamente apoacutes a seta utilizadanormalmente para trechos de coacutedigo pequenos e simples e a segunda utiliza-se de chavespara incorporar o coacutedigo e da palavra-chave return para especificar o retorno forma maisutilizada para uma quantidade maior de coacutedigo

1 p minusgt p getGender ( ) == Person Sex MALE2 ampamp p getAge ( ) gt= 183 ampamp p getAge ( ) lt= 25

Listagem 37 Exemplo de expressatildeo lambda com uma expressatildeo [30]

1 p minusgt 2 re turn p getGender ( ) == Person Sex MALE3 ampamp p getAge ( ) gt= 184 ampamp p getAge ( ) lt= 25 5

Listagem 38 Exemplo de expressatildeo lambda com um bloco de coacutedigo [30]

18

342 Principais formas de uso

Anonymous Inner Class

Antes do Java 8 a necessidade de passar funccedilotildees ou expressotildees como paracircmetro de algummeacutetodo era suprida atraveacutes de Anonymous Inner Classes A utilizaccedilatildeo desse tipo dedeclaraccedilatildeo junto com a anotaccedilatildeo de Override permite sobrescrever um meacutetodo de umainterface funcional e ao mesmo tempo passa-la como argumento para um meacutetodo Umaexpressatildeo lambda se comporta da mesma forma poreacutem a quantidade de coacutedigo escritopela Anonymous Inner Class eacute maior e pode dificultar a leitura de coacutedigo pois conteacutemmuita informaccedilatildeo natildeo utilizada para efetivo entendimento do que estaacute sendo feito naqueletrecho

A Listagem 39 apresenta a instanciaccedilatildeo da classe EventHandler internamente ao meacute-todo setOnAction() de forma que o desenvolvedor possa escrever o comportamento quedeseja passar como paracircmetro do meacutetodo atraveacutes da substituiccedilatildeo do meacutetodo handle()que jaacute existe pelo meacutetodo handle() criado e escrito pelo desenvolvedor

1 btn setOnAction (new EventHandlerltActionEvent gt() 2 Override3 pub l i c void handle ( ActionEvent event ) 4 System out p r i n t l n ( He l lo World ) 5 6 )

Listagem 39 Exemplo de uso de Anonymous Inner Class [35]

Interface funcional

Ao projetar um coacutedigo novo o desenvolvedor que optar por utilizar expressotildees lambdadeve iniciar com a criaccedilatildeo de uma interface funcional Esse tipo de interface possui umuacutenico meacutetodo abstrato permitindo que expressotildees lambda sejam usadas para sobrescrevero comportamento do meacutetodo abstrato Uma interface funcional pode possuir outros meacuteto-dos desde que sejam default Uma nova anotaccedilatildeo FunctionalInterface foi adicionadacom a atualizaccedilatildeo do Java 8 para conferir em tempo de compilaccedilatildeo se a interface satisfazos requisitos desse modelo de interface

A Listagem 310 apresenta um exemplo de interface funcional com o objetivo de permi-tir o uso de expressotildees lambda que utilizaratildeo de dois Double como paracircmetro e jaacute utilizada nova anotaccedilatildeo FunctionalInterface introduzida no Java 8

1 Funct iona l Inte r face2 pub l i c i n t e r f a c e DoubleOp 3 pub l i c Double apply ( Double a Double b)

19

4

Listagem 310 Exemplo de interface funcional

Dessa forma conforme as Listagens 311 e 312 o meacutetodo apply() pode tomar formade qualquer operaccedilatildeo entre dois Double que seraacute especificada quando a expressatildeo lambdafor montada dando o aspecto de linguagem funcional agrave linguagem e mais facilidade eliberdade ao desenvolvedor

1 pub l i c c l a s s Ca l cu la to r 2 pub l i c s t a t i c Double c a l c ( Double op1 Double op2 DoubleOp operator ) 3 re turn operator apply ( op1 op2 ) 4 5

Listagem 311 Exemplo de aplicaccedilatildeo da interface funcional

1 Double r e s u l t 1 = Ca lcu la to r c a l c (10d 50d ( a b ) minusgt a + b)

Listagem 312 Uso de expressatildeo lambda para o exemplo anterior

Collections

Dentre as atualizaccedilotildees de pacotes do Java 8 foi adicionado um meacutetodo stream() nainterface Collection Esse meacutetodo trata as Collection como streams o que significa queapesar de natildeo ser possiacutevel acessar elementos diretamente algumas novas manipulaccedilotildeessatildeo possiacuteveis Essas manipulaccedilotildees satildeo na verdade meacutetodos da interface Stream quepodem receber como paracircmetro uma expressatildeo lambda ou seja um comportamento a seraplicado agrave Collection Dentre os meacutetodos temos

bull filter() O meacutetodo filter() recebe uma expressatildeo lambda contendo uma condiccedilatildeopara filtragem da collection

bull map() O meacutetodo map() mapeia os elementos de uma Collection em outro objetocomo uma String A expressatildeo lambda passada por paracircmetro deve retornar o tipode objeto ao qual seraacute mapeado

bull forEach() O meacutetodo forEach() aplica uma operaccedilatildeo especiacutefica para cada ele-mento da Collection A expressatildeo lambda a ser passada deve conter a operaccedilatildeo aser realizada

bull min() e max() Os meacutetodos min() e max() retornam o elemento menor ou maiorda Collection dependendo da expressatildeo lambda passada como paracircmetro

20

A Listagem 313 demonstra como vaacuterias operaccedilotildees com uma Collection podem seraplicadas de uma vez de forma que lendo a expressatildeo lambda jaacute eacute possiacutevel saber oresultado da aplicaccedilatildeo do meacutetodo agrave Collection

1 r o s t e r2 stream ( )3 f i l t e r (4 p minusgt p getGender ( ) == Person Sex MALE5 ampamp p getAge ( ) gt= 186 ampamp p getAge ( ) lt= 25)7 map(p minusgt p getEmailAddress ( ) )8 forEach ( emai l minusgt System out p r i n t l n ( emai l ) )

Listagem 313 Exemplo de utilizaccedilatildeo de meacutetodos de stream com expressotildees lambda [30]

21

Capiacutetulo 4

Estudo e o Processo de Mineraccedilatildeo

A definiccedilatildeo da metodologia utilizada para realizaccedilatildeo deste trabalho eacute importante para queexista uma padronizaccedilatildeo e melhor entendimento de como os resultados foram obtidos paraque a replicaccedilatildeo do mesmo possa ser realizada em trabalhos futuros [36]

Figura 41 Processo utilizado para realizaccedilatildeo do estudo

O esquema representado na Figura 41 descreve o processo seguido para a realizaccedilatildeodeste trabalho que foi divido em trecircs grandes etapas a de planejamento definindo osobjetivos questotildees de pesquisa e meios de investigaccedilatildeo deste projeto a etapa de execuccedilatildeorealizando todo o procedimento metodoloacutegico definido para a coleta e refinamento de

22

dados e a etapa de avaliaccedilatildeo onde foram classificados e avaliados os dados coletadospara responder agraves questotildees de pesquisa

A seguir na primeira seccedilatildeo seratildeo apresentadas em detalhes as questotildees de pesquisa aserem respondidas Em seguida seraacute feito uma breve descriccedilatildeo da fonte de dados utilizada- especificamente os projetos utilizados como objetos de estudo deste trabalho e por fimtodo o restante da metodologia que foi de fato desenvolvida para obter os resultadosnecessaacuterios

41 Questotildees de Pesquisa

Com o objetivo de entender e caracterizar melhor o uso de expressotildees lambda foramdefinidas as seguintes questotildees de pesquisa a serem respondidas

bull PQ-1 Quando os projetos comeccedilaram a introduzir o uso de expressotildees lambda emseus coacutedigos e qual a meacutedia de expressotildees lambda por snapshots caso existam

bull PQ-2 Como as equipes de desenvolvimento estatildeo utilizando expressotildees lambdaatraveacutes de refatoraccedilatildeo de coacutedigo ou introduzindo apenas em coacutedigo novo

bull PQ-3 Quais satildeo os padrotildees tipicamente adotados para o uso de expressotildees lambda

A primeira pergunta de pesquisa gira em torno de como projetos populares open-sourceestatildeo se adaptando agrave introduccedilatildeo de expressotildees lambda em Java muitos projetos jaacute estatildeoutilizando as expressotildees lambda Se sim a partir de quando comeccedilaram a utilizaacute-lasdesde o iniacutecio da introduccedilatildeo das mesmas no Java 8 ou em um periacuteodo mais tardio Aleacutemdisso eacute interessante descobrir se a utilizaccedilatildeo dessa nova caracteriacutestica tem acontecido deforma expressiva ou natildeo

Em seguida para melhor entender a forma como as expressotildees lambda estatildeo sendointroduzidas em projetos eacute interessante investigar se as equipes de desenvolvimento estatildeose preocupando em refatorar coacutedigo com o objetivo de evoluir o software ou se estatildeoexperimentando utilizar expressotildees lambda apenas em coacutedigo novo introduzido

Como a introduccedilatildeo de novas funcionalidades em projetos open-source de grande escaladepende do objetivo do projeto e os padrotildees de projeto utilizados [37] espera-se obser-var diversas abordagens quanto a utilizaccedilatildeo de expressotildees lambda para entatildeo poderclassificar estes softwares quanto a abordagem utilizada

Eacute de grande importacircncia para este estudo conseguir identificar na praacutetica comoexpressotildees lambda estatildeo sendo tipicamente adotadas nestes projetos Assim a terceirapergunta de pesquisa busca identificar alguns exemplos de utilizaccedilatildeo atraveacutes da realizaccedilatildeode alguns estudos de caso

23

Eacute importante ressaltar que apesar de as expressotildees lambda serem uma alternativa aouso de AIC elas natildeo os substituem completamente Existem precondiccedilotildees para que umaAIC possa ser substituiacuteda por expressotildees lambda [12] descritas a seguir

bull AIC deve instanciar-se de uma interface

bull AIC natildeo deve possuir nenhum campo e declarar apenas um meacutetodo

bull AIC natildeo deve possuir uma referecircncia para this ou super

bull AIC natildeo deve declarar um meacutetodo recursivo

Para responder agrave primeira pergunta apenas dados gerais sobre todos os projetos seratildeonecessaacuterios ao passo que pelas perguntas 2 e 3 possuiacuterem uma natureza mais complexaseraacute necessaacuterio aleacutem de uma anaacutelise geral estatiacutestica a realizaccedilatildeo de alguns estudos decaso para obter resultados mais completos

42 Fonte de Dados e Objetos de Estudo

Para responder agraves perguntas de pesquisa estabelecidas foram selecionados os 99 projetosmais populares na linguagem Java dentro da plataforma github ateacute a data da coleta dosdados feita em Abril de 2017 Satildeo considerados populares os repositoacuterios que possuema maior quantidade possiacutevel de estrelas (stars) A decisatildeo de escolher os 99 projetos maispopulares foi por sua natureza imparcial e ao mesmo tempo para que se possa analisarprojetos que satildeo de familiaridade e conhecimento da comunidade do github e de domiacuteniopuacuteblico Os 99 projetos estatildeo listados no Anexo I

Para entender a transiccedilatildeo feita por esses projetos entre as versotildees anteriores do Java eo Java 8 com as expressotildees lambda eacute necessaacuterio analisar o coacutedigo de vaacuterias versotildees a fimde observar alguma mudanccedila para cada projeto Como satildeo 99 projetos e vaacuterios dessesprojetos possuem milhares de linhas de coacutedigo e commits seria impossiacutevel avaliar todosos commits Optou-se entatildeo por coletar snapshots mensais de cada projeto conformeprocedimento tambeacutem seguido anteriormente [38] Cada snapshots representa o estadodo projeto em um determinado mecircs e como criteacuterio de escolha padratildeo todos os snapshotsequivalem ao uacuteltimo commit realizado no determinado mecircs que este representa

O proacuteximo passo eacute determinar o periacuteodo de tempo em que esses snapshots seriamcoletados Como Java 8 (e consequentemente as expressotildees lambda) foi introduzidoapenas em meados de 2014 [28] coletar dados de projetos a partir de um periacuteodo muitoantes deste ano natildeo agregaria valor ao estudo em questatildeo Definiu-se entatildeo um periacuteodopara a coleta mensal desses snapshots atraveacutes dos anos Janeiro de 2013 um ano antesda introduccedilatildeo do Java 8 para que se pudesse identificar para todos os projetos o mecircs

24

exato em que expressotildees lambda foram introduzidas ateacute o mecircs da coleta de dados Abrilde 2017

Eacute importante ressaltar que a definiccedilatildeo dos meses foi definida do dia primeiro de ummecircs ao dia primeiro do proacuteximo mecircs e por consequecircncia alguns snapshots que deveriamrepresentar o final de determinado mecircs correspondem na verdade a commits realizadosno dia primeiro do mecircs seguinte Por exemplo pode existir casos em que o commit querepresente o mecircs de Marccedilo de 2016 seja na verdade o commit realizado no dia primeirode Abril de 2016 Isso se deve a natureza da forma como os resultados de log de commitssatildeo obtidos pelo git [39] Poreacutem isso natildeo interfere nas anaacutelises ou no propoacutesito destetrabalho uma vez que foram realizadas verificaccedilotildees e validaccedilotildees para que natildeo existamdatas repetidas (e consequentemente commits repetidos) por repositoacuterio

Neste trabalho o termo projeto e repositoacuterio foram utilizados de forma intercaladapara representar a mesma coisa o software desenvolvido que possui um repositoacuterio naplataforma github Os termos commit snapshops e versotildees tambeacutem representam a mesmacoisa uma vez que foi definido que seriam utilizados apenas um commit por mecircs pararepresentar um determinado snapshot ou versatildeo do repositoacuterio em questatildeo

Todos os 99 projetos seratildeo utilizados para a realizaccedilatildeo de uma anaacutelise geral de ca-racterizaccedilatildeo do uso de expressotildees lambda Para as anaacutelises aprofundadas foi feito umcriteacuterio de classificaccedilatildeo para que apenas alguns projetos possam ser analisados em niacutevelde coacutedigo como estudos de caso

Resumindo foram escolhidos os 99 projetos mais populares de Java no github cole-tando dados mensais de seus commits a partir do ano de 2013 ateacute a data da coleta dosdados lembrando que nem todos os projetos existem desde 2013 (projetos mais recentes)

43 Processo de Mineraccedilatildeo

A abordagem utilizada para coletar e analisar os 99 projetos escolhidos como mostra aFigura 42 foi realizada de forma automatizada utilizando scripts python e dois projetosdesenvolvidos em Java para a coleta e tratamento de dados como descrito a seguir

Primeiramente foi realizado uma coacutepia dos repositoacuterios atuais de todos os 99 projetosmais populares do github em Java Para automatizar o processo foi desenvolvido umscript em python que lista todos os projetos escolhidos clona todos os repositoacuterios emuma pasta na maacutequina local e cria um arquivo temporaacuterio com as informaccedilotildees do nomede cada repositoacuterio e seu caminho absoluto na maacutequina local

25

Figura 42 Metodologia implementada para coleta e tratamento de dados

Em seguida foi necessaacuterio realizar o checkout de todas as versotildees entre Janeiro de2013 a Abril de 2017 de cada projeto Por motivos de otimizaccedilatildeo de espaccedilo da maacutequinalocal e automatizaccedilatildeo no processo de checkout utilizou-se de um segundo script pythonque realizava as seguintes tarefas para cada mecircs em cada projeto verificar se dentreo mecircs estipulado houve algum commit para aquele projeto se sim pega-se o hash douacuteltimo commit do mecircs realiza o checkout conta-se a quantidade de linhas de coacutedigo emJava que o projeto tem utilizando a biblioteca cloc e armazena todas as informaccedilotildeespertinentes referentes a todos os projetos que naquele mecircs tiveram commits para que oprojeto static-analysis possa entatildeo ser executado sobre esses projetos naquele determinadomomento As informaccedilotildees coletadas que satildeo utilizadas pelo static-analysis correspondemao nome do projeto o hash do commit para aquela versatildeo a pasta onde o projeto estaacutearmazenado na maacutequina local a quantidade de linhas de coacutedigo Java do projeto e datareferente ao commit Essas informaccedilotildees satildeo pertinentes para que o projeto static-analysisconsiga funcionar de forma correta projeto este descrito em detalhes a seguir

431 static-analysis

O static-analysis foi um projeto desenvolvido anteriormente a este trabalho pelos alunosThiago Cavalcanti e Vinicius de Almeida cujo objetivo eacute realizar a anaacutelise estaacutetica de

26

coacutedigos-fonte Java e gerar arquivos de saiacuteda contendo informaccedilotildees de classes e meacutetodoscom suas devidas ocorrecircncias de caracteriacutesticas da linguagem [40]

A anaacutelise estaacutetica de coacutedigo consiste em analisar um coacutedigo-fonte sem a necessidadede executaacute-lo Esse tipo de anaacutelise eacute de extrema importacircncia para manter um coacutedigo dequalidade evitar futuras refatoraccedilotildees e obter informaccedilotildees estatiacutesticas de forma raacutepida epraacutetica [41]

Seguindo esse princiacutepio o static-analysis foi projetado para receber um arquivo deentrada csv seguindo o padratildeo

Tipo da Aplicaccedilatildeo Inicio do projeto Antes ou Apoacutes Java 5 Nome do ProjetoVersatildeo Caminho absolutoQuantidade de linhas de coacutedigo

Atraveacutes da informaccedilatildeo do caminho absoluto do projeto o static-analysis varre osdiretoacuterios em busca dos arquivos fonte java realiza o parse desses arquivos e utilizade Visitors para extrair as informaccedilotildees desejadas e exporta-las em arquivos csv Ouso de Visitors permite que sejam escolhidas as informaccedilotildees desejadas para a consultacomo expressotildees Lambda e AIC s aleacutem de possibilitar que sejam implementados novosVisitors conforme a linguagem evolua ou as necessidades mudem

Para este trabalho foram utilizados os Visitors de expressotildees Lambda map() filter()AICs e declaraccedilotildees de meacutetodos

432 BDAnalisador

Apoacutes obter todas as informaccedilotildees necessaacuterias geradas pelo static-analysis era preciso ma-nipular os dados de forma que facilitasse a coleta de dados para o estudo proposto Comovaacuterios arquivos em formato csv satildeo de difiacutecil manipulaccedilatildeo foi desenvolvido entatildeo umaferramenta chamada BDAnalisador Esta ferramenta eacute responsaacutevel por processar os arqui-vos em csv gerados pelo static-analysis e popular uma base de dados relacional MySQLcom as informaccedilotildees pertinentes a este estudo

O BDAnalisador foi desenvolvido com a intenccedilatildeo de tornar mais simples o trabalhocom os dados resultantes do static-analysis de forma que consultas em SQL pudessemser feitas a ponto de permitir a obtenccedilatildeo de resultados mais complexos Seguindo esseobjetivo o framework Hibernate foi escolhido como ferramenta para persistecircncia devidoa ser um framework jaacute consolidado no mercado e que de forma simples relaciona osobjetos Java ao banco de dados MySQL [42] A divisatildeo de classes foi projetada em quatroentidades Projeto Versao Classe e Metodo cada uma com seus respectivos camposcontendo as informaccedilotildees necessaacuterias para a pesquisa como pode ser visto na Figura 44Eacute importante ressaltar que a tabela de Versao guarda hashs de commits devido agrave escolhade utilizar commits para obter mais informaccedilatildeo de evoluccedilatildeo de coacutedigo em um menor

27

espaccedilo de tempo Aleacutem disso para este trabalho optou-se por persistir todos os meacutetodose classes de cada versatildeo sem se importar com a repeticcedilatildeo desses dados pois a hipoacutetesede haver grandes refatoraccedilotildees entre versotildees poderia comprometer a confiabilidade dasinformaccedilotildees

Figura 43 Diagrama de classes UML do BDAnalisador

Como visto na Figura 43 seguindo parcialmente a arquitetura MVC cada entidadepossui sua respectiva classe DAO(Data Access Object) para persistecircncia dos dados eapenas uma classe Controlador no projeto responsaacutevel pela manipulaccedilatildeo e parse dosdados dos arquivos csv gerados pelo static analysis para serem enviados agraves classes DAOO sistema inicia chamando o meacutetodo inicializar() da classe Controlador Esse meacutetodoeacute responsaacutevel por ler um arquivo de entrada csv que segue o mesmo modelo do arquivo dostatic-analysis citado na seccedilatildeo anterior O arquivo conteacutem os dados de todos os projetose suas respectivas versotildees dessa forma o meacutetodo instancia um objeto da classe Projetoe persiste o projeto no banco de dados Para cada versatildeo encontrada no arquivo deentrada o inicializar() aciona os meacutetodos responsaacuteveis por instanciar e preencher aslistas da classe Classe e Metodo Os meacutetodos responsaacuteveis por preencher as listas varremos arquivos csv gerados pelo static-analysis e fazem o parse das informaccedilotildees relevantescomo nomes dos meacutetodos e quantidades de lambdas para construir os objetos que seratildeogravados Ao final dos preenchimentos o objeto Versatildeo eacute instanciado e gravado no bancode dados atraveacutes de sua classe DAO ao mesmo tempo que grava suas respectivas Classese Metodos

28

Apoacutes vaacuterios testes e correccedilotildees de bugs o banco de dados se encontrava finalmente comas informaccedilotildees de 99 projetos Java open-source separados por um commit por mecircs desde2013 cada um com suas respectivas informaccedilotildees de classes meacutetodos e a quantidade deexpressotildees lambda filters e maps em cada meacutetodo Filter ou Filter pattern eacute o padratildeode projeto que tem como objetivo filtrar objetos de uma coleccedilatildeo (Collection) de acordocom algum criteacuterio Jaacute o map ou map pattern eacute um padratildeo que ldquomapeia os elementosde uma coleccedilatildeo aplicando uma funccedilatildeo a eles para uma nova coleccedilatildeo [43] A coleta deinformaccedilotildees sobre esses padrotildees podem ser uacuteteis para possiacuteveis anaacutelises de oportunidadesde uso de expressotildees lambda para refatoraccedilatildeo de coacutedigo

A Figura 44 mostra o esquema de como o banco de dados resultante foi gerado

Figura 44 Modelo relacional do banco de dados populado pelo BDAnalisador Imagemgerada com software DBeaver [2]

44 Classificaccedilatildeo e Anaacutelise

Com o banco de dados populado restam apenas as etapas de classificaccedilatildeo e anaacutelise pararesponder as questotildees de pesquisa propostas Para isso inicialmente houve uma tentativade se utilizar apenas queries SQL para analisar os dados de acordo com as informaccedilotildeesrelevantes Poreacutem devido ao fato de o banco de dados conter todas as informaccedilotildees detodos os projetos e todas as suas versotildees queries que possuem uma alta complexidadedemoravam muito tempo para retornar os dados

Assim com o objetivo de facilitar o trabalho alguns scripts python foram desenvolvi-dos para rodar as queries separadamente e individualmente para cada projeto de formaautomatizada a fim de melhorar o tempo de resposta para obtenccedilatildeo dos resultados

29

441 Meacutedia de Lambda

O primeiro script retorna a quantidade de expressotildees lambda (ou AICs) por n snapshotsque contenha expressotildees lambda O objetivo eacute ter uma visatildeo geral da meacutedia de expressotildeeslambda e AICs utilizadas por cada projeto e como nem todos os snapshots coletados decada projeto possuem expressotildees lambda e AICs apenas aqueles com alguma expressatildeolambda ou AIC satildeo incluiacutedos no caacutelculo da meacutedia

Mmedia =sumn qtdLambdai

n

442 Anaacutelise Temporal

O segundo script retorna para cada projeto a soma total da quantidade de expressotildeeslambda AIC map() e filter() no projeto inteiro para cada versatildeo Ou seja tem-seo total de cada uma das quatro propriedades selecionadas para cada mecircs do projetoobtendo assim uma visatildeo temporal de evoluccedilatildeo do uso das caracteriacutesticas descritas ATabela 41 ilustra parcialmente o resultado obtido para o projeto agera onde idVersaoeacute o identificador no banco de dados referente ao hash do commit mensal coletado qtd eacutea quantidade de cada uma das caracteriacutesticas escolhidas e a data do commit encontra-seno formato americano

Tabela 41 Informaccedilotildees mensais sobre o projeto ageraidVersao Data do Commit qtd lambda qtd AIC qtd maps qtd filter

823 512016 0 29 4 0755 612016 13 28 4 0686 6152016 13 29 4 0621 812016 13 29 4 0555 8162016 13 30 4 0485 922016 13 30 4 0422 10132016 14 30 4 0356 11282016 14 30 4 0295 12212016 21 30 5 0232 212017 21 30 5 0175 312017 21 30 5 0112 3312017 21 36 5 048 4242017 21 48 5 0

Os resultados obtidos com esta anaacutelise temporal permitiu a identificaccedilatildeo de padrotildees nautilizaccedilatildeo de expressotildees lambda em relaccedilatildeo a utilizaccedilatildeo de AIC por todos os projetos Foi

30

possiacutevel classificar todos os projetos em 6 grupos ilustrado na Figura 45 Primeiramenteseparou-se os projetos entre os que possuem expressotildees lambda e os que natildeo possuemDentre os que possuem identificou-se cinco categorias

1 Grupo 1 Quantidade de AICs e expressotildees lambda aumentam com o tempo pro-porcionalmente

2 Grupo 2 Quantidade de AICs diminui agrave medida que a quantidade de expressotildeeslambda aumentam e a quantidade de expressotildees lambda ultrapassa a quantidade deAIC em um determinado momento

3 Grupo 3 Quantidade de AICs diminui agrave medida que a quantidade de expressotildeeslambda aumentam mas a quantidade de AIC permanece superior agrave quantidade delambda

4 Grupo 4 Expressotildees lambda satildeo introduzidas e existem por um pequeno periacuteodode tempo mas satildeo completamente removidas posteriormente

5 Grupo 5 Quantidade de expressotildees lambda eacute constante e muito inferior compa-rado com a quantidade de AICs no projeto Foi determinado que para pertencera esta classificaccedilatildeo o projeto precisa ter uma razatildeo de meacutedia de expressotildees lamb-dasnapshot por meacutedia de AICsnapshot inferior a 020 Esse paracircmetro foi esta-belecido com o objetivo de definir um padratildeo para o que pode ser considerado umprojeto com poucas expressotildees lambda

Figura 45 Classificaccedilatildeo dos projetos

31

443 Refatoraccedilatildeo de Coacutedigo

O uacuteltimo script teve como objetivo realizar uma tentativa inicial de identificar refatoraccedilatildeode coacutedigo da seguinte maneira para todos os projetos que possuem expressotildees lambdaforam identificados o mecircs imediatamente antes da introduccedilatildeo de expressotildees lambda e omecircs seguinte onde houve a primeira ocorrecircncia de lambda no projeto Assim realizou-se uma anaacutelise do tamanho em quantidade de linhas de coacutedigo de todos os meacutetodosdo projeto que no mecircs seguinte tiveram introduccedilatildeo de lambda Em seguida fez-se umacomparaccedilatildeo com os mesmos meacutetodos em relaccedilatildeo ao mecircs anterior e assim foi possiacuteveldetectar quais meacutetodos tiveram a quantidade de linhas de coacutedigo reduzidas o que seriaum indicativo natildeo necessariamente exclusivo de que uma refatoraccedilatildeo de coacutedigo possa terocorrido

Sabe-se que este meacutetodo de detecccedilatildeo de refatoraccedilatildeo de coacutedigo possui suas limitaccedilotildeesuma vez que as comparaccedilotildees para saber se um meacutetodo existe em ambas versotildees eacute feitopuramente por comparaccedilatildeo de String (nome do meacutetodo) e a classe que este pertence

444 Casos de Uso

Os meacutetodos descritos acima ajudaram a identificar alguns padrotildees e facilitar a anaacutelise dosdados Poreacutem natildeo satildeo suficientes para que se possa responder agraves questotildees de pesquisaDessa forma apoacutes a identificaccedilatildeo dos grupos de classificaccedilatildeo para os projetos foramescolhidos um projeto de cada grupo (com exceccedilatildeo do grupo dos projetos sem expressotildeeslambda) para realizar um breve estudo de caso com o objetivo de identificar e caracterizarmelhor a adoccedilatildeo de expressotildees lambda Os projetos escolhidos foram agera vertxAndroid-CleanArchitecture RxJava e guava

32

Capiacutetulo 5

Resultados Obtidos e Anaacutelise

Neste capiacutetulo seratildeo apresentados os dados obtidos e anaacutelise com o objetivo de responderagraves questotildees de pesquisa propostas Como mencionado anteriormente as perguntas seratildeorespondidas de duas maneiras algumas com informaccedilotildees gerais sobre todos os projetose outras com breve estudos de caso envolvendo cinco projetos

51 Visatildeo Geral

Dentre os repositoacuterios coletados para a anaacutelise 74 (7474) natildeo utilizaram nenhumaexpressatildeo lambda no projeto durante todo o periacuteodo analisado (Janeiro de 2013 a Abrilde 2017) restando apenas 25 repositoacuterios (2525) com expressotildees lambda Eacute interessantedestacar que apesar de a quantidade de repositoacuterios que natildeo possuem expressotildees lambdaser relativamente expressiva muitos destes repositoacuterios satildeo de projetos em Java que umdia foram populares e atualmente natildeo estatildeo sendo mais desenvolvidos (por exemplo umaplicativo que soacute funciona para Android 23 atualmente descontinuado)

Levando em consideraccedilatildeo apenas os projetos que possuem expressotildees lambda exis-tem dois tipos de dados que podem ser analisados para responder agrave primeira questatildeo depesquisa atraveacutes dos dados obtidos pelo meacutetodo anteriormente mencionado como anaacutelisetemporal e a meacutedia de lambda por snapshot mencionados no capiacutetulo anterior

Com relaccedilatildeo ao ano em que a primeira ocorrecircncia foi encontrada 6 projetos introduzi-ram expressotildees lambda jaacute em 2014 8 comeccedilaram a utilizar em 2015 7 em 2016 e apenas4 tiveram a primeira ocorrecircncia de expressotildees lambda em 2017 Dessa forma percebe-seque os projetos estatildeo relativamente bem distribuiacutedos em grupos quanto ao ano em que seintroduziu expressotildees lambda

Pela meacutedia de lambda por snapshot (lambdasnapshot) a maioria (11 projetos) possuiuma quantidade expressiva acima de 100 lambdasnapshot (com 6 projetos entre 20 e 100lambdasnapshot e 8 projetos com menos de 20 lambdasnapshot) como apresentados no

33

graacutefico da Figura 51 Isso mostra que essa nova caracteriacutestica jaacute estaacute sendo bem utilizadanos projetos que comeccedilaram a migrar para a nova versatildeo do Java

Figura 51 Graacuteficos dos projetos separados por ano de introduccedilatildeo de expressotildees lambdae meacutedia de lambda por snapshot

Com isso pode-se observar que apesar de a quantidade de projetos que possuemexpressotildees lambda natildeo ser tatildeo alta eacute possiacutevel obter resultados expressivos uma vez quea quantidade dos projetos com lambda estatildeo bem dispersos quanto ao periacuteodo em quecomeccedilaram a adotar essa caracteriacutestica e a quantidade de expressotildees lambda por snapshot

511 Projetos Selecionados

Atraveacutes dos grupos de classificaccedilatildeo identificados pela anaacutelise temporal descritos na Figura45 cinco projetos foram selecionados para uma anaacutelise detalhada levando em consideraccedilatildeoo grupo em que eles pertencem Estes projetos seratildeo apresentados a seguir

512 agera

Agera eacute uma biblioteca Android que ajuda a introduzir programaccedilatildeo funcional reativa(functional reactive programming) em projetos Android Eacute um projeto recente lanccediladoem 2016 pela Google [44] e encontra-se no grupo dos projetos que introduziram expressotildeeslambda em 2016 no mesmo ano de seu lanccedilamento contendo uma meacutedia de expressotildeeslambda de 16 lambdasnapshot

Na classificaccedilatildeo estabelecida agera pertence ao Grupo 1 onde a quantidade de ex-pressotildees lambda no projeto com o tempo aumentam juntamente com a quantidade deAICs como mostra o graacutefico de anaacutelise temporal na Figura 52

34

Figura 52 Graacuteficos de anaacutelise temporal do projeto agera

513 vertx

Eclipse Vertx eacute um conjunto de ferramentas para criaccedilatildeo de reactive applications namaacutequina virtual Java (JVM) em grande escala [45] Seu primeiro lanccedilamento aconteceuem 2011 e a primeira ocorrecircncia de expressotildees lambda no projeto aconteceu em 2014 Esteprojeto possui uma meacutedia de 2867 lambdasnapshot e dentre os projetos consideradosneste trabalho eacute o que possui a maior quantidade de expressotildees lambda

Este projeto pertence ao Grupo 2 onde a quantidade de expressotildees lambda aumen-tou consideravelmente pelos meses ultrapassando a quantidade de AICs que diminuiudrasticamente como mostra a Figura 53

35

Figura 53 Graacuteficos de anaacutelise temporal do projeto Vertx

514 Android-CleanArchitecture

Apesar de ser uma amostra de projeto Android-CleanArchitecture que tem como objetivoconstruir aplicaccedilotildees Android utilizando clean architecture foi lanccedilado em 2014 mas semanteacutem sempre atualizado [46]

A introduccedilatildeo de expressotildees lambda que aconteceu no ano de 2015 se deu de formatiacutemida com uma meacutedia de 35 lambdasnapshot De qualquer forma este projeto conseguerepresentar com seu graacutefico de anaacutelise temporal o grupo 3 composto por projetos em quea quantidade de expressotildees lambda aumentou mas sem ultrapassar AICs que diminuiacuteramdemonstrado no graacutefico da Figura 54

36

Figura 54 Graacuteficos de anaacutelise temporal do projeto Android-CleanArchitecture

515 RxJava

Dentre os repositoacuterios estudados RxJava eacute considerado o mais popular Como umaimplementaccedilatildeo de Reactive Extensions para a JVM RxJava teve seu lanccedilamento dadoem 2013 [47] Expressotildees lambda apareceram pela primeira vez no ano de 2015 comuma meacutedia de 766 lambdasnapshot

Apesar de uma meacutedia relativamente alta o tempo de vida das expressotildees lambda nesteprojeto foi bem curto caracterizando assim projetos do grupo 4 houve a introduccedilatildeo dasexpressotildees lambda no projeto poreacutem houve a remoccedilatildeo completa de todas as expressotildeeslambda previamente introduzidas desaparecendo completamente do projeto ateacute a datada coleta de dados (Figura 55)

37

Figura 55 Graacuteficos de anaacutelise temporal do projeto RxJava

516 guava

Guava eacute um conjunto de bibliotecas para Java da Google lanccedilado em 2011 A atualizaccedilatildeodo coacutedigo do projeto para Java 8 aconteceu somente em 2016 e apesar do projeto conteruma meacutedia de 281 lambdasnapshot ele foi escolhido como representante dos projetosdo Grupo 5 (Figura 56) que possuem expressotildees lambda mas de forma natildeo expressiva osuficiente quando comparado com a quantidade de AIC pelo fato de sua razatildeo de meacutedia delambdasnapshot por meacutedia de AICsnapshot ser 004 Ou seja embora o projeto tenhaexpressotildees lambda estas satildeo consideradas muito poucas quando inseridas no contextogeral deste projeto que eacute considerado um projeto grande

38

Figura 56 Graacuteficos de anaacutelise temporal do projeto Guava

52 Refatoraccedilatildeo de Coacutedigo

Com o objetivo de caracterizar melhor como as expressotildees lambda estatildeo sendo utilizadaseacute interessante identificar se estas estatildeo sendo introduzidas atraveacutes de refatoraccedilatildeo de coacutedigoou em coacutedigo novo

Os projetos classificados como pertencentes ao Grupo 2 possuem em comum o fatode expressotildees lambda aumentarem a medida que AICs diminuem ultrapassando-as eessa caracteriacutestica em comum pode indicar que nestes projetos possivelmente houve re-fatoraccedilatildeo de coacutedigo visto que AIC sendo substituiacutedo por expressotildees lambda dentro dascondiccedilotildees determinadas eacute a maneira mais comum de se identificar refatoraccedilatildeo de coacute-digo para introduccedilatildeo de expressotildees lambda [12] Os projetos que compotildeem o grupo 2representam 44 de todos os projetos estudados que possuem expressotildees lambda o quepode ser um indicativo caso a hipoacutetese de refatoraccedilatildeo de coacutedigo seja positiva de quemuitos projetos que estatildeo adotando o Java 8 estatildeo se preocupando de alguma formacom refatoraccedilatildeo se coacutedigo Fazem parte desse grupo os seguintes projetos elasticsearchjava-design-patterns PocketHub presto RxJava-Android-Samples spark vertx zipkinjava8-tutorial dropwizard e material-dialogs

39

Outra maneira de verificar possiacuteveis indicadores de refatoraccedilatildeo de coacutedigo foi atraveacutesda anaacutelise dos tamanhos (em quantidade de linhas de coacutedigo) dos meacutetodos com expressotildeeslambda no mecircs em que se introduziu expressotildees lambda e um mecircs imediatamente antesdeste Essa anaacutelise mostra que dos 25 projetos com expressotildees lambda 12 (48) projetostiveram ao menos um meacutetodo em que houve uma diminuiccedilatildeo no tamanho o que podeser considerado um indicativo de refatoraccedilatildeo de coacutedigo A Figura 57 mostra todos osprojetos em relaccedilatildeo agrave quantidade total de meacutetodos que possuem lambda no primeiro mecircsde introduccedilatildeo do mesmo em vermelho comparado com a quantidade desses meacutetodos quetiveram uma diminuiccedilatildeo no tamanho quando comparados com o coacutedigo do mecircs anteriorem azul

Figura 57 Comparaccedilatildeo entre todos os projetos com expressatildeo lambda sobre refatoraccedilatildeode coacutedigo no mecircs de introduccedilatildeo da caracteriacutestica

Ainda observando a figura 57 com relaccedilatildeo aos projetos que natildeo tiveram nenhummeacutetodo com diminuiccedilatildeo de tamanho (barra azul) percebe-se que todos os 13 projetossequer tiveram uma quantidade significativa de meacutetodos que possuem expressotildees lambda(com o maior tendo apenas 5 meacutetodos) no mecircs de introduccedilatildeo da caracteriacutestica no projetoe ao mesmo tempo jaacute existiam no mecircs em que natildeo existia lambda no projeto Essa eacuteuma observaccedilatildeo importante porque projetos como vertx sendo este o que possui a maiormeacutedia de lambdasnapshot de todos os projetos e ao mesmo tempo tendo apenas trecircsmeacutetodos que continham expressotildees lambda no mecircs da introduccedilatildeo e que existiam no mecircs

40

anterior permitem inferir que todas as outras expressotildees lambda existentes no projetopara este determinado mecircs de introduccedilatildeo encontram-se em coacutedigo novo introduzido

Eacute importante ressaltar que somente essa anaacutelise natildeo eacute exclusivamente suficiente paradeterminar se estes projetos estatildeo realmente introduzindo lambda em coacutedigo novo ourealizando refatoraccedilatildeo uma vez que como a comparaccedilatildeo aconteceu apenas no mecircs deintroduccedilatildeo com o mecircs imediatamente anterior natildeo reflete todo o ciclo de vida do pro-jeto Por exemplo algumas equipes podem escolher refatorar o coacutedigo depois de umtempo de adaptaccedilatildeo apoacutes a transiccedilatildeo para a nova versatildeo da linguagem Assim paraobter uma melhor anaacutelise sobre refatoraccedilatildeo de coacutedigo ou natildeo feita nestes projetos aleacutemde outras anaacutelises referentes aos padrotildees tipicamente adotados para implementaccedilatildeo delambda nestes projetos seratildeo apresentados a seguir os estudos de caso dos cinco projetospreviamente selecionados

Outro ponto importante eacute o fato de que apesar das informaccedilotildees quanto agraves quantida-des de filter e map terem sido incluiacutedas inicialmente no trabalho para observar possiacuteveispadrotildees de refatoraccedilatildeo de coacutedigo percebeu-se que estas natildeo satildeo utilizadas de forma con-sideraacutevel pelos projetos estudados e para fins de anaacutelises generalizadas natildeo apresentaramtanta influecircncia na utilizaccedilatildeo de expressotildees lambda quanto a quantidade de AICs noprojeto

53 Estudos de Caso

Dentre os projetos analisados verificou-se que os projetos de pequeno e meacutedio porte op-taram por refatorar de uma vez seus coacutedigos para incluir expressotildees lambda em situaccedilotildeesem que se utilizava AICs anteriormente ou em alguns poucos casos de utilizaccedilatildeo deCollection Os projetos de grande porte natildeo apresentaram nenhuma refatoraccedilatildeo de coacute-digo ou uma refatoraccedilatildeo parcial gradativa provavelmente devido agrave grande quantidade dearquivos e coacutedigo que possuem o que pode tornar o trabalho de refatoraccedilatildeo extenso ecansativo

O projeto vertx que pertence ao grupo 2 dos projetos em que a quantidade de ex-pressotildees lambda aumentaram e as de AICs diminuiacuteram com lambda ultrapassando AICsexecutou inicialmente commits em maio de 2014 com adiccedilatildeo de coacutedigo novo utilizandoexpressotildees lambda e apoacutes um mecircs realizou um commit maior com a refatoraccedilatildeo de todasas AICs para expressotildees lambda Apoacutes a refatoraccedilatildeo o projeto se preocupou em mantera utilizaccedilatildeo de expressotildees lambda ao mesmo tempo que o uso de AICs se manteve apenasaos casos de classes com interfaces natildeo funcionais A Figura 58 apresenta uma parte docommit de refatoraccedilatildeo de coacutedigo que mostra em vermelho a parte eliminada do coacutedigo(AIC) e em verde o coacutedigo novo representando a substituiccedilatildeo por uma expressatildeo lambda

41

Figura 58 Commit de refatoraccedilatildeo de coacutedigo do projeto Vertx [3]

Alguns projetos ainda natildeo se preocuparam em refatorar o coacutedigo para o uso de ex-pressotildees lambda ateacute a data deste trabalho que eacute o caso do projeto guava que apresentouum commit em 03112016 com a atualizaccedilatildeo do projeto para Java 8 Mas a partir daatualizaccedilatildeo se preocupou em utilizar as expressotildees lambda apenas na implementaccedilatildeo decoacutedigo novo O cenaacuterio em que a refatoraccedilatildeo natildeo eacute prioridade ainda eacute a realidade de vaacuteriosprojetos de grande porte visto que os dados de projetos sem nenhuma expressatildeo lambdasatildeo o maior nuacutemero neste trabalho Poreacutem projetos que jaacute adotaram a utilizaccedilatildeo do Java8 tendem a mudar isso com o passar do tempo A Figura 59 apresenta em verde umaadiccedilatildeo de coacutedigo novo com expressatildeo lambda sem a eliminaccedilatildeo de algum coacutedigo anteriora esse que estaria em vermelho

42

Figura 59 Exemplo de um arquivo do commit de adiccedilatildeo de coacutedigo novo em Java 8 doprojeto Guava [4]

Na categoria de projetos em que os AICs e expressotildees lambda aumentam proporci-onalmente (grupo 1) o projeto agera realizou um commit em 19052016 com a adiccedilatildeoda biblioteca retrolambda como dependecircncia do projeto Essa biblioteca utilizada prin-cipalmente por projetos Android permite executar coacutedigo Java 8 contendo expressotildeeslambda em Java 5 6 e 7 [48] O commit tambeacutem apresenta refatoraccedilatildeo dos AICs ad-vindos de interfaces funcionais para expressotildees lambda Apesar de o projeto continuar autilizar as expressotildees lambda em seus commits posteriores o nuacutemero de AICs tambeacutemcontinuou a aumentar visualizando os commits posteriores notou-se que esses AICs satildeorelativos a interfaces natildeo funcionais ou seja que possuem mais de um meacutetodo O projetoAndroid-CleanArchitecture eacute similar ao agera pois tambeacutem optou pela instalaccedilatildeo da bi-blioteca retrolambda para uso de expressotildees lambda em seus coacutedigos e como tambeacutem eacuteum projeto de pequeno porte houve uma pequena refatoraccedilatildeo dos AICs A Figura 510mostra a parte do commit de refatoraccedilatildeo de coacutedigo em que o desenvolvedor adiciona abiblioteca retrolambda como dependecircncia

43

Figura 510 Commit de adiccedilatildeo da biblioteca Retrolambda no projeto Agera [5]

Outro caso interessante eacute o do projeto RxJava que em 2015 optou pela refatoraccedilatildeodo coacutedigo para a utilizaccedilatildeo de expressotildees lambda quase eliminando por completo o usode AICs mas que no ano seguinte reverteu os commits de forma que eliminasse comple-tamente o uso de expressotildees lambda para manter a retrocompatibilidade com o Java 6A Figura 511 demonstra uma parte do commit de reversatildeo do coacutedigo para Java 6 emque pode ser visto em vermelho o coacutedigo anterior com expressotildees lambda e o verde como novo coacutedigo utilizando AIC novamente

44

Figura 511 Commit de remoccedilatildeo de Lambdas e volta para o uso de AICs no projetoRXJava [6]

Essa preocupaccedilatildeo com retrocompatibilidade de coacutedigo pode ser um fator crucial nadecisatildeo das equipes de desenvolvimento na hora de decidir como fazer o software co-evoluircom a linguagem sem perder a compatibilidade com versotildees anteriores

45

Capiacutetulo 6

Consideraccedilotildees Finais

Este estudo permitiu entender melhor como projetos estatildeo realizando a migraccedilatildeo para oJava 8 em especial utilizando uma nova caracteriacutestica introduzida expressatildeo lambdaApesar de a maioria dos projetos populares considerados natildeo possuiacuterem nenhuma ocor-recircncia de expressotildees lambda os projetos que tinham expressotildees lambda foram suficientespara realizar um primeiro estudo de caracterizaccedilatildeo no uso desta caracteriacutestica e com osprojetos efetivamente utilizados para estudo foi possiacutevel agrupaacute-los quanto a maneira emque as expressotildees lambda estavam sendo utilizadas quando comparadas com AICs em 5grandes grupos quando AIC e lambda aumentam proporcionalmente quando AIC dimi-nui e lambda aumenta ultrapassando AIC quando AIC diminui mas continua superior aolambda crescente expressotildees lambda que foram introduzidas e retiradas completamentedo coacutedigo e expressotildees lambda que natildeo existem em quantidades expressivas

Foi possiacutevel entatildeo realizar um estudo aprofundado levando em consideraccedilatildeo as di-ferentes maneiras com que as expressotildees lambda foram adotadas nos projetos atraveacutes daescolha de um projeto que representasse cada grupo para anaacutelise Dentre os cinco projetosestudados foi possiacutevel observar alguns padrotildees tipicamente adotados por desenvolvedorespara implementar expressotildees lambda em seus projetos como a utilizaccedilatildeo da bibliotecas(retrolambda) que permitissem uma flexibilizaccedilatildeo na utilizaccedilatildeo de expressotildees lambda oucomo lambda eacute primariamente utilizada para substituir determinados AICs ou operaccedilotildeesem Collection

Aleacutem disso foi possiacutevel observar como a refatoraccedilatildeo de coacutedigo acontece em cada umdesses projetos Observou-se como projetos menores tendem a refatorar coacutedigo maisfacilmente ao passo que projetos maiores e mais complexos fazem menos refatoraccedilatildeo oudemoram mais entre o periacuteodo em que houve a primeira migraccedilatildeo de coacutedigo para a novaversatildeo da linguagem ateacute o periacuteodo em que realmente decidem refatorar coacutedigo Aleacutem dacomplexidade do projeto influenciar na decisatildeo de migrar o projeto para uma versatildeo maisrecente da linguagem a preocupaccedilatildeo com retrocompatibilidade com versotildees anteriores da

46

linguagem tambeacutem podem ser uma barreira para que projetos comecem a evoluir o coacutedigojuntamente com a evoluccedilatildeo da linguagem

Ainda assim foi possiacutevel observar que a preocupaccedilatildeo com a co-evoluccedilatildeo do software-linguagem existe entre os desenvolvedores de projetos mas a realizaccedilatildeo da migraccedilatildeo aindaacontece lentamente devido agrave diversos fatores que precisam ser levados em consideraccedilatildeopara a manutenccedilatildeo do projeto

Para trabalhos e contribuiccedilotildees futuras seria interessante desenvolver uma ferramentaque pudesse analisar diretamente no coacutedigo-fonte as oportunidades de aplicaccedilatildeo de ex-pressotildees lambda dessa forma poderiam ser analisadas as porcentagens de conversatildeo decoacutedigo para Java 8 e obter melhores conclusotildees sobre a importacircncia que os projetos estatildeodando para a evoluccedilatildeo de seus coacutedigos Outro fator interessante seria aplicar mais Visitorsagrave ferramenta static-analysis e fazer este mesmo estudo aplicado agrave outras caracteriacutesticasda linguagem

47

Referecircncias

[1] Kagdi Huzefa Michael L Collard e Jonathan I Maletic A survey and taxonomyof approaches for mining software repositories in the context of software evolution2007 ix 3 8 9 10 11

[2] DBeaver Dbeaver - features httpdbeaverjkissorgdocsfeatures ix 29

[3] Eclipse Vertx commit Java8-ify code httpsgithubcomeclipsevertxcommit93f95e9c77419f442a42fe711b6eeaef88192fd3 ix 42

[4] Google Guava commit Release java 8 changes to guava httpsgithubcomgoogleguavacommit73e382fa877f80994817a136b0adcc4365ccd904 ix 43

[5] Google Agera commit Collapsed testapp with retrolambda httpsgithubcomgoogleageracommit5e518b7b05f9e7a34a314945f68deff7b2c3e334 ix 44

[6] ReactiveX Rxjava commit 2x full jdk 6 compatible backport + includ-ing bugfixes up to today httpsgithubcomReactiveXRxJavacommit000a174d87a901135f9665d3b11f3627fd2dc4ed ix 45

[7] Godfrey M W e D M German The past present and future of software evolutionEm 2008 Frontiers of Maintenance paacuteginas 129ndash138 Sept 2008 1 6

[8] Favre J M Languages evolve too changing the software time scale Em Principles ofSoftware Evolution Eighth International Workshop on paacuteginas 33ndash42 IEEE 20051 5 7

[9] Overbey Jeffrey L e Ralph E Johnson Regrowing a language refactoring tools allowprogramming languages to evolve Em ACM SIGPLAN Notices volume 44 paacuteginas493ndash502 ACM 2009 1 5 7 8 12

[10] Grechanik Mark Collin McMillan Luca DeFerrari Marco Comi Stefano CrespiDenys Poshyvanyk Chen Fu Qing Xie e Carlo Ghezzi An empirical investiga-tion into a large-scale java open source code repository Em Proceedings of the2010 ACM-IEEE International Symposium on Empirical Software Engineering andMeasurement ESEM rsquo10 paacuteginas 111ndash1110 New York NY USA 2010 ACMISBN 978-1-4503-0039-1 httpdoiacmorg10114518527861852801 1

[11] TIOBE Tiobe httpswwwtiobecomtiobe-index 1 14

48

[12] Gyori Alex Lyle Franklin Danny Dig e Jan Lahoda Crossing the gap from im-perative to functional programming through refactoring Em Proceedings of the 20139th Joint Meeting on Foundations of Software Engineering ESECFSE 2013 paacute-ginas 543ndash553 New York NY USA 2013 ACM ISBN 978-1-4503-2237-9 httpdoiacmorg10114524914112491461 2 11 24 39

[13] OpenJDK State of the lambda httpcropenjdkjavanet~briangoetzlambdalambda-state-4html 2

[14] Han Jiawei Micheline Kamber e Jian Pei Data Mining Concepts and TechniquesMorgan Kaufmann Publishers Inc San Francisco CA USA 3rd ediccedilatildeo 2011ISBN 0123814790 9780123814791 3

[15] Fowler Martin e Kent Beck Refactoring improving the design of existing codeAddison-Wesley Professional 1999 5 7

[16] Lehman M M J F Ramil P D Wernick D E Perry e W M Turski Met-rics and laws of software evolution - the nineties view Em Proceedings of the4th International Symposium on Software Metrics METRICS rsquo97 paacuteginas 20ndashWashington DC USA 1997 IEEE Computer Society ISBN 0-8186-8093-8 httpdlacmorgcitationcfmid=823454823901 6

[17] Hassan Ahmed E e Tao Xie Software intelligence The future of mining softwareengineering data Em Proceedings of the FSESDP Workshop on Future of SoftwareEngineering Research FoSER rsquo10 paacuteginas 161ndash166 New York NY USA 2010ACM ISBN 978-1-4503-0427-6 httpdoiacmorg101145188236218823978 9

[18] Hassan Ahmed E The road ahead for mining software repositories Em Frontiers ofSoftware Maintenance 2008 FoSM 2008 paacuteginas 48ndash57 IEEE 2008 8

[19] Berry Michael J e Gordon Linoff Data Mining Techniques For Marketing Salesand Customer Support John Wiley amp Sons Inc New York NY USA 1997ISBN 0471179809 10

[20] Parnin Chris Christian Bird e Emerson Murphy-Hill Java generics adoption hownew features are introduced championed or ignored Em Proceedings of the 8thWorking Conference on Mining Software Repositories paacuteginas 3ndash12 ACM 2011 12

[21] Oracle The java language specification httpsdocsoraclecomjavasespecsjlsse8jls8pdf 13

[22] Oracle The history of java technology httpwwworaclecomtechnetworkjavajavaseoverviewjavahistory-index-198355html 13

[23] Murphy Kieron So why did they decide to call itjava httpwwwjavaworldcomarticle2077265core-javaso-why-did-they-decide-to-call-it-java-html 13

[24] McGraw Tata Object-oriented Programming with Java Essentials and ApplicationsHill Education 13

49

[25] Oracle Differences between java ee and java se httpdocsoraclecomjavaee6firstcupdocgkhoyhtml 13

[26] Lindsey Clark S The History of Java Cambridge 14

[27] Oracle The java language environment httpwwworaclecomtechnetworkjavaintro-141325html 14

[28] Oracle Jdk 8 httpopenjdkjavanetprojectsjdk8 15 24

[29] Oracle Enhancements in java se 8 httpdocsoraclecomjavase8docstechnotesguideslanguageenhancementshtmljavase8 15 16 17

[30] Oracle Lambda expressions httpdocsoraclecomjavasetutorialjavajavaOOlambdaexpressionshtml 16 18 21

[31] Oracle Method references httpdocsoraclecomjavasetutorialjavajavaOOmethodreferenceshtml 16

[32] Oracle Default methods httpdocsoraclecomjavasetutorialjavaIandIdefaultmethodshtml 17

[33] Oracle Repeating annotations httpdocsoraclecomjavasetutorialjavaannotationsrepeatinghtml 17

[34] Oracle Type annotations httpdocsoraclecomjavasetutorialjavaannotationstype_annotationshtml 17

[35] Oracle Anonymous inner classes httpsdocsoraclecomjavasetutorialjavajavaOOanonymousclasseshtml 19

[36] Kothari CR Research Methodology Methods and Techniques New Age Interna-tional (P) Limited 2004 ISBN 9788122415223 httpsbooksgooglecombrbooksid=8c6gkbKi-F4C 22

[37] Nakakoji Kumiyo Yasuhiro Yamamoto Yoshiyuki Nishinaka Kouichi Kishida eYunwen Ye Evolution patterns of open-source software systems and communitiesEm IWPSE rsquo02 Proceedings of the International Workshop on Principles of SoftwareEvolution paacuteginas 76ndash85 New York NY USA 2002 ACM Press ISBN 1581135459httpdxdoiorg101145512035512055 23

[38] Rahman Foyzur Christian Bird e Premkumar Devanbu Clones What is that smellEmpirical Software Engineering 17(4-5)503ndash530 2012 24

[39] Chacon Scott Pro Git Apress Berkely CA USA 1st ediccedilatildeo 2009ISBN 1430218339 9781430218333 25

[40] Cavalcanti Thiago Gomes e Viniacutecius Correa de Almeida Caracterizaccedilatildeo do uso deconstruccedilotildees da linguagem java em projetos open-source Publicaccedilatildeo online 2016httpbdmunbbrhandle1048315733 27

50

[41] Parr Terence Language Implementation Patterns Create Your Own Domain-Specific and General Programming Languages Pragmatic Bookshelf 1st ediccedilatildeo 2009ISBN 193435645X 9781934356456 27

[42] Janssen Thorben 5 reasons to use jpa hibernate Publicaccedilatildeo online httpswwwsitepointcom5-reasons-to-use-jpa-hibernate 27

[43] Franklin Lyle Alex Gyori Jan Lahoda e Danny Dig Lambdaficator From imperativeto functional programming through automated refactoring Em Proceedings of the2013 International Conference on Software Engineering ICSE rsquo13 paacuteginas 1287ndash1290 Piscataway NJ USA 2013 IEEE Press ISBN 978-1-4673-3076-3 httpdlacmorgcitationcfmid=24867882486986 29

[44] Google Agera httpsgithubcomgoogleagerawiki 34

[45] Eclipse Eclipse vertx httpvertxio 35

[46] Cejas Fernando Android cleanarchitecture httpsgithubcomandroid10Android-CleanArchitecture 36

[47] ReactiveX Rxjava httpsgithubcomReactiveXRxJava 37

[48] Luontola Esko Retrolambda httpsgithubcomorfjackalretrolambda 43

51

Anexo I

Projetos utilizados

fastjson

platform_frameworks_base

netty

material-dialogs

kotlin

okhttp

tinker

AndroidUtilCode

RxJava

spring-boot

java-design-patterns

elasticsearch

ExoPlayer

kafka

vertx

realm-java

guava

zipkin

bazel

stetho

Signal-Android

glide

agera

fresco

plaid

presto

libgdx

spark

52

disruptor

lottie-android

flexbox-layout

PocketHub

zxing

spring-framework

deeplearning4j

dropwizard

interviews

BaseRecyclerViewAdapterHelper

uCrop

DanmakuFlameMaster

lottie-react-native

android-UniversalMusicPlayer

AndroidInterview-Q-A

greenDAO

retrofit

MaterialDrawer

BottomBar

druid

MPAndroidChart

Hystrix

guice

recyclerview-animators

dubbo

androidannotations

RxJava-Android-Samples

PhotoView

clojure

CircleImageView

AndroidSwipeLayout

jedis

MaterialViewPager

butterknife

junit4

RxBinding

leakcanary

SimianArmy

picasso

UltimateRecyclerView

53

AndroidViewAnimations

AppIntro

FizzBuzzEnterpriseEdition

ion

cheesesquare

physical-web

RxAndroid

Android-CleanArchitecture

Calligraphy

Android-Bootstrap

iosched

Android_Data

MaterialDesignLibrary

ListViewAnimations

EventBus

java8-tutorial

AndroidSlidingUpPanel

dagger

okhttputils

logger

HomeMirror

Material-Animations

android-Ultra-Pull-To-Refresh

android-async-http

Android-ObservableScrollView

Android-Universal-Image-Loader

ActionBarSherlock

SlidingMenu

storm

PagerSlidingTabStrip

Android-PullToRefresh

54

  • Dedicatoacuteria
  • Agradecimentos
  • Resumo
  • Abstract
  • Introduccedilatildeo
    • Contexto
    • Objetivos
      • Objetivos Gerais
      • Objetivos Especiacuteficos
        • Metodologia
        • Organizaccedilatildeo do Trabalho
          • Evoluccedilatildeo e Mineraccedilatildeo de Repositoacuterios de Software
            • Evoluccedilatildeo de Software
            • MSR Mineraccedilatildeo de dados e a Engenharia de Software
              • Classificaccedilatildeo
                • Trabalhos Relacionados
                  • Java SE 8 e JDK 8
                    • Histoacuterico
                    • Princiacutepios
                    • Evoluccedilatildeo
                    • Expressotildees Lambda
                      • Sintaxe
                      • Principais formas de uso
                          • Estudo e o Processo de Mineraccedilatildeo
                            • Questotildees de Pesquisa
                            • Fonte de Dados e Objetos de Estudo
                            • Processo de Mineraccedilatildeo
                              • static-analysis
                              • BDAnalisador
                                • Classificaccedilatildeo e Anaacutelise
                                  • Meacutedia de Lambda
                                  • Anaacutelise Temporal
                                  • Refatoraccedilatildeo de Coacutedigo
                                  • Casos de Uso
                                      • Resultados Obtidos e Anaacutelise
                                        • Visatildeo Geral
                                          • Projetos Selecionados
                                          • agera
                                          • vertx
                                          • Android-CleanArchitecture
                                          • RxJava
                                          • guava
                                            • Refatoraccedilatildeo de Coacutedigo
                                            • Estudos de Caso
                                              • Consideraccedilotildees Finais
                                              • Referecircncias
                                              • Anexo
                                              • Projetos utilizados

6 LocalDateTime getLocalDateTime ( ) 7

8 s t a t i c ZoneId getZoneId ( S t r ing zoneStr ing ) 9 t ry

10 re turn ZoneId o f ( zoneStr ing ) 11 catch ( DateTimeException e ) 12 System e r r p r i n t l n ( I n v a l i d time zone + zoneStr ing

+13 us ing d e f a u l t time zone in s t ead ) 14 re turn ZoneId systemDefault ( ) 15 16 17

18 d e f a u l t ZonedDateTime getZonedDateTime ( St r ing zoneStr ing ) 19 re turn ZonedDateTime o f ( getLocalDateTime ( ) getZoneId (

zoneStr ing ) ) 20 21 22

Listagem 34 Exemplo de interface com um meacutetodo default [32]

4 Repeating Annotations permitem a implementaccedilatildeo e utilizaccedilatildeo de anotaccedilotildees deum mesmo tipo que podem ser utilizadas mais de uma vez para a mesma declara-ccedilatildeo [29] A Listagem 35 apresenta duas anotaccedilotildees iguais com paracircmetros diferentespermitindo uma customizaccedilatildeo maior na aplicaccedilatildeo de um tipo de anotaccedilatildeo

1 Schedule ( dayOfMonth= l a s t )2 Schedule (dayOfWeek= Fr i hour= 23 )3 pub l i c void doPeriodicCleanup ( ) 4

Listagem 35 Exemplo de Repeating Annotations [33]

5 Type Annotations permitem que anotaccedilotildees possam ser utilizadas em tipos aleacutemde declaraccedilotildees dessa forma pode-se garantir que um campo sempre atenda agraves suasexpectativas e evite testes desnecessaacuterios [29] A Listagem 36 mostra um exemplo derestriccedilatildeo a uma String que nunca poderaacute ser nula devido agrave anotaccedilatildeo de NonNull

1 NonNull S t r ing s t r

Listagem 36 Exemplo de Type Annotation garantindo que o campo nunca seja null [34]

17

34 Expressotildees Lambda

Uma das mudanccedilas mais interessantes implementadas no Java 8 foi a adiccedilatildeo de expressotildeeslambda As expressotildees lambda permitem que a linguagem Java possa atuar parcialmentecomo uma linguagem de programaccedilatildeo funcional onde comportamentos satildeo avaliados eaplicados diferentemente da programaccedilatildeo imperativa que foca na mudanccedila de estadosNa praacutetica um comportamento pode ser passado como paracircmetro de um meacutetodo atraveacutesde uma escrita mais reduzida e legiacutevel Os benefiacutecios de utilizar expressotildees lambda incluemuma melhora na legibilidade e organizaccedilatildeo de coacutedigo que antes era escrito com AnonymousInner Class aleacutem de permitir uma forma simples de utilizar comportamento paralelo como uso de Streams

341 Sintaxe

A sintaxe de uma expressatildeo lambda eacute dividida nas seguintes partes [30]

bull Uma lista de paracircmetros separados por viacutergulas

bull Um token representado por uma seta -gt

bull Um corpo que pode ser representado por uma expressatildeo uacutenica ou um bloco de coacutedigodentro de chaves

As Listagens 37 e 38 mostram duas formas diferentes de se aplicar expressotildees Lambdacom uma sintaxe similar A primeira aplica a expressatildeo diretamente apoacutes a seta utilizadanormalmente para trechos de coacutedigo pequenos e simples e a segunda utiliza-se de chavespara incorporar o coacutedigo e da palavra-chave return para especificar o retorno forma maisutilizada para uma quantidade maior de coacutedigo

1 p minusgt p getGender ( ) == Person Sex MALE2 ampamp p getAge ( ) gt= 183 ampamp p getAge ( ) lt= 25

Listagem 37 Exemplo de expressatildeo lambda com uma expressatildeo [30]

1 p minusgt 2 re turn p getGender ( ) == Person Sex MALE3 ampamp p getAge ( ) gt= 184 ampamp p getAge ( ) lt= 25 5

Listagem 38 Exemplo de expressatildeo lambda com um bloco de coacutedigo [30]

18

342 Principais formas de uso

Anonymous Inner Class

Antes do Java 8 a necessidade de passar funccedilotildees ou expressotildees como paracircmetro de algummeacutetodo era suprida atraveacutes de Anonymous Inner Classes A utilizaccedilatildeo desse tipo dedeclaraccedilatildeo junto com a anotaccedilatildeo de Override permite sobrescrever um meacutetodo de umainterface funcional e ao mesmo tempo passa-la como argumento para um meacutetodo Umaexpressatildeo lambda se comporta da mesma forma poreacutem a quantidade de coacutedigo escritopela Anonymous Inner Class eacute maior e pode dificultar a leitura de coacutedigo pois conteacutemmuita informaccedilatildeo natildeo utilizada para efetivo entendimento do que estaacute sendo feito naqueletrecho

A Listagem 39 apresenta a instanciaccedilatildeo da classe EventHandler internamente ao meacute-todo setOnAction() de forma que o desenvolvedor possa escrever o comportamento quedeseja passar como paracircmetro do meacutetodo atraveacutes da substituiccedilatildeo do meacutetodo handle()que jaacute existe pelo meacutetodo handle() criado e escrito pelo desenvolvedor

1 btn setOnAction (new EventHandlerltActionEvent gt() 2 Override3 pub l i c void handle ( ActionEvent event ) 4 System out p r i n t l n ( He l lo World ) 5 6 )

Listagem 39 Exemplo de uso de Anonymous Inner Class [35]

Interface funcional

Ao projetar um coacutedigo novo o desenvolvedor que optar por utilizar expressotildees lambdadeve iniciar com a criaccedilatildeo de uma interface funcional Esse tipo de interface possui umuacutenico meacutetodo abstrato permitindo que expressotildees lambda sejam usadas para sobrescrevero comportamento do meacutetodo abstrato Uma interface funcional pode possuir outros meacuteto-dos desde que sejam default Uma nova anotaccedilatildeo FunctionalInterface foi adicionadacom a atualizaccedilatildeo do Java 8 para conferir em tempo de compilaccedilatildeo se a interface satisfazos requisitos desse modelo de interface

A Listagem 310 apresenta um exemplo de interface funcional com o objetivo de permi-tir o uso de expressotildees lambda que utilizaratildeo de dois Double como paracircmetro e jaacute utilizada nova anotaccedilatildeo FunctionalInterface introduzida no Java 8

1 Funct iona l Inte r face2 pub l i c i n t e r f a c e DoubleOp 3 pub l i c Double apply ( Double a Double b)

19

4

Listagem 310 Exemplo de interface funcional

Dessa forma conforme as Listagens 311 e 312 o meacutetodo apply() pode tomar formade qualquer operaccedilatildeo entre dois Double que seraacute especificada quando a expressatildeo lambdafor montada dando o aspecto de linguagem funcional agrave linguagem e mais facilidade eliberdade ao desenvolvedor

1 pub l i c c l a s s Ca l cu la to r 2 pub l i c s t a t i c Double c a l c ( Double op1 Double op2 DoubleOp operator ) 3 re turn operator apply ( op1 op2 ) 4 5

Listagem 311 Exemplo de aplicaccedilatildeo da interface funcional

1 Double r e s u l t 1 = Ca lcu la to r c a l c (10d 50d ( a b ) minusgt a + b)

Listagem 312 Uso de expressatildeo lambda para o exemplo anterior

Collections

Dentre as atualizaccedilotildees de pacotes do Java 8 foi adicionado um meacutetodo stream() nainterface Collection Esse meacutetodo trata as Collection como streams o que significa queapesar de natildeo ser possiacutevel acessar elementos diretamente algumas novas manipulaccedilotildeessatildeo possiacuteveis Essas manipulaccedilotildees satildeo na verdade meacutetodos da interface Stream quepodem receber como paracircmetro uma expressatildeo lambda ou seja um comportamento a seraplicado agrave Collection Dentre os meacutetodos temos

bull filter() O meacutetodo filter() recebe uma expressatildeo lambda contendo uma condiccedilatildeopara filtragem da collection

bull map() O meacutetodo map() mapeia os elementos de uma Collection em outro objetocomo uma String A expressatildeo lambda passada por paracircmetro deve retornar o tipode objeto ao qual seraacute mapeado

bull forEach() O meacutetodo forEach() aplica uma operaccedilatildeo especiacutefica para cada ele-mento da Collection A expressatildeo lambda a ser passada deve conter a operaccedilatildeo aser realizada

bull min() e max() Os meacutetodos min() e max() retornam o elemento menor ou maiorda Collection dependendo da expressatildeo lambda passada como paracircmetro

20

A Listagem 313 demonstra como vaacuterias operaccedilotildees com uma Collection podem seraplicadas de uma vez de forma que lendo a expressatildeo lambda jaacute eacute possiacutevel saber oresultado da aplicaccedilatildeo do meacutetodo agrave Collection

1 r o s t e r2 stream ( )3 f i l t e r (4 p minusgt p getGender ( ) == Person Sex MALE5 ampamp p getAge ( ) gt= 186 ampamp p getAge ( ) lt= 25)7 map(p minusgt p getEmailAddress ( ) )8 forEach ( emai l minusgt System out p r i n t l n ( emai l ) )

Listagem 313 Exemplo de utilizaccedilatildeo de meacutetodos de stream com expressotildees lambda [30]

21

Capiacutetulo 4

Estudo e o Processo de Mineraccedilatildeo

A definiccedilatildeo da metodologia utilizada para realizaccedilatildeo deste trabalho eacute importante para queexista uma padronizaccedilatildeo e melhor entendimento de como os resultados foram obtidos paraque a replicaccedilatildeo do mesmo possa ser realizada em trabalhos futuros [36]

Figura 41 Processo utilizado para realizaccedilatildeo do estudo

O esquema representado na Figura 41 descreve o processo seguido para a realizaccedilatildeodeste trabalho que foi divido em trecircs grandes etapas a de planejamento definindo osobjetivos questotildees de pesquisa e meios de investigaccedilatildeo deste projeto a etapa de execuccedilatildeorealizando todo o procedimento metodoloacutegico definido para a coleta e refinamento de

22

dados e a etapa de avaliaccedilatildeo onde foram classificados e avaliados os dados coletadospara responder agraves questotildees de pesquisa

A seguir na primeira seccedilatildeo seratildeo apresentadas em detalhes as questotildees de pesquisa aserem respondidas Em seguida seraacute feito uma breve descriccedilatildeo da fonte de dados utilizada- especificamente os projetos utilizados como objetos de estudo deste trabalho e por fimtodo o restante da metodologia que foi de fato desenvolvida para obter os resultadosnecessaacuterios

41 Questotildees de Pesquisa

Com o objetivo de entender e caracterizar melhor o uso de expressotildees lambda foramdefinidas as seguintes questotildees de pesquisa a serem respondidas

bull PQ-1 Quando os projetos comeccedilaram a introduzir o uso de expressotildees lambda emseus coacutedigos e qual a meacutedia de expressotildees lambda por snapshots caso existam

bull PQ-2 Como as equipes de desenvolvimento estatildeo utilizando expressotildees lambdaatraveacutes de refatoraccedilatildeo de coacutedigo ou introduzindo apenas em coacutedigo novo

bull PQ-3 Quais satildeo os padrotildees tipicamente adotados para o uso de expressotildees lambda

A primeira pergunta de pesquisa gira em torno de como projetos populares open-sourceestatildeo se adaptando agrave introduccedilatildeo de expressotildees lambda em Java muitos projetos jaacute estatildeoutilizando as expressotildees lambda Se sim a partir de quando comeccedilaram a utilizaacute-lasdesde o iniacutecio da introduccedilatildeo das mesmas no Java 8 ou em um periacuteodo mais tardio Aleacutemdisso eacute interessante descobrir se a utilizaccedilatildeo dessa nova caracteriacutestica tem acontecido deforma expressiva ou natildeo

Em seguida para melhor entender a forma como as expressotildees lambda estatildeo sendointroduzidas em projetos eacute interessante investigar se as equipes de desenvolvimento estatildeose preocupando em refatorar coacutedigo com o objetivo de evoluir o software ou se estatildeoexperimentando utilizar expressotildees lambda apenas em coacutedigo novo introduzido

Como a introduccedilatildeo de novas funcionalidades em projetos open-source de grande escaladepende do objetivo do projeto e os padrotildees de projeto utilizados [37] espera-se obser-var diversas abordagens quanto a utilizaccedilatildeo de expressotildees lambda para entatildeo poderclassificar estes softwares quanto a abordagem utilizada

Eacute de grande importacircncia para este estudo conseguir identificar na praacutetica comoexpressotildees lambda estatildeo sendo tipicamente adotadas nestes projetos Assim a terceirapergunta de pesquisa busca identificar alguns exemplos de utilizaccedilatildeo atraveacutes da realizaccedilatildeode alguns estudos de caso

23

Eacute importante ressaltar que apesar de as expressotildees lambda serem uma alternativa aouso de AIC elas natildeo os substituem completamente Existem precondiccedilotildees para que umaAIC possa ser substituiacuteda por expressotildees lambda [12] descritas a seguir

bull AIC deve instanciar-se de uma interface

bull AIC natildeo deve possuir nenhum campo e declarar apenas um meacutetodo

bull AIC natildeo deve possuir uma referecircncia para this ou super

bull AIC natildeo deve declarar um meacutetodo recursivo

Para responder agrave primeira pergunta apenas dados gerais sobre todos os projetos seratildeonecessaacuterios ao passo que pelas perguntas 2 e 3 possuiacuterem uma natureza mais complexaseraacute necessaacuterio aleacutem de uma anaacutelise geral estatiacutestica a realizaccedilatildeo de alguns estudos decaso para obter resultados mais completos

42 Fonte de Dados e Objetos de Estudo

Para responder agraves perguntas de pesquisa estabelecidas foram selecionados os 99 projetosmais populares na linguagem Java dentro da plataforma github ateacute a data da coleta dosdados feita em Abril de 2017 Satildeo considerados populares os repositoacuterios que possuema maior quantidade possiacutevel de estrelas (stars) A decisatildeo de escolher os 99 projetos maispopulares foi por sua natureza imparcial e ao mesmo tempo para que se possa analisarprojetos que satildeo de familiaridade e conhecimento da comunidade do github e de domiacuteniopuacuteblico Os 99 projetos estatildeo listados no Anexo I

Para entender a transiccedilatildeo feita por esses projetos entre as versotildees anteriores do Java eo Java 8 com as expressotildees lambda eacute necessaacuterio analisar o coacutedigo de vaacuterias versotildees a fimde observar alguma mudanccedila para cada projeto Como satildeo 99 projetos e vaacuterios dessesprojetos possuem milhares de linhas de coacutedigo e commits seria impossiacutevel avaliar todosos commits Optou-se entatildeo por coletar snapshots mensais de cada projeto conformeprocedimento tambeacutem seguido anteriormente [38] Cada snapshots representa o estadodo projeto em um determinado mecircs e como criteacuterio de escolha padratildeo todos os snapshotsequivalem ao uacuteltimo commit realizado no determinado mecircs que este representa

O proacuteximo passo eacute determinar o periacuteodo de tempo em que esses snapshots seriamcoletados Como Java 8 (e consequentemente as expressotildees lambda) foi introduzidoapenas em meados de 2014 [28] coletar dados de projetos a partir de um periacuteodo muitoantes deste ano natildeo agregaria valor ao estudo em questatildeo Definiu-se entatildeo um periacuteodopara a coleta mensal desses snapshots atraveacutes dos anos Janeiro de 2013 um ano antesda introduccedilatildeo do Java 8 para que se pudesse identificar para todos os projetos o mecircs

24

exato em que expressotildees lambda foram introduzidas ateacute o mecircs da coleta de dados Abrilde 2017

Eacute importante ressaltar que a definiccedilatildeo dos meses foi definida do dia primeiro de ummecircs ao dia primeiro do proacuteximo mecircs e por consequecircncia alguns snapshots que deveriamrepresentar o final de determinado mecircs correspondem na verdade a commits realizadosno dia primeiro do mecircs seguinte Por exemplo pode existir casos em que o commit querepresente o mecircs de Marccedilo de 2016 seja na verdade o commit realizado no dia primeirode Abril de 2016 Isso se deve a natureza da forma como os resultados de log de commitssatildeo obtidos pelo git [39] Poreacutem isso natildeo interfere nas anaacutelises ou no propoacutesito destetrabalho uma vez que foram realizadas verificaccedilotildees e validaccedilotildees para que natildeo existamdatas repetidas (e consequentemente commits repetidos) por repositoacuterio

Neste trabalho o termo projeto e repositoacuterio foram utilizados de forma intercaladapara representar a mesma coisa o software desenvolvido que possui um repositoacuterio naplataforma github Os termos commit snapshops e versotildees tambeacutem representam a mesmacoisa uma vez que foi definido que seriam utilizados apenas um commit por mecircs pararepresentar um determinado snapshot ou versatildeo do repositoacuterio em questatildeo

Todos os 99 projetos seratildeo utilizados para a realizaccedilatildeo de uma anaacutelise geral de ca-racterizaccedilatildeo do uso de expressotildees lambda Para as anaacutelises aprofundadas foi feito umcriteacuterio de classificaccedilatildeo para que apenas alguns projetos possam ser analisados em niacutevelde coacutedigo como estudos de caso

Resumindo foram escolhidos os 99 projetos mais populares de Java no github cole-tando dados mensais de seus commits a partir do ano de 2013 ateacute a data da coleta dosdados lembrando que nem todos os projetos existem desde 2013 (projetos mais recentes)

43 Processo de Mineraccedilatildeo

A abordagem utilizada para coletar e analisar os 99 projetos escolhidos como mostra aFigura 42 foi realizada de forma automatizada utilizando scripts python e dois projetosdesenvolvidos em Java para a coleta e tratamento de dados como descrito a seguir

Primeiramente foi realizado uma coacutepia dos repositoacuterios atuais de todos os 99 projetosmais populares do github em Java Para automatizar o processo foi desenvolvido umscript em python que lista todos os projetos escolhidos clona todos os repositoacuterios emuma pasta na maacutequina local e cria um arquivo temporaacuterio com as informaccedilotildees do nomede cada repositoacuterio e seu caminho absoluto na maacutequina local

25

Figura 42 Metodologia implementada para coleta e tratamento de dados

Em seguida foi necessaacuterio realizar o checkout de todas as versotildees entre Janeiro de2013 a Abril de 2017 de cada projeto Por motivos de otimizaccedilatildeo de espaccedilo da maacutequinalocal e automatizaccedilatildeo no processo de checkout utilizou-se de um segundo script pythonque realizava as seguintes tarefas para cada mecircs em cada projeto verificar se dentreo mecircs estipulado houve algum commit para aquele projeto se sim pega-se o hash douacuteltimo commit do mecircs realiza o checkout conta-se a quantidade de linhas de coacutedigo emJava que o projeto tem utilizando a biblioteca cloc e armazena todas as informaccedilotildeespertinentes referentes a todos os projetos que naquele mecircs tiveram commits para que oprojeto static-analysis possa entatildeo ser executado sobre esses projetos naquele determinadomomento As informaccedilotildees coletadas que satildeo utilizadas pelo static-analysis correspondemao nome do projeto o hash do commit para aquela versatildeo a pasta onde o projeto estaacutearmazenado na maacutequina local a quantidade de linhas de coacutedigo Java do projeto e datareferente ao commit Essas informaccedilotildees satildeo pertinentes para que o projeto static-analysisconsiga funcionar de forma correta projeto este descrito em detalhes a seguir

431 static-analysis

O static-analysis foi um projeto desenvolvido anteriormente a este trabalho pelos alunosThiago Cavalcanti e Vinicius de Almeida cujo objetivo eacute realizar a anaacutelise estaacutetica de

26

coacutedigos-fonte Java e gerar arquivos de saiacuteda contendo informaccedilotildees de classes e meacutetodoscom suas devidas ocorrecircncias de caracteriacutesticas da linguagem [40]

A anaacutelise estaacutetica de coacutedigo consiste em analisar um coacutedigo-fonte sem a necessidadede executaacute-lo Esse tipo de anaacutelise eacute de extrema importacircncia para manter um coacutedigo dequalidade evitar futuras refatoraccedilotildees e obter informaccedilotildees estatiacutesticas de forma raacutepida epraacutetica [41]

Seguindo esse princiacutepio o static-analysis foi projetado para receber um arquivo deentrada csv seguindo o padratildeo

Tipo da Aplicaccedilatildeo Inicio do projeto Antes ou Apoacutes Java 5 Nome do ProjetoVersatildeo Caminho absolutoQuantidade de linhas de coacutedigo

Atraveacutes da informaccedilatildeo do caminho absoluto do projeto o static-analysis varre osdiretoacuterios em busca dos arquivos fonte java realiza o parse desses arquivos e utilizade Visitors para extrair as informaccedilotildees desejadas e exporta-las em arquivos csv Ouso de Visitors permite que sejam escolhidas as informaccedilotildees desejadas para a consultacomo expressotildees Lambda e AIC s aleacutem de possibilitar que sejam implementados novosVisitors conforme a linguagem evolua ou as necessidades mudem

Para este trabalho foram utilizados os Visitors de expressotildees Lambda map() filter()AICs e declaraccedilotildees de meacutetodos

432 BDAnalisador

Apoacutes obter todas as informaccedilotildees necessaacuterias geradas pelo static-analysis era preciso ma-nipular os dados de forma que facilitasse a coleta de dados para o estudo proposto Comovaacuterios arquivos em formato csv satildeo de difiacutecil manipulaccedilatildeo foi desenvolvido entatildeo umaferramenta chamada BDAnalisador Esta ferramenta eacute responsaacutevel por processar os arqui-vos em csv gerados pelo static-analysis e popular uma base de dados relacional MySQLcom as informaccedilotildees pertinentes a este estudo

O BDAnalisador foi desenvolvido com a intenccedilatildeo de tornar mais simples o trabalhocom os dados resultantes do static-analysis de forma que consultas em SQL pudessemser feitas a ponto de permitir a obtenccedilatildeo de resultados mais complexos Seguindo esseobjetivo o framework Hibernate foi escolhido como ferramenta para persistecircncia devidoa ser um framework jaacute consolidado no mercado e que de forma simples relaciona osobjetos Java ao banco de dados MySQL [42] A divisatildeo de classes foi projetada em quatroentidades Projeto Versao Classe e Metodo cada uma com seus respectivos camposcontendo as informaccedilotildees necessaacuterias para a pesquisa como pode ser visto na Figura 44Eacute importante ressaltar que a tabela de Versao guarda hashs de commits devido agrave escolhade utilizar commits para obter mais informaccedilatildeo de evoluccedilatildeo de coacutedigo em um menor

27

espaccedilo de tempo Aleacutem disso para este trabalho optou-se por persistir todos os meacutetodose classes de cada versatildeo sem se importar com a repeticcedilatildeo desses dados pois a hipoacutetesede haver grandes refatoraccedilotildees entre versotildees poderia comprometer a confiabilidade dasinformaccedilotildees

Figura 43 Diagrama de classes UML do BDAnalisador

Como visto na Figura 43 seguindo parcialmente a arquitetura MVC cada entidadepossui sua respectiva classe DAO(Data Access Object) para persistecircncia dos dados eapenas uma classe Controlador no projeto responsaacutevel pela manipulaccedilatildeo e parse dosdados dos arquivos csv gerados pelo static analysis para serem enviados agraves classes DAOO sistema inicia chamando o meacutetodo inicializar() da classe Controlador Esse meacutetodoeacute responsaacutevel por ler um arquivo de entrada csv que segue o mesmo modelo do arquivo dostatic-analysis citado na seccedilatildeo anterior O arquivo conteacutem os dados de todos os projetose suas respectivas versotildees dessa forma o meacutetodo instancia um objeto da classe Projetoe persiste o projeto no banco de dados Para cada versatildeo encontrada no arquivo deentrada o inicializar() aciona os meacutetodos responsaacuteveis por instanciar e preencher aslistas da classe Classe e Metodo Os meacutetodos responsaacuteveis por preencher as listas varremos arquivos csv gerados pelo static-analysis e fazem o parse das informaccedilotildees relevantescomo nomes dos meacutetodos e quantidades de lambdas para construir os objetos que seratildeogravados Ao final dos preenchimentos o objeto Versatildeo eacute instanciado e gravado no bancode dados atraveacutes de sua classe DAO ao mesmo tempo que grava suas respectivas Classese Metodos

28

Apoacutes vaacuterios testes e correccedilotildees de bugs o banco de dados se encontrava finalmente comas informaccedilotildees de 99 projetos Java open-source separados por um commit por mecircs desde2013 cada um com suas respectivas informaccedilotildees de classes meacutetodos e a quantidade deexpressotildees lambda filters e maps em cada meacutetodo Filter ou Filter pattern eacute o padratildeode projeto que tem como objetivo filtrar objetos de uma coleccedilatildeo (Collection) de acordocom algum criteacuterio Jaacute o map ou map pattern eacute um padratildeo que ldquomapeia os elementosde uma coleccedilatildeo aplicando uma funccedilatildeo a eles para uma nova coleccedilatildeo [43] A coleta deinformaccedilotildees sobre esses padrotildees podem ser uacuteteis para possiacuteveis anaacutelises de oportunidadesde uso de expressotildees lambda para refatoraccedilatildeo de coacutedigo

A Figura 44 mostra o esquema de como o banco de dados resultante foi gerado

Figura 44 Modelo relacional do banco de dados populado pelo BDAnalisador Imagemgerada com software DBeaver [2]

44 Classificaccedilatildeo e Anaacutelise

Com o banco de dados populado restam apenas as etapas de classificaccedilatildeo e anaacutelise pararesponder as questotildees de pesquisa propostas Para isso inicialmente houve uma tentativade se utilizar apenas queries SQL para analisar os dados de acordo com as informaccedilotildeesrelevantes Poreacutem devido ao fato de o banco de dados conter todas as informaccedilotildees detodos os projetos e todas as suas versotildees queries que possuem uma alta complexidadedemoravam muito tempo para retornar os dados

Assim com o objetivo de facilitar o trabalho alguns scripts python foram desenvolvi-dos para rodar as queries separadamente e individualmente para cada projeto de formaautomatizada a fim de melhorar o tempo de resposta para obtenccedilatildeo dos resultados

29

441 Meacutedia de Lambda

O primeiro script retorna a quantidade de expressotildees lambda (ou AICs) por n snapshotsque contenha expressotildees lambda O objetivo eacute ter uma visatildeo geral da meacutedia de expressotildeeslambda e AICs utilizadas por cada projeto e como nem todos os snapshots coletados decada projeto possuem expressotildees lambda e AICs apenas aqueles com alguma expressatildeolambda ou AIC satildeo incluiacutedos no caacutelculo da meacutedia

Mmedia =sumn qtdLambdai

n

442 Anaacutelise Temporal

O segundo script retorna para cada projeto a soma total da quantidade de expressotildeeslambda AIC map() e filter() no projeto inteiro para cada versatildeo Ou seja tem-seo total de cada uma das quatro propriedades selecionadas para cada mecircs do projetoobtendo assim uma visatildeo temporal de evoluccedilatildeo do uso das caracteriacutesticas descritas ATabela 41 ilustra parcialmente o resultado obtido para o projeto agera onde idVersaoeacute o identificador no banco de dados referente ao hash do commit mensal coletado qtd eacutea quantidade de cada uma das caracteriacutesticas escolhidas e a data do commit encontra-seno formato americano

Tabela 41 Informaccedilotildees mensais sobre o projeto ageraidVersao Data do Commit qtd lambda qtd AIC qtd maps qtd filter

823 512016 0 29 4 0755 612016 13 28 4 0686 6152016 13 29 4 0621 812016 13 29 4 0555 8162016 13 30 4 0485 922016 13 30 4 0422 10132016 14 30 4 0356 11282016 14 30 4 0295 12212016 21 30 5 0232 212017 21 30 5 0175 312017 21 30 5 0112 3312017 21 36 5 048 4242017 21 48 5 0

Os resultados obtidos com esta anaacutelise temporal permitiu a identificaccedilatildeo de padrotildees nautilizaccedilatildeo de expressotildees lambda em relaccedilatildeo a utilizaccedilatildeo de AIC por todos os projetos Foi

30

possiacutevel classificar todos os projetos em 6 grupos ilustrado na Figura 45 Primeiramenteseparou-se os projetos entre os que possuem expressotildees lambda e os que natildeo possuemDentre os que possuem identificou-se cinco categorias

1 Grupo 1 Quantidade de AICs e expressotildees lambda aumentam com o tempo pro-porcionalmente

2 Grupo 2 Quantidade de AICs diminui agrave medida que a quantidade de expressotildeeslambda aumentam e a quantidade de expressotildees lambda ultrapassa a quantidade deAIC em um determinado momento

3 Grupo 3 Quantidade de AICs diminui agrave medida que a quantidade de expressotildeeslambda aumentam mas a quantidade de AIC permanece superior agrave quantidade delambda

4 Grupo 4 Expressotildees lambda satildeo introduzidas e existem por um pequeno periacuteodode tempo mas satildeo completamente removidas posteriormente

5 Grupo 5 Quantidade de expressotildees lambda eacute constante e muito inferior compa-rado com a quantidade de AICs no projeto Foi determinado que para pertencera esta classificaccedilatildeo o projeto precisa ter uma razatildeo de meacutedia de expressotildees lamb-dasnapshot por meacutedia de AICsnapshot inferior a 020 Esse paracircmetro foi esta-belecido com o objetivo de definir um padratildeo para o que pode ser considerado umprojeto com poucas expressotildees lambda

Figura 45 Classificaccedilatildeo dos projetos

31

443 Refatoraccedilatildeo de Coacutedigo

O uacuteltimo script teve como objetivo realizar uma tentativa inicial de identificar refatoraccedilatildeode coacutedigo da seguinte maneira para todos os projetos que possuem expressotildees lambdaforam identificados o mecircs imediatamente antes da introduccedilatildeo de expressotildees lambda e omecircs seguinte onde houve a primeira ocorrecircncia de lambda no projeto Assim realizou-se uma anaacutelise do tamanho em quantidade de linhas de coacutedigo de todos os meacutetodosdo projeto que no mecircs seguinte tiveram introduccedilatildeo de lambda Em seguida fez-se umacomparaccedilatildeo com os mesmos meacutetodos em relaccedilatildeo ao mecircs anterior e assim foi possiacuteveldetectar quais meacutetodos tiveram a quantidade de linhas de coacutedigo reduzidas o que seriaum indicativo natildeo necessariamente exclusivo de que uma refatoraccedilatildeo de coacutedigo possa terocorrido

Sabe-se que este meacutetodo de detecccedilatildeo de refatoraccedilatildeo de coacutedigo possui suas limitaccedilotildeesuma vez que as comparaccedilotildees para saber se um meacutetodo existe em ambas versotildees eacute feitopuramente por comparaccedilatildeo de String (nome do meacutetodo) e a classe que este pertence

444 Casos de Uso

Os meacutetodos descritos acima ajudaram a identificar alguns padrotildees e facilitar a anaacutelise dosdados Poreacutem natildeo satildeo suficientes para que se possa responder agraves questotildees de pesquisaDessa forma apoacutes a identificaccedilatildeo dos grupos de classificaccedilatildeo para os projetos foramescolhidos um projeto de cada grupo (com exceccedilatildeo do grupo dos projetos sem expressotildeeslambda) para realizar um breve estudo de caso com o objetivo de identificar e caracterizarmelhor a adoccedilatildeo de expressotildees lambda Os projetos escolhidos foram agera vertxAndroid-CleanArchitecture RxJava e guava

32

Capiacutetulo 5

Resultados Obtidos e Anaacutelise

Neste capiacutetulo seratildeo apresentados os dados obtidos e anaacutelise com o objetivo de responderagraves questotildees de pesquisa propostas Como mencionado anteriormente as perguntas seratildeorespondidas de duas maneiras algumas com informaccedilotildees gerais sobre todos os projetose outras com breve estudos de caso envolvendo cinco projetos

51 Visatildeo Geral

Dentre os repositoacuterios coletados para a anaacutelise 74 (7474) natildeo utilizaram nenhumaexpressatildeo lambda no projeto durante todo o periacuteodo analisado (Janeiro de 2013 a Abrilde 2017) restando apenas 25 repositoacuterios (2525) com expressotildees lambda Eacute interessantedestacar que apesar de a quantidade de repositoacuterios que natildeo possuem expressotildees lambdaser relativamente expressiva muitos destes repositoacuterios satildeo de projetos em Java que umdia foram populares e atualmente natildeo estatildeo sendo mais desenvolvidos (por exemplo umaplicativo que soacute funciona para Android 23 atualmente descontinuado)

Levando em consideraccedilatildeo apenas os projetos que possuem expressotildees lambda exis-tem dois tipos de dados que podem ser analisados para responder agrave primeira questatildeo depesquisa atraveacutes dos dados obtidos pelo meacutetodo anteriormente mencionado como anaacutelisetemporal e a meacutedia de lambda por snapshot mencionados no capiacutetulo anterior

Com relaccedilatildeo ao ano em que a primeira ocorrecircncia foi encontrada 6 projetos introduzi-ram expressotildees lambda jaacute em 2014 8 comeccedilaram a utilizar em 2015 7 em 2016 e apenas4 tiveram a primeira ocorrecircncia de expressotildees lambda em 2017 Dessa forma percebe-seque os projetos estatildeo relativamente bem distribuiacutedos em grupos quanto ao ano em que seintroduziu expressotildees lambda

Pela meacutedia de lambda por snapshot (lambdasnapshot) a maioria (11 projetos) possuiuma quantidade expressiva acima de 100 lambdasnapshot (com 6 projetos entre 20 e 100lambdasnapshot e 8 projetos com menos de 20 lambdasnapshot) como apresentados no

33

graacutefico da Figura 51 Isso mostra que essa nova caracteriacutestica jaacute estaacute sendo bem utilizadanos projetos que comeccedilaram a migrar para a nova versatildeo do Java

Figura 51 Graacuteficos dos projetos separados por ano de introduccedilatildeo de expressotildees lambdae meacutedia de lambda por snapshot

Com isso pode-se observar que apesar de a quantidade de projetos que possuemexpressotildees lambda natildeo ser tatildeo alta eacute possiacutevel obter resultados expressivos uma vez quea quantidade dos projetos com lambda estatildeo bem dispersos quanto ao periacuteodo em quecomeccedilaram a adotar essa caracteriacutestica e a quantidade de expressotildees lambda por snapshot

511 Projetos Selecionados

Atraveacutes dos grupos de classificaccedilatildeo identificados pela anaacutelise temporal descritos na Figura45 cinco projetos foram selecionados para uma anaacutelise detalhada levando em consideraccedilatildeoo grupo em que eles pertencem Estes projetos seratildeo apresentados a seguir

512 agera

Agera eacute uma biblioteca Android que ajuda a introduzir programaccedilatildeo funcional reativa(functional reactive programming) em projetos Android Eacute um projeto recente lanccediladoem 2016 pela Google [44] e encontra-se no grupo dos projetos que introduziram expressotildeeslambda em 2016 no mesmo ano de seu lanccedilamento contendo uma meacutedia de expressotildeeslambda de 16 lambdasnapshot

Na classificaccedilatildeo estabelecida agera pertence ao Grupo 1 onde a quantidade de ex-pressotildees lambda no projeto com o tempo aumentam juntamente com a quantidade deAICs como mostra o graacutefico de anaacutelise temporal na Figura 52

34

Figura 52 Graacuteficos de anaacutelise temporal do projeto agera

513 vertx

Eclipse Vertx eacute um conjunto de ferramentas para criaccedilatildeo de reactive applications namaacutequina virtual Java (JVM) em grande escala [45] Seu primeiro lanccedilamento aconteceuem 2011 e a primeira ocorrecircncia de expressotildees lambda no projeto aconteceu em 2014 Esteprojeto possui uma meacutedia de 2867 lambdasnapshot e dentre os projetos consideradosneste trabalho eacute o que possui a maior quantidade de expressotildees lambda

Este projeto pertence ao Grupo 2 onde a quantidade de expressotildees lambda aumen-tou consideravelmente pelos meses ultrapassando a quantidade de AICs que diminuiudrasticamente como mostra a Figura 53

35

Figura 53 Graacuteficos de anaacutelise temporal do projeto Vertx

514 Android-CleanArchitecture

Apesar de ser uma amostra de projeto Android-CleanArchitecture que tem como objetivoconstruir aplicaccedilotildees Android utilizando clean architecture foi lanccedilado em 2014 mas semanteacutem sempre atualizado [46]

A introduccedilatildeo de expressotildees lambda que aconteceu no ano de 2015 se deu de formatiacutemida com uma meacutedia de 35 lambdasnapshot De qualquer forma este projeto conseguerepresentar com seu graacutefico de anaacutelise temporal o grupo 3 composto por projetos em quea quantidade de expressotildees lambda aumentou mas sem ultrapassar AICs que diminuiacuteramdemonstrado no graacutefico da Figura 54

36

Figura 54 Graacuteficos de anaacutelise temporal do projeto Android-CleanArchitecture

515 RxJava

Dentre os repositoacuterios estudados RxJava eacute considerado o mais popular Como umaimplementaccedilatildeo de Reactive Extensions para a JVM RxJava teve seu lanccedilamento dadoem 2013 [47] Expressotildees lambda apareceram pela primeira vez no ano de 2015 comuma meacutedia de 766 lambdasnapshot

Apesar de uma meacutedia relativamente alta o tempo de vida das expressotildees lambda nesteprojeto foi bem curto caracterizando assim projetos do grupo 4 houve a introduccedilatildeo dasexpressotildees lambda no projeto poreacutem houve a remoccedilatildeo completa de todas as expressotildeeslambda previamente introduzidas desaparecendo completamente do projeto ateacute a datada coleta de dados (Figura 55)

37

Figura 55 Graacuteficos de anaacutelise temporal do projeto RxJava

516 guava

Guava eacute um conjunto de bibliotecas para Java da Google lanccedilado em 2011 A atualizaccedilatildeodo coacutedigo do projeto para Java 8 aconteceu somente em 2016 e apesar do projeto conteruma meacutedia de 281 lambdasnapshot ele foi escolhido como representante dos projetosdo Grupo 5 (Figura 56) que possuem expressotildees lambda mas de forma natildeo expressiva osuficiente quando comparado com a quantidade de AIC pelo fato de sua razatildeo de meacutedia delambdasnapshot por meacutedia de AICsnapshot ser 004 Ou seja embora o projeto tenhaexpressotildees lambda estas satildeo consideradas muito poucas quando inseridas no contextogeral deste projeto que eacute considerado um projeto grande

38

Figura 56 Graacuteficos de anaacutelise temporal do projeto Guava

52 Refatoraccedilatildeo de Coacutedigo

Com o objetivo de caracterizar melhor como as expressotildees lambda estatildeo sendo utilizadaseacute interessante identificar se estas estatildeo sendo introduzidas atraveacutes de refatoraccedilatildeo de coacutedigoou em coacutedigo novo

Os projetos classificados como pertencentes ao Grupo 2 possuem em comum o fatode expressotildees lambda aumentarem a medida que AICs diminuem ultrapassando-as eessa caracteriacutestica em comum pode indicar que nestes projetos possivelmente houve re-fatoraccedilatildeo de coacutedigo visto que AIC sendo substituiacutedo por expressotildees lambda dentro dascondiccedilotildees determinadas eacute a maneira mais comum de se identificar refatoraccedilatildeo de coacute-digo para introduccedilatildeo de expressotildees lambda [12] Os projetos que compotildeem o grupo 2representam 44 de todos os projetos estudados que possuem expressotildees lambda o quepode ser um indicativo caso a hipoacutetese de refatoraccedilatildeo de coacutedigo seja positiva de quemuitos projetos que estatildeo adotando o Java 8 estatildeo se preocupando de alguma formacom refatoraccedilatildeo se coacutedigo Fazem parte desse grupo os seguintes projetos elasticsearchjava-design-patterns PocketHub presto RxJava-Android-Samples spark vertx zipkinjava8-tutorial dropwizard e material-dialogs

39

Outra maneira de verificar possiacuteveis indicadores de refatoraccedilatildeo de coacutedigo foi atraveacutesda anaacutelise dos tamanhos (em quantidade de linhas de coacutedigo) dos meacutetodos com expressotildeeslambda no mecircs em que se introduziu expressotildees lambda e um mecircs imediatamente antesdeste Essa anaacutelise mostra que dos 25 projetos com expressotildees lambda 12 (48) projetostiveram ao menos um meacutetodo em que houve uma diminuiccedilatildeo no tamanho o que podeser considerado um indicativo de refatoraccedilatildeo de coacutedigo A Figura 57 mostra todos osprojetos em relaccedilatildeo agrave quantidade total de meacutetodos que possuem lambda no primeiro mecircsde introduccedilatildeo do mesmo em vermelho comparado com a quantidade desses meacutetodos quetiveram uma diminuiccedilatildeo no tamanho quando comparados com o coacutedigo do mecircs anteriorem azul

Figura 57 Comparaccedilatildeo entre todos os projetos com expressatildeo lambda sobre refatoraccedilatildeode coacutedigo no mecircs de introduccedilatildeo da caracteriacutestica

Ainda observando a figura 57 com relaccedilatildeo aos projetos que natildeo tiveram nenhummeacutetodo com diminuiccedilatildeo de tamanho (barra azul) percebe-se que todos os 13 projetossequer tiveram uma quantidade significativa de meacutetodos que possuem expressotildees lambda(com o maior tendo apenas 5 meacutetodos) no mecircs de introduccedilatildeo da caracteriacutestica no projetoe ao mesmo tempo jaacute existiam no mecircs em que natildeo existia lambda no projeto Essa eacuteuma observaccedilatildeo importante porque projetos como vertx sendo este o que possui a maiormeacutedia de lambdasnapshot de todos os projetos e ao mesmo tempo tendo apenas trecircsmeacutetodos que continham expressotildees lambda no mecircs da introduccedilatildeo e que existiam no mecircs

40

anterior permitem inferir que todas as outras expressotildees lambda existentes no projetopara este determinado mecircs de introduccedilatildeo encontram-se em coacutedigo novo introduzido

Eacute importante ressaltar que somente essa anaacutelise natildeo eacute exclusivamente suficiente paradeterminar se estes projetos estatildeo realmente introduzindo lambda em coacutedigo novo ourealizando refatoraccedilatildeo uma vez que como a comparaccedilatildeo aconteceu apenas no mecircs deintroduccedilatildeo com o mecircs imediatamente anterior natildeo reflete todo o ciclo de vida do pro-jeto Por exemplo algumas equipes podem escolher refatorar o coacutedigo depois de umtempo de adaptaccedilatildeo apoacutes a transiccedilatildeo para a nova versatildeo da linguagem Assim paraobter uma melhor anaacutelise sobre refatoraccedilatildeo de coacutedigo ou natildeo feita nestes projetos aleacutemde outras anaacutelises referentes aos padrotildees tipicamente adotados para implementaccedilatildeo delambda nestes projetos seratildeo apresentados a seguir os estudos de caso dos cinco projetospreviamente selecionados

Outro ponto importante eacute o fato de que apesar das informaccedilotildees quanto agraves quantida-des de filter e map terem sido incluiacutedas inicialmente no trabalho para observar possiacuteveispadrotildees de refatoraccedilatildeo de coacutedigo percebeu-se que estas natildeo satildeo utilizadas de forma con-sideraacutevel pelos projetos estudados e para fins de anaacutelises generalizadas natildeo apresentaramtanta influecircncia na utilizaccedilatildeo de expressotildees lambda quanto a quantidade de AICs noprojeto

53 Estudos de Caso

Dentre os projetos analisados verificou-se que os projetos de pequeno e meacutedio porte op-taram por refatorar de uma vez seus coacutedigos para incluir expressotildees lambda em situaccedilotildeesem que se utilizava AICs anteriormente ou em alguns poucos casos de utilizaccedilatildeo deCollection Os projetos de grande porte natildeo apresentaram nenhuma refatoraccedilatildeo de coacute-digo ou uma refatoraccedilatildeo parcial gradativa provavelmente devido agrave grande quantidade dearquivos e coacutedigo que possuem o que pode tornar o trabalho de refatoraccedilatildeo extenso ecansativo

O projeto vertx que pertence ao grupo 2 dos projetos em que a quantidade de ex-pressotildees lambda aumentaram e as de AICs diminuiacuteram com lambda ultrapassando AICsexecutou inicialmente commits em maio de 2014 com adiccedilatildeo de coacutedigo novo utilizandoexpressotildees lambda e apoacutes um mecircs realizou um commit maior com a refatoraccedilatildeo de todasas AICs para expressotildees lambda Apoacutes a refatoraccedilatildeo o projeto se preocupou em mantera utilizaccedilatildeo de expressotildees lambda ao mesmo tempo que o uso de AICs se manteve apenasaos casos de classes com interfaces natildeo funcionais A Figura 58 apresenta uma parte docommit de refatoraccedilatildeo de coacutedigo que mostra em vermelho a parte eliminada do coacutedigo(AIC) e em verde o coacutedigo novo representando a substituiccedilatildeo por uma expressatildeo lambda

41

Figura 58 Commit de refatoraccedilatildeo de coacutedigo do projeto Vertx [3]

Alguns projetos ainda natildeo se preocuparam em refatorar o coacutedigo para o uso de ex-pressotildees lambda ateacute a data deste trabalho que eacute o caso do projeto guava que apresentouum commit em 03112016 com a atualizaccedilatildeo do projeto para Java 8 Mas a partir daatualizaccedilatildeo se preocupou em utilizar as expressotildees lambda apenas na implementaccedilatildeo decoacutedigo novo O cenaacuterio em que a refatoraccedilatildeo natildeo eacute prioridade ainda eacute a realidade de vaacuteriosprojetos de grande porte visto que os dados de projetos sem nenhuma expressatildeo lambdasatildeo o maior nuacutemero neste trabalho Poreacutem projetos que jaacute adotaram a utilizaccedilatildeo do Java8 tendem a mudar isso com o passar do tempo A Figura 59 apresenta em verde umaadiccedilatildeo de coacutedigo novo com expressatildeo lambda sem a eliminaccedilatildeo de algum coacutedigo anteriora esse que estaria em vermelho

42

Figura 59 Exemplo de um arquivo do commit de adiccedilatildeo de coacutedigo novo em Java 8 doprojeto Guava [4]

Na categoria de projetos em que os AICs e expressotildees lambda aumentam proporci-onalmente (grupo 1) o projeto agera realizou um commit em 19052016 com a adiccedilatildeoda biblioteca retrolambda como dependecircncia do projeto Essa biblioteca utilizada prin-cipalmente por projetos Android permite executar coacutedigo Java 8 contendo expressotildeeslambda em Java 5 6 e 7 [48] O commit tambeacutem apresenta refatoraccedilatildeo dos AICs ad-vindos de interfaces funcionais para expressotildees lambda Apesar de o projeto continuar autilizar as expressotildees lambda em seus commits posteriores o nuacutemero de AICs tambeacutemcontinuou a aumentar visualizando os commits posteriores notou-se que esses AICs satildeorelativos a interfaces natildeo funcionais ou seja que possuem mais de um meacutetodo O projetoAndroid-CleanArchitecture eacute similar ao agera pois tambeacutem optou pela instalaccedilatildeo da bi-blioteca retrolambda para uso de expressotildees lambda em seus coacutedigos e como tambeacutem eacuteum projeto de pequeno porte houve uma pequena refatoraccedilatildeo dos AICs A Figura 510mostra a parte do commit de refatoraccedilatildeo de coacutedigo em que o desenvolvedor adiciona abiblioteca retrolambda como dependecircncia

43

Figura 510 Commit de adiccedilatildeo da biblioteca Retrolambda no projeto Agera [5]

Outro caso interessante eacute o do projeto RxJava que em 2015 optou pela refatoraccedilatildeodo coacutedigo para a utilizaccedilatildeo de expressotildees lambda quase eliminando por completo o usode AICs mas que no ano seguinte reverteu os commits de forma que eliminasse comple-tamente o uso de expressotildees lambda para manter a retrocompatibilidade com o Java 6A Figura 511 demonstra uma parte do commit de reversatildeo do coacutedigo para Java 6 emque pode ser visto em vermelho o coacutedigo anterior com expressotildees lambda e o verde como novo coacutedigo utilizando AIC novamente

44

Figura 511 Commit de remoccedilatildeo de Lambdas e volta para o uso de AICs no projetoRXJava [6]

Essa preocupaccedilatildeo com retrocompatibilidade de coacutedigo pode ser um fator crucial nadecisatildeo das equipes de desenvolvimento na hora de decidir como fazer o software co-evoluircom a linguagem sem perder a compatibilidade com versotildees anteriores

45

Capiacutetulo 6

Consideraccedilotildees Finais

Este estudo permitiu entender melhor como projetos estatildeo realizando a migraccedilatildeo para oJava 8 em especial utilizando uma nova caracteriacutestica introduzida expressatildeo lambdaApesar de a maioria dos projetos populares considerados natildeo possuiacuterem nenhuma ocor-recircncia de expressotildees lambda os projetos que tinham expressotildees lambda foram suficientespara realizar um primeiro estudo de caracterizaccedilatildeo no uso desta caracteriacutestica e com osprojetos efetivamente utilizados para estudo foi possiacutevel agrupaacute-los quanto a maneira emque as expressotildees lambda estavam sendo utilizadas quando comparadas com AICs em 5grandes grupos quando AIC e lambda aumentam proporcionalmente quando AIC dimi-nui e lambda aumenta ultrapassando AIC quando AIC diminui mas continua superior aolambda crescente expressotildees lambda que foram introduzidas e retiradas completamentedo coacutedigo e expressotildees lambda que natildeo existem em quantidades expressivas

Foi possiacutevel entatildeo realizar um estudo aprofundado levando em consideraccedilatildeo as di-ferentes maneiras com que as expressotildees lambda foram adotadas nos projetos atraveacutes daescolha de um projeto que representasse cada grupo para anaacutelise Dentre os cinco projetosestudados foi possiacutevel observar alguns padrotildees tipicamente adotados por desenvolvedorespara implementar expressotildees lambda em seus projetos como a utilizaccedilatildeo da bibliotecas(retrolambda) que permitissem uma flexibilizaccedilatildeo na utilizaccedilatildeo de expressotildees lambda oucomo lambda eacute primariamente utilizada para substituir determinados AICs ou operaccedilotildeesem Collection

Aleacutem disso foi possiacutevel observar como a refatoraccedilatildeo de coacutedigo acontece em cada umdesses projetos Observou-se como projetos menores tendem a refatorar coacutedigo maisfacilmente ao passo que projetos maiores e mais complexos fazem menos refatoraccedilatildeo oudemoram mais entre o periacuteodo em que houve a primeira migraccedilatildeo de coacutedigo para a novaversatildeo da linguagem ateacute o periacuteodo em que realmente decidem refatorar coacutedigo Aleacutem dacomplexidade do projeto influenciar na decisatildeo de migrar o projeto para uma versatildeo maisrecente da linguagem a preocupaccedilatildeo com retrocompatibilidade com versotildees anteriores da

46

linguagem tambeacutem podem ser uma barreira para que projetos comecem a evoluir o coacutedigojuntamente com a evoluccedilatildeo da linguagem

Ainda assim foi possiacutevel observar que a preocupaccedilatildeo com a co-evoluccedilatildeo do software-linguagem existe entre os desenvolvedores de projetos mas a realizaccedilatildeo da migraccedilatildeo aindaacontece lentamente devido agrave diversos fatores que precisam ser levados em consideraccedilatildeopara a manutenccedilatildeo do projeto

Para trabalhos e contribuiccedilotildees futuras seria interessante desenvolver uma ferramentaque pudesse analisar diretamente no coacutedigo-fonte as oportunidades de aplicaccedilatildeo de ex-pressotildees lambda dessa forma poderiam ser analisadas as porcentagens de conversatildeo decoacutedigo para Java 8 e obter melhores conclusotildees sobre a importacircncia que os projetos estatildeodando para a evoluccedilatildeo de seus coacutedigos Outro fator interessante seria aplicar mais Visitorsagrave ferramenta static-analysis e fazer este mesmo estudo aplicado agrave outras caracteriacutesticasda linguagem

47

Referecircncias

[1] Kagdi Huzefa Michael L Collard e Jonathan I Maletic A survey and taxonomyof approaches for mining software repositories in the context of software evolution2007 ix 3 8 9 10 11

[2] DBeaver Dbeaver - features httpdbeaverjkissorgdocsfeatures ix 29

[3] Eclipse Vertx commit Java8-ify code httpsgithubcomeclipsevertxcommit93f95e9c77419f442a42fe711b6eeaef88192fd3 ix 42

[4] Google Guava commit Release java 8 changes to guava httpsgithubcomgoogleguavacommit73e382fa877f80994817a136b0adcc4365ccd904 ix 43

[5] Google Agera commit Collapsed testapp with retrolambda httpsgithubcomgoogleageracommit5e518b7b05f9e7a34a314945f68deff7b2c3e334 ix 44

[6] ReactiveX Rxjava commit 2x full jdk 6 compatible backport + includ-ing bugfixes up to today httpsgithubcomReactiveXRxJavacommit000a174d87a901135f9665d3b11f3627fd2dc4ed ix 45

[7] Godfrey M W e D M German The past present and future of software evolutionEm 2008 Frontiers of Maintenance paacuteginas 129ndash138 Sept 2008 1 6

[8] Favre J M Languages evolve too changing the software time scale Em Principles ofSoftware Evolution Eighth International Workshop on paacuteginas 33ndash42 IEEE 20051 5 7

[9] Overbey Jeffrey L e Ralph E Johnson Regrowing a language refactoring tools allowprogramming languages to evolve Em ACM SIGPLAN Notices volume 44 paacuteginas493ndash502 ACM 2009 1 5 7 8 12

[10] Grechanik Mark Collin McMillan Luca DeFerrari Marco Comi Stefano CrespiDenys Poshyvanyk Chen Fu Qing Xie e Carlo Ghezzi An empirical investiga-tion into a large-scale java open source code repository Em Proceedings of the2010 ACM-IEEE International Symposium on Empirical Software Engineering andMeasurement ESEM rsquo10 paacuteginas 111ndash1110 New York NY USA 2010 ACMISBN 978-1-4503-0039-1 httpdoiacmorg10114518527861852801 1

[11] TIOBE Tiobe httpswwwtiobecomtiobe-index 1 14

48

[12] Gyori Alex Lyle Franklin Danny Dig e Jan Lahoda Crossing the gap from im-perative to functional programming through refactoring Em Proceedings of the 20139th Joint Meeting on Foundations of Software Engineering ESECFSE 2013 paacute-ginas 543ndash553 New York NY USA 2013 ACM ISBN 978-1-4503-2237-9 httpdoiacmorg10114524914112491461 2 11 24 39

[13] OpenJDK State of the lambda httpcropenjdkjavanet~briangoetzlambdalambda-state-4html 2

[14] Han Jiawei Micheline Kamber e Jian Pei Data Mining Concepts and TechniquesMorgan Kaufmann Publishers Inc San Francisco CA USA 3rd ediccedilatildeo 2011ISBN 0123814790 9780123814791 3

[15] Fowler Martin e Kent Beck Refactoring improving the design of existing codeAddison-Wesley Professional 1999 5 7

[16] Lehman M M J F Ramil P D Wernick D E Perry e W M Turski Met-rics and laws of software evolution - the nineties view Em Proceedings of the4th International Symposium on Software Metrics METRICS rsquo97 paacuteginas 20ndashWashington DC USA 1997 IEEE Computer Society ISBN 0-8186-8093-8 httpdlacmorgcitationcfmid=823454823901 6

[17] Hassan Ahmed E e Tao Xie Software intelligence The future of mining softwareengineering data Em Proceedings of the FSESDP Workshop on Future of SoftwareEngineering Research FoSER rsquo10 paacuteginas 161ndash166 New York NY USA 2010ACM ISBN 978-1-4503-0427-6 httpdoiacmorg101145188236218823978 9

[18] Hassan Ahmed E The road ahead for mining software repositories Em Frontiers ofSoftware Maintenance 2008 FoSM 2008 paacuteginas 48ndash57 IEEE 2008 8

[19] Berry Michael J e Gordon Linoff Data Mining Techniques For Marketing Salesand Customer Support John Wiley amp Sons Inc New York NY USA 1997ISBN 0471179809 10

[20] Parnin Chris Christian Bird e Emerson Murphy-Hill Java generics adoption hownew features are introduced championed or ignored Em Proceedings of the 8thWorking Conference on Mining Software Repositories paacuteginas 3ndash12 ACM 2011 12

[21] Oracle The java language specification httpsdocsoraclecomjavasespecsjlsse8jls8pdf 13

[22] Oracle The history of java technology httpwwworaclecomtechnetworkjavajavaseoverviewjavahistory-index-198355html 13

[23] Murphy Kieron So why did they decide to call itjava httpwwwjavaworldcomarticle2077265core-javaso-why-did-they-decide-to-call-it-java-html 13

[24] McGraw Tata Object-oriented Programming with Java Essentials and ApplicationsHill Education 13

49

[25] Oracle Differences between java ee and java se httpdocsoraclecomjavaee6firstcupdocgkhoyhtml 13

[26] Lindsey Clark S The History of Java Cambridge 14

[27] Oracle The java language environment httpwwworaclecomtechnetworkjavaintro-141325html 14

[28] Oracle Jdk 8 httpopenjdkjavanetprojectsjdk8 15 24

[29] Oracle Enhancements in java se 8 httpdocsoraclecomjavase8docstechnotesguideslanguageenhancementshtmljavase8 15 16 17

[30] Oracle Lambda expressions httpdocsoraclecomjavasetutorialjavajavaOOlambdaexpressionshtml 16 18 21

[31] Oracle Method references httpdocsoraclecomjavasetutorialjavajavaOOmethodreferenceshtml 16

[32] Oracle Default methods httpdocsoraclecomjavasetutorialjavaIandIdefaultmethodshtml 17

[33] Oracle Repeating annotations httpdocsoraclecomjavasetutorialjavaannotationsrepeatinghtml 17

[34] Oracle Type annotations httpdocsoraclecomjavasetutorialjavaannotationstype_annotationshtml 17

[35] Oracle Anonymous inner classes httpsdocsoraclecomjavasetutorialjavajavaOOanonymousclasseshtml 19

[36] Kothari CR Research Methodology Methods and Techniques New Age Interna-tional (P) Limited 2004 ISBN 9788122415223 httpsbooksgooglecombrbooksid=8c6gkbKi-F4C 22

[37] Nakakoji Kumiyo Yasuhiro Yamamoto Yoshiyuki Nishinaka Kouichi Kishida eYunwen Ye Evolution patterns of open-source software systems and communitiesEm IWPSE rsquo02 Proceedings of the International Workshop on Principles of SoftwareEvolution paacuteginas 76ndash85 New York NY USA 2002 ACM Press ISBN 1581135459httpdxdoiorg101145512035512055 23

[38] Rahman Foyzur Christian Bird e Premkumar Devanbu Clones What is that smellEmpirical Software Engineering 17(4-5)503ndash530 2012 24

[39] Chacon Scott Pro Git Apress Berkely CA USA 1st ediccedilatildeo 2009ISBN 1430218339 9781430218333 25

[40] Cavalcanti Thiago Gomes e Viniacutecius Correa de Almeida Caracterizaccedilatildeo do uso deconstruccedilotildees da linguagem java em projetos open-source Publicaccedilatildeo online 2016httpbdmunbbrhandle1048315733 27

50

[41] Parr Terence Language Implementation Patterns Create Your Own Domain-Specific and General Programming Languages Pragmatic Bookshelf 1st ediccedilatildeo 2009ISBN 193435645X 9781934356456 27

[42] Janssen Thorben 5 reasons to use jpa hibernate Publicaccedilatildeo online httpswwwsitepointcom5-reasons-to-use-jpa-hibernate 27

[43] Franklin Lyle Alex Gyori Jan Lahoda e Danny Dig Lambdaficator From imperativeto functional programming through automated refactoring Em Proceedings of the2013 International Conference on Software Engineering ICSE rsquo13 paacuteginas 1287ndash1290 Piscataway NJ USA 2013 IEEE Press ISBN 978-1-4673-3076-3 httpdlacmorgcitationcfmid=24867882486986 29

[44] Google Agera httpsgithubcomgoogleagerawiki 34

[45] Eclipse Eclipse vertx httpvertxio 35

[46] Cejas Fernando Android cleanarchitecture httpsgithubcomandroid10Android-CleanArchitecture 36

[47] ReactiveX Rxjava httpsgithubcomReactiveXRxJava 37

[48] Luontola Esko Retrolambda httpsgithubcomorfjackalretrolambda 43

51

Anexo I

Projetos utilizados

fastjson

platform_frameworks_base

netty

material-dialogs

kotlin

okhttp

tinker

AndroidUtilCode

RxJava

spring-boot

java-design-patterns

elasticsearch

ExoPlayer

kafka

vertx

realm-java

guava

zipkin

bazel

stetho

Signal-Android

glide

agera

fresco

plaid

presto

libgdx

spark

52

disruptor

lottie-android

flexbox-layout

PocketHub

zxing

spring-framework

deeplearning4j

dropwizard

interviews

BaseRecyclerViewAdapterHelper

uCrop

DanmakuFlameMaster

lottie-react-native

android-UniversalMusicPlayer

AndroidInterview-Q-A

greenDAO

retrofit

MaterialDrawer

BottomBar

druid

MPAndroidChart

Hystrix

guice

recyclerview-animators

dubbo

androidannotations

RxJava-Android-Samples

PhotoView

clojure

CircleImageView

AndroidSwipeLayout

jedis

MaterialViewPager

butterknife

junit4

RxBinding

leakcanary

SimianArmy

picasso

UltimateRecyclerView

53

AndroidViewAnimations

AppIntro

FizzBuzzEnterpriseEdition

ion

cheesesquare

physical-web

RxAndroid

Android-CleanArchitecture

Calligraphy

Android-Bootstrap

iosched

Android_Data

MaterialDesignLibrary

ListViewAnimations

EventBus

java8-tutorial

AndroidSlidingUpPanel

dagger

okhttputils

logger

HomeMirror

Material-Animations

android-Ultra-Pull-To-Refresh

android-async-http

Android-ObservableScrollView

Android-Universal-Image-Loader

ActionBarSherlock

SlidingMenu

storm

PagerSlidingTabStrip

Android-PullToRefresh

54

  • Dedicatoacuteria
  • Agradecimentos
  • Resumo
  • Abstract
  • Introduccedilatildeo
    • Contexto
    • Objetivos
      • Objetivos Gerais
      • Objetivos Especiacuteficos
        • Metodologia
        • Organizaccedilatildeo do Trabalho
          • Evoluccedilatildeo e Mineraccedilatildeo de Repositoacuterios de Software
            • Evoluccedilatildeo de Software
            • MSR Mineraccedilatildeo de dados e a Engenharia de Software
              • Classificaccedilatildeo
                • Trabalhos Relacionados
                  • Java SE 8 e JDK 8
                    • Histoacuterico
                    • Princiacutepios
                    • Evoluccedilatildeo
                    • Expressotildees Lambda
                      • Sintaxe
                      • Principais formas de uso
                          • Estudo e o Processo de Mineraccedilatildeo
                            • Questotildees de Pesquisa
                            • Fonte de Dados e Objetos de Estudo
                            • Processo de Mineraccedilatildeo
                              • static-analysis
                              • BDAnalisador
                                • Classificaccedilatildeo e Anaacutelise
                                  • Meacutedia de Lambda
                                  • Anaacutelise Temporal
                                  • Refatoraccedilatildeo de Coacutedigo
                                  • Casos de Uso
                                      • Resultados Obtidos e Anaacutelise
                                        • Visatildeo Geral
                                          • Projetos Selecionados
                                          • agera
                                          • vertx
                                          • Android-CleanArchitecture
                                          • RxJava
                                          • guava
                                            • Refatoraccedilatildeo de Coacutedigo
                                            • Estudos de Caso
                                              • Consideraccedilotildees Finais
                                              • Referecircncias
                                              • Anexo
                                              • Projetos utilizados

34 Expressotildees Lambda

Uma das mudanccedilas mais interessantes implementadas no Java 8 foi a adiccedilatildeo de expressotildeeslambda As expressotildees lambda permitem que a linguagem Java possa atuar parcialmentecomo uma linguagem de programaccedilatildeo funcional onde comportamentos satildeo avaliados eaplicados diferentemente da programaccedilatildeo imperativa que foca na mudanccedila de estadosNa praacutetica um comportamento pode ser passado como paracircmetro de um meacutetodo atraveacutesde uma escrita mais reduzida e legiacutevel Os benefiacutecios de utilizar expressotildees lambda incluemuma melhora na legibilidade e organizaccedilatildeo de coacutedigo que antes era escrito com AnonymousInner Class aleacutem de permitir uma forma simples de utilizar comportamento paralelo como uso de Streams

341 Sintaxe

A sintaxe de uma expressatildeo lambda eacute dividida nas seguintes partes [30]

bull Uma lista de paracircmetros separados por viacutergulas

bull Um token representado por uma seta -gt

bull Um corpo que pode ser representado por uma expressatildeo uacutenica ou um bloco de coacutedigodentro de chaves

As Listagens 37 e 38 mostram duas formas diferentes de se aplicar expressotildees Lambdacom uma sintaxe similar A primeira aplica a expressatildeo diretamente apoacutes a seta utilizadanormalmente para trechos de coacutedigo pequenos e simples e a segunda utiliza-se de chavespara incorporar o coacutedigo e da palavra-chave return para especificar o retorno forma maisutilizada para uma quantidade maior de coacutedigo

1 p minusgt p getGender ( ) == Person Sex MALE2 ampamp p getAge ( ) gt= 183 ampamp p getAge ( ) lt= 25

Listagem 37 Exemplo de expressatildeo lambda com uma expressatildeo [30]

1 p minusgt 2 re turn p getGender ( ) == Person Sex MALE3 ampamp p getAge ( ) gt= 184 ampamp p getAge ( ) lt= 25 5

Listagem 38 Exemplo de expressatildeo lambda com um bloco de coacutedigo [30]

18

342 Principais formas de uso

Anonymous Inner Class

Antes do Java 8 a necessidade de passar funccedilotildees ou expressotildees como paracircmetro de algummeacutetodo era suprida atraveacutes de Anonymous Inner Classes A utilizaccedilatildeo desse tipo dedeclaraccedilatildeo junto com a anotaccedilatildeo de Override permite sobrescrever um meacutetodo de umainterface funcional e ao mesmo tempo passa-la como argumento para um meacutetodo Umaexpressatildeo lambda se comporta da mesma forma poreacutem a quantidade de coacutedigo escritopela Anonymous Inner Class eacute maior e pode dificultar a leitura de coacutedigo pois conteacutemmuita informaccedilatildeo natildeo utilizada para efetivo entendimento do que estaacute sendo feito naqueletrecho

A Listagem 39 apresenta a instanciaccedilatildeo da classe EventHandler internamente ao meacute-todo setOnAction() de forma que o desenvolvedor possa escrever o comportamento quedeseja passar como paracircmetro do meacutetodo atraveacutes da substituiccedilatildeo do meacutetodo handle()que jaacute existe pelo meacutetodo handle() criado e escrito pelo desenvolvedor

1 btn setOnAction (new EventHandlerltActionEvent gt() 2 Override3 pub l i c void handle ( ActionEvent event ) 4 System out p r i n t l n ( He l lo World ) 5 6 )

Listagem 39 Exemplo de uso de Anonymous Inner Class [35]

Interface funcional

Ao projetar um coacutedigo novo o desenvolvedor que optar por utilizar expressotildees lambdadeve iniciar com a criaccedilatildeo de uma interface funcional Esse tipo de interface possui umuacutenico meacutetodo abstrato permitindo que expressotildees lambda sejam usadas para sobrescrevero comportamento do meacutetodo abstrato Uma interface funcional pode possuir outros meacuteto-dos desde que sejam default Uma nova anotaccedilatildeo FunctionalInterface foi adicionadacom a atualizaccedilatildeo do Java 8 para conferir em tempo de compilaccedilatildeo se a interface satisfazos requisitos desse modelo de interface

A Listagem 310 apresenta um exemplo de interface funcional com o objetivo de permi-tir o uso de expressotildees lambda que utilizaratildeo de dois Double como paracircmetro e jaacute utilizada nova anotaccedilatildeo FunctionalInterface introduzida no Java 8

1 Funct iona l Inte r face2 pub l i c i n t e r f a c e DoubleOp 3 pub l i c Double apply ( Double a Double b)

19

4

Listagem 310 Exemplo de interface funcional

Dessa forma conforme as Listagens 311 e 312 o meacutetodo apply() pode tomar formade qualquer operaccedilatildeo entre dois Double que seraacute especificada quando a expressatildeo lambdafor montada dando o aspecto de linguagem funcional agrave linguagem e mais facilidade eliberdade ao desenvolvedor

1 pub l i c c l a s s Ca l cu la to r 2 pub l i c s t a t i c Double c a l c ( Double op1 Double op2 DoubleOp operator ) 3 re turn operator apply ( op1 op2 ) 4 5

Listagem 311 Exemplo de aplicaccedilatildeo da interface funcional

1 Double r e s u l t 1 = Ca lcu la to r c a l c (10d 50d ( a b ) minusgt a + b)

Listagem 312 Uso de expressatildeo lambda para o exemplo anterior

Collections

Dentre as atualizaccedilotildees de pacotes do Java 8 foi adicionado um meacutetodo stream() nainterface Collection Esse meacutetodo trata as Collection como streams o que significa queapesar de natildeo ser possiacutevel acessar elementos diretamente algumas novas manipulaccedilotildeessatildeo possiacuteveis Essas manipulaccedilotildees satildeo na verdade meacutetodos da interface Stream quepodem receber como paracircmetro uma expressatildeo lambda ou seja um comportamento a seraplicado agrave Collection Dentre os meacutetodos temos

bull filter() O meacutetodo filter() recebe uma expressatildeo lambda contendo uma condiccedilatildeopara filtragem da collection

bull map() O meacutetodo map() mapeia os elementos de uma Collection em outro objetocomo uma String A expressatildeo lambda passada por paracircmetro deve retornar o tipode objeto ao qual seraacute mapeado

bull forEach() O meacutetodo forEach() aplica uma operaccedilatildeo especiacutefica para cada ele-mento da Collection A expressatildeo lambda a ser passada deve conter a operaccedilatildeo aser realizada

bull min() e max() Os meacutetodos min() e max() retornam o elemento menor ou maiorda Collection dependendo da expressatildeo lambda passada como paracircmetro

20

A Listagem 313 demonstra como vaacuterias operaccedilotildees com uma Collection podem seraplicadas de uma vez de forma que lendo a expressatildeo lambda jaacute eacute possiacutevel saber oresultado da aplicaccedilatildeo do meacutetodo agrave Collection

1 r o s t e r2 stream ( )3 f i l t e r (4 p minusgt p getGender ( ) == Person Sex MALE5 ampamp p getAge ( ) gt= 186 ampamp p getAge ( ) lt= 25)7 map(p minusgt p getEmailAddress ( ) )8 forEach ( emai l minusgt System out p r i n t l n ( emai l ) )

Listagem 313 Exemplo de utilizaccedilatildeo de meacutetodos de stream com expressotildees lambda [30]

21

Capiacutetulo 4

Estudo e o Processo de Mineraccedilatildeo

A definiccedilatildeo da metodologia utilizada para realizaccedilatildeo deste trabalho eacute importante para queexista uma padronizaccedilatildeo e melhor entendimento de como os resultados foram obtidos paraque a replicaccedilatildeo do mesmo possa ser realizada em trabalhos futuros [36]

Figura 41 Processo utilizado para realizaccedilatildeo do estudo

O esquema representado na Figura 41 descreve o processo seguido para a realizaccedilatildeodeste trabalho que foi divido em trecircs grandes etapas a de planejamento definindo osobjetivos questotildees de pesquisa e meios de investigaccedilatildeo deste projeto a etapa de execuccedilatildeorealizando todo o procedimento metodoloacutegico definido para a coleta e refinamento de

22

dados e a etapa de avaliaccedilatildeo onde foram classificados e avaliados os dados coletadospara responder agraves questotildees de pesquisa

A seguir na primeira seccedilatildeo seratildeo apresentadas em detalhes as questotildees de pesquisa aserem respondidas Em seguida seraacute feito uma breve descriccedilatildeo da fonte de dados utilizada- especificamente os projetos utilizados como objetos de estudo deste trabalho e por fimtodo o restante da metodologia que foi de fato desenvolvida para obter os resultadosnecessaacuterios

41 Questotildees de Pesquisa

Com o objetivo de entender e caracterizar melhor o uso de expressotildees lambda foramdefinidas as seguintes questotildees de pesquisa a serem respondidas

bull PQ-1 Quando os projetos comeccedilaram a introduzir o uso de expressotildees lambda emseus coacutedigos e qual a meacutedia de expressotildees lambda por snapshots caso existam

bull PQ-2 Como as equipes de desenvolvimento estatildeo utilizando expressotildees lambdaatraveacutes de refatoraccedilatildeo de coacutedigo ou introduzindo apenas em coacutedigo novo

bull PQ-3 Quais satildeo os padrotildees tipicamente adotados para o uso de expressotildees lambda

A primeira pergunta de pesquisa gira em torno de como projetos populares open-sourceestatildeo se adaptando agrave introduccedilatildeo de expressotildees lambda em Java muitos projetos jaacute estatildeoutilizando as expressotildees lambda Se sim a partir de quando comeccedilaram a utilizaacute-lasdesde o iniacutecio da introduccedilatildeo das mesmas no Java 8 ou em um periacuteodo mais tardio Aleacutemdisso eacute interessante descobrir se a utilizaccedilatildeo dessa nova caracteriacutestica tem acontecido deforma expressiva ou natildeo

Em seguida para melhor entender a forma como as expressotildees lambda estatildeo sendointroduzidas em projetos eacute interessante investigar se as equipes de desenvolvimento estatildeose preocupando em refatorar coacutedigo com o objetivo de evoluir o software ou se estatildeoexperimentando utilizar expressotildees lambda apenas em coacutedigo novo introduzido

Como a introduccedilatildeo de novas funcionalidades em projetos open-source de grande escaladepende do objetivo do projeto e os padrotildees de projeto utilizados [37] espera-se obser-var diversas abordagens quanto a utilizaccedilatildeo de expressotildees lambda para entatildeo poderclassificar estes softwares quanto a abordagem utilizada

Eacute de grande importacircncia para este estudo conseguir identificar na praacutetica comoexpressotildees lambda estatildeo sendo tipicamente adotadas nestes projetos Assim a terceirapergunta de pesquisa busca identificar alguns exemplos de utilizaccedilatildeo atraveacutes da realizaccedilatildeode alguns estudos de caso

23

Eacute importante ressaltar que apesar de as expressotildees lambda serem uma alternativa aouso de AIC elas natildeo os substituem completamente Existem precondiccedilotildees para que umaAIC possa ser substituiacuteda por expressotildees lambda [12] descritas a seguir

bull AIC deve instanciar-se de uma interface

bull AIC natildeo deve possuir nenhum campo e declarar apenas um meacutetodo

bull AIC natildeo deve possuir uma referecircncia para this ou super

bull AIC natildeo deve declarar um meacutetodo recursivo

Para responder agrave primeira pergunta apenas dados gerais sobre todos os projetos seratildeonecessaacuterios ao passo que pelas perguntas 2 e 3 possuiacuterem uma natureza mais complexaseraacute necessaacuterio aleacutem de uma anaacutelise geral estatiacutestica a realizaccedilatildeo de alguns estudos decaso para obter resultados mais completos

42 Fonte de Dados e Objetos de Estudo

Para responder agraves perguntas de pesquisa estabelecidas foram selecionados os 99 projetosmais populares na linguagem Java dentro da plataforma github ateacute a data da coleta dosdados feita em Abril de 2017 Satildeo considerados populares os repositoacuterios que possuema maior quantidade possiacutevel de estrelas (stars) A decisatildeo de escolher os 99 projetos maispopulares foi por sua natureza imparcial e ao mesmo tempo para que se possa analisarprojetos que satildeo de familiaridade e conhecimento da comunidade do github e de domiacuteniopuacuteblico Os 99 projetos estatildeo listados no Anexo I

Para entender a transiccedilatildeo feita por esses projetos entre as versotildees anteriores do Java eo Java 8 com as expressotildees lambda eacute necessaacuterio analisar o coacutedigo de vaacuterias versotildees a fimde observar alguma mudanccedila para cada projeto Como satildeo 99 projetos e vaacuterios dessesprojetos possuem milhares de linhas de coacutedigo e commits seria impossiacutevel avaliar todosos commits Optou-se entatildeo por coletar snapshots mensais de cada projeto conformeprocedimento tambeacutem seguido anteriormente [38] Cada snapshots representa o estadodo projeto em um determinado mecircs e como criteacuterio de escolha padratildeo todos os snapshotsequivalem ao uacuteltimo commit realizado no determinado mecircs que este representa

O proacuteximo passo eacute determinar o periacuteodo de tempo em que esses snapshots seriamcoletados Como Java 8 (e consequentemente as expressotildees lambda) foi introduzidoapenas em meados de 2014 [28] coletar dados de projetos a partir de um periacuteodo muitoantes deste ano natildeo agregaria valor ao estudo em questatildeo Definiu-se entatildeo um periacuteodopara a coleta mensal desses snapshots atraveacutes dos anos Janeiro de 2013 um ano antesda introduccedilatildeo do Java 8 para que se pudesse identificar para todos os projetos o mecircs

24

exato em que expressotildees lambda foram introduzidas ateacute o mecircs da coleta de dados Abrilde 2017

Eacute importante ressaltar que a definiccedilatildeo dos meses foi definida do dia primeiro de ummecircs ao dia primeiro do proacuteximo mecircs e por consequecircncia alguns snapshots que deveriamrepresentar o final de determinado mecircs correspondem na verdade a commits realizadosno dia primeiro do mecircs seguinte Por exemplo pode existir casos em que o commit querepresente o mecircs de Marccedilo de 2016 seja na verdade o commit realizado no dia primeirode Abril de 2016 Isso se deve a natureza da forma como os resultados de log de commitssatildeo obtidos pelo git [39] Poreacutem isso natildeo interfere nas anaacutelises ou no propoacutesito destetrabalho uma vez que foram realizadas verificaccedilotildees e validaccedilotildees para que natildeo existamdatas repetidas (e consequentemente commits repetidos) por repositoacuterio

Neste trabalho o termo projeto e repositoacuterio foram utilizados de forma intercaladapara representar a mesma coisa o software desenvolvido que possui um repositoacuterio naplataforma github Os termos commit snapshops e versotildees tambeacutem representam a mesmacoisa uma vez que foi definido que seriam utilizados apenas um commit por mecircs pararepresentar um determinado snapshot ou versatildeo do repositoacuterio em questatildeo

Todos os 99 projetos seratildeo utilizados para a realizaccedilatildeo de uma anaacutelise geral de ca-racterizaccedilatildeo do uso de expressotildees lambda Para as anaacutelises aprofundadas foi feito umcriteacuterio de classificaccedilatildeo para que apenas alguns projetos possam ser analisados em niacutevelde coacutedigo como estudos de caso

Resumindo foram escolhidos os 99 projetos mais populares de Java no github cole-tando dados mensais de seus commits a partir do ano de 2013 ateacute a data da coleta dosdados lembrando que nem todos os projetos existem desde 2013 (projetos mais recentes)

43 Processo de Mineraccedilatildeo

A abordagem utilizada para coletar e analisar os 99 projetos escolhidos como mostra aFigura 42 foi realizada de forma automatizada utilizando scripts python e dois projetosdesenvolvidos em Java para a coleta e tratamento de dados como descrito a seguir

Primeiramente foi realizado uma coacutepia dos repositoacuterios atuais de todos os 99 projetosmais populares do github em Java Para automatizar o processo foi desenvolvido umscript em python que lista todos os projetos escolhidos clona todos os repositoacuterios emuma pasta na maacutequina local e cria um arquivo temporaacuterio com as informaccedilotildees do nomede cada repositoacuterio e seu caminho absoluto na maacutequina local

25

Figura 42 Metodologia implementada para coleta e tratamento de dados

Em seguida foi necessaacuterio realizar o checkout de todas as versotildees entre Janeiro de2013 a Abril de 2017 de cada projeto Por motivos de otimizaccedilatildeo de espaccedilo da maacutequinalocal e automatizaccedilatildeo no processo de checkout utilizou-se de um segundo script pythonque realizava as seguintes tarefas para cada mecircs em cada projeto verificar se dentreo mecircs estipulado houve algum commit para aquele projeto se sim pega-se o hash douacuteltimo commit do mecircs realiza o checkout conta-se a quantidade de linhas de coacutedigo emJava que o projeto tem utilizando a biblioteca cloc e armazena todas as informaccedilotildeespertinentes referentes a todos os projetos que naquele mecircs tiveram commits para que oprojeto static-analysis possa entatildeo ser executado sobre esses projetos naquele determinadomomento As informaccedilotildees coletadas que satildeo utilizadas pelo static-analysis correspondemao nome do projeto o hash do commit para aquela versatildeo a pasta onde o projeto estaacutearmazenado na maacutequina local a quantidade de linhas de coacutedigo Java do projeto e datareferente ao commit Essas informaccedilotildees satildeo pertinentes para que o projeto static-analysisconsiga funcionar de forma correta projeto este descrito em detalhes a seguir

431 static-analysis

O static-analysis foi um projeto desenvolvido anteriormente a este trabalho pelos alunosThiago Cavalcanti e Vinicius de Almeida cujo objetivo eacute realizar a anaacutelise estaacutetica de

26

coacutedigos-fonte Java e gerar arquivos de saiacuteda contendo informaccedilotildees de classes e meacutetodoscom suas devidas ocorrecircncias de caracteriacutesticas da linguagem [40]

A anaacutelise estaacutetica de coacutedigo consiste em analisar um coacutedigo-fonte sem a necessidadede executaacute-lo Esse tipo de anaacutelise eacute de extrema importacircncia para manter um coacutedigo dequalidade evitar futuras refatoraccedilotildees e obter informaccedilotildees estatiacutesticas de forma raacutepida epraacutetica [41]

Seguindo esse princiacutepio o static-analysis foi projetado para receber um arquivo deentrada csv seguindo o padratildeo

Tipo da Aplicaccedilatildeo Inicio do projeto Antes ou Apoacutes Java 5 Nome do ProjetoVersatildeo Caminho absolutoQuantidade de linhas de coacutedigo

Atraveacutes da informaccedilatildeo do caminho absoluto do projeto o static-analysis varre osdiretoacuterios em busca dos arquivos fonte java realiza o parse desses arquivos e utilizade Visitors para extrair as informaccedilotildees desejadas e exporta-las em arquivos csv Ouso de Visitors permite que sejam escolhidas as informaccedilotildees desejadas para a consultacomo expressotildees Lambda e AIC s aleacutem de possibilitar que sejam implementados novosVisitors conforme a linguagem evolua ou as necessidades mudem

Para este trabalho foram utilizados os Visitors de expressotildees Lambda map() filter()AICs e declaraccedilotildees de meacutetodos

432 BDAnalisador

Apoacutes obter todas as informaccedilotildees necessaacuterias geradas pelo static-analysis era preciso ma-nipular os dados de forma que facilitasse a coleta de dados para o estudo proposto Comovaacuterios arquivos em formato csv satildeo de difiacutecil manipulaccedilatildeo foi desenvolvido entatildeo umaferramenta chamada BDAnalisador Esta ferramenta eacute responsaacutevel por processar os arqui-vos em csv gerados pelo static-analysis e popular uma base de dados relacional MySQLcom as informaccedilotildees pertinentes a este estudo

O BDAnalisador foi desenvolvido com a intenccedilatildeo de tornar mais simples o trabalhocom os dados resultantes do static-analysis de forma que consultas em SQL pudessemser feitas a ponto de permitir a obtenccedilatildeo de resultados mais complexos Seguindo esseobjetivo o framework Hibernate foi escolhido como ferramenta para persistecircncia devidoa ser um framework jaacute consolidado no mercado e que de forma simples relaciona osobjetos Java ao banco de dados MySQL [42] A divisatildeo de classes foi projetada em quatroentidades Projeto Versao Classe e Metodo cada uma com seus respectivos camposcontendo as informaccedilotildees necessaacuterias para a pesquisa como pode ser visto na Figura 44Eacute importante ressaltar que a tabela de Versao guarda hashs de commits devido agrave escolhade utilizar commits para obter mais informaccedilatildeo de evoluccedilatildeo de coacutedigo em um menor

27

espaccedilo de tempo Aleacutem disso para este trabalho optou-se por persistir todos os meacutetodose classes de cada versatildeo sem se importar com a repeticcedilatildeo desses dados pois a hipoacutetesede haver grandes refatoraccedilotildees entre versotildees poderia comprometer a confiabilidade dasinformaccedilotildees

Figura 43 Diagrama de classes UML do BDAnalisador

Como visto na Figura 43 seguindo parcialmente a arquitetura MVC cada entidadepossui sua respectiva classe DAO(Data Access Object) para persistecircncia dos dados eapenas uma classe Controlador no projeto responsaacutevel pela manipulaccedilatildeo e parse dosdados dos arquivos csv gerados pelo static analysis para serem enviados agraves classes DAOO sistema inicia chamando o meacutetodo inicializar() da classe Controlador Esse meacutetodoeacute responsaacutevel por ler um arquivo de entrada csv que segue o mesmo modelo do arquivo dostatic-analysis citado na seccedilatildeo anterior O arquivo conteacutem os dados de todos os projetose suas respectivas versotildees dessa forma o meacutetodo instancia um objeto da classe Projetoe persiste o projeto no banco de dados Para cada versatildeo encontrada no arquivo deentrada o inicializar() aciona os meacutetodos responsaacuteveis por instanciar e preencher aslistas da classe Classe e Metodo Os meacutetodos responsaacuteveis por preencher as listas varremos arquivos csv gerados pelo static-analysis e fazem o parse das informaccedilotildees relevantescomo nomes dos meacutetodos e quantidades de lambdas para construir os objetos que seratildeogravados Ao final dos preenchimentos o objeto Versatildeo eacute instanciado e gravado no bancode dados atraveacutes de sua classe DAO ao mesmo tempo que grava suas respectivas Classese Metodos

28

Apoacutes vaacuterios testes e correccedilotildees de bugs o banco de dados se encontrava finalmente comas informaccedilotildees de 99 projetos Java open-source separados por um commit por mecircs desde2013 cada um com suas respectivas informaccedilotildees de classes meacutetodos e a quantidade deexpressotildees lambda filters e maps em cada meacutetodo Filter ou Filter pattern eacute o padratildeode projeto que tem como objetivo filtrar objetos de uma coleccedilatildeo (Collection) de acordocom algum criteacuterio Jaacute o map ou map pattern eacute um padratildeo que ldquomapeia os elementosde uma coleccedilatildeo aplicando uma funccedilatildeo a eles para uma nova coleccedilatildeo [43] A coleta deinformaccedilotildees sobre esses padrotildees podem ser uacuteteis para possiacuteveis anaacutelises de oportunidadesde uso de expressotildees lambda para refatoraccedilatildeo de coacutedigo

A Figura 44 mostra o esquema de como o banco de dados resultante foi gerado

Figura 44 Modelo relacional do banco de dados populado pelo BDAnalisador Imagemgerada com software DBeaver [2]

44 Classificaccedilatildeo e Anaacutelise

Com o banco de dados populado restam apenas as etapas de classificaccedilatildeo e anaacutelise pararesponder as questotildees de pesquisa propostas Para isso inicialmente houve uma tentativade se utilizar apenas queries SQL para analisar os dados de acordo com as informaccedilotildeesrelevantes Poreacutem devido ao fato de o banco de dados conter todas as informaccedilotildees detodos os projetos e todas as suas versotildees queries que possuem uma alta complexidadedemoravam muito tempo para retornar os dados

Assim com o objetivo de facilitar o trabalho alguns scripts python foram desenvolvi-dos para rodar as queries separadamente e individualmente para cada projeto de formaautomatizada a fim de melhorar o tempo de resposta para obtenccedilatildeo dos resultados

29

441 Meacutedia de Lambda

O primeiro script retorna a quantidade de expressotildees lambda (ou AICs) por n snapshotsque contenha expressotildees lambda O objetivo eacute ter uma visatildeo geral da meacutedia de expressotildeeslambda e AICs utilizadas por cada projeto e como nem todos os snapshots coletados decada projeto possuem expressotildees lambda e AICs apenas aqueles com alguma expressatildeolambda ou AIC satildeo incluiacutedos no caacutelculo da meacutedia

Mmedia =sumn qtdLambdai

n

442 Anaacutelise Temporal

O segundo script retorna para cada projeto a soma total da quantidade de expressotildeeslambda AIC map() e filter() no projeto inteiro para cada versatildeo Ou seja tem-seo total de cada uma das quatro propriedades selecionadas para cada mecircs do projetoobtendo assim uma visatildeo temporal de evoluccedilatildeo do uso das caracteriacutesticas descritas ATabela 41 ilustra parcialmente o resultado obtido para o projeto agera onde idVersaoeacute o identificador no banco de dados referente ao hash do commit mensal coletado qtd eacutea quantidade de cada uma das caracteriacutesticas escolhidas e a data do commit encontra-seno formato americano

Tabela 41 Informaccedilotildees mensais sobre o projeto ageraidVersao Data do Commit qtd lambda qtd AIC qtd maps qtd filter

823 512016 0 29 4 0755 612016 13 28 4 0686 6152016 13 29 4 0621 812016 13 29 4 0555 8162016 13 30 4 0485 922016 13 30 4 0422 10132016 14 30 4 0356 11282016 14 30 4 0295 12212016 21 30 5 0232 212017 21 30 5 0175 312017 21 30 5 0112 3312017 21 36 5 048 4242017 21 48 5 0

Os resultados obtidos com esta anaacutelise temporal permitiu a identificaccedilatildeo de padrotildees nautilizaccedilatildeo de expressotildees lambda em relaccedilatildeo a utilizaccedilatildeo de AIC por todos os projetos Foi

30

possiacutevel classificar todos os projetos em 6 grupos ilustrado na Figura 45 Primeiramenteseparou-se os projetos entre os que possuem expressotildees lambda e os que natildeo possuemDentre os que possuem identificou-se cinco categorias

1 Grupo 1 Quantidade de AICs e expressotildees lambda aumentam com o tempo pro-porcionalmente

2 Grupo 2 Quantidade de AICs diminui agrave medida que a quantidade de expressotildeeslambda aumentam e a quantidade de expressotildees lambda ultrapassa a quantidade deAIC em um determinado momento

3 Grupo 3 Quantidade de AICs diminui agrave medida que a quantidade de expressotildeeslambda aumentam mas a quantidade de AIC permanece superior agrave quantidade delambda

4 Grupo 4 Expressotildees lambda satildeo introduzidas e existem por um pequeno periacuteodode tempo mas satildeo completamente removidas posteriormente

5 Grupo 5 Quantidade de expressotildees lambda eacute constante e muito inferior compa-rado com a quantidade de AICs no projeto Foi determinado que para pertencera esta classificaccedilatildeo o projeto precisa ter uma razatildeo de meacutedia de expressotildees lamb-dasnapshot por meacutedia de AICsnapshot inferior a 020 Esse paracircmetro foi esta-belecido com o objetivo de definir um padratildeo para o que pode ser considerado umprojeto com poucas expressotildees lambda

Figura 45 Classificaccedilatildeo dos projetos

31

443 Refatoraccedilatildeo de Coacutedigo

O uacuteltimo script teve como objetivo realizar uma tentativa inicial de identificar refatoraccedilatildeode coacutedigo da seguinte maneira para todos os projetos que possuem expressotildees lambdaforam identificados o mecircs imediatamente antes da introduccedilatildeo de expressotildees lambda e omecircs seguinte onde houve a primeira ocorrecircncia de lambda no projeto Assim realizou-se uma anaacutelise do tamanho em quantidade de linhas de coacutedigo de todos os meacutetodosdo projeto que no mecircs seguinte tiveram introduccedilatildeo de lambda Em seguida fez-se umacomparaccedilatildeo com os mesmos meacutetodos em relaccedilatildeo ao mecircs anterior e assim foi possiacuteveldetectar quais meacutetodos tiveram a quantidade de linhas de coacutedigo reduzidas o que seriaum indicativo natildeo necessariamente exclusivo de que uma refatoraccedilatildeo de coacutedigo possa terocorrido

Sabe-se que este meacutetodo de detecccedilatildeo de refatoraccedilatildeo de coacutedigo possui suas limitaccedilotildeesuma vez que as comparaccedilotildees para saber se um meacutetodo existe em ambas versotildees eacute feitopuramente por comparaccedilatildeo de String (nome do meacutetodo) e a classe que este pertence

444 Casos de Uso

Os meacutetodos descritos acima ajudaram a identificar alguns padrotildees e facilitar a anaacutelise dosdados Poreacutem natildeo satildeo suficientes para que se possa responder agraves questotildees de pesquisaDessa forma apoacutes a identificaccedilatildeo dos grupos de classificaccedilatildeo para os projetos foramescolhidos um projeto de cada grupo (com exceccedilatildeo do grupo dos projetos sem expressotildeeslambda) para realizar um breve estudo de caso com o objetivo de identificar e caracterizarmelhor a adoccedilatildeo de expressotildees lambda Os projetos escolhidos foram agera vertxAndroid-CleanArchitecture RxJava e guava

32

Capiacutetulo 5

Resultados Obtidos e Anaacutelise

Neste capiacutetulo seratildeo apresentados os dados obtidos e anaacutelise com o objetivo de responderagraves questotildees de pesquisa propostas Como mencionado anteriormente as perguntas seratildeorespondidas de duas maneiras algumas com informaccedilotildees gerais sobre todos os projetose outras com breve estudos de caso envolvendo cinco projetos

51 Visatildeo Geral

Dentre os repositoacuterios coletados para a anaacutelise 74 (7474) natildeo utilizaram nenhumaexpressatildeo lambda no projeto durante todo o periacuteodo analisado (Janeiro de 2013 a Abrilde 2017) restando apenas 25 repositoacuterios (2525) com expressotildees lambda Eacute interessantedestacar que apesar de a quantidade de repositoacuterios que natildeo possuem expressotildees lambdaser relativamente expressiva muitos destes repositoacuterios satildeo de projetos em Java que umdia foram populares e atualmente natildeo estatildeo sendo mais desenvolvidos (por exemplo umaplicativo que soacute funciona para Android 23 atualmente descontinuado)

Levando em consideraccedilatildeo apenas os projetos que possuem expressotildees lambda exis-tem dois tipos de dados que podem ser analisados para responder agrave primeira questatildeo depesquisa atraveacutes dos dados obtidos pelo meacutetodo anteriormente mencionado como anaacutelisetemporal e a meacutedia de lambda por snapshot mencionados no capiacutetulo anterior

Com relaccedilatildeo ao ano em que a primeira ocorrecircncia foi encontrada 6 projetos introduzi-ram expressotildees lambda jaacute em 2014 8 comeccedilaram a utilizar em 2015 7 em 2016 e apenas4 tiveram a primeira ocorrecircncia de expressotildees lambda em 2017 Dessa forma percebe-seque os projetos estatildeo relativamente bem distribuiacutedos em grupos quanto ao ano em que seintroduziu expressotildees lambda

Pela meacutedia de lambda por snapshot (lambdasnapshot) a maioria (11 projetos) possuiuma quantidade expressiva acima de 100 lambdasnapshot (com 6 projetos entre 20 e 100lambdasnapshot e 8 projetos com menos de 20 lambdasnapshot) como apresentados no

33

graacutefico da Figura 51 Isso mostra que essa nova caracteriacutestica jaacute estaacute sendo bem utilizadanos projetos que comeccedilaram a migrar para a nova versatildeo do Java

Figura 51 Graacuteficos dos projetos separados por ano de introduccedilatildeo de expressotildees lambdae meacutedia de lambda por snapshot

Com isso pode-se observar que apesar de a quantidade de projetos que possuemexpressotildees lambda natildeo ser tatildeo alta eacute possiacutevel obter resultados expressivos uma vez quea quantidade dos projetos com lambda estatildeo bem dispersos quanto ao periacuteodo em quecomeccedilaram a adotar essa caracteriacutestica e a quantidade de expressotildees lambda por snapshot

511 Projetos Selecionados

Atraveacutes dos grupos de classificaccedilatildeo identificados pela anaacutelise temporal descritos na Figura45 cinco projetos foram selecionados para uma anaacutelise detalhada levando em consideraccedilatildeoo grupo em que eles pertencem Estes projetos seratildeo apresentados a seguir

512 agera

Agera eacute uma biblioteca Android que ajuda a introduzir programaccedilatildeo funcional reativa(functional reactive programming) em projetos Android Eacute um projeto recente lanccediladoem 2016 pela Google [44] e encontra-se no grupo dos projetos que introduziram expressotildeeslambda em 2016 no mesmo ano de seu lanccedilamento contendo uma meacutedia de expressotildeeslambda de 16 lambdasnapshot

Na classificaccedilatildeo estabelecida agera pertence ao Grupo 1 onde a quantidade de ex-pressotildees lambda no projeto com o tempo aumentam juntamente com a quantidade deAICs como mostra o graacutefico de anaacutelise temporal na Figura 52

34

Figura 52 Graacuteficos de anaacutelise temporal do projeto agera

513 vertx

Eclipse Vertx eacute um conjunto de ferramentas para criaccedilatildeo de reactive applications namaacutequina virtual Java (JVM) em grande escala [45] Seu primeiro lanccedilamento aconteceuem 2011 e a primeira ocorrecircncia de expressotildees lambda no projeto aconteceu em 2014 Esteprojeto possui uma meacutedia de 2867 lambdasnapshot e dentre os projetos consideradosneste trabalho eacute o que possui a maior quantidade de expressotildees lambda

Este projeto pertence ao Grupo 2 onde a quantidade de expressotildees lambda aumen-tou consideravelmente pelos meses ultrapassando a quantidade de AICs que diminuiudrasticamente como mostra a Figura 53

35

Figura 53 Graacuteficos de anaacutelise temporal do projeto Vertx

514 Android-CleanArchitecture

Apesar de ser uma amostra de projeto Android-CleanArchitecture que tem como objetivoconstruir aplicaccedilotildees Android utilizando clean architecture foi lanccedilado em 2014 mas semanteacutem sempre atualizado [46]

A introduccedilatildeo de expressotildees lambda que aconteceu no ano de 2015 se deu de formatiacutemida com uma meacutedia de 35 lambdasnapshot De qualquer forma este projeto conseguerepresentar com seu graacutefico de anaacutelise temporal o grupo 3 composto por projetos em quea quantidade de expressotildees lambda aumentou mas sem ultrapassar AICs que diminuiacuteramdemonstrado no graacutefico da Figura 54

36

Figura 54 Graacuteficos de anaacutelise temporal do projeto Android-CleanArchitecture

515 RxJava

Dentre os repositoacuterios estudados RxJava eacute considerado o mais popular Como umaimplementaccedilatildeo de Reactive Extensions para a JVM RxJava teve seu lanccedilamento dadoem 2013 [47] Expressotildees lambda apareceram pela primeira vez no ano de 2015 comuma meacutedia de 766 lambdasnapshot

Apesar de uma meacutedia relativamente alta o tempo de vida das expressotildees lambda nesteprojeto foi bem curto caracterizando assim projetos do grupo 4 houve a introduccedilatildeo dasexpressotildees lambda no projeto poreacutem houve a remoccedilatildeo completa de todas as expressotildeeslambda previamente introduzidas desaparecendo completamente do projeto ateacute a datada coleta de dados (Figura 55)

37

Figura 55 Graacuteficos de anaacutelise temporal do projeto RxJava

516 guava

Guava eacute um conjunto de bibliotecas para Java da Google lanccedilado em 2011 A atualizaccedilatildeodo coacutedigo do projeto para Java 8 aconteceu somente em 2016 e apesar do projeto conteruma meacutedia de 281 lambdasnapshot ele foi escolhido como representante dos projetosdo Grupo 5 (Figura 56) que possuem expressotildees lambda mas de forma natildeo expressiva osuficiente quando comparado com a quantidade de AIC pelo fato de sua razatildeo de meacutedia delambdasnapshot por meacutedia de AICsnapshot ser 004 Ou seja embora o projeto tenhaexpressotildees lambda estas satildeo consideradas muito poucas quando inseridas no contextogeral deste projeto que eacute considerado um projeto grande

38

Figura 56 Graacuteficos de anaacutelise temporal do projeto Guava

52 Refatoraccedilatildeo de Coacutedigo

Com o objetivo de caracterizar melhor como as expressotildees lambda estatildeo sendo utilizadaseacute interessante identificar se estas estatildeo sendo introduzidas atraveacutes de refatoraccedilatildeo de coacutedigoou em coacutedigo novo

Os projetos classificados como pertencentes ao Grupo 2 possuem em comum o fatode expressotildees lambda aumentarem a medida que AICs diminuem ultrapassando-as eessa caracteriacutestica em comum pode indicar que nestes projetos possivelmente houve re-fatoraccedilatildeo de coacutedigo visto que AIC sendo substituiacutedo por expressotildees lambda dentro dascondiccedilotildees determinadas eacute a maneira mais comum de se identificar refatoraccedilatildeo de coacute-digo para introduccedilatildeo de expressotildees lambda [12] Os projetos que compotildeem o grupo 2representam 44 de todos os projetos estudados que possuem expressotildees lambda o quepode ser um indicativo caso a hipoacutetese de refatoraccedilatildeo de coacutedigo seja positiva de quemuitos projetos que estatildeo adotando o Java 8 estatildeo se preocupando de alguma formacom refatoraccedilatildeo se coacutedigo Fazem parte desse grupo os seguintes projetos elasticsearchjava-design-patterns PocketHub presto RxJava-Android-Samples spark vertx zipkinjava8-tutorial dropwizard e material-dialogs

39

Outra maneira de verificar possiacuteveis indicadores de refatoraccedilatildeo de coacutedigo foi atraveacutesda anaacutelise dos tamanhos (em quantidade de linhas de coacutedigo) dos meacutetodos com expressotildeeslambda no mecircs em que se introduziu expressotildees lambda e um mecircs imediatamente antesdeste Essa anaacutelise mostra que dos 25 projetos com expressotildees lambda 12 (48) projetostiveram ao menos um meacutetodo em que houve uma diminuiccedilatildeo no tamanho o que podeser considerado um indicativo de refatoraccedilatildeo de coacutedigo A Figura 57 mostra todos osprojetos em relaccedilatildeo agrave quantidade total de meacutetodos que possuem lambda no primeiro mecircsde introduccedilatildeo do mesmo em vermelho comparado com a quantidade desses meacutetodos quetiveram uma diminuiccedilatildeo no tamanho quando comparados com o coacutedigo do mecircs anteriorem azul

Figura 57 Comparaccedilatildeo entre todos os projetos com expressatildeo lambda sobre refatoraccedilatildeode coacutedigo no mecircs de introduccedilatildeo da caracteriacutestica

Ainda observando a figura 57 com relaccedilatildeo aos projetos que natildeo tiveram nenhummeacutetodo com diminuiccedilatildeo de tamanho (barra azul) percebe-se que todos os 13 projetossequer tiveram uma quantidade significativa de meacutetodos que possuem expressotildees lambda(com o maior tendo apenas 5 meacutetodos) no mecircs de introduccedilatildeo da caracteriacutestica no projetoe ao mesmo tempo jaacute existiam no mecircs em que natildeo existia lambda no projeto Essa eacuteuma observaccedilatildeo importante porque projetos como vertx sendo este o que possui a maiormeacutedia de lambdasnapshot de todos os projetos e ao mesmo tempo tendo apenas trecircsmeacutetodos que continham expressotildees lambda no mecircs da introduccedilatildeo e que existiam no mecircs

40

anterior permitem inferir que todas as outras expressotildees lambda existentes no projetopara este determinado mecircs de introduccedilatildeo encontram-se em coacutedigo novo introduzido

Eacute importante ressaltar que somente essa anaacutelise natildeo eacute exclusivamente suficiente paradeterminar se estes projetos estatildeo realmente introduzindo lambda em coacutedigo novo ourealizando refatoraccedilatildeo uma vez que como a comparaccedilatildeo aconteceu apenas no mecircs deintroduccedilatildeo com o mecircs imediatamente anterior natildeo reflete todo o ciclo de vida do pro-jeto Por exemplo algumas equipes podem escolher refatorar o coacutedigo depois de umtempo de adaptaccedilatildeo apoacutes a transiccedilatildeo para a nova versatildeo da linguagem Assim paraobter uma melhor anaacutelise sobre refatoraccedilatildeo de coacutedigo ou natildeo feita nestes projetos aleacutemde outras anaacutelises referentes aos padrotildees tipicamente adotados para implementaccedilatildeo delambda nestes projetos seratildeo apresentados a seguir os estudos de caso dos cinco projetospreviamente selecionados

Outro ponto importante eacute o fato de que apesar das informaccedilotildees quanto agraves quantida-des de filter e map terem sido incluiacutedas inicialmente no trabalho para observar possiacuteveispadrotildees de refatoraccedilatildeo de coacutedigo percebeu-se que estas natildeo satildeo utilizadas de forma con-sideraacutevel pelos projetos estudados e para fins de anaacutelises generalizadas natildeo apresentaramtanta influecircncia na utilizaccedilatildeo de expressotildees lambda quanto a quantidade de AICs noprojeto

53 Estudos de Caso

Dentre os projetos analisados verificou-se que os projetos de pequeno e meacutedio porte op-taram por refatorar de uma vez seus coacutedigos para incluir expressotildees lambda em situaccedilotildeesem que se utilizava AICs anteriormente ou em alguns poucos casos de utilizaccedilatildeo deCollection Os projetos de grande porte natildeo apresentaram nenhuma refatoraccedilatildeo de coacute-digo ou uma refatoraccedilatildeo parcial gradativa provavelmente devido agrave grande quantidade dearquivos e coacutedigo que possuem o que pode tornar o trabalho de refatoraccedilatildeo extenso ecansativo

O projeto vertx que pertence ao grupo 2 dos projetos em que a quantidade de ex-pressotildees lambda aumentaram e as de AICs diminuiacuteram com lambda ultrapassando AICsexecutou inicialmente commits em maio de 2014 com adiccedilatildeo de coacutedigo novo utilizandoexpressotildees lambda e apoacutes um mecircs realizou um commit maior com a refatoraccedilatildeo de todasas AICs para expressotildees lambda Apoacutes a refatoraccedilatildeo o projeto se preocupou em mantera utilizaccedilatildeo de expressotildees lambda ao mesmo tempo que o uso de AICs se manteve apenasaos casos de classes com interfaces natildeo funcionais A Figura 58 apresenta uma parte docommit de refatoraccedilatildeo de coacutedigo que mostra em vermelho a parte eliminada do coacutedigo(AIC) e em verde o coacutedigo novo representando a substituiccedilatildeo por uma expressatildeo lambda

41

Figura 58 Commit de refatoraccedilatildeo de coacutedigo do projeto Vertx [3]

Alguns projetos ainda natildeo se preocuparam em refatorar o coacutedigo para o uso de ex-pressotildees lambda ateacute a data deste trabalho que eacute o caso do projeto guava que apresentouum commit em 03112016 com a atualizaccedilatildeo do projeto para Java 8 Mas a partir daatualizaccedilatildeo se preocupou em utilizar as expressotildees lambda apenas na implementaccedilatildeo decoacutedigo novo O cenaacuterio em que a refatoraccedilatildeo natildeo eacute prioridade ainda eacute a realidade de vaacuteriosprojetos de grande porte visto que os dados de projetos sem nenhuma expressatildeo lambdasatildeo o maior nuacutemero neste trabalho Poreacutem projetos que jaacute adotaram a utilizaccedilatildeo do Java8 tendem a mudar isso com o passar do tempo A Figura 59 apresenta em verde umaadiccedilatildeo de coacutedigo novo com expressatildeo lambda sem a eliminaccedilatildeo de algum coacutedigo anteriora esse que estaria em vermelho

42

Figura 59 Exemplo de um arquivo do commit de adiccedilatildeo de coacutedigo novo em Java 8 doprojeto Guava [4]

Na categoria de projetos em que os AICs e expressotildees lambda aumentam proporci-onalmente (grupo 1) o projeto agera realizou um commit em 19052016 com a adiccedilatildeoda biblioteca retrolambda como dependecircncia do projeto Essa biblioteca utilizada prin-cipalmente por projetos Android permite executar coacutedigo Java 8 contendo expressotildeeslambda em Java 5 6 e 7 [48] O commit tambeacutem apresenta refatoraccedilatildeo dos AICs ad-vindos de interfaces funcionais para expressotildees lambda Apesar de o projeto continuar autilizar as expressotildees lambda em seus commits posteriores o nuacutemero de AICs tambeacutemcontinuou a aumentar visualizando os commits posteriores notou-se que esses AICs satildeorelativos a interfaces natildeo funcionais ou seja que possuem mais de um meacutetodo O projetoAndroid-CleanArchitecture eacute similar ao agera pois tambeacutem optou pela instalaccedilatildeo da bi-blioteca retrolambda para uso de expressotildees lambda em seus coacutedigos e como tambeacutem eacuteum projeto de pequeno porte houve uma pequena refatoraccedilatildeo dos AICs A Figura 510mostra a parte do commit de refatoraccedilatildeo de coacutedigo em que o desenvolvedor adiciona abiblioteca retrolambda como dependecircncia

43

Figura 510 Commit de adiccedilatildeo da biblioteca Retrolambda no projeto Agera [5]

Outro caso interessante eacute o do projeto RxJava que em 2015 optou pela refatoraccedilatildeodo coacutedigo para a utilizaccedilatildeo de expressotildees lambda quase eliminando por completo o usode AICs mas que no ano seguinte reverteu os commits de forma que eliminasse comple-tamente o uso de expressotildees lambda para manter a retrocompatibilidade com o Java 6A Figura 511 demonstra uma parte do commit de reversatildeo do coacutedigo para Java 6 emque pode ser visto em vermelho o coacutedigo anterior com expressotildees lambda e o verde como novo coacutedigo utilizando AIC novamente

44

Figura 511 Commit de remoccedilatildeo de Lambdas e volta para o uso de AICs no projetoRXJava [6]

Essa preocupaccedilatildeo com retrocompatibilidade de coacutedigo pode ser um fator crucial nadecisatildeo das equipes de desenvolvimento na hora de decidir como fazer o software co-evoluircom a linguagem sem perder a compatibilidade com versotildees anteriores

45

Capiacutetulo 6

Consideraccedilotildees Finais

Este estudo permitiu entender melhor como projetos estatildeo realizando a migraccedilatildeo para oJava 8 em especial utilizando uma nova caracteriacutestica introduzida expressatildeo lambdaApesar de a maioria dos projetos populares considerados natildeo possuiacuterem nenhuma ocor-recircncia de expressotildees lambda os projetos que tinham expressotildees lambda foram suficientespara realizar um primeiro estudo de caracterizaccedilatildeo no uso desta caracteriacutestica e com osprojetos efetivamente utilizados para estudo foi possiacutevel agrupaacute-los quanto a maneira emque as expressotildees lambda estavam sendo utilizadas quando comparadas com AICs em 5grandes grupos quando AIC e lambda aumentam proporcionalmente quando AIC dimi-nui e lambda aumenta ultrapassando AIC quando AIC diminui mas continua superior aolambda crescente expressotildees lambda que foram introduzidas e retiradas completamentedo coacutedigo e expressotildees lambda que natildeo existem em quantidades expressivas

Foi possiacutevel entatildeo realizar um estudo aprofundado levando em consideraccedilatildeo as di-ferentes maneiras com que as expressotildees lambda foram adotadas nos projetos atraveacutes daescolha de um projeto que representasse cada grupo para anaacutelise Dentre os cinco projetosestudados foi possiacutevel observar alguns padrotildees tipicamente adotados por desenvolvedorespara implementar expressotildees lambda em seus projetos como a utilizaccedilatildeo da bibliotecas(retrolambda) que permitissem uma flexibilizaccedilatildeo na utilizaccedilatildeo de expressotildees lambda oucomo lambda eacute primariamente utilizada para substituir determinados AICs ou operaccedilotildeesem Collection

Aleacutem disso foi possiacutevel observar como a refatoraccedilatildeo de coacutedigo acontece em cada umdesses projetos Observou-se como projetos menores tendem a refatorar coacutedigo maisfacilmente ao passo que projetos maiores e mais complexos fazem menos refatoraccedilatildeo oudemoram mais entre o periacuteodo em que houve a primeira migraccedilatildeo de coacutedigo para a novaversatildeo da linguagem ateacute o periacuteodo em que realmente decidem refatorar coacutedigo Aleacutem dacomplexidade do projeto influenciar na decisatildeo de migrar o projeto para uma versatildeo maisrecente da linguagem a preocupaccedilatildeo com retrocompatibilidade com versotildees anteriores da

46

linguagem tambeacutem podem ser uma barreira para que projetos comecem a evoluir o coacutedigojuntamente com a evoluccedilatildeo da linguagem

Ainda assim foi possiacutevel observar que a preocupaccedilatildeo com a co-evoluccedilatildeo do software-linguagem existe entre os desenvolvedores de projetos mas a realizaccedilatildeo da migraccedilatildeo aindaacontece lentamente devido agrave diversos fatores que precisam ser levados em consideraccedilatildeopara a manutenccedilatildeo do projeto

Para trabalhos e contribuiccedilotildees futuras seria interessante desenvolver uma ferramentaque pudesse analisar diretamente no coacutedigo-fonte as oportunidades de aplicaccedilatildeo de ex-pressotildees lambda dessa forma poderiam ser analisadas as porcentagens de conversatildeo decoacutedigo para Java 8 e obter melhores conclusotildees sobre a importacircncia que os projetos estatildeodando para a evoluccedilatildeo de seus coacutedigos Outro fator interessante seria aplicar mais Visitorsagrave ferramenta static-analysis e fazer este mesmo estudo aplicado agrave outras caracteriacutesticasda linguagem

47

Referecircncias

[1] Kagdi Huzefa Michael L Collard e Jonathan I Maletic A survey and taxonomyof approaches for mining software repositories in the context of software evolution2007 ix 3 8 9 10 11

[2] DBeaver Dbeaver - features httpdbeaverjkissorgdocsfeatures ix 29

[3] Eclipse Vertx commit Java8-ify code httpsgithubcomeclipsevertxcommit93f95e9c77419f442a42fe711b6eeaef88192fd3 ix 42

[4] Google Guava commit Release java 8 changes to guava httpsgithubcomgoogleguavacommit73e382fa877f80994817a136b0adcc4365ccd904 ix 43

[5] Google Agera commit Collapsed testapp with retrolambda httpsgithubcomgoogleageracommit5e518b7b05f9e7a34a314945f68deff7b2c3e334 ix 44

[6] ReactiveX Rxjava commit 2x full jdk 6 compatible backport + includ-ing bugfixes up to today httpsgithubcomReactiveXRxJavacommit000a174d87a901135f9665d3b11f3627fd2dc4ed ix 45

[7] Godfrey M W e D M German The past present and future of software evolutionEm 2008 Frontiers of Maintenance paacuteginas 129ndash138 Sept 2008 1 6

[8] Favre J M Languages evolve too changing the software time scale Em Principles ofSoftware Evolution Eighth International Workshop on paacuteginas 33ndash42 IEEE 20051 5 7

[9] Overbey Jeffrey L e Ralph E Johnson Regrowing a language refactoring tools allowprogramming languages to evolve Em ACM SIGPLAN Notices volume 44 paacuteginas493ndash502 ACM 2009 1 5 7 8 12

[10] Grechanik Mark Collin McMillan Luca DeFerrari Marco Comi Stefano CrespiDenys Poshyvanyk Chen Fu Qing Xie e Carlo Ghezzi An empirical investiga-tion into a large-scale java open source code repository Em Proceedings of the2010 ACM-IEEE International Symposium on Empirical Software Engineering andMeasurement ESEM rsquo10 paacuteginas 111ndash1110 New York NY USA 2010 ACMISBN 978-1-4503-0039-1 httpdoiacmorg10114518527861852801 1

[11] TIOBE Tiobe httpswwwtiobecomtiobe-index 1 14

48

[12] Gyori Alex Lyle Franklin Danny Dig e Jan Lahoda Crossing the gap from im-perative to functional programming through refactoring Em Proceedings of the 20139th Joint Meeting on Foundations of Software Engineering ESECFSE 2013 paacute-ginas 543ndash553 New York NY USA 2013 ACM ISBN 978-1-4503-2237-9 httpdoiacmorg10114524914112491461 2 11 24 39

[13] OpenJDK State of the lambda httpcropenjdkjavanet~briangoetzlambdalambda-state-4html 2

[14] Han Jiawei Micheline Kamber e Jian Pei Data Mining Concepts and TechniquesMorgan Kaufmann Publishers Inc San Francisco CA USA 3rd ediccedilatildeo 2011ISBN 0123814790 9780123814791 3

[15] Fowler Martin e Kent Beck Refactoring improving the design of existing codeAddison-Wesley Professional 1999 5 7

[16] Lehman M M J F Ramil P D Wernick D E Perry e W M Turski Met-rics and laws of software evolution - the nineties view Em Proceedings of the4th International Symposium on Software Metrics METRICS rsquo97 paacuteginas 20ndashWashington DC USA 1997 IEEE Computer Society ISBN 0-8186-8093-8 httpdlacmorgcitationcfmid=823454823901 6

[17] Hassan Ahmed E e Tao Xie Software intelligence The future of mining softwareengineering data Em Proceedings of the FSESDP Workshop on Future of SoftwareEngineering Research FoSER rsquo10 paacuteginas 161ndash166 New York NY USA 2010ACM ISBN 978-1-4503-0427-6 httpdoiacmorg101145188236218823978 9

[18] Hassan Ahmed E The road ahead for mining software repositories Em Frontiers ofSoftware Maintenance 2008 FoSM 2008 paacuteginas 48ndash57 IEEE 2008 8

[19] Berry Michael J e Gordon Linoff Data Mining Techniques For Marketing Salesand Customer Support John Wiley amp Sons Inc New York NY USA 1997ISBN 0471179809 10

[20] Parnin Chris Christian Bird e Emerson Murphy-Hill Java generics adoption hownew features are introduced championed or ignored Em Proceedings of the 8thWorking Conference on Mining Software Repositories paacuteginas 3ndash12 ACM 2011 12

[21] Oracle The java language specification httpsdocsoraclecomjavasespecsjlsse8jls8pdf 13

[22] Oracle The history of java technology httpwwworaclecomtechnetworkjavajavaseoverviewjavahistory-index-198355html 13

[23] Murphy Kieron So why did they decide to call itjava httpwwwjavaworldcomarticle2077265core-javaso-why-did-they-decide-to-call-it-java-html 13

[24] McGraw Tata Object-oriented Programming with Java Essentials and ApplicationsHill Education 13

49

[25] Oracle Differences between java ee and java se httpdocsoraclecomjavaee6firstcupdocgkhoyhtml 13

[26] Lindsey Clark S The History of Java Cambridge 14

[27] Oracle The java language environment httpwwworaclecomtechnetworkjavaintro-141325html 14

[28] Oracle Jdk 8 httpopenjdkjavanetprojectsjdk8 15 24

[29] Oracle Enhancements in java se 8 httpdocsoraclecomjavase8docstechnotesguideslanguageenhancementshtmljavase8 15 16 17

[30] Oracle Lambda expressions httpdocsoraclecomjavasetutorialjavajavaOOlambdaexpressionshtml 16 18 21

[31] Oracle Method references httpdocsoraclecomjavasetutorialjavajavaOOmethodreferenceshtml 16

[32] Oracle Default methods httpdocsoraclecomjavasetutorialjavaIandIdefaultmethodshtml 17

[33] Oracle Repeating annotations httpdocsoraclecomjavasetutorialjavaannotationsrepeatinghtml 17

[34] Oracle Type annotations httpdocsoraclecomjavasetutorialjavaannotationstype_annotationshtml 17

[35] Oracle Anonymous inner classes httpsdocsoraclecomjavasetutorialjavajavaOOanonymousclasseshtml 19

[36] Kothari CR Research Methodology Methods and Techniques New Age Interna-tional (P) Limited 2004 ISBN 9788122415223 httpsbooksgooglecombrbooksid=8c6gkbKi-F4C 22

[37] Nakakoji Kumiyo Yasuhiro Yamamoto Yoshiyuki Nishinaka Kouichi Kishida eYunwen Ye Evolution patterns of open-source software systems and communitiesEm IWPSE rsquo02 Proceedings of the International Workshop on Principles of SoftwareEvolution paacuteginas 76ndash85 New York NY USA 2002 ACM Press ISBN 1581135459httpdxdoiorg101145512035512055 23

[38] Rahman Foyzur Christian Bird e Premkumar Devanbu Clones What is that smellEmpirical Software Engineering 17(4-5)503ndash530 2012 24

[39] Chacon Scott Pro Git Apress Berkely CA USA 1st ediccedilatildeo 2009ISBN 1430218339 9781430218333 25

[40] Cavalcanti Thiago Gomes e Viniacutecius Correa de Almeida Caracterizaccedilatildeo do uso deconstruccedilotildees da linguagem java em projetos open-source Publicaccedilatildeo online 2016httpbdmunbbrhandle1048315733 27

50

[41] Parr Terence Language Implementation Patterns Create Your Own Domain-Specific and General Programming Languages Pragmatic Bookshelf 1st ediccedilatildeo 2009ISBN 193435645X 9781934356456 27

[42] Janssen Thorben 5 reasons to use jpa hibernate Publicaccedilatildeo online httpswwwsitepointcom5-reasons-to-use-jpa-hibernate 27

[43] Franklin Lyle Alex Gyori Jan Lahoda e Danny Dig Lambdaficator From imperativeto functional programming through automated refactoring Em Proceedings of the2013 International Conference on Software Engineering ICSE rsquo13 paacuteginas 1287ndash1290 Piscataway NJ USA 2013 IEEE Press ISBN 978-1-4673-3076-3 httpdlacmorgcitationcfmid=24867882486986 29

[44] Google Agera httpsgithubcomgoogleagerawiki 34

[45] Eclipse Eclipse vertx httpvertxio 35

[46] Cejas Fernando Android cleanarchitecture httpsgithubcomandroid10Android-CleanArchitecture 36

[47] ReactiveX Rxjava httpsgithubcomReactiveXRxJava 37

[48] Luontola Esko Retrolambda httpsgithubcomorfjackalretrolambda 43

51

Anexo I

Projetos utilizados

fastjson

platform_frameworks_base

netty

material-dialogs

kotlin

okhttp

tinker

AndroidUtilCode

RxJava

spring-boot

java-design-patterns

elasticsearch

ExoPlayer

kafka

vertx

realm-java

guava

zipkin

bazel

stetho

Signal-Android

glide

agera

fresco

plaid

presto

libgdx

spark

52

disruptor

lottie-android

flexbox-layout

PocketHub

zxing

spring-framework

deeplearning4j

dropwizard

interviews

BaseRecyclerViewAdapterHelper

uCrop

DanmakuFlameMaster

lottie-react-native

android-UniversalMusicPlayer

AndroidInterview-Q-A

greenDAO

retrofit

MaterialDrawer

BottomBar

druid

MPAndroidChart

Hystrix

guice

recyclerview-animators

dubbo

androidannotations

RxJava-Android-Samples

PhotoView

clojure

CircleImageView

AndroidSwipeLayout

jedis

MaterialViewPager

butterknife

junit4

RxBinding

leakcanary

SimianArmy

picasso

UltimateRecyclerView

53

AndroidViewAnimations

AppIntro

FizzBuzzEnterpriseEdition

ion

cheesesquare

physical-web

RxAndroid

Android-CleanArchitecture

Calligraphy

Android-Bootstrap

iosched

Android_Data

MaterialDesignLibrary

ListViewAnimations

EventBus

java8-tutorial

AndroidSlidingUpPanel

dagger

okhttputils

logger

HomeMirror

Material-Animations

android-Ultra-Pull-To-Refresh

android-async-http

Android-ObservableScrollView

Android-Universal-Image-Loader

ActionBarSherlock

SlidingMenu

storm

PagerSlidingTabStrip

Android-PullToRefresh

54

  • Dedicatoacuteria
  • Agradecimentos
  • Resumo
  • Abstract
  • Introduccedilatildeo
    • Contexto
    • Objetivos
      • Objetivos Gerais
      • Objetivos Especiacuteficos
        • Metodologia
        • Organizaccedilatildeo do Trabalho
          • Evoluccedilatildeo e Mineraccedilatildeo de Repositoacuterios de Software
            • Evoluccedilatildeo de Software
            • MSR Mineraccedilatildeo de dados e a Engenharia de Software
              • Classificaccedilatildeo
                • Trabalhos Relacionados
                  • Java SE 8 e JDK 8
                    • Histoacuterico
                    • Princiacutepios
                    • Evoluccedilatildeo
                    • Expressotildees Lambda
                      • Sintaxe
                      • Principais formas de uso
                          • Estudo e o Processo de Mineraccedilatildeo
                            • Questotildees de Pesquisa
                            • Fonte de Dados e Objetos de Estudo
                            • Processo de Mineraccedilatildeo
                              • static-analysis
                              • BDAnalisador
                                • Classificaccedilatildeo e Anaacutelise
                                  • Meacutedia de Lambda
                                  • Anaacutelise Temporal
                                  • Refatoraccedilatildeo de Coacutedigo
                                  • Casos de Uso
                                      • Resultados Obtidos e Anaacutelise
                                        • Visatildeo Geral
                                          • Projetos Selecionados
                                          • agera
                                          • vertx
                                          • Android-CleanArchitecture
                                          • RxJava
                                          • guava
                                            • Refatoraccedilatildeo de Coacutedigo
                                            • Estudos de Caso
                                              • Consideraccedilotildees Finais
                                              • Referecircncias
                                              • Anexo
                                              • Projetos utilizados

342 Principais formas de uso

Anonymous Inner Class

Antes do Java 8 a necessidade de passar funccedilotildees ou expressotildees como paracircmetro de algummeacutetodo era suprida atraveacutes de Anonymous Inner Classes A utilizaccedilatildeo desse tipo dedeclaraccedilatildeo junto com a anotaccedilatildeo de Override permite sobrescrever um meacutetodo de umainterface funcional e ao mesmo tempo passa-la como argumento para um meacutetodo Umaexpressatildeo lambda se comporta da mesma forma poreacutem a quantidade de coacutedigo escritopela Anonymous Inner Class eacute maior e pode dificultar a leitura de coacutedigo pois conteacutemmuita informaccedilatildeo natildeo utilizada para efetivo entendimento do que estaacute sendo feito naqueletrecho

A Listagem 39 apresenta a instanciaccedilatildeo da classe EventHandler internamente ao meacute-todo setOnAction() de forma que o desenvolvedor possa escrever o comportamento quedeseja passar como paracircmetro do meacutetodo atraveacutes da substituiccedilatildeo do meacutetodo handle()que jaacute existe pelo meacutetodo handle() criado e escrito pelo desenvolvedor

1 btn setOnAction (new EventHandlerltActionEvent gt() 2 Override3 pub l i c void handle ( ActionEvent event ) 4 System out p r i n t l n ( He l lo World ) 5 6 )

Listagem 39 Exemplo de uso de Anonymous Inner Class [35]

Interface funcional

Ao projetar um coacutedigo novo o desenvolvedor que optar por utilizar expressotildees lambdadeve iniciar com a criaccedilatildeo de uma interface funcional Esse tipo de interface possui umuacutenico meacutetodo abstrato permitindo que expressotildees lambda sejam usadas para sobrescrevero comportamento do meacutetodo abstrato Uma interface funcional pode possuir outros meacuteto-dos desde que sejam default Uma nova anotaccedilatildeo FunctionalInterface foi adicionadacom a atualizaccedilatildeo do Java 8 para conferir em tempo de compilaccedilatildeo se a interface satisfazos requisitos desse modelo de interface

A Listagem 310 apresenta um exemplo de interface funcional com o objetivo de permi-tir o uso de expressotildees lambda que utilizaratildeo de dois Double como paracircmetro e jaacute utilizada nova anotaccedilatildeo FunctionalInterface introduzida no Java 8

1 Funct iona l Inte r face2 pub l i c i n t e r f a c e DoubleOp 3 pub l i c Double apply ( Double a Double b)

19

4

Listagem 310 Exemplo de interface funcional

Dessa forma conforme as Listagens 311 e 312 o meacutetodo apply() pode tomar formade qualquer operaccedilatildeo entre dois Double que seraacute especificada quando a expressatildeo lambdafor montada dando o aspecto de linguagem funcional agrave linguagem e mais facilidade eliberdade ao desenvolvedor

1 pub l i c c l a s s Ca l cu la to r 2 pub l i c s t a t i c Double c a l c ( Double op1 Double op2 DoubleOp operator ) 3 re turn operator apply ( op1 op2 ) 4 5

Listagem 311 Exemplo de aplicaccedilatildeo da interface funcional

1 Double r e s u l t 1 = Ca lcu la to r c a l c (10d 50d ( a b ) minusgt a + b)

Listagem 312 Uso de expressatildeo lambda para o exemplo anterior

Collections

Dentre as atualizaccedilotildees de pacotes do Java 8 foi adicionado um meacutetodo stream() nainterface Collection Esse meacutetodo trata as Collection como streams o que significa queapesar de natildeo ser possiacutevel acessar elementos diretamente algumas novas manipulaccedilotildeessatildeo possiacuteveis Essas manipulaccedilotildees satildeo na verdade meacutetodos da interface Stream quepodem receber como paracircmetro uma expressatildeo lambda ou seja um comportamento a seraplicado agrave Collection Dentre os meacutetodos temos

bull filter() O meacutetodo filter() recebe uma expressatildeo lambda contendo uma condiccedilatildeopara filtragem da collection

bull map() O meacutetodo map() mapeia os elementos de uma Collection em outro objetocomo uma String A expressatildeo lambda passada por paracircmetro deve retornar o tipode objeto ao qual seraacute mapeado

bull forEach() O meacutetodo forEach() aplica uma operaccedilatildeo especiacutefica para cada ele-mento da Collection A expressatildeo lambda a ser passada deve conter a operaccedilatildeo aser realizada

bull min() e max() Os meacutetodos min() e max() retornam o elemento menor ou maiorda Collection dependendo da expressatildeo lambda passada como paracircmetro

20

A Listagem 313 demonstra como vaacuterias operaccedilotildees com uma Collection podem seraplicadas de uma vez de forma que lendo a expressatildeo lambda jaacute eacute possiacutevel saber oresultado da aplicaccedilatildeo do meacutetodo agrave Collection

1 r o s t e r2 stream ( )3 f i l t e r (4 p minusgt p getGender ( ) == Person Sex MALE5 ampamp p getAge ( ) gt= 186 ampamp p getAge ( ) lt= 25)7 map(p minusgt p getEmailAddress ( ) )8 forEach ( emai l minusgt System out p r i n t l n ( emai l ) )

Listagem 313 Exemplo de utilizaccedilatildeo de meacutetodos de stream com expressotildees lambda [30]

21

Capiacutetulo 4

Estudo e o Processo de Mineraccedilatildeo

A definiccedilatildeo da metodologia utilizada para realizaccedilatildeo deste trabalho eacute importante para queexista uma padronizaccedilatildeo e melhor entendimento de como os resultados foram obtidos paraque a replicaccedilatildeo do mesmo possa ser realizada em trabalhos futuros [36]

Figura 41 Processo utilizado para realizaccedilatildeo do estudo

O esquema representado na Figura 41 descreve o processo seguido para a realizaccedilatildeodeste trabalho que foi divido em trecircs grandes etapas a de planejamento definindo osobjetivos questotildees de pesquisa e meios de investigaccedilatildeo deste projeto a etapa de execuccedilatildeorealizando todo o procedimento metodoloacutegico definido para a coleta e refinamento de

22

dados e a etapa de avaliaccedilatildeo onde foram classificados e avaliados os dados coletadospara responder agraves questotildees de pesquisa

A seguir na primeira seccedilatildeo seratildeo apresentadas em detalhes as questotildees de pesquisa aserem respondidas Em seguida seraacute feito uma breve descriccedilatildeo da fonte de dados utilizada- especificamente os projetos utilizados como objetos de estudo deste trabalho e por fimtodo o restante da metodologia que foi de fato desenvolvida para obter os resultadosnecessaacuterios

41 Questotildees de Pesquisa

Com o objetivo de entender e caracterizar melhor o uso de expressotildees lambda foramdefinidas as seguintes questotildees de pesquisa a serem respondidas

bull PQ-1 Quando os projetos comeccedilaram a introduzir o uso de expressotildees lambda emseus coacutedigos e qual a meacutedia de expressotildees lambda por snapshots caso existam

bull PQ-2 Como as equipes de desenvolvimento estatildeo utilizando expressotildees lambdaatraveacutes de refatoraccedilatildeo de coacutedigo ou introduzindo apenas em coacutedigo novo

bull PQ-3 Quais satildeo os padrotildees tipicamente adotados para o uso de expressotildees lambda

A primeira pergunta de pesquisa gira em torno de como projetos populares open-sourceestatildeo se adaptando agrave introduccedilatildeo de expressotildees lambda em Java muitos projetos jaacute estatildeoutilizando as expressotildees lambda Se sim a partir de quando comeccedilaram a utilizaacute-lasdesde o iniacutecio da introduccedilatildeo das mesmas no Java 8 ou em um periacuteodo mais tardio Aleacutemdisso eacute interessante descobrir se a utilizaccedilatildeo dessa nova caracteriacutestica tem acontecido deforma expressiva ou natildeo

Em seguida para melhor entender a forma como as expressotildees lambda estatildeo sendointroduzidas em projetos eacute interessante investigar se as equipes de desenvolvimento estatildeose preocupando em refatorar coacutedigo com o objetivo de evoluir o software ou se estatildeoexperimentando utilizar expressotildees lambda apenas em coacutedigo novo introduzido

Como a introduccedilatildeo de novas funcionalidades em projetos open-source de grande escaladepende do objetivo do projeto e os padrotildees de projeto utilizados [37] espera-se obser-var diversas abordagens quanto a utilizaccedilatildeo de expressotildees lambda para entatildeo poderclassificar estes softwares quanto a abordagem utilizada

Eacute de grande importacircncia para este estudo conseguir identificar na praacutetica comoexpressotildees lambda estatildeo sendo tipicamente adotadas nestes projetos Assim a terceirapergunta de pesquisa busca identificar alguns exemplos de utilizaccedilatildeo atraveacutes da realizaccedilatildeode alguns estudos de caso

23

Eacute importante ressaltar que apesar de as expressotildees lambda serem uma alternativa aouso de AIC elas natildeo os substituem completamente Existem precondiccedilotildees para que umaAIC possa ser substituiacuteda por expressotildees lambda [12] descritas a seguir

bull AIC deve instanciar-se de uma interface

bull AIC natildeo deve possuir nenhum campo e declarar apenas um meacutetodo

bull AIC natildeo deve possuir uma referecircncia para this ou super

bull AIC natildeo deve declarar um meacutetodo recursivo

Para responder agrave primeira pergunta apenas dados gerais sobre todos os projetos seratildeonecessaacuterios ao passo que pelas perguntas 2 e 3 possuiacuterem uma natureza mais complexaseraacute necessaacuterio aleacutem de uma anaacutelise geral estatiacutestica a realizaccedilatildeo de alguns estudos decaso para obter resultados mais completos

42 Fonte de Dados e Objetos de Estudo

Para responder agraves perguntas de pesquisa estabelecidas foram selecionados os 99 projetosmais populares na linguagem Java dentro da plataforma github ateacute a data da coleta dosdados feita em Abril de 2017 Satildeo considerados populares os repositoacuterios que possuema maior quantidade possiacutevel de estrelas (stars) A decisatildeo de escolher os 99 projetos maispopulares foi por sua natureza imparcial e ao mesmo tempo para que se possa analisarprojetos que satildeo de familiaridade e conhecimento da comunidade do github e de domiacuteniopuacuteblico Os 99 projetos estatildeo listados no Anexo I

Para entender a transiccedilatildeo feita por esses projetos entre as versotildees anteriores do Java eo Java 8 com as expressotildees lambda eacute necessaacuterio analisar o coacutedigo de vaacuterias versotildees a fimde observar alguma mudanccedila para cada projeto Como satildeo 99 projetos e vaacuterios dessesprojetos possuem milhares de linhas de coacutedigo e commits seria impossiacutevel avaliar todosos commits Optou-se entatildeo por coletar snapshots mensais de cada projeto conformeprocedimento tambeacutem seguido anteriormente [38] Cada snapshots representa o estadodo projeto em um determinado mecircs e como criteacuterio de escolha padratildeo todos os snapshotsequivalem ao uacuteltimo commit realizado no determinado mecircs que este representa

O proacuteximo passo eacute determinar o periacuteodo de tempo em que esses snapshots seriamcoletados Como Java 8 (e consequentemente as expressotildees lambda) foi introduzidoapenas em meados de 2014 [28] coletar dados de projetos a partir de um periacuteodo muitoantes deste ano natildeo agregaria valor ao estudo em questatildeo Definiu-se entatildeo um periacuteodopara a coleta mensal desses snapshots atraveacutes dos anos Janeiro de 2013 um ano antesda introduccedilatildeo do Java 8 para que se pudesse identificar para todos os projetos o mecircs

24

exato em que expressotildees lambda foram introduzidas ateacute o mecircs da coleta de dados Abrilde 2017

Eacute importante ressaltar que a definiccedilatildeo dos meses foi definida do dia primeiro de ummecircs ao dia primeiro do proacuteximo mecircs e por consequecircncia alguns snapshots que deveriamrepresentar o final de determinado mecircs correspondem na verdade a commits realizadosno dia primeiro do mecircs seguinte Por exemplo pode existir casos em que o commit querepresente o mecircs de Marccedilo de 2016 seja na verdade o commit realizado no dia primeirode Abril de 2016 Isso se deve a natureza da forma como os resultados de log de commitssatildeo obtidos pelo git [39] Poreacutem isso natildeo interfere nas anaacutelises ou no propoacutesito destetrabalho uma vez que foram realizadas verificaccedilotildees e validaccedilotildees para que natildeo existamdatas repetidas (e consequentemente commits repetidos) por repositoacuterio

Neste trabalho o termo projeto e repositoacuterio foram utilizados de forma intercaladapara representar a mesma coisa o software desenvolvido que possui um repositoacuterio naplataforma github Os termos commit snapshops e versotildees tambeacutem representam a mesmacoisa uma vez que foi definido que seriam utilizados apenas um commit por mecircs pararepresentar um determinado snapshot ou versatildeo do repositoacuterio em questatildeo

Todos os 99 projetos seratildeo utilizados para a realizaccedilatildeo de uma anaacutelise geral de ca-racterizaccedilatildeo do uso de expressotildees lambda Para as anaacutelises aprofundadas foi feito umcriteacuterio de classificaccedilatildeo para que apenas alguns projetos possam ser analisados em niacutevelde coacutedigo como estudos de caso

Resumindo foram escolhidos os 99 projetos mais populares de Java no github cole-tando dados mensais de seus commits a partir do ano de 2013 ateacute a data da coleta dosdados lembrando que nem todos os projetos existem desde 2013 (projetos mais recentes)

43 Processo de Mineraccedilatildeo

A abordagem utilizada para coletar e analisar os 99 projetos escolhidos como mostra aFigura 42 foi realizada de forma automatizada utilizando scripts python e dois projetosdesenvolvidos em Java para a coleta e tratamento de dados como descrito a seguir

Primeiramente foi realizado uma coacutepia dos repositoacuterios atuais de todos os 99 projetosmais populares do github em Java Para automatizar o processo foi desenvolvido umscript em python que lista todos os projetos escolhidos clona todos os repositoacuterios emuma pasta na maacutequina local e cria um arquivo temporaacuterio com as informaccedilotildees do nomede cada repositoacuterio e seu caminho absoluto na maacutequina local

25

Figura 42 Metodologia implementada para coleta e tratamento de dados

Em seguida foi necessaacuterio realizar o checkout de todas as versotildees entre Janeiro de2013 a Abril de 2017 de cada projeto Por motivos de otimizaccedilatildeo de espaccedilo da maacutequinalocal e automatizaccedilatildeo no processo de checkout utilizou-se de um segundo script pythonque realizava as seguintes tarefas para cada mecircs em cada projeto verificar se dentreo mecircs estipulado houve algum commit para aquele projeto se sim pega-se o hash douacuteltimo commit do mecircs realiza o checkout conta-se a quantidade de linhas de coacutedigo emJava que o projeto tem utilizando a biblioteca cloc e armazena todas as informaccedilotildeespertinentes referentes a todos os projetos que naquele mecircs tiveram commits para que oprojeto static-analysis possa entatildeo ser executado sobre esses projetos naquele determinadomomento As informaccedilotildees coletadas que satildeo utilizadas pelo static-analysis correspondemao nome do projeto o hash do commit para aquela versatildeo a pasta onde o projeto estaacutearmazenado na maacutequina local a quantidade de linhas de coacutedigo Java do projeto e datareferente ao commit Essas informaccedilotildees satildeo pertinentes para que o projeto static-analysisconsiga funcionar de forma correta projeto este descrito em detalhes a seguir

431 static-analysis

O static-analysis foi um projeto desenvolvido anteriormente a este trabalho pelos alunosThiago Cavalcanti e Vinicius de Almeida cujo objetivo eacute realizar a anaacutelise estaacutetica de

26

coacutedigos-fonte Java e gerar arquivos de saiacuteda contendo informaccedilotildees de classes e meacutetodoscom suas devidas ocorrecircncias de caracteriacutesticas da linguagem [40]

A anaacutelise estaacutetica de coacutedigo consiste em analisar um coacutedigo-fonte sem a necessidadede executaacute-lo Esse tipo de anaacutelise eacute de extrema importacircncia para manter um coacutedigo dequalidade evitar futuras refatoraccedilotildees e obter informaccedilotildees estatiacutesticas de forma raacutepida epraacutetica [41]

Seguindo esse princiacutepio o static-analysis foi projetado para receber um arquivo deentrada csv seguindo o padratildeo

Tipo da Aplicaccedilatildeo Inicio do projeto Antes ou Apoacutes Java 5 Nome do ProjetoVersatildeo Caminho absolutoQuantidade de linhas de coacutedigo

Atraveacutes da informaccedilatildeo do caminho absoluto do projeto o static-analysis varre osdiretoacuterios em busca dos arquivos fonte java realiza o parse desses arquivos e utilizade Visitors para extrair as informaccedilotildees desejadas e exporta-las em arquivos csv Ouso de Visitors permite que sejam escolhidas as informaccedilotildees desejadas para a consultacomo expressotildees Lambda e AIC s aleacutem de possibilitar que sejam implementados novosVisitors conforme a linguagem evolua ou as necessidades mudem

Para este trabalho foram utilizados os Visitors de expressotildees Lambda map() filter()AICs e declaraccedilotildees de meacutetodos

432 BDAnalisador

Apoacutes obter todas as informaccedilotildees necessaacuterias geradas pelo static-analysis era preciso ma-nipular os dados de forma que facilitasse a coleta de dados para o estudo proposto Comovaacuterios arquivos em formato csv satildeo de difiacutecil manipulaccedilatildeo foi desenvolvido entatildeo umaferramenta chamada BDAnalisador Esta ferramenta eacute responsaacutevel por processar os arqui-vos em csv gerados pelo static-analysis e popular uma base de dados relacional MySQLcom as informaccedilotildees pertinentes a este estudo

O BDAnalisador foi desenvolvido com a intenccedilatildeo de tornar mais simples o trabalhocom os dados resultantes do static-analysis de forma que consultas em SQL pudessemser feitas a ponto de permitir a obtenccedilatildeo de resultados mais complexos Seguindo esseobjetivo o framework Hibernate foi escolhido como ferramenta para persistecircncia devidoa ser um framework jaacute consolidado no mercado e que de forma simples relaciona osobjetos Java ao banco de dados MySQL [42] A divisatildeo de classes foi projetada em quatroentidades Projeto Versao Classe e Metodo cada uma com seus respectivos camposcontendo as informaccedilotildees necessaacuterias para a pesquisa como pode ser visto na Figura 44Eacute importante ressaltar que a tabela de Versao guarda hashs de commits devido agrave escolhade utilizar commits para obter mais informaccedilatildeo de evoluccedilatildeo de coacutedigo em um menor

27

espaccedilo de tempo Aleacutem disso para este trabalho optou-se por persistir todos os meacutetodose classes de cada versatildeo sem se importar com a repeticcedilatildeo desses dados pois a hipoacutetesede haver grandes refatoraccedilotildees entre versotildees poderia comprometer a confiabilidade dasinformaccedilotildees

Figura 43 Diagrama de classes UML do BDAnalisador

Como visto na Figura 43 seguindo parcialmente a arquitetura MVC cada entidadepossui sua respectiva classe DAO(Data Access Object) para persistecircncia dos dados eapenas uma classe Controlador no projeto responsaacutevel pela manipulaccedilatildeo e parse dosdados dos arquivos csv gerados pelo static analysis para serem enviados agraves classes DAOO sistema inicia chamando o meacutetodo inicializar() da classe Controlador Esse meacutetodoeacute responsaacutevel por ler um arquivo de entrada csv que segue o mesmo modelo do arquivo dostatic-analysis citado na seccedilatildeo anterior O arquivo conteacutem os dados de todos os projetose suas respectivas versotildees dessa forma o meacutetodo instancia um objeto da classe Projetoe persiste o projeto no banco de dados Para cada versatildeo encontrada no arquivo deentrada o inicializar() aciona os meacutetodos responsaacuteveis por instanciar e preencher aslistas da classe Classe e Metodo Os meacutetodos responsaacuteveis por preencher as listas varremos arquivos csv gerados pelo static-analysis e fazem o parse das informaccedilotildees relevantescomo nomes dos meacutetodos e quantidades de lambdas para construir os objetos que seratildeogravados Ao final dos preenchimentos o objeto Versatildeo eacute instanciado e gravado no bancode dados atraveacutes de sua classe DAO ao mesmo tempo que grava suas respectivas Classese Metodos

28

Apoacutes vaacuterios testes e correccedilotildees de bugs o banco de dados se encontrava finalmente comas informaccedilotildees de 99 projetos Java open-source separados por um commit por mecircs desde2013 cada um com suas respectivas informaccedilotildees de classes meacutetodos e a quantidade deexpressotildees lambda filters e maps em cada meacutetodo Filter ou Filter pattern eacute o padratildeode projeto que tem como objetivo filtrar objetos de uma coleccedilatildeo (Collection) de acordocom algum criteacuterio Jaacute o map ou map pattern eacute um padratildeo que ldquomapeia os elementosde uma coleccedilatildeo aplicando uma funccedilatildeo a eles para uma nova coleccedilatildeo [43] A coleta deinformaccedilotildees sobre esses padrotildees podem ser uacuteteis para possiacuteveis anaacutelises de oportunidadesde uso de expressotildees lambda para refatoraccedilatildeo de coacutedigo

A Figura 44 mostra o esquema de como o banco de dados resultante foi gerado

Figura 44 Modelo relacional do banco de dados populado pelo BDAnalisador Imagemgerada com software DBeaver [2]

44 Classificaccedilatildeo e Anaacutelise

Com o banco de dados populado restam apenas as etapas de classificaccedilatildeo e anaacutelise pararesponder as questotildees de pesquisa propostas Para isso inicialmente houve uma tentativade se utilizar apenas queries SQL para analisar os dados de acordo com as informaccedilotildeesrelevantes Poreacutem devido ao fato de o banco de dados conter todas as informaccedilotildees detodos os projetos e todas as suas versotildees queries que possuem uma alta complexidadedemoravam muito tempo para retornar os dados

Assim com o objetivo de facilitar o trabalho alguns scripts python foram desenvolvi-dos para rodar as queries separadamente e individualmente para cada projeto de formaautomatizada a fim de melhorar o tempo de resposta para obtenccedilatildeo dos resultados

29

441 Meacutedia de Lambda

O primeiro script retorna a quantidade de expressotildees lambda (ou AICs) por n snapshotsque contenha expressotildees lambda O objetivo eacute ter uma visatildeo geral da meacutedia de expressotildeeslambda e AICs utilizadas por cada projeto e como nem todos os snapshots coletados decada projeto possuem expressotildees lambda e AICs apenas aqueles com alguma expressatildeolambda ou AIC satildeo incluiacutedos no caacutelculo da meacutedia

Mmedia =sumn qtdLambdai

n

442 Anaacutelise Temporal

O segundo script retorna para cada projeto a soma total da quantidade de expressotildeeslambda AIC map() e filter() no projeto inteiro para cada versatildeo Ou seja tem-seo total de cada uma das quatro propriedades selecionadas para cada mecircs do projetoobtendo assim uma visatildeo temporal de evoluccedilatildeo do uso das caracteriacutesticas descritas ATabela 41 ilustra parcialmente o resultado obtido para o projeto agera onde idVersaoeacute o identificador no banco de dados referente ao hash do commit mensal coletado qtd eacutea quantidade de cada uma das caracteriacutesticas escolhidas e a data do commit encontra-seno formato americano

Tabela 41 Informaccedilotildees mensais sobre o projeto ageraidVersao Data do Commit qtd lambda qtd AIC qtd maps qtd filter

823 512016 0 29 4 0755 612016 13 28 4 0686 6152016 13 29 4 0621 812016 13 29 4 0555 8162016 13 30 4 0485 922016 13 30 4 0422 10132016 14 30 4 0356 11282016 14 30 4 0295 12212016 21 30 5 0232 212017 21 30 5 0175 312017 21 30 5 0112 3312017 21 36 5 048 4242017 21 48 5 0

Os resultados obtidos com esta anaacutelise temporal permitiu a identificaccedilatildeo de padrotildees nautilizaccedilatildeo de expressotildees lambda em relaccedilatildeo a utilizaccedilatildeo de AIC por todos os projetos Foi

30

possiacutevel classificar todos os projetos em 6 grupos ilustrado na Figura 45 Primeiramenteseparou-se os projetos entre os que possuem expressotildees lambda e os que natildeo possuemDentre os que possuem identificou-se cinco categorias

1 Grupo 1 Quantidade de AICs e expressotildees lambda aumentam com o tempo pro-porcionalmente

2 Grupo 2 Quantidade de AICs diminui agrave medida que a quantidade de expressotildeeslambda aumentam e a quantidade de expressotildees lambda ultrapassa a quantidade deAIC em um determinado momento

3 Grupo 3 Quantidade de AICs diminui agrave medida que a quantidade de expressotildeeslambda aumentam mas a quantidade de AIC permanece superior agrave quantidade delambda

4 Grupo 4 Expressotildees lambda satildeo introduzidas e existem por um pequeno periacuteodode tempo mas satildeo completamente removidas posteriormente

5 Grupo 5 Quantidade de expressotildees lambda eacute constante e muito inferior compa-rado com a quantidade de AICs no projeto Foi determinado que para pertencera esta classificaccedilatildeo o projeto precisa ter uma razatildeo de meacutedia de expressotildees lamb-dasnapshot por meacutedia de AICsnapshot inferior a 020 Esse paracircmetro foi esta-belecido com o objetivo de definir um padratildeo para o que pode ser considerado umprojeto com poucas expressotildees lambda

Figura 45 Classificaccedilatildeo dos projetos

31

443 Refatoraccedilatildeo de Coacutedigo

O uacuteltimo script teve como objetivo realizar uma tentativa inicial de identificar refatoraccedilatildeode coacutedigo da seguinte maneira para todos os projetos que possuem expressotildees lambdaforam identificados o mecircs imediatamente antes da introduccedilatildeo de expressotildees lambda e omecircs seguinte onde houve a primeira ocorrecircncia de lambda no projeto Assim realizou-se uma anaacutelise do tamanho em quantidade de linhas de coacutedigo de todos os meacutetodosdo projeto que no mecircs seguinte tiveram introduccedilatildeo de lambda Em seguida fez-se umacomparaccedilatildeo com os mesmos meacutetodos em relaccedilatildeo ao mecircs anterior e assim foi possiacuteveldetectar quais meacutetodos tiveram a quantidade de linhas de coacutedigo reduzidas o que seriaum indicativo natildeo necessariamente exclusivo de que uma refatoraccedilatildeo de coacutedigo possa terocorrido

Sabe-se que este meacutetodo de detecccedilatildeo de refatoraccedilatildeo de coacutedigo possui suas limitaccedilotildeesuma vez que as comparaccedilotildees para saber se um meacutetodo existe em ambas versotildees eacute feitopuramente por comparaccedilatildeo de String (nome do meacutetodo) e a classe que este pertence

444 Casos de Uso

Os meacutetodos descritos acima ajudaram a identificar alguns padrotildees e facilitar a anaacutelise dosdados Poreacutem natildeo satildeo suficientes para que se possa responder agraves questotildees de pesquisaDessa forma apoacutes a identificaccedilatildeo dos grupos de classificaccedilatildeo para os projetos foramescolhidos um projeto de cada grupo (com exceccedilatildeo do grupo dos projetos sem expressotildeeslambda) para realizar um breve estudo de caso com o objetivo de identificar e caracterizarmelhor a adoccedilatildeo de expressotildees lambda Os projetos escolhidos foram agera vertxAndroid-CleanArchitecture RxJava e guava

32

Capiacutetulo 5

Resultados Obtidos e Anaacutelise

Neste capiacutetulo seratildeo apresentados os dados obtidos e anaacutelise com o objetivo de responderagraves questotildees de pesquisa propostas Como mencionado anteriormente as perguntas seratildeorespondidas de duas maneiras algumas com informaccedilotildees gerais sobre todos os projetose outras com breve estudos de caso envolvendo cinco projetos

51 Visatildeo Geral

Dentre os repositoacuterios coletados para a anaacutelise 74 (7474) natildeo utilizaram nenhumaexpressatildeo lambda no projeto durante todo o periacuteodo analisado (Janeiro de 2013 a Abrilde 2017) restando apenas 25 repositoacuterios (2525) com expressotildees lambda Eacute interessantedestacar que apesar de a quantidade de repositoacuterios que natildeo possuem expressotildees lambdaser relativamente expressiva muitos destes repositoacuterios satildeo de projetos em Java que umdia foram populares e atualmente natildeo estatildeo sendo mais desenvolvidos (por exemplo umaplicativo que soacute funciona para Android 23 atualmente descontinuado)

Levando em consideraccedilatildeo apenas os projetos que possuem expressotildees lambda exis-tem dois tipos de dados que podem ser analisados para responder agrave primeira questatildeo depesquisa atraveacutes dos dados obtidos pelo meacutetodo anteriormente mencionado como anaacutelisetemporal e a meacutedia de lambda por snapshot mencionados no capiacutetulo anterior

Com relaccedilatildeo ao ano em que a primeira ocorrecircncia foi encontrada 6 projetos introduzi-ram expressotildees lambda jaacute em 2014 8 comeccedilaram a utilizar em 2015 7 em 2016 e apenas4 tiveram a primeira ocorrecircncia de expressotildees lambda em 2017 Dessa forma percebe-seque os projetos estatildeo relativamente bem distribuiacutedos em grupos quanto ao ano em que seintroduziu expressotildees lambda

Pela meacutedia de lambda por snapshot (lambdasnapshot) a maioria (11 projetos) possuiuma quantidade expressiva acima de 100 lambdasnapshot (com 6 projetos entre 20 e 100lambdasnapshot e 8 projetos com menos de 20 lambdasnapshot) como apresentados no

33

graacutefico da Figura 51 Isso mostra que essa nova caracteriacutestica jaacute estaacute sendo bem utilizadanos projetos que comeccedilaram a migrar para a nova versatildeo do Java

Figura 51 Graacuteficos dos projetos separados por ano de introduccedilatildeo de expressotildees lambdae meacutedia de lambda por snapshot

Com isso pode-se observar que apesar de a quantidade de projetos que possuemexpressotildees lambda natildeo ser tatildeo alta eacute possiacutevel obter resultados expressivos uma vez quea quantidade dos projetos com lambda estatildeo bem dispersos quanto ao periacuteodo em quecomeccedilaram a adotar essa caracteriacutestica e a quantidade de expressotildees lambda por snapshot

511 Projetos Selecionados

Atraveacutes dos grupos de classificaccedilatildeo identificados pela anaacutelise temporal descritos na Figura45 cinco projetos foram selecionados para uma anaacutelise detalhada levando em consideraccedilatildeoo grupo em que eles pertencem Estes projetos seratildeo apresentados a seguir

512 agera

Agera eacute uma biblioteca Android que ajuda a introduzir programaccedilatildeo funcional reativa(functional reactive programming) em projetos Android Eacute um projeto recente lanccediladoem 2016 pela Google [44] e encontra-se no grupo dos projetos que introduziram expressotildeeslambda em 2016 no mesmo ano de seu lanccedilamento contendo uma meacutedia de expressotildeeslambda de 16 lambdasnapshot

Na classificaccedilatildeo estabelecida agera pertence ao Grupo 1 onde a quantidade de ex-pressotildees lambda no projeto com o tempo aumentam juntamente com a quantidade deAICs como mostra o graacutefico de anaacutelise temporal na Figura 52

34

Figura 52 Graacuteficos de anaacutelise temporal do projeto agera

513 vertx

Eclipse Vertx eacute um conjunto de ferramentas para criaccedilatildeo de reactive applications namaacutequina virtual Java (JVM) em grande escala [45] Seu primeiro lanccedilamento aconteceuem 2011 e a primeira ocorrecircncia de expressotildees lambda no projeto aconteceu em 2014 Esteprojeto possui uma meacutedia de 2867 lambdasnapshot e dentre os projetos consideradosneste trabalho eacute o que possui a maior quantidade de expressotildees lambda

Este projeto pertence ao Grupo 2 onde a quantidade de expressotildees lambda aumen-tou consideravelmente pelos meses ultrapassando a quantidade de AICs que diminuiudrasticamente como mostra a Figura 53

35

Figura 53 Graacuteficos de anaacutelise temporal do projeto Vertx

514 Android-CleanArchitecture

Apesar de ser uma amostra de projeto Android-CleanArchitecture que tem como objetivoconstruir aplicaccedilotildees Android utilizando clean architecture foi lanccedilado em 2014 mas semanteacutem sempre atualizado [46]

A introduccedilatildeo de expressotildees lambda que aconteceu no ano de 2015 se deu de formatiacutemida com uma meacutedia de 35 lambdasnapshot De qualquer forma este projeto conseguerepresentar com seu graacutefico de anaacutelise temporal o grupo 3 composto por projetos em quea quantidade de expressotildees lambda aumentou mas sem ultrapassar AICs que diminuiacuteramdemonstrado no graacutefico da Figura 54

36

Figura 54 Graacuteficos de anaacutelise temporal do projeto Android-CleanArchitecture

515 RxJava

Dentre os repositoacuterios estudados RxJava eacute considerado o mais popular Como umaimplementaccedilatildeo de Reactive Extensions para a JVM RxJava teve seu lanccedilamento dadoem 2013 [47] Expressotildees lambda apareceram pela primeira vez no ano de 2015 comuma meacutedia de 766 lambdasnapshot

Apesar de uma meacutedia relativamente alta o tempo de vida das expressotildees lambda nesteprojeto foi bem curto caracterizando assim projetos do grupo 4 houve a introduccedilatildeo dasexpressotildees lambda no projeto poreacutem houve a remoccedilatildeo completa de todas as expressotildeeslambda previamente introduzidas desaparecendo completamente do projeto ateacute a datada coleta de dados (Figura 55)

37

Figura 55 Graacuteficos de anaacutelise temporal do projeto RxJava

516 guava

Guava eacute um conjunto de bibliotecas para Java da Google lanccedilado em 2011 A atualizaccedilatildeodo coacutedigo do projeto para Java 8 aconteceu somente em 2016 e apesar do projeto conteruma meacutedia de 281 lambdasnapshot ele foi escolhido como representante dos projetosdo Grupo 5 (Figura 56) que possuem expressotildees lambda mas de forma natildeo expressiva osuficiente quando comparado com a quantidade de AIC pelo fato de sua razatildeo de meacutedia delambdasnapshot por meacutedia de AICsnapshot ser 004 Ou seja embora o projeto tenhaexpressotildees lambda estas satildeo consideradas muito poucas quando inseridas no contextogeral deste projeto que eacute considerado um projeto grande

38

Figura 56 Graacuteficos de anaacutelise temporal do projeto Guava

52 Refatoraccedilatildeo de Coacutedigo

Com o objetivo de caracterizar melhor como as expressotildees lambda estatildeo sendo utilizadaseacute interessante identificar se estas estatildeo sendo introduzidas atraveacutes de refatoraccedilatildeo de coacutedigoou em coacutedigo novo

Os projetos classificados como pertencentes ao Grupo 2 possuem em comum o fatode expressotildees lambda aumentarem a medida que AICs diminuem ultrapassando-as eessa caracteriacutestica em comum pode indicar que nestes projetos possivelmente houve re-fatoraccedilatildeo de coacutedigo visto que AIC sendo substituiacutedo por expressotildees lambda dentro dascondiccedilotildees determinadas eacute a maneira mais comum de se identificar refatoraccedilatildeo de coacute-digo para introduccedilatildeo de expressotildees lambda [12] Os projetos que compotildeem o grupo 2representam 44 de todos os projetos estudados que possuem expressotildees lambda o quepode ser um indicativo caso a hipoacutetese de refatoraccedilatildeo de coacutedigo seja positiva de quemuitos projetos que estatildeo adotando o Java 8 estatildeo se preocupando de alguma formacom refatoraccedilatildeo se coacutedigo Fazem parte desse grupo os seguintes projetos elasticsearchjava-design-patterns PocketHub presto RxJava-Android-Samples spark vertx zipkinjava8-tutorial dropwizard e material-dialogs

39

Outra maneira de verificar possiacuteveis indicadores de refatoraccedilatildeo de coacutedigo foi atraveacutesda anaacutelise dos tamanhos (em quantidade de linhas de coacutedigo) dos meacutetodos com expressotildeeslambda no mecircs em que se introduziu expressotildees lambda e um mecircs imediatamente antesdeste Essa anaacutelise mostra que dos 25 projetos com expressotildees lambda 12 (48) projetostiveram ao menos um meacutetodo em que houve uma diminuiccedilatildeo no tamanho o que podeser considerado um indicativo de refatoraccedilatildeo de coacutedigo A Figura 57 mostra todos osprojetos em relaccedilatildeo agrave quantidade total de meacutetodos que possuem lambda no primeiro mecircsde introduccedilatildeo do mesmo em vermelho comparado com a quantidade desses meacutetodos quetiveram uma diminuiccedilatildeo no tamanho quando comparados com o coacutedigo do mecircs anteriorem azul

Figura 57 Comparaccedilatildeo entre todos os projetos com expressatildeo lambda sobre refatoraccedilatildeode coacutedigo no mecircs de introduccedilatildeo da caracteriacutestica

Ainda observando a figura 57 com relaccedilatildeo aos projetos que natildeo tiveram nenhummeacutetodo com diminuiccedilatildeo de tamanho (barra azul) percebe-se que todos os 13 projetossequer tiveram uma quantidade significativa de meacutetodos que possuem expressotildees lambda(com o maior tendo apenas 5 meacutetodos) no mecircs de introduccedilatildeo da caracteriacutestica no projetoe ao mesmo tempo jaacute existiam no mecircs em que natildeo existia lambda no projeto Essa eacuteuma observaccedilatildeo importante porque projetos como vertx sendo este o que possui a maiormeacutedia de lambdasnapshot de todos os projetos e ao mesmo tempo tendo apenas trecircsmeacutetodos que continham expressotildees lambda no mecircs da introduccedilatildeo e que existiam no mecircs

40

anterior permitem inferir que todas as outras expressotildees lambda existentes no projetopara este determinado mecircs de introduccedilatildeo encontram-se em coacutedigo novo introduzido

Eacute importante ressaltar que somente essa anaacutelise natildeo eacute exclusivamente suficiente paradeterminar se estes projetos estatildeo realmente introduzindo lambda em coacutedigo novo ourealizando refatoraccedilatildeo uma vez que como a comparaccedilatildeo aconteceu apenas no mecircs deintroduccedilatildeo com o mecircs imediatamente anterior natildeo reflete todo o ciclo de vida do pro-jeto Por exemplo algumas equipes podem escolher refatorar o coacutedigo depois de umtempo de adaptaccedilatildeo apoacutes a transiccedilatildeo para a nova versatildeo da linguagem Assim paraobter uma melhor anaacutelise sobre refatoraccedilatildeo de coacutedigo ou natildeo feita nestes projetos aleacutemde outras anaacutelises referentes aos padrotildees tipicamente adotados para implementaccedilatildeo delambda nestes projetos seratildeo apresentados a seguir os estudos de caso dos cinco projetospreviamente selecionados

Outro ponto importante eacute o fato de que apesar das informaccedilotildees quanto agraves quantida-des de filter e map terem sido incluiacutedas inicialmente no trabalho para observar possiacuteveispadrotildees de refatoraccedilatildeo de coacutedigo percebeu-se que estas natildeo satildeo utilizadas de forma con-sideraacutevel pelos projetos estudados e para fins de anaacutelises generalizadas natildeo apresentaramtanta influecircncia na utilizaccedilatildeo de expressotildees lambda quanto a quantidade de AICs noprojeto

53 Estudos de Caso

Dentre os projetos analisados verificou-se que os projetos de pequeno e meacutedio porte op-taram por refatorar de uma vez seus coacutedigos para incluir expressotildees lambda em situaccedilotildeesem que se utilizava AICs anteriormente ou em alguns poucos casos de utilizaccedilatildeo deCollection Os projetos de grande porte natildeo apresentaram nenhuma refatoraccedilatildeo de coacute-digo ou uma refatoraccedilatildeo parcial gradativa provavelmente devido agrave grande quantidade dearquivos e coacutedigo que possuem o que pode tornar o trabalho de refatoraccedilatildeo extenso ecansativo

O projeto vertx que pertence ao grupo 2 dos projetos em que a quantidade de ex-pressotildees lambda aumentaram e as de AICs diminuiacuteram com lambda ultrapassando AICsexecutou inicialmente commits em maio de 2014 com adiccedilatildeo de coacutedigo novo utilizandoexpressotildees lambda e apoacutes um mecircs realizou um commit maior com a refatoraccedilatildeo de todasas AICs para expressotildees lambda Apoacutes a refatoraccedilatildeo o projeto se preocupou em mantera utilizaccedilatildeo de expressotildees lambda ao mesmo tempo que o uso de AICs se manteve apenasaos casos de classes com interfaces natildeo funcionais A Figura 58 apresenta uma parte docommit de refatoraccedilatildeo de coacutedigo que mostra em vermelho a parte eliminada do coacutedigo(AIC) e em verde o coacutedigo novo representando a substituiccedilatildeo por uma expressatildeo lambda

41

Figura 58 Commit de refatoraccedilatildeo de coacutedigo do projeto Vertx [3]

Alguns projetos ainda natildeo se preocuparam em refatorar o coacutedigo para o uso de ex-pressotildees lambda ateacute a data deste trabalho que eacute o caso do projeto guava que apresentouum commit em 03112016 com a atualizaccedilatildeo do projeto para Java 8 Mas a partir daatualizaccedilatildeo se preocupou em utilizar as expressotildees lambda apenas na implementaccedilatildeo decoacutedigo novo O cenaacuterio em que a refatoraccedilatildeo natildeo eacute prioridade ainda eacute a realidade de vaacuteriosprojetos de grande porte visto que os dados de projetos sem nenhuma expressatildeo lambdasatildeo o maior nuacutemero neste trabalho Poreacutem projetos que jaacute adotaram a utilizaccedilatildeo do Java8 tendem a mudar isso com o passar do tempo A Figura 59 apresenta em verde umaadiccedilatildeo de coacutedigo novo com expressatildeo lambda sem a eliminaccedilatildeo de algum coacutedigo anteriora esse que estaria em vermelho

42

Figura 59 Exemplo de um arquivo do commit de adiccedilatildeo de coacutedigo novo em Java 8 doprojeto Guava [4]

Na categoria de projetos em que os AICs e expressotildees lambda aumentam proporci-onalmente (grupo 1) o projeto agera realizou um commit em 19052016 com a adiccedilatildeoda biblioteca retrolambda como dependecircncia do projeto Essa biblioteca utilizada prin-cipalmente por projetos Android permite executar coacutedigo Java 8 contendo expressotildeeslambda em Java 5 6 e 7 [48] O commit tambeacutem apresenta refatoraccedilatildeo dos AICs ad-vindos de interfaces funcionais para expressotildees lambda Apesar de o projeto continuar autilizar as expressotildees lambda em seus commits posteriores o nuacutemero de AICs tambeacutemcontinuou a aumentar visualizando os commits posteriores notou-se que esses AICs satildeorelativos a interfaces natildeo funcionais ou seja que possuem mais de um meacutetodo O projetoAndroid-CleanArchitecture eacute similar ao agera pois tambeacutem optou pela instalaccedilatildeo da bi-blioteca retrolambda para uso de expressotildees lambda em seus coacutedigos e como tambeacutem eacuteum projeto de pequeno porte houve uma pequena refatoraccedilatildeo dos AICs A Figura 510mostra a parte do commit de refatoraccedilatildeo de coacutedigo em que o desenvolvedor adiciona abiblioteca retrolambda como dependecircncia

43

Figura 510 Commit de adiccedilatildeo da biblioteca Retrolambda no projeto Agera [5]

Outro caso interessante eacute o do projeto RxJava que em 2015 optou pela refatoraccedilatildeodo coacutedigo para a utilizaccedilatildeo de expressotildees lambda quase eliminando por completo o usode AICs mas que no ano seguinte reverteu os commits de forma que eliminasse comple-tamente o uso de expressotildees lambda para manter a retrocompatibilidade com o Java 6A Figura 511 demonstra uma parte do commit de reversatildeo do coacutedigo para Java 6 emque pode ser visto em vermelho o coacutedigo anterior com expressotildees lambda e o verde como novo coacutedigo utilizando AIC novamente

44

Figura 511 Commit de remoccedilatildeo de Lambdas e volta para o uso de AICs no projetoRXJava [6]

Essa preocupaccedilatildeo com retrocompatibilidade de coacutedigo pode ser um fator crucial nadecisatildeo das equipes de desenvolvimento na hora de decidir como fazer o software co-evoluircom a linguagem sem perder a compatibilidade com versotildees anteriores

45

Capiacutetulo 6

Consideraccedilotildees Finais

Este estudo permitiu entender melhor como projetos estatildeo realizando a migraccedilatildeo para oJava 8 em especial utilizando uma nova caracteriacutestica introduzida expressatildeo lambdaApesar de a maioria dos projetos populares considerados natildeo possuiacuterem nenhuma ocor-recircncia de expressotildees lambda os projetos que tinham expressotildees lambda foram suficientespara realizar um primeiro estudo de caracterizaccedilatildeo no uso desta caracteriacutestica e com osprojetos efetivamente utilizados para estudo foi possiacutevel agrupaacute-los quanto a maneira emque as expressotildees lambda estavam sendo utilizadas quando comparadas com AICs em 5grandes grupos quando AIC e lambda aumentam proporcionalmente quando AIC dimi-nui e lambda aumenta ultrapassando AIC quando AIC diminui mas continua superior aolambda crescente expressotildees lambda que foram introduzidas e retiradas completamentedo coacutedigo e expressotildees lambda que natildeo existem em quantidades expressivas

Foi possiacutevel entatildeo realizar um estudo aprofundado levando em consideraccedilatildeo as di-ferentes maneiras com que as expressotildees lambda foram adotadas nos projetos atraveacutes daescolha de um projeto que representasse cada grupo para anaacutelise Dentre os cinco projetosestudados foi possiacutevel observar alguns padrotildees tipicamente adotados por desenvolvedorespara implementar expressotildees lambda em seus projetos como a utilizaccedilatildeo da bibliotecas(retrolambda) que permitissem uma flexibilizaccedilatildeo na utilizaccedilatildeo de expressotildees lambda oucomo lambda eacute primariamente utilizada para substituir determinados AICs ou operaccedilotildeesem Collection

Aleacutem disso foi possiacutevel observar como a refatoraccedilatildeo de coacutedigo acontece em cada umdesses projetos Observou-se como projetos menores tendem a refatorar coacutedigo maisfacilmente ao passo que projetos maiores e mais complexos fazem menos refatoraccedilatildeo oudemoram mais entre o periacuteodo em que houve a primeira migraccedilatildeo de coacutedigo para a novaversatildeo da linguagem ateacute o periacuteodo em que realmente decidem refatorar coacutedigo Aleacutem dacomplexidade do projeto influenciar na decisatildeo de migrar o projeto para uma versatildeo maisrecente da linguagem a preocupaccedilatildeo com retrocompatibilidade com versotildees anteriores da

46

linguagem tambeacutem podem ser uma barreira para que projetos comecem a evoluir o coacutedigojuntamente com a evoluccedilatildeo da linguagem

Ainda assim foi possiacutevel observar que a preocupaccedilatildeo com a co-evoluccedilatildeo do software-linguagem existe entre os desenvolvedores de projetos mas a realizaccedilatildeo da migraccedilatildeo aindaacontece lentamente devido agrave diversos fatores que precisam ser levados em consideraccedilatildeopara a manutenccedilatildeo do projeto

Para trabalhos e contribuiccedilotildees futuras seria interessante desenvolver uma ferramentaque pudesse analisar diretamente no coacutedigo-fonte as oportunidades de aplicaccedilatildeo de ex-pressotildees lambda dessa forma poderiam ser analisadas as porcentagens de conversatildeo decoacutedigo para Java 8 e obter melhores conclusotildees sobre a importacircncia que os projetos estatildeodando para a evoluccedilatildeo de seus coacutedigos Outro fator interessante seria aplicar mais Visitorsagrave ferramenta static-analysis e fazer este mesmo estudo aplicado agrave outras caracteriacutesticasda linguagem

47

Referecircncias

[1] Kagdi Huzefa Michael L Collard e Jonathan I Maletic A survey and taxonomyof approaches for mining software repositories in the context of software evolution2007 ix 3 8 9 10 11

[2] DBeaver Dbeaver - features httpdbeaverjkissorgdocsfeatures ix 29

[3] Eclipse Vertx commit Java8-ify code httpsgithubcomeclipsevertxcommit93f95e9c77419f442a42fe711b6eeaef88192fd3 ix 42

[4] Google Guava commit Release java 8 changes to guava httpsgithubcomgoogleguavacommit73e382fa877f80994817a136b0adcc4365ccd904 ix 43

[5] Google Agera commit Collapsed testapp with retrolambda httpsgithubcomgoogleageracommit5e518b7b05f9e7a34a314945f68deff7b2c3e334 ix 44

[6] ReactiveX Rxjava commit 2x full jdk 6 compatible backport + includ-ing bugfixes up to today httpsgithubcomReactiveXRxJavacommit000a174d87a901135f9665d3b11f3627fd2dc4ed ix 45

[7] Godfrey M W e D M German The past present and future of software evolutionEm 2008 Frontiers of Maintenance paacuteginas 129ndash138 Sept 2008 1 6

[8] Favre J M Languages evolve too changing the software time scale Em Principles ofSoftware Evolution Eighth International Workshop on paacuteginas 33ndash42 IEEE 20051 5 7

[9] Overbey Jeffrey L e Ralph E Johnson Regrowing a language refactoring tools allowprogramming languages to evolve Em ACM SIGPLAN Notices volume 44 paacuteginas493ndash502 ACM 2009 1 5 7 8 12

[10] Grechanik Mark Collin McMillan Luca DeFerrari Marco Comi Stefano CrespiDenys Poshyvanyk Chen Fu Qing Xie e Carlo Ghezzi An empirical investiga-tion into a large-scale java open source code repository Em Proceedings of the2010 ACM-IEEE International Symposium on Empirical Software Engineering andMeasurement ESEM rsquo10 paacuteginas 111ndash1110 New York NY USA 2010 ACMISBN 978-1-4503-0039-1 httpdoiacmorg10114518527861852801 1

[11] TIOBE Tiobe httpswwwtiobecomtiobe-index 1 14

48

[12] Gyori Alex Lyle Franklin Danny Dig e Jan Lahoda Crossing the gap from im-perative to functional programming through refactoring Em Proceedings of the 20139th Joint Meeting on Foundations of Software Engineering ESECFSE 2013 paacute-ginas 543ndash553 New York NY USA 2013 ACM ISBN 978-1-4503-2237-9 httpdoiacmorg10114524914112491461 2 11 24 39

[13] OpenJDK State of the lambda httpcropenjdkjavanet~briangoetzlambdalambda-state-4html 2

[14] Han Jiawei Micheline Kamber e Jian Pei Data Mining Concepts and TechniquesMorgan Kaufmann Publishers Inc San Francisco CA USA 3rd ediccedilatildeo 2011ISBN 0123814790 9780123814791 3

[15] Fowler Martin e Kent Beck Refactoring improving the design of existing codeAddison-Wesley Professional 1999 5 7

[16] Lehman M M J F Ramil P D Wernick D E Perry e W M Turski Met-rics and laws of software evolution - the nineties view Em Proceedings of the4th International Symposium on Software Metrics METRICS rsquo97 paacuteginas 20ndashWashington DC USA 1997 IEEE Computer Society ISBN 0-8186-8093-8 httpdlacmorgcitationcfmid=823454823901 6

[17] Hassan Ahmed E e Tao Xie Software intelligence The future of mining softwareengineering data Em Proceedings of the FSESDP Workshop on Future of SoftwareEngineering Research FoSER rsquo10 paacuteginas 161ndash166 New York NY USA 2010ACM ISBN 978-1-4503-0427-6 httpdoiacmorg101145188236218823978 9

[18] Hassan Ahmed E The road ahead for mining software repositories Em Frontiers ofSoftware Maintenance 2008 FoSM 2008 paacuteginas 48ndash57 IEEE 2008 8

[19] Berry Michael J e Gordon Linoff Data Mining Techniques For Marketing Salesand Customer Support John Wiley amp Sons Inc New York NY USA 1997ISBN 0471179809 10

[20] Parnin Chris Christian Bird e Emerson Murphy-Hill Java generics adoption hownew features are introduced championed or ignored Em Proceedings of the 8thWorking Conference on Mining Software Repositories paacuteginas 3ndash12 ACM 2011 12

[21] Oracle The java language specification httpsdocsoraclecomjavasespecsjlsse8jls8pdf 13

[22] Oracle The history of java technology httpwwworaclecomtechnetworkjavajavaseoverviewjavahistory-index-198355html 13

[23] Murphy Kieron So why did they decide to call itjava httpwwwjavaworldcomarticle2077265core-javaso-why-did-they-decide-to-call-it-java-html 13

[24] McGraw Tata Object-oriented Programming with Java Essentials and ApplicationsHill Education 13

49

[25] Oracle Differences between java ee and java se httpdocsoraclecomjavaee6firstcupdocgkhoyhtml 13

[26] Lindsey Clark S The History of Java Cambridge 14

[27] Oracle The java language environment httpwwworaclecomtechnetworkjavaintro-141325html 14

[28] Oracle Jdk 8 httpopenjdkjavanetprojectsjdk8 15 24

[29] Oracle Enhancements in java se 8 httpdocsoraclecomjavase8docstechnotesguideslanguageenhancementshtmljavase8 15 16 17

[30] Oracle Lambda expressions httpdocsoraclecomjavasetutorialjavajavaOOlambdaexpressionshtml 16 18 21

[31] Oracle Method references httpdocsoraclecomjavasetutorialjavajavaOOmethodreferenceshtml 16

[32] Oracle Default methods httpdocsoraclecomjavasetutorialjavaIandIdefaultmethodshtml 17

[33] Oracle Repeating annotations httpdocsoraclecomjavasetutorialjavaannotationsrepeatinghtml 17

[34] Oracle Type annotations httpdocsoraclecomjavasetutorialjavaannotationstype_annotationshtml 17

[35] Oracle Anonymous inner classes httpsdocsoraclecomjavasetutorialjavajavaOOanonymousclasseshtml 19

[36] Kothari CR Research Methodology Methods and Techniques New Age Interna-tional (P) Limited 2004 ISBN 9788122415223 httpsbooksgooglecombrbooksid=8c6gkbKi-F4C 22

[37] Nakakoji Kumiyo Yasuhiro Yamamoto Yoshiyuki Nishinaka Kouichi Kishida eYunwen Ye Evolution patterns of open-source software systems and communitiesEm IWPSE rsquo02 Proceedings of the International Workshop on Principles of SoftwareEvolution paacuteginas 76ndash85 New York NY USA 2002 ACM Press ISBN 1581135459httpdxdoiorg101145512035512055 23

[38] Rahman Foyzur Christian Bird e Premkumar Devanbu Clones What is that smellEmpirical Software Engineering 17(4-5)503ndash530 2012 24

[39] Chacon Scott Pro Git Apress Berkely CA USA 1st ediccedilatildeo 2009ISBN 1430218339 9781430218333 25

[40] Cavalcanti Thiago Gomes e Viniacutecius Correa de Almeida Caracterizaccedilatildeo do uso deconstruccedilotildees da linguagem java em projetos open-source Publicaccedilatildeo online 2016httpbdmunbbrhandle1048315733 27

50

[41] Parr Terence Language Implementation Patterns Create Your Own Domain-Specific and General Programming Languages Pragmatic Bookshelf 1st ediccedilatildeo 2009ISBN 193435645X 9781934356456 27

[42] Janssen Thorben 5 reasons to use jpa hibernate Publicaccedilatildeo online httpswwwsitepointcom5-reasons-to-use-jpa-hibernate 27

[43] Franklin Lyle Alex Gyori Jan Lahoda e Danny Dig Lambdaficator From imperativeto functional programming through automated refactoring Em Proceedings of the2013 International Conference on Software Engineering ICSE rsquo13 paacuteginas 1287ndash1290 Piscataway NJ USA 2013 IEEE Press ISBN 978-1-4673-3076-3 httpdlacmorgcitationcfmid=24867882486986 29

[44] Google Agera httpsgithubcomgoogleagerawiki 34

[45] Eclipse Eclipse vertx httpvertxio 35

[46] Cejas Fernando Android cleanarchitecture httpsgithubcomandroid10Android-CleanArchitecture 36

[47] ReactiveX Rxjava httpsgithubcomReactiveXRxJava 37

[48] Luontola Esko Retrolambda httpsgithubcomorfjackalretrolambda 43

51

Anexo I

Projetos utilizados

fastjson

platform_frameworks_base

netty

material-dialogs

kotlin

okhttp

tinker

AndroidUtilCode

RxJava

spring-boot

java-design-patterns

elasticsearch

ExoPlayer

kafka

vertx

realm-java

guava

zipkin

bazel

stetho

Signal-Android

glide

agera

fresco

plaid

presto

libgdx

spark

52

disruptor

lottie-android

flexbox-layout

PocketHub

zxing

spring-framework

deeplearning4j

dropwizard

interviews

BaseRecyclerViewAdapterHelper

uCrop

DanmakuFlameMaster

lottie-react-native

android-UniversalMusicPlayer

AndroidInterview-Q-A

greenDAO

retrofit

MaterialDrawer

BottomBar

druid

MPAndroidChart

Hystrix

guice

recyclerview-animators

dubbo

androidannotations

RxJava-Android-Samples

PhotoView

clojure

CircleImageView

AndroidSwipeLayout

jedis

MaterialViewPager

butterknife

junit4

RxBinding

leakcanary

SimianArmy

picasso

UltimateRecyclerView

53

AndroidViewAnimations

AppIntro

FizzBuzzEnterpriseEdition

ion

cheesesquare

physical-web

RxAndroid

Android-CleanArchitecture

Calligraphy

Android-Bootstrap

iosched

Android_Data

MaterialDesignLibrary

ListViewAnimations

EventBus

java8-tutorial

AndroidSlidingUpPanel

dagger

okhttputils

logger

HomeMirror

Material-Animations

android-Ultra-Pull-To-Refresh

android-async-http

Android-ObservableScrollView

Android-Universal-Image-Loader

ActionBarSherlock

SlidingMenu

storm

PagerSlidingTabStrip

Android-PullToRefresh

54

  • Dedicatoacuteria
  • Agradecimentos
  • Resumo
  • Abstract
  • Introduccedilatildeo
    • Contexto
    • Objetivos
      • Objetivos Gerais
      • Objetivos Especiacuteficos
        • Metodologia
        • Organizaccedilatildeo do Trabalho
          • Evoluccedilatildeo e Mineraccedilatildeo de Repositoacuterios de Software
            • Evoluccedilatildeo de Software
            • MSR Mineraccedilatildeo de dados e a Engenharia de Software
              • Classificaccedilatildeo
                • Trabalhos Relacionados
                  • Java SE 8 e JDK 8
                    • Histoacuterico
                    • Princiacutepios
                    • Evoluccedilatildeo
                    • Expressotildees Lambda
                      • Sintaxe
                      • Principais formas de uso
                          • Estudo e o Processo de Mineraccedilatildeo
                            • Questotildees de Pesquisa
                            • Fonte de Dados e Objetos de Estudo
                            • Processo de Mineraccedilatildeo
                              • static-analysis
                              • BDAnalisador
                                • Classificaccedilatildeo e Anaacutelise
                                  • Meacutedia de Lambda
                                  • Anaacutelise Temporal
                                  • Refatoraccedilatildeo de Coacutedigo
                                  • Casos de Uso
                                      • Resultados Obtidos e Anaacutelise
                                        • Visatildeo Geral
                                          • Projetos Selecionados
                                          • agera
                                          • vertx
                                          • Android-CleanArchitecture
                                          • RxJava
                                          • guava
                                            • Refatoraccedilatildeo de Coacutedigo
                                            • Estudos de Caso
                                              • Consideraccedilotildees Finais
                                              • Referecircncias
                                              • Anexo
                                              • Projetos utilizados

4

Listagem 310 Exemplo de interface funcional

Dessa forma conforme as Listagens 311 e 312 o meacutetodo apply() pode tomar formade qualquer operaccedilatildeo entre dois Double que seraacute especificada quando a expressatildeo lambdafor montada dando o aspecto de linguagem funcional agrave linguagem e mais facilidade eliberdade ao desenvolvedor

1 pub l i c c l a s s Ca l cu la to r 2 pub l i c s t a t i c Double c a l c ( Double op1 Double op2 DoubleOp operator ) 3 re turn operator apply ( op1 op2 ) 4 5

Listagem 311 Exemplo de aplicaccedilatildeo da interface funcional

1 Double r e s u l t 1 = Ca lcu la to r c a l c (10d 50d ( a b ) minusgt a + b)

Listagem 312 Uso de expressatildeo lambda para o exemplo anterior

Collections

Dentre as atualizaccedilotildees de pacotes do Java 8 foi adicionado um meacutetodo stream() nainterface Collection Esse meacutetodo trata as Collection como streams o que significa queapesar de natildeo ser possiacutevel acessar elementos diretamente algumas novas manipulaccedilotildeessatildeo possiacuteveis Essas manipulaccedilotildees satildeo na verdade meacutetodos da interface Stream quepodem receber como paracircmetro uma expressatildeo lambda ou seja um comportamento a seraplicado agrave Collection Dentre os meacutetodos temos

bull filter() O meacutetodo filter() recebe uma expressatildeo lambda contendo uma condiccedilatildeopara filtragem da collection

bull map() O meacutetodo map() mapeia os elementos de uma Collection em outro objetocomo uma String A expressatildeo lambda passada por paracircmetro deve retornar o tipode objeto ao qual seraacute mapeado

bull forEach() O meacutetodo forEach() aplica uma operaccedilatildeo especiacutefica para cada ele-mento da Collection A expressatildeo lambda a ser passada deve conter a operaccedilatildeo aser realizada

bull min() e max() Os meacutetodos min() e max() retornam o elemento menor ou maiorda Collection dependendo da expressatildeo lambda passada como paracircmetro

20

A Listagem 313 demonstra como vaacuterias operaccedilotildees com uma Collection podem seraplicadas de uma vez de forma que lendo a expressatildeo lambda jaacute eacute possiacutevel saber oresultado da aplicaccedilatildeo do meacutetodo agrave Collection

1 r o s t e r2 stream ( )3 f i l t e r (4 p minusgt p getGender ( ) == Person Sex MALE5 ampamp p getAge ( ) gt= 186 ampamp p getAge ( ) lt= 25)7 map(p minusgt p getEmailAddress ( ) )8 forEach ( emai l minusgt System out p r i n t l n ( emai l ) )

Listagem 313 Exemplo de utilizaccedilatildeo de meacutetodos de stream com expressotildees lambda [30]

21

Capiacutetulo 4

Estudo e o Processo de Mineraccedilatildeo

A definiccedilatildeo da metodologia utilizada para realizaccedilatildeo deste trabalho eacute importante para queexista uma padronizaccedilatildeo e melhor entendimento de como os resultados foram obtidos paraque a replicaccedilatildeo do mesmo possa ser realizada em trabalhos futuros [36]

Figura 41 Processo utilizado para realizaccedilatildeo do estudo

O esquema representado na Figura 41 descreve o processo seguido para a realizaccedilatildeodeste trabalho que foi divido em trecircs grandes etapas a de planejamento definindo osobjetivos questotildees de pesquisa e meios de investigaccedilatildeo deste projeto a etapa de execuccedilatildeorealizando todo o procedimento metodoloacutegico definido para a coleta e refinamento de

22

dados e a etapa de avaliaccedilatildeo onde foram classificados e avaliados os dados coletadospara responder agraves questotildees de pesquisa

A seguir na primeira seccedilatildeo seratildeo apresentadas em detalhes as questotildees de pesquisa aserem respondidas Em seguida seraacute feito uma breve descriccedilatildeo da fonte de dados utilizada- especificamente os projetos utilizados como objetos de estudo deste trabalho e por fimtodo o restante da metodologia que foi de fato desenvolvida para obter os resultadosnecessaacuterios

41 Questotildees de Pesquisa

Com o objetivo de entender e caracterizar melhor o uso de expressotildees lambda foramdefinidas as seguintes questotildees de pesquisa a serem respondidas

bull PQ-1 Quando os projetos comeccedilaram a introduzir o uso de expressotildees lambda emseus coacutedigos e qual a meacutedia de expressotildees lambda por snapshots caso existam

bull PQ-2 Como as equipes de desenvolvimento estatildeo utilizando expressotildees lambdaatraveacutes de refatoraccedilatildeo de coacutedigo ou introduzindo apenas em coacutedigo novo

bull PQ-3 Quais satildeo os padrotildees tipicamente adotados para o uso de expressotildees lambda

A primeira pergunta de pesquisa gira em torno de como projetos populares open-sourceestatildeo se adaptando agrave introduccedilatildeo de expressotildees lambda em Java muitos projetos jaacute estatildeoutilizando as expressotildees lambda Se sim a partir de quando comeccedilaram a utilizaacute-lasdesde o iniacutecio da introduccedilatildeo das mesmas no Java 8 ou em um periacuteodo mais tardio Aleacutemdisso eacute interessante descobrir se a utilizaccedilatildeo dessa nova caracteriacutestica tem acontecido deforma expressiva ou natildeo

Em seguida para melhor entender a forma como as expressotildees lambda estatildeo sendointroduzidas em projetos eacute interessante investigar se as equipes de desenvolvimento estatildeose preocupando em refatorar coacutedigo com o objetivo de evoluir o software ou se estatildeoexperimentando utilizar expressotildees lambda apenas em coacutedigo novo introduzido

Como a introduccedilatildeo de novas funcionalidades em projetos open-source de grande escaladepende do objetivo do projeto e os padrotildees de projeto utilizados [37] espera-se obser-var diversas abordagens quanto a utilizaccedilatildeo de expressotildees lambda para entatildeo poderclassificar estes softwares quanto a abordagem utilizada

Eacute de grande importacircncia para este estudo conseguir identificar na praacutetica comoexpressotildees lambda estatildeo sendo tipicamente adotadas nestes projetos Assim a terceirapergunta de pesquisa busca identificar alguns exemplos de utilizaccedilatildeo atraveacutes da realizaccedilatildeode alguns estudos de caso

23

Eacute importante ressaltar que apesar de as expressotildees lambda serem uma alternativa aouso de AIC elas natildeo os substituem completamente Existem precondiccedilotildees para que umaAIC possa ser substituiacuteda por expressotildees lambda [12] descritas a seguir

bull AIC deve instanciar-se de uma interface

bull AIC natildeo deve possuir nenhum campo e declarar apenas um meacutetodo

bull AIC natildeo deve possuir uma referecircncia para this ou super

bull AIC natildeo deve declarar um meacutetodo recursivo

Para responder agrave primeira pergunta apenas dados gerais sobre todos os projetos seratildeonecessaacuterios ao passo que pelas perguntas 2 e 3 possuiacuterem uma natureza mais complexaseraacute necessaacuterio aleacutem de uma anaacutelise geral estatiacutestica a realizaccedilatildeo de alguns estudos decaso para obter resultados mais completos

42 Fonte de Dados e Objetos de Estudo

Para responder agraves perguntas de pesquisa estabelecidas foram selecionados os 99 projetosmais populares na linguagem Java dentro da plataforma github ateacute a data da coleta dosdados feita em Abril de 2017 Satildeo considerados populares os repositoacuterios que possuema maior quantidade possiacutevel de estrelas (stars) A decisatildeo de escolher os 99 projetos maispopulares foi por sua natureza imparcial e ao mesmo tempo para que se possa analisarprojetos que satildeo de familiaridade e conhecimento da comunidade do github e de domiacuteniopuacuteblico Os 99 projetos estatildeo listados no Anexo I

Para entender a transiccedilatildeo feita por esses projetos entre as versotildees anteriores do Java eo Java 8 com as expressotildees lambda eacute necessaacuterio analisar o coacutedigo de vaacuterias versotildees a fimde observar alguma mudanccedila para cada projeto Como satildeo 99 projetos e vaacuterios dessesprojetos possuem milhares de linhas de coacutedigo e commits seria impossiacutevel avaliar todosos commits Optou-se entatildeo por coletar snapshots mensais de cada projeto conformeprocedimento tambeacutem seguido anteriormente [38] Cada snapshots representa o estadodo projeto em um determinado mecircs e como criteacuterio de escolha padratildeo todos os snapshotsequivalem ao uacuteltimo commit realizado no determinado mecircs que este representa

O proacuteximo passo eacute determinar o periacuteodo de tempo em que esses snapshots seriamcoletados Como Java 8 (e consequentemente as expressotildees lambda) foi introduzidoapenas em meados de 2014 [28] coletar dados de projetos a partir de um periacuteodo muitoantes deste ano natildeo agregaria valor ao estudo em questatildeo Definiu-se entatildeo um periacuteodopara a coleta mensal desses snapshots atraveacutes dos anos Janeiro de 2013 um ano antesda introduccedilatildeo do Java 8 para que se pudesse identificar para todos os projetos o mecircs

24

exato em que expressotildees lambda foram introduzidas ateacute o mecircs da coleta de dados Abrilde 2017

Eacute importante ressaltar que a definiccedilatildeo dos meses foi definida do dia primeiro de ummecircs ao dia primeiro do proacuteximo mecircs e por consequecircncia alguns snapshots que deveriamrepresentar o final de determinado mecircs correspondem na verdade a commits realizadosno dia primeiro do mecircs seguinte Por exemplo pode existir casos em que o commit querepresente o mecircs de Marccedilo de 2016 seja na verdade o commit realizado no dia primeirode Abril de 2016 Isso se deve a natureza da forma como os resultados de log de commitssatildeo obtidos pelo git [39] Poreacutem isso natildeo interfere nas anaacutelises ou no propoacutesito destetrabalho uma vez que foram realizadas verificaccedilotildees e validaccedilotildees para que natildeo existamdatas repetidas (e consequentemente commits repetidos) por repositoacuterio

Neste trabalho o termo projeto e repositoacuterio foram utilizados de forma intercaladapara representar a mesma coisa o software desenvolvido que possui um repositoacuterio naplataforma github Os termos commit snapshops e versotildees tambeacutem representam a mesmacoisa uma vez que foi definido que seriam utilizados apenas um commit por mecircs pararepresentar um determinado snapshot ou versatildeo do repositoacuterio em questatildeo

Todos os 99 projetos seratildeo utilizados para a realizaccedilatildeo de uma anaacutelise geral de ca-racterizaccedilatildeo do uso de expressotildees lambda Para as anaacutelises aprofundadas foi feito umcriteacuterio de classificaccedilatildeo para que apenas alguns projetos possam ser analisados em niacutevelde coacutedigo como estudos de caso

Resumindo foram escolhidos os 99 projetos mais populares de Java no github cole-tando dados mensais de seus commits a partir do ano de 2013 ateacute a data da coleta dosdados lembrando que nem todos os projetos existem desde 2013 (projetos mais recentes)

43 Processo de Mineraccedilatildeo

A abordagem utilizada para coletar e analisar os 99 projetos escolhidos como mostra aFigura 42 foi realizada de forma automatizada utilizando scripts python e dois projetosdesenvolvidos em Java para a coleta e tratamento de dados como descrito a seguir

Primeiramente foi realizado uma coacutepia dos repositoacuterios atuais de todos os 99 projetosmais populares do github em Java Para automatizar o processo foi desenvolvido umscript em python que lista todos os projetos escolhidos clona todos os repositoacuterios emuma pasta na maacutequina local e cria um arquivo temporaacuterio com as informaccedilotildees do nomede cada repositoacuterio e seu caminho absoluto na maacutequina local

25

Figura 42 Metodologia implementada para coleta e tratamento de dados

Em seguida foi necessaacuterio realizar o checkout de todas as versotildees entre Janeiro de2013 a Abril de 2017 de cada projeto Por motivos de otimizaccedilatildeo de espaccedilo da maacutequinalocal e automatizaccedilatildeo no processo de checkout utilizou-se de um segundo script pythonque realizava as seguintes tarefas para cada mecircs em cada projeto verificar se dentreo mecircs estipulado houve algum commit para aquele projeto se sim pega-se o hash douacuteltimo commit do mecircs realiza o checkout conta-se a quantidade de linhas de coacutedigo emJava que o projeto tem utilizando a biblioteca cloc e armazena todas as informaccedilotildeespertinentes referentes a todos os projetos que naquele mecircs tiveram commits para que oprojeto static-analysis possa entatildeo ser executado sobre esses projetos naquele determinadomomento As informaccedilotildees coletadas que satildeo utilizadas pelo static-analysis correspondemao nome do projeto o hash do commit para aquela versatildeo a pasta onde o projeto estaacutearmazenado na maacutequina local a quantidade de linhas de coacutedigo Java do projeto e datareferente ao commit Essas informaccedilotildees satildeo pertinentes para que o projeto static-analysisconsiga funcionar de forma correta projeto este descrito em detalhes a seguir

431 static-analysis

O static-analysis foi um projeto desenvolvido anteriormente a este trabalho pelos alunosThiago Cavalcanti e Vinicius de Almeida cujo objetivo eacute realizar a anaacutelise estaacutetica de

26

coacutedigos-fonte Java e gerar arquivos de saiacuteda contendo informaccedilotildees de classes e meacutetodoscom suas devidas ocorrecircncias de caracteriacutesticas da linguagem [40]

A anaacutelise estaacutetica de coacutedigo consiste em analisar um coacutedigo-fonte sem a necessidadede executaacute-lo Esse tipo de anaacutelise eacute de extrema importacircncia para manter um coacutedigo dequalidade evitar futuras refatoraccedilotildees e obter informaccedilotildees estatiacutesticas de forma raacutepida epraacutetica [41]

Seguindo esse princiacutepio o static-analysis foi projetado para receber um arquivo deentrada csv seguindo o padratildeo

Tipo da Aplicaccedilatildeo Inicio do projeto Antes ou Apoacutes Java 5 Nome do ProjetoVersatildeo Caminho absolutoQuantidade de linhas de coacutedigo

Atraveacutes da informaccedilatildeo do caminho absoluto do projeto o static-analysis varre osdiretoacuterios em busca dos arquivos fonte java realiza o parse desses arquivos e utilizade Visitors para extrair as informaccedilotildees desejadas e exporta-las em arquivos csv Ouso de Visitors permite que sejam escolhidas as informaccedilotildees desejadas para a consultacomo expressotildees Lambda e AIC s aleacutem de possibilitar que sejam implementados novosVisitors conforme a linguagem evolua ou as necessidades mudem

Para este trabalho foram utilizados os Visitors de expressotildees Lambda map() filter()AICs e declaraccedilotildees de meacutetodos

432 BDAnalisador

Apoacutes obter todas as informaccedilotildees necessaacuterias geradas pelo static-analysis era preciso ma-nipular os dados de forma que facilitasse a coleta de dados para o estudo proposto Comovaacuterios arquivos em formato csv satildeo de difiacutecil manipulaccedilatildeo foi desenvolvido entatildeo umaferramenta chamada BDAnalisador Esta ferramenta eacute responsaacutevel por processar os arqui-vos em csv gerados pelo static-analysis e popular uma base de dados relacional MySQLcom as informaccedilotildees pertinentes a este estudo

O BDAnalisador foi desenvolvido com a intenccedilatildeo de tornar mais simples o trabalhocom os dados resultantes do static-analysis de forma que consultas em SQL pudessemser feitas a ponto de permitir a obtenccedilatildeo de resultados mais complexos Seguindo esseobjetivo o framework Hibernate foi escolhido como ferramenta para persistecircncia devidoa ser um framework jaacute consolidado no mercado e que de forma simples relaciona osobjetos Java ao banco de dados MySQL [42] A divisatildeo de classes foi projetada em quatroentidades Projeto Versao Classe e Metodo cada uma com seus respectivos camposcontendo as informaccedilotildees necessaacuterias para a pesquisa como pode ser visto na Figura 44Eacute importante ressaltar que a tabela de Versao guarda hashs de commits devido agrave escolhade utilizar commits para obter mais informaccedilatildeo de evoluccedilatildeo de coacutedigo em um menor

27

espaccedilo de tempo Aleacutem disso para este trabalho optou-se por persistir todos os meacutetodose classes de cada versatildeo sem se importar com a repeticcedilatildeo desses dados pois a hipoacutetesede haver grandes refatoraccedilotildees entre versotildees poderia comprometer a confiabilidade dasinformaccedilotildees

Figura 43 Diagrama de classes UML do BDAnalisador

Como visto na Figura 43 seguindo parcialmente a arquitetura MVC cada entidadepossui sua respectiva classe DAO(Data Access Object) para persistecircncia dos dados eapenas uma classe Controlador no projeto responsaacutevel pela manipulaccedilatildeo e parse dosdados dos arquivos csv gerados pelo static analysis para serem enviados agraves classes DAOO sistema inicia chamando o meacutetodo inicializar() da classe Controlador Esse meacutetodoeacute responsaacutevel por ler um arquivo de entrada csv que segue o mesmo modelo do arquivo dostatic-analysis citado na seccedilatildeo anterior O arquivo conteacutem os dados de todos os projetose suas respectivas versotildees dessa forma o meacutetodo instancia um objeto da classe Projetoe persiste o projeto no banco de dados Para cada versatildeo encontrada no arquivo deentrada o inicializar() aciona os meacutetodos responsaacuteveis por instanciar e preencher aslistas da classe Classe e Metodo Os meacutetodos responsaacuteveis por preencher as listas varremos arquivos csv gerados pelo static-analysis e fazem o parse das informaccedilotildees relevantescomo nomes dos meacutetodos e quantidades de lambdas para construir os objetos que seratildeogravados Ao final dos preenchimentos o objeto Versatildeo eacute instanciado e gravado no bancode dados atraveacutes de sua classe DAO ao mesmo tempo que grava suas respectivas Classese Metodos

28

Apoacutes vaacuterios testes e correccedilotildees de bugs o banco de dados se encontrava finalmente comas informaccedilotildees de 99 projetos Java open-source separados por um commit por mecircs desde2013 cada um com suas respectivas informaccedilotildees de classes meacutetodos e a quantidade deexpressotildees lambda filters e maps em cada meacutetodo Filter ou Filter pattern eacute o padratildeode projeto que tem como objetivo filtrar objetos de uma coleccedilatildeo (Collection) de acordocom algum criteacuterio Jaacute o map ou map pattern eacute um padratildeo que ldquomapeia os elementosde uma coleccedilatildeo aplicando uma funccedilatildeo a eles para uma nova coleccedilatildeo [43] A coleta deinformaccedilotildees sobre esses padrotildees podem ser uacuteteis para possiacuteveis anaacutelises de oportunidadesde uso de expressotildees lambda para refatoraccedilatildeo de coacutedigo

A Figura 44 mostra o esquema de como o banco de dados resultante foi gerado

Figura 44 Modelo relacional do banco de dados populado pelo BDAnalisador Imagemgerada com software DBeaver [2]

44 Classificaccedilatildeo e Anaacutelise

Com o banco de dados populado restam apenas as etapas de classificaccedilatildeo e anaacutelise pararesponder as questotildees de pesquisa propostas Para isso inicialmente houve uma tentativade se utilizar apenas queries SQL para analisar os dados de acordo com as informaccedilotildeesrelevantes Poreacutem devido ao fato de o banco de dados conter todas as informaccedilotildees detodos os projetos e todas as suas versotildees queries que possuem uma alta complexidadedemoravam muito tempo para retornar os dados

Assim com o objetivo de facilitar o trabalho alguns scripts python foram desenvolvi-dos para rodar as queries separadamente e individualmente para cada projeto de formaautomatizada a fim de melhorar o tempo de resposta para obtenccedilatildeo dos resultados

29

441 Meacutedia de Lambda

O primeiro script retorna a quantidade de expressotildees lambda (ou AICs) por n snapshotsque contenha expressotildees lambda O objetivo eacute ter uma visatildeo geral da meacutedia de expressotildeeslambda e AICs utilizadas por cada projeto e como nem todos os snapshots coletados decada projeto possuem expressotildees lambda e AICs apenas aqueles com alguma expressatildeolambda ou AIC satildeo incluiacutedos no caacutelculo da meacutedia

Mmedia =sumn qtdLambdai

n

442 Anaacutelise Temporal

O segundo script retorna para cada projeto a soma total da quantidade de expressotildeeslambda AIC map() e filter() no projeto inteiro para cada versatildeo Ou seja tem-seo total de cada uma das quatro propriedades selecionadas para cada mecircs do projetoobtendo assim uma visatildeo temporal de evoluccedilatildeo do uso das caracteriacutesticas descritas ATabela 41 ilustra parcialmente o resultado obtido para o projeto agera onde idVersaoeacute o identificador no banco de dados referente ao hash do commit mensal coletado qtd eacutea quantidade de cada uma das caracteriacutesticas escolhidas e a data do commit encontra-seno formato americano

Tabela 41 Informaccedilotildees mensais sobre o projeto ageraidVersao Data do Commit qtd lambda qtd AIC qtd maps qtd filter

823 512016 0 29 4 0755 612016 13 28 4 0686 6152016 13 29 4 0621 812016 13 29 4 0555 8162016 13 30 4 0485 922016 13 30 4 0422 10132016 14 30 4 0356 11282016 14 30 4 0295 12212016 21 30 5 0232 212017 21 30 5 0175 312017 21 30 5 0112 3312017 21 36 5 048 4242017 21 48 5 0

Os resultados obtidos com esta anaacutelise temporal permitiu a identificaccedilatildeo de padrotildees nautilizaccedilatildeo de expressotildees lambda em relaccedilatildeo a utilizaccedilatildeo de AIC por todos os projetos Foi

30

possiacutevel classificar todos os projetos em 6 grupos ilustrado na Figura 45 Primeiramenteseparou-se os projetos entre os que possuem expressotildees lambda e os que natildeo possuemDentre os que possuem identificou-se cinco categorias

1 Grupo 1 Quantidade de AICs e expressotildees lambda aumentam com o tempo pro-porcionalmente

2 Grupo 2 Quantidade de AICs diminui agrave medida que a quantidade de expressotildeeslambda aumentam e a quantidade de expressotildees lambda ultrapassa a quantidade deAIC em um determinado momento

3 Grupo 3 Quantidade de AICs diminui agrave medida que a quantidade de expressotildeeslambda aumentam mas a quantidade de AIC permanece superior agrave quantidade delambda

4 Grupo 4 Expressotildees lambda satildeo introduzidas e existem por um pequeno periacuteodode tempo mas satildeo completamente removidas posteriormente

5 Grupo 5 Quantidade de expressotildees lambda eacute constante e muito inferior compa-rado com a quantidade de AICs no projeto Foi determinado que para pertencera esta classificaccedilatildeo o projeto precisa ter uma razatildeo de meacutedia de expressotildees lamb-dasnapshot por meacutedia de AICsnapshot inferior a 020 Esse paracircmetro foi esta-belecido com o objetivo de definir um padratildeo para o que pode ser considerado umprojeto com poucas expressotildees lambda

Figura 45 Classificaccedilatildeo dos projetos

31

443 Refatoraccedilatildeo de Coacutedigo

O uacuteltimo script teve como objetivo realizar uma tentativa inicial de identificar refatoraccedilatildeode coacutedigo da seguinte maneira para todos os projetos que possuem expressotildees lambdaforam identificados o mecircs imediatamente antes da introduccedilatildeo de expressotildees lambda e omecircs seguinte onde houve a primeira ocorrecircncia de lambda no projeto Assim realizou-se uma anaacutelise do tamanho em quantidade de linhas de coacutedigo de todos os meacutetodosdo projeto que no mecircs seguinte tiveram introduccedilatildeo de lambda Em seguida fez-se umacomparaccedilatildeo com os mesmos meacutetodos em relaccedilatildeo ao mecircs anterior e assim foi possiacuteveldetectar quais meacutetodos tiveram a quantidade de linhas de coacutedigo reduzidas o que seriaum indicativo natildeo necessariamente exclusivo de que uma refatoraccedilatildeo de coacutedigo possa terocorrido

Sabe-se que este meacutetodo de detecccedilatildeo de refatoraccedilatildeo de coacutedigo possui suas limitaccedilotildeesuma vez que as comparaccedilotildees para saber se um meacutetodo existe em ambas versotildees eacute feitopuramente por comparaccedilatildeo de String (nome do meacutetodo) e a classe que este pertence

444 Casos de Uso

Os meacutetodos descritos acima ajudaram a identificar alguns padrotildees e facilitar a anaacutelise dosdados Poreacutem natildeo satildeo suficientes para que se possa responder agraves questotildees de pesquisaDessa forma apoacutes a identificaccedilatildeo dos grupos de classificaccedilatildeo para os projetos foramescolhidos um projeto de cada grupo (com exceccedilatildeo do grupo dos projetos sem expressotildeeslambda) para realizar um breve estudo de caso com o objetivo de identificar e caracterizarmelhor a adoccedilatildeo de expressotildees lambda Os projetos escolhidos foram agera vertxAndroid-CleanArchitecture RxJava e guava

32

Capiacutetulo 5

Resultados Obtidos e Anaacutelise

Neste capiacutetulo seratildeo apresentados os dados obtidos e anaacutelise com o objetivo de responderagraves questotildees de pesquisa propostas Como mencionado anteriormente as perguntas seratildeorespondidas de duas maneiras algumas com informaccedilotildees gerais sobre todos os projetose outras com breve estudos de caso envolvendo cinco projetos

51 Visatildeo Geral

Dentre os repositoacuterios coletados para a anaacutelise 74 (7474) natildeo utilizaram nenhumaexpressatildeo lambda no projeto durante todo o periacuteodo analisado (Janeiro de 2013 a Abrilde 2017) restando apenas 25 repositoacuterios (2525) com expressotildees lambda Eacute interessantedestacar que apesar de a quantidade de repositoacuterios que natildeo possuem expressotildees lambdaser relativamente expressiva muitos destes repositoacuterios satildeo de projetos em Java que umdia foram populares e atualmente natildeo estatildeo sendo mais desenvolvidos (por exemplo umaplicativo que soacute funciona para Android 23 atualmente descontinuado)

Levando em consideraccedilatildeo apenas os projetos que possuem expressotildees lambda exis-tem dois tipos de dados que podem ser analisados para responder agrave primeira questatildeo depesquisa atraveacutes dos dados obtidos pelo meacutetodo anteriormente mencionado como anaacutelisetemporal e a meacutedia de lambda por snapshot mencionados no capiacutetulo anterior

Com relaccedilatildeo ao ano em que a primeira ocorrecircncia foi encontrada 6 projetos introduzi-ram expressotildees lambda jaacute em 2014 8 comeccedilaram a utilizar em 2015 7 em 2016 e apenas4 tiveram a primeira ocorrecircncia de expressotildees lambda em 2017 Dessa forma percebe-seque os projetos estatildeo relativamente bem distribuiacutedos em grupos quanto ao ano em que seintroduziu expressotildees lambda

Pela meacutedia de lambda por snapshot (lambdasnapshot) a maioria (11 projetos) possuiuma quantidade expressiva acima de 100 lambdasnapshot (com 6 projetos entre 20 e 100lambdasnapshot e 8 projetos com menos de 20 lambdasnapshot) como apresentados no

33

graacutefico da Figura 51 Isso mostra que essa nova caracteriacutestica jaacute estaacute sendo bem utilizadanos projetos que comeccedilaram a migrar para a nova versatildeo do Java

Figura 51 Graacuteficos dos projetos separados por ano de introduccedilatildeo de expressotildees lambdae meacutedia de lambda por snapshot

Com isso pode-se observar que apesar de a quantidade de projetos que possuemexpressotildees lambda natildeo ser tatildeo alta eacute possiacutevel obter resultados expressivos uma vez quea quantidade dos projetos com lambda estatildeo bem dispersos quanto ao periacuteodo em quecomeccedilaram a adotar essa caracteriacutestica e a quantidade de expressotildees lambda por snapshot

511 Projetos Selecionados

Atraveacutes dos grupos de classificaccedilatildeo identificados pela anaacutelise temporal descritos na Figura45 cinco projetos foram selecionados para uma anaacutelise detalhada levando em consideraccedilatildeoo grupo em que eles pertencem Estes projetos seratildeo apresentados a seguir

512 agera

Agera eacute uma biblioteca Android que ajuda a introduzir programaccedilatildeo funcional reativa(functional reactive programming) em projetos Android Eacute um projeto recente lanccediladoem 2016 pela Google [44] e encontra-se no grupo dos projetos que introduziram expressotildeeslambda em 2016 no mesmo ano de seu lanccedilamento contendo uma meacutedia de expressotildeeslambda de 16 lambdasnapshot

Na classificaccedilatildeo estabelecida agera pertence ao Grupo 1 onde a quantidade de ex-pressotildees lambda no projeto com o tempo aumentam juntamente com a quantidade deAICs como mostra o graacutefico de anaacutelise temporal na Figura 52

34

Figura 52 Graacuteficos de anaacutelise temporal do projeto agera

513 vertx

Eclipse Vertx eacute um conjunto de ferramentas para criaccedilatildeo de reactive applications namaacutequina virtual Java (JVM) em grande escala [45] Seu primeiro lanccedilamento aconteceuem 2011 e a primeira ocorrecircncia de expressotildees lambda no projeto aconteceu em 2014 Esteprojeto possui uma meacutedia de 2867 lambdasnapshot e dentre os projetos consideradosneste trabalho eacute o que possui a maior quantidade de expressotildees lambda

Este projeto pertence ao Grupo 2 onde a quantidade de expressotildees lambda aumen-tou consideravelmente pelos meses ultrapassando a quantidade de AICs que diminuiudrasticamente como mostra a Figura 53

35

Figura 53 Graacuteficos de anaacutelise temporal do projeto Vertx

514 Android-CleanArchitecture

Apesar de ser uma amostra de projeto Android-CleanArchitecture que tem como objetivoconstruir aplicaccedilotildees Android utilizando clean architecture foi lanccedilado em 2014 mas semanteacutem sempre atualizado [46]

A introduccedilatildeo de expressotildees lambda que aconteceu no ano de 2015 se deu de formatiacutemida com uma meacutedia de 35 lambdasnapshot De qualquer forma este projeto conseguerepresentar com seu graacutefico de anaacutelise temporal o grupo 3 composto por projetos em quea quantidade de expressotildees lambda aumentou mas sem ultrapassar AICs que diminuiacuteramdemonstrado no graacutefico da Figura 54

36

Figura 54 Graacuteficos de anaacutelise temporal do projeto Android-CleanArchitecture

515 RxJava

Dentre os repositoacuterios estudados RxJava eacute considerado o mais popular Como umaimplementaccedilatildeo de Reactive Extensions para a JVM RxJava teve seu lanccedilamento dadoem 2013 [47] Expressotildees lambda apareceram pela primeira vez no ano de 2015 comuma meacutedia de 766 lambdasnapshot

Apesar de uma meacutedia relativamente alta o tempo de vida das expressotildees lambda nesteprojeto foi bem curto caracterizando assim projetos do grupo 4 houve a introduccedilatildeo dasexpressotildees lambda no projeto poreacutem houve a remoccedilatildeo completa de todas as expressotildeeslambda previamente introduzidas desaparecendo completamente do projeto ateacute a datada coleta de dados (Figura 55)

37

Figura 55 Graacuteficos de anaacutelise temporal do projeto RxJava

516 guava

Guava eacute um conjunto de bibliotecas para Java da Google lanccedilado em 2011 A atualizaccedilatildeodo coacutedigo do projeto para Java 8 aconteceu somente em 2016 e apesar do projeto conteruma meacutedia de 281 lambdasnapshot ele foi escolhido como representante dos projetosdo Grupo 5 (Figura 56) que possuem expressotildees lambda mas de forma natildeo expressiva osuficiente quando comparado com a quantidade de AIC pelo fato de sua razatildeo de meacutedia delambdasnapshot por meacutedia de AICsnapshot ser 004 Ou seja embora o projeto tenhaexpressotildees lambda estas satildeo consideradas muito poucas quando inseridas no contextogeral deste projeto que eacute considerado um projeto grande

38

Figura 56 Graacuteficos de anaacutelise temporal do projeto Guava

52 Refatoraccedilatildeo de Coacutedigo

Com o objetivo de caracterizar melhor como as expressotildees lambda estatildeo sendo utilizadaseacute interessante identificar se estas estatildeo sendo introduzidas atraveacutes de refatoraccedilatildeo de coacutedigoou em coacutedigo novo

Os projetos classificados como pertencentes ao Grupo 2 possuem em comum o fatode expressotildees lambda aumentarem a medida que AICs diminuem ultrapassando-as eessa caracteriacutestica em comum pode indicar que nestes projetos possivelmente houve re-fatoraccedilatildeo de coacutedigo visto que AIC sendo substituiacutedo por expressotildees lambda dentro dascondiccedilotildees determinadas eacute a maneira mais comum de se identificar refatoraccedilatildeo de coacute-digo para introduccedilatildeo de expressotildees lambda [12] Os projetos que compotildeem o grupo 2representam 44 de todos os projetos estudados que possuem expressotildees lambda o quepode ser um indicativo caso a hipoacutetese de refatoraccedilatildeo de coacutedigo seja positiva de quemuitos projetos que estatildeo adotando o Java 8 estatildeo se preocupando de alguma formacom refatoraccedilatildeo se coacutedigo Fazem parte desse grupo os seguintes projetos elasticsearchjava-design-patterns PocketHub presto RxJava-Android-Samples spark vertx zipkinjava8-tutorial dropwizard e material-dialogs

39

Outra maneira de verificar possiacuteveis indicadores de refatoraccedilatildeo de coacutedigo foi atraveacutesda anaacutelise dos tamanhos (em quantidade de linhas de coacutedigo) dos meacutetodos com expressotildeeslambda no mecircs em que se introduziu expressotildees lambda e um mecircs imediatamente antesdeste Essa anaacutelise mostra que dos 25 projetos com expressotildees lambda 12 (48) projetostiveram ao menos um meacutetodo em que houve uma diminuiccedilatildeo no tamanho o que podeser considerado um indicativo de refatoraccedilatildeo de coacutedigo A Figura 57 mostra todos osprojetos em relaccedilatildeo agrave quantidade total de meacutetodos que possuem lambda no primeiro mecircsde introduccedilatildeo do mesmo em vermelho comparado com a quantidade desses meacutetodos quetiveram uma diminuiccedilatildeo no tamanho quando comparados com o coacutedigo do mecircs anteriorem azul

Figura 57 Comparaccedilatildeo entre todos os projetos com expressatildeo lambda sobre refatoraccedilatildeode coacutedigo no mecircs de introduccedilatildeo da caracteriacutestica

Ainda observando a figura 57 com relaccedilatildeo aos projetos que natildeo tiveram nenhummeacutetodo com diminuiccedilatildeo de tamanho (barra azul) percebe-se que todos os 13 projetossequer tiveram uma quantidade significativa de meacutetodos que possuem expressotildees lambda(com o maior tendo apenas 5 meacutetodos) no mecircs de introduccedilatildeo da caracteriacutestica no projetoe ao mesmo tempo jaacute existiam no mecircs em que natildeo existia lambda no projeto Essa eacuteuma observaccedilatildeo importante porque projetos como vertx sendo este o que possui a maiormeacutedia de lambdasnapshot de todos os projetos e ao mesmo tempo tendo apenas trecircsmeacutetodos que continham expressotildees lambda no mecircs da introduccedilatildeo e que existiam no mecircs

40

anterior permitem inferir que todas as outras expressotildees lambda existentes no projetopara este determinado mecircs de introduccedilatildeo encontram-se em coacutedigo novo introduzido

Eacute importante ressaltar que somente essa anaacutelise natildeo eacute exclusivamente suficiente paradeterminar se estes projetos estatildeo realmente introduzindo lambda em coacutedigo novo ourealizando refatoraccedilatildeo uma vez que como a comparaccedilatildeo aconteceu apenas no mecircs deintroduccedilatildeo com o mecircs imediatamente anterior natildeo reflete todo o ciclo de vida do pro-jeto Por exemplo algumas equipes podem escolher refatorar o coacutedigo depois de umtempo de adaptaccedilatildeo apoacutes a transiccedilatildeo para a nova versatildeo da linguagem Assim paraobter uma melhor anaacutelise sobre refatoraccedilatildeo de coacutedigo ou natildeo feita nestes projetos aleacutemde outras anaacutelises referentes aos padrotildees tipicamente adotados para implementaccedilatildeo delambda nestes projetos seratildeo apresentados a seguir os estudos de caso dos cinco projetospreviamente selecionados

Outro ponto importante eacute o fato de que apesar das informaccedilotildees quanto agraves quantida-des de filter e map terem sido incluiacutedas inicialmente no trabalho para observar possiacuteveispadrotildees de refatoraccedilatildeo de coacutedigo percebeu-se que estas natildeo satildeo utilizadas de forma con-sideraacutevel pelos projetos estudados e para fins de anaacutelises generalizadas natildeo apresentaramtanta influecircncia na utilizaccedilatildeo de expressotildees lambda quanto a quantidade de AICs noprojeto

53 Estudos de Caso

Dentre os projetos analisados verificou-se que os projetos de pequeno e meacutedio porte op-taram por refatorar de uma vez seus coacutedigos para incluir expressotildees lambda em situaccedilotildeesem que se utilizava AICs anteriormente ou em alguns poucos casos de utilizaccedilatildeo deCollection Os projetos de grande porte natildeo apresentaram nenhuma refatoraccedilatildeo de coacute-digo ou uma refatoraccedilatildeo parcial gradativa provavelmente devido agrave grande quantidade dearquivos e coacutedigo que possuem o que pode tornar o trabalho de refatoraccedilatildeo extenso ecansativo

O projeto vertx que pertence ao grupo 2 dos projetos em que a quantidade de ex-pressotildees lambda aumentaram e as de AICs diminuiacuteram com lambda ultrapassando AICsexecutou inicialmente commits em maio de 2014 com adiccedilatildeo de coacutedigo novo utilizandoexpressotildees lambda e apoacutes um mecircs realizou um commit maior com a refatoraccedilatildeo de todasas AICs para expressotildees lambda Apoacutes a refatoraccedilatildeo o projeto se preocupou em mantera utilizaccedilatildeo de expressotildees lambda ao mesmo tempo que o uso de AICs se manteve apenasaos casos de classes com interfaces natildeo funcionais A Figura 58 apresenta uma parte docommit de refatoraccedilatildeo de coacutedigo que mostra em vermelho a parte eliminada do coacutedigo(AIC) e em verde o coacutedigo novo representando a substituiccedilatildeo por uma expressatildeo lambda

41

Figura 58 Commit de refatoraccedilatildeo de coacutedigo do projeto Vertx [3]

Alguns projetos ainda natildeo se preocuparam em refatorar o coacutedigo para o uso de ex-pressotildees lambda ateacute a data deste trabalho que eacute o caso do projeto guava que apresentouum commit em 03112016 com a atualizaccedilatildeo do projeto para Java 8 Mas a partir daatualizaccedilatildeo se preocupou em utilizar as expressotildees lambda apenas na implementaccedilatildeo decoacutedigo novo O cenaacuterio em que a refatoraccedilatildeo natildeo eacute prioridade ainda eacute a realidade de vaacuteriosprojetos de grande porte visto que os dados de projetos sem nenhuma expressatildeo lambdasatildeo o maior nuacutemero neste trabalho Poreacutem projetos que jaacute adotaram a utilizaccedilatildeo do Java8 tendem a mudar isso com o passar do tempo A Figura 59 apresenta em verde umaadiccedilatildeo de coacutedigo novo com expressatildeo lambda sem a eliminaccedilatildeo de algum coacutedigo anteriora esse que estaria em vermelho

42

Figura 59 Exemplo de um arquivo do commit de adiccedilatildeo de coacutedigo novo em Java 8 doprojeto Guava [4]

Na categoria de projetos em que os AICs e expressotildees lambda aumentam proporci-onalmente (grupo 1) o projeto agera realizou um commit em 19052016 com a adiccedilatildeoda biblioteca retrolambda como dependecircncia do projeto Essa biblioteca utilizada prin-cipalmente por projetos Android permite executar coacutedigo Java 8 contendo expressotildeeslambda em Java 5 6 e 7 [48] O commit tambeacutem apresenta refatoraccedilatildeo dos AICs ad-vindos de interfaces funcionais para expressotildees lambda Apesar de o projeto continuar autilizar as expressotildees lambda em seus commits posteriores o nuacutemero de AICs tambeacutemcontinuou a aumentar visualizando os commits posteriores notou-se que esses AICs satildeorelativos a interfaces natildeo funcionais ou seja que possuem mais de um meacutetodo O projetoAndroid-CleanArchitecture eacute similar ao agera pois tambeacutem optou pela instalaccedilatildeo da bi-blioteca retrolambda para uso de expressotildees lambda em seus coacutedigos e como tambeacutem eacuteum projeto de pequeno porte houve uma pequena refatoraccedilatildeo dos AICs A Figura 510mostra a parte do commit de refatoraccedilatildeo de coacutedigo em que o desenvolvedor adiciona abiblioteca retrolambda como dependecircncia

43

Figura 510 Commit de adiccedilatildeo da biblioteca Retrolambda no projeto Agera [5]

Outro caso interessante eacute o do projeto RxJava que em 2015 optou pela refatoraccedilatildeodo coacutedigo para a utilizaccedilatildeo de expressotildees lambda quase eliminando por completo o usode AICs mas que no ano seguinte reverteu os commits de forma que eliminasse comple-tamente o uso de expressotildees lambda para manter a retrocompatibilidade com o Java 6A Figura 511 demonstra uma parte do commit de reversatildeo do coacutedigo para Java 6 emque pode ser visto em vermelho o coacutedigo anterior com expressotildees lambda e o verde como novo coacutedigo utilizando AIC novamente

44

Figura 511 Commit de remoccedilatildeo de Lambdas e volta para o uso de AICs no projetoRXJava [6]

Essa preocupaccedilatildeo com retrocompatibilidade de coacutedigo pode ser um fator crucial nadecisatildeo das equipes de desenvolvimento na hora de decidir como fazer o software co-evoluircom a linguagem sem perder a compatibilidade com versotildees anteriores

45

Capiacutetulo 6

Consideraccedilotildees Finais

Este estudo permitiu entender melhor como projetos estatildeo realizando a migraccedilatildeo para oJava 8 em especial utilizando uma nova caracteriacutestica introduzida expressatildeo lambdaApesar de a maioria dos projetos populares considerados natildeo possuiacuterem nenhuma ocor-recircncia de expressotildees lambda os projetos que tinham expressotildees lambda foram suficientespara realizar um primeiro estudo de caracterizaccedilatildeo no uso desta caracteriacutestica e com osprojetos efetivamente utilizados para estudo foi possiacutevel agrupaacute-los quanto a maneira emque as expressotildees lambda estavam sendo utilizadas quando comparadas com AICs em 5grandes grupos quando AIC e lambda aumentam proporcionalmente quando AIC dimi-nui e lambda aumenta ultrapassando AIC quando AIC diminui mas continua superior aolambda crescente expressotildees lambda que foram introduzidas e retiradas completamentedo coacutedigo e expressotildees lambda que natildeo existem em quantidades expressivas

Foi possiacutevel entatildeo realizar um estudo aprofundado levando em consideraccedilatildeo as di-ferentes maneiras com que as expressotildees lambda foram adotadas nos projetos atraveacutes daescolha de um projeto que representasse cada grupo para anaacutelise Dentre os cinco projetosestudados foi possiacutevel observar alguns padrotildees tipicamente adotados por desenvolvedorespara implementar expressotildees lambda em seus projetos como a utilizaccedilatildeo da bibliotecas(retrolambda) que permitissem uma flexibilizaccedilatildeo na utilizaccedilatildeo de expressotildees lambda oucomo lambda eacute primariamente utilizada para substituir determinados AICs ou operaccedilotildeesem Collection

Aleacutem disso foi possiacutevel observar como a refatoraccedilatildeo de coacutedigo acontece em cada umdesses projetos Observou-se como projetos menores tendem a refatorar coacutedigo maisfacilmente ao passo que projetos maiores e mais complexos fazem menos refatoraccedilatildeo oudemoram mais entre o periacuteodo em que houve a primeira migraccedilatildeo de coacutedigo para a novaversatildeo da linguagem ateacute o periacuteodo em que realmente decidem refatorar coacutedigo Aleacutem dacomplexidade do projeto influenciar na decisatildeo de migrar o projeto para uma versatildeo maisrecente da linguagem a preocupaccedilatildeo com retrocompatibilidade com versotildees anteriores da

46

linguagem tambeacutem podem ser uma barreira para que projetos comecem a evoluir o coacutedigojuntamente com a evoluccedilatildeo da linguagem

Ainda assim foi possiacutevel observar que a preocupaccedilatildeo com a co-evoluccedilatildeo do software-linguagem existe entre os desenvolvedores de projetos mas a realizaccedilatildeo da migraccedilatildeo aindaacontece lentamente devido agrave diversos fatores que precisam ser levados em consideraccedilatildeopara a manutenccedilatildeo do projeto

Para trabalhos e contribuiccedilotildees futuras seria interessante desenvolver uma ferramentaque pudesse analisar diretamente no coacutedigo-fonte as oportunidades de aplicaccedilatildeo de ex-pressotildees lambda dessa forma poderiam ser analisadas as porcentagens de conversatildeo decoacutedigo para Java 8 e obter melhores conclusotildees sobre a importacircncia que os projetos estatildeodando para a evoluccedilatildeo de seus coacutedigos Outro fator interessante seria aplicar mais Visitorsagrave ferramenta static-analysis e fazer este mesmo estudo aplicado agrave outras caracteriacutesticasda linguagem

47

Referecircncias

[1] Kagdi Huzefa Michael L Collard e Jonathan I Maletic A survey and taxonomyof approaches for mining software repositories in the context of software evolution2007 ix 3 8 9 10 11

[2] DBeaver Dbeaver - features httpdbeaverjkissorgdocsfeatures ix 29

[3] Eclipse Vertx commit Java8-ify code httpsgithubcomeclipsevertxcommit93f95e9c77419f442a42fe711b6eeaef88192fd3 ix 42

[4] Google Guava commit Release java 8 changes to guava httpsgithubcomgoogleguavacommit73e382fa877f80994817a136b0adcc4365ccd904 ix 43

[5] Google Agera commit Collapsed testapp with retrolambda httpsgithubcomgoogleageracommit5e518b7b05f9e7a34a314945f68deff7b2c3e334 ix 44

[6] ReactiveX Rxjava commit 2x full jdk 6 compatible backport + includ-ing bugfixes up to today httpsgithubcomReactiveXRxJavacommit000a174d87a901135f9665d3b11f3627fd2dc4ed ix 45

[7] Godfrey M W e D M German The past present and future of software evolutionEm 2008 Frontiers of Maintenance paacuteginas 129ndash138 Sept 2008 1 6

[8] Favre J M Languages evolve too changing the software time scale Em Principles ofSoftware Evolution Eighth International Workshop on paacuteginas 33ndash42 IEEE 20051 5 7

[9] Overbey Jeffrey L e Ralph E Johnson Regrowing a language refactoring tools allowprogramming languages to evolve Em ACM SIGPLAN Notices volume 44 paacuteginas493ndash502 ACM 2009 1 5 7 8 12

[10] Grechanik Mark Collin McMillan Luca DeFerrari Marco Comi Stefano CrespiDenys Poshyvanyk Chen Fu Qing Xie e Carlo Ghezzi An empirical investiga-tion into a large-scale java open source code repository Em Proceedings of the2010 ACM-IEEE International Symposium on Empirical Software Engineering andMeasurement ESEM rsquo10 paacuteginas 111ndash1110 New York NY USA 2010 ACMISBN 978-1-4503-0039-1 httpdoiacmorg10114518527861852801 1

[11] TIOBE Tiobe httpswwwtiobecomtiobe-index 1 14

48

[12] Gyori Alex Lyle Franklin Danny Dig e Jan Lahoda Crossing the gap from im-perative to functional programming through refactoring Em Proceedings of the 20139th Joint Meeting on Foundations of Software Engineering ESECFSE 2013 paacute-ginas 543ndash553 New York NY USA 2013 ACM ISBN 978-1-4503-2237-9 httpdoiacmorg10114524914112491461 2 11 24 39

[13] OpenJDK State of the lambda httpcropenjdkjavanet~briangoetzlambdalambda-state-4html 2

[14] Han Jiawei Micheline Kamber e Jian Pei Data Mining Concepts and TechniquesMorgan Kaufmann Publishers Inc San Francisco CA USA 3rd ediccedilatildeo 2011ISBN 0123814790 9780123814791 3

[15] Fowler Martin e Kent Beck Refactoring improving the design of existing codeAddison-Wesley Professional 1999 5 7

[16] Lehman M M J F Ramil P D Wernick D E Perry e W M Turski Met-rics and laws of software evolution - the nineties view Em Proceedings of the4th International Symposium on Software Metrics METRICS rsquo97 paacuteginas 20ndashWashington DC USA 1997 IEEE Computer Society ISBN 0-8186-8093-8 httpdlacmorgcitationcfmid=823454823901 6

[17] Hassan Ahmed E e Tao Xie Software intelligence The future of mining softwareengineering data Em Proceedings of the FSESDP Workshop on Future of SoftwareEngineering Research FoSER rsquo10 paacuteginas 161ndash166 New York NY USA 2010ACM ISBN 978-1-4503-0427-6 httpdoiacmorg101145188236218823978 9

[18] Hassan Ahmed E The road ahead for mining software repositories Em Frontiers ofSoftware Maintenance 2008 FoSM 2008 paacuteginas 48ndash57 IEEE 2008 8

[19] Berry Michael J e Gordon Linoff Data Mining Techniques For Marketing Salesand Customer Support John Wiley amp Sons Inc New York NY USA 1997ISBN 0471179809 10

[20] Parnin Chris Christian Bird e Emerson Murphy-Hill Java generics adoption hownew features are introduced championed or ignored Em Proceedings of the 8thWorking Conference on Mining Software Repositories paacuteginas 3ndash12 ACM 2011 12

[21] Oracle The java language specification httpsdocsoraclecomjavasespecsjlsse8jls8pdf 13

[22] Oracle The history of java technology httpwwworaclecomtechnetworkjavajavaseoverviewjavahistory-index-198355html 13

[23] Murphy Kieron So why did they decide to call itjava httpwwwjavaworldcomarticle2077265core-javaso-why-did-they-decide-to-call-it-java-html 13

[24] McGraw Tata Object-oriented Programming with Java Essentials and ApplicationsHill Education 13

49

[25] Oracle Differences between java ee and java se httpdocsoraclecomjavaee6firstcupdocgkhoyhtml 13

[26] Lindsey Clark S The History of Java Cambridge 14

[27] Oracle The java language environment httpwwworaclecomtechnetworkjavaintro-141325html 14

[28] Oracle Jdk 8 httpopenjdkjavanetprojectsjdk8 15 24

[29] Oracle Enhancements in java se 8 httpdocsoraclecomjavase8docstechnotesguideslanguageenhancementshtmljavase8 15 16 17

[30] Oracle Lambda expressions httpdocsoraclecomjavasetutorialjavajavaOOlambdaexpressionshtml 16 18 21

[31] Oracle Method references httpdocsoraclecomjavasetutorialjavajavaOOmethodreferenceshtml 16

[32] Oracle Default methods httpdocsoraclecomjavasetutorialjavaIandIdefaultmethodshtml 17

[33] Oracle Repeating annotations httpdocsoraclecomjavasetutorialjavaannotationsrepeatinghtml 17

[34] Oracle Type annotations httpdocsoraclecomjavasetutorialjavaannotationstype_annotationshtml 17

[35] Oracle Anonymous inner classes httpsdocsoraclecomjavasetutorialjavajavaOOanonymousclasseshtml 19

[36] Kothari CR Research Methodology Methods and Techniques New Age Interna-tional (P) Limited 2004 ISBN 9788122415223 httpsbooksgooglecombrbooksid=8c6gkbKi-F4C 22

[37] Nakakoji Kumiyo Yasuhiro Yamamoto Yoshiyuki Nishinaka Kouichi Kishida eYunwen Ye Evolution patterns of open-source software systems and communitiesEm IWPSE rsquo02 Proceedings of the International Workshop on Principles of SoftwareEvolution paacuteginas 76ndash85 New York NY USA 2002 ACM Press ISBN 1581135459httpdxdoiorg101145512035512055 23

[38] Rahman Foyzur Christian Bird e Premkumar Devanbu Clones What is that smellEmpirical Software Engineering 17(4-5)503ndash530 2012 24

[39] Chacon Scott Pro Git Apress Berkely CA USA 1st ediccedilatildeo 2009ISBN 1430218339 9781430218333 25

[40] Cavalcanti Thiago Gomes e Viniacutecius Correa de Almeida Caracterizaccedilatildeo do uso deconstruccedilotildees da linguagem java em projetos open-source Publicaccedilatildeo online 2016httpbdmunbbrhandle1048315733 27

50

[41] Parr Terence Language Implementation Patterns Create Your Own Domain-Specific and General Programming Languages Pragmatic Bookshelf 1st ediccedilatildeo 2009ISBN 193435645X 9781934356456 27

[42] Janssen Thorben 5 reasons to use jpa hibernate Publicaccedilatildeo online httpswwwsitepointcom5-reasons-to-use-jpa-hibernate 27

[43] Franklin Lyle Alex Gyori Jan Lahoda e Danny Dig Lambdaficator From imperativeto functional programming through automated refactoring Em Proceedings of the2013 International Conference on Software Engineering ICSE rsquo13 paacuteginas 1287ndash1290 Piscataway NJ USA 2013 IEEE Press ISBN 978-1-4673-3076-3 httpdlacmorgcitationcfmid=24867882486986 29

[44] Google Agera httpsgithubcomgoogleagerawiki 34

[45] Eclipse Eclipse vertx httpvertxio 35

[46] Cejas Fernando Android cleanarchitecture httpsgithubcomandroid10Android-CleanArchitecture 36

[47] ReactiveX Rxjava httpsgithubcomReactiveXRxJava 37

[48] Luontola Esko Retrolambda httpsgithubcomorfjackalretrolambda 43

51

Anexo I

Projetos utilizados

fastjson

platform_frameworks_base

netty

material-dialogs

kotlin

okhttp

tinker

AndroidUtilCode

RxJava

spring-boot

java-design-patterns

elasticsearch

ExoPlayer

kafka

vertx

realm-java

guava

zipkin

bazel

stetho

Signal-Android

glide

agera

fresco

plaid

presto

libgdx

spark

52

disruptor

lottie-android

flexbox-layout

PocketHub

zxing

spring-framework

deeplearning4j

dropwizard

interviews

BaseRecyclerViewAdapterHelper

uCrop

DanmakuFlameMaster

lottie-react-native

android-UniversalMusicPlayer

AndroidInterview-Q-A

greenDAO

retrofit

MaterialDrawer

BottomBar

druid

MPAndroidChart

Hystrix

guice

recyclerview-animators

dubbo

androidannotations

RxJava-Android-Samples

PhotoView

clojure

CircleImageView

AndroidSwipeLayout

jedis

MaterialViewPager

butterknife

junit4

RxBinding

leakcanary

SimianArmy

picasso

UltimateRecyclerView

53

AndroidViewAnimations

AppIntro

FizzBuzzEnterpriseEdition

ion

cheesesquare

physical-web

RxAndroid

Android-CleanArchitecture

Calligraphy

Android-Bootstrap

iosched

Android_Data

MaterialDesignLibrary

ListViewAnimations

EventBus

java8-tutorial

AndroidSlidingUpPanel

dagger

okhttputils

logger

HomeMirror

Material-Animations

android-Ultra-Pull-To-Refresh

android-async-http

Android-ObservableScrollView

Android-Universal-Image-Loader

ActionBarSherlock

SlidingMenu

storm

PagerSlidingTabStrip

Android-PullToRefresh

54

  • Dedicatoacuteria
  • Agradecimentos
  • Resumo
  • Abstract
  • Introduccedilatildeo
    • Contexto
    • Objetivos
      • Objetivos Gerais
      • Objetivos Especiacuteficos
        • Metodologia
        • Organizaccedilatildeo do Trabalho
          • Evoluccedilatildeo e Mineraccedilatildeo de Repositoacuterios de Software
            • Evoluccedilatildeo de Software
            • MSR Mineraccedilatildeo de dados e a Engenharia de Software
              • Classificaccedilatildeo
                • Trabalhos Relacionados
                  • Java SE 8 e JDK 8
                    • Histoacuterico
                    • Princiacutepios
                    • Evoluccedilatildeo
                    • Expressotildees Lambda
                      • Sintaxe
                      • Principais formas de uso
                          • Estudo e o Processo de Mineraccedilatildeo
                            • Questotildees de Pesquisa
                            • Fonte de Dados e Objetos de Estudo
                            • Processo de Mineraccedilatildeo
                              • static-analysis
                              • BDAnalisador
                                • Classificaccedilatildeo e Anaacutelise
                                  • Meacutedia de Lambda
                                  • Anaacutelise Temporal
                                  • Refatoraccedilatildeo de Coacutedigo
                                  • Casos de Uso
                                      • Resultados Obtidos e Anaacutelise
                                        • Visatildeo Geral
                                          • Projetos Selecionados
                                          • agera
                                          • vertx
                                          • Android-CleanArchitecture
                                          • RxJava
                                          • guava
                                            • Refatoraccedilatildeo de Coacutedigo
                                            • Estudos de Caso
                                              • Consideraccedilotildees Finais
                                              • Referecircncias
                                              • Anexo
                                              • Projetos utilizados

A Listagem 313 demonstra como vaacuterias operaccedilotildees com uma Collection podem seraplicadas de uma vez de forma que lendo a expressatildeo lambda jaacute eacute possiacutevel saber oresultado da aplicaccedilatildeo do meacutetodo agrave Collection

1 r o s t e r2 stream ( )3 f i l t e r (4 p minusgt p getGender ( ) == Person Sex MALE5 ampamp p getAge ( ) gt= 186 ampamp p getAge ( ) lt= 25)7 map(p minusgt p getEmailAddress ( ) )8 forEach ( emai l minusgt System out p r i n t l n ( emai l ) )

Listagem 313 Exemplo de utilizaccedilatildeo de meacutetodos de stream com expressotildees lambda [30]

21

Capiacutetulo 4

Estudo e o Processo de Mineraccedilatildeo

A definiccedilatildeo da metodologia utilizada para realizaccedilatildeo deste trabalho eacute importante para queexista uma padronizaccedilatildeo e melhor entendimento de como os resultados foram obtidos paraque a replicaccedilatildeo do mesmo possa ser realizada em trabalhos futuros [36]

Figura 41 Processo utilizado para realizaccedilatildeo do estudo

O esquema representado na Figura 41 descreve o processo seguido para a realizaccedilatildeodeste trabalho que foi divido em trecircs grandes etapas a de planejamento definindo osobjetivos questotildees de pesquisa e meios de investigaccedilatildeo deste projeto a etapa de execuccedilatildeorealizando todo o procedimento metodoloacutegico definido para a coleta e refinamento de

22

dados e a etapa de avaliaccedilatildeo onde foram classificados e avaliados os dados coletadospara responder agraves questotildees de pesquisa

A seguir na primeira seccedilatildeo seratildeo apresentadas em detalhes as questotildees de pesquisa aserem respondidas Em seguida seraacute feito uma breve descriccedilatildeo da fonte de dados utilizada- especificamente os projetos utilizados como objetos de estudo deste trabalho e por fimtodo o restante da metodologia que foi de fato desenvolvida para obter os resultadosnecessaacuterios

41 Questotildees de Pesquisa

Com o objetivo de entender e caracterizar melhor o uso de expressotildees lambda foramdefinidas as seguintes questotildees de pesquisa a serem respondidas

bull PQ-1 Quando os projetos comeccedilaram a introduzir o uso de expressotildees lambda emseus coacutedigos e qual a meacutedia de expressotildees lambda por snapshots caso existam

bull PQ-2 Como as equipes de desenvolvimento estatildeo utilizando expressotildees lambdaatraveacutes de refatoraccedilatildeo de coacutedigo ou introduzindo apenas em coacutedigo novo

bull PQ-3 Quais satildeo os padrotildees tipicamente adotados para o uso de expressotildees lambda

A primeira pergunta de pesquisa gira em torno de como projetos populares open-sourceestatildeo se adaptando agrave introduccedilatildeo de expressotildees lambda em Java muitos projetos jaacute estatildeoutilizando as expressotildees lambda Se sim a partir de quando comeccedilaram a utilizaacute-lasdesde o iniacutecio da introduccedilatildeo das mesmas no Java 8 ou em um periacuteodo mais tardio Aleacutemdisso eacute interessante descobrir se a utilizaccedilatildeo dessa nova caracteriacutestica tem acontecido deforma expressiva ou natildeo

Em seguida para melhor entender a forma como as expressotildees lambda estatildeo sendointroduzidas em projetos eacute interessante investigar se as equipes de desenvolvimento estatildeose preocupando em refatorar coacutedigo com o objetivo de evoluir o software ou se estatildeoexperimentando utilizar expressotildees lambda apenas em coacutedigo novo introduzido

Como a introduccedilatildeo de novas funcionalidades em projetos open-source de grande escaladepende do objetivo do projeto e os padrotildees de projeto utilizados [37] espera-se obser-var diversas abordagens quanto a utilizaccedilatildeo de expressotildees lambda para entatildeo poderclassificar estes softwares quanto a abordagem utilizada

Eacute de grande importacircncia para este estudo conseguir identificar na praacutetica comoexpressotildees lambda estatildeo sendo tipicamente adotadas nestes projetos Assim a terceirapergunta de pesquisa busca identificar alguns exemplos de utilizaccedilatildeo atraveacutes da realizaccedilatildeode alguns estudos de caso

23

Eacute importante ressaltar que apesar de as expressotildees lambda serem uma alternativa aouso de AIC elas natildeo os substituem completamente Existem precondiccedilotildees para que umaAIC possa ser substituiacuteda por expressotildees lambda [12] descritas a seguir

bull AIC deve instanciar-se de uma interface

bull AIC natildeo deve possuir nenhum campo e declarar apenas um meacutetodo

bull AIC natildeo deve possuir uma referecircncia para this ou super

bull AIC natildeo deve declarar um meacutetodo recursivo

Para responder agrave primeira pergunta apenas dados gerais sobre todos os projetos seratildeonecessaacuterios ao passo que pelas perguntas 2 e 3 possuiacuterem uma natureza mais complexaseraacute necessaacuterio aleacutem de uma anaacutelise geral estatiacutestica a realizaccedilatildeo de alguns estudos decaso para obter resultados mais completos

42 Fonte de Dados e Objetos de Estudo

Para responder agraves perguntas de pesquisa estabelecidas foram selecionados os 99 projetosmais populares na linguagem Java dentro da plataforma github ateacute a data da coleta dosdados feita em Abril de 2017 Satildeo considerados populares os repositoacuterios que possuema maior quantidade possiacutevel de estrelas (stars) A decisatildeo de escolher os 99 projetos maispopulares foi por sua natureza imparcial e ao mesmo tempo para que se possa analisarprojetos que satildeo de familiaridade e conhecimento da comunidade do github e de domiacuteniopuacuteblico Os 99 projetos estatildeo listados no Anexo I

Para entender a transiccedilatildeo feita por esses projetos entre as versotildees anteriores do Java eo Java 8 com as expressotildees lambda eacute necessaacuterio analisar o coacutedigo de vaacuterias versotildees a fimde observar alguma mudanccedila para cada projeto Como satildeo 99 projetos e vaacuterios dessesprojetos possuem milhares de linhas de coacutedigo e commits seria impossiacutevel avaliar todosos commits Optou-se entatildeo por coletar snapshots mensais de cada projeto conformeprocedimento tambeacutem seguido anteriormente [38] Cada snapshots representa o estadodo projeto em um determinado mecircs e como criteacuterio de escolha padratildeo todos os snapshotsequivalem ao uacuteltimo commit realizado no determinado mecircs que este representa

O proacuteximo passo eacute determinar o periacuteodo de tempo em que esses snapshots seriamcoletados Como Java 8 (e consequentemente as expressotildees lambda) foi introduzidoapenas em meados de 2014 [28] coletar dados de projetos a partir de um periacuteodo muitoantes deste ano natildeo agregaria valor ao estudo em questatildeo Definiu-se entatildeo um periacuteodopara a coleta mensal desses snapshots atraveacutes dos anos Janeiro de 2013 um ano antesda introduccedilatildeo do Java 8 para que se pudesse identificar para todos os projetos o mecircs

24

exato em que expressotildees lambda foram introduzidas ateacute o mecircs da coleta de dados Abrilde 2017

Eacute importante ressaltar que a definiccedilatildeo dos meses foi definida do dia primeiro de ummecircs ao dia primeiro do proacuteximo mecircs e por consequecircncia alguns snapshots que deveriamrepresentar o final de determinado mecircs correspondem na verdade a commits realizadosno dia primeiro do mecircs seguinte Por exemplo pode existir casos em que o commit querepresente o mecircs de Marccedilo de 2016 seja na verdade o commit realizado no dia primeirode Abril de 2016 Isso se deve a natureza da forma como os resultados de log de commitssatildeo obtidos pelo git [39] Poreacutem isso natildeo interfere nas anaacutelises ou no propoacutesito destetrabalho uma vez que foram realizadas verificaccedilotildees e validaccedilotildees para que natildeo existamdatas repetidas (e consequentemente commits repetidos) por repositoacuterio

Neste trabalho o termo projeto e repositoacuterio foram utilizados de forma intercaladapara representar a mesma coisa o software desenvolvido que possui um repositoacuterio naplataforma github Os termos commit snapshops e versotildees tambeacutem representam a mesmacoisa uma vez que foi definido que seriam utilizados apenas um commit por mecircs pararepresentar um determinado snapshot ou versatildeo do repositoacuterio em questatildeo

Todos os 99 projetos seratildeo utilizados para a realizaccedilatildeo de uma anaacutelise geral de ca-racterizaccedilatildeo do uso de expressotildees lambda Para as anaacutelises aprofundadas foi feito umcriteacuterio de classificaccedilatildeo para que apenas alguns projetos possam ser analisados em niacutevelde coacutedigo como estudos de caso

Resumindo foram escolhidos os 99 projetos mais populares de Java no github cole-tando dados mensais de seus commits a partir do ano de 2013 ateacute a data da coleta dosdados lembrando que nem todos os projetos existem desde 2013 (projetos mais recentes)

43 Processo de Mineraccedilatildeo

A abordagem utilizada para coletar e analisar os 99 projetos escolhidos como mostra aFigura 42 foi realizada de forma automatizada utilizando scripts python e dois projetosdesenvolvidos em Java para a coleta e tratamento de dados como descrito a seguir

Primeiramente foi realizado uma coacutepia dos repositoacuterios atuais de todos os 99 projetosmais populares do github em Java Para automatizar o processo foi desenvolvido umscript em python que lista todos os projetos escolhidos clona todos os repositoacuterios emuma pasta na maacutequina local e cria um arquivo temporaacuterio com as informaccedilotildees do nomede cada repositoacuterio e seu caminho absoluto na maacutequina local

25

Figura 42 Metodologia implementada para coleta e tratamento de dados

Em seguida foi necessaacuterio realizar o checkout de todas as versotildees entre Janeiro de2013 a Abril de 2017 de cada projeto Por motivos de otimizaccedilatildeo de espaccedilo da maacutequinalocal e automatizaccedilatildeo no processo de checkout utilizou-se de um segundo script pythonque realizava as seguintes tarefas para cada mecircs em cada projeto verificar se dentreo mecircs estipulado houve algum commit para aquele projeto se sim pega-se o hash douacuteltimo commit do mecircs realiza o checkout conta-se a quantidade de linhas de coacutedigo emJava que o projeto tem utilizando a biblioteca cloc e armazena todas as informaccedilotildeespertinentes referentes a todos os projetos que naquele mecircs tiveram commits para que oprojeto static-analysis possa entatildeo ser executado sobre esses projetos naquele determinadomomento As informaccedilotildees coletadas que satildeo utilizadas pelo static-analysis correspondemao nome do projeto o hash do commit para aquela versatildeo a pasta onde o projeto estaacutearmazenado na maacutequina local a quantidade de linhas de coacutedigo Java do projeto e datareferente ao commit Essas informaccedilotildees satildeo pertinentes para que o projeto static-analysisconsiga funcionar de forma correta projeto este descrito em detalhes a seguir

431 static-analysis

O static-analysis foi um projeto desenvolvido anteriormente a este trabalho pelos alunosThiago Cavalcanti e Vinicius de Almeida cujo objetivo eacute realizar a anaacutelise estaacutetica de

26

coacutedigos-fonte Java e gerar arquivos de saiacuteda contendo informaccedilotildees de classes e meacutetodoscom suas devidas ocorrecircncias de caracteriacutesticas da linguagem [40]

A anaacutelise estaacutetica de coacutedigo consiste em analisar um coacutedigo-fonte sem a necessidadede executaacute-lo Esse tipo de anaacutelise eacute de extrema importacircncia para manter um coacutedigo dequalidade evitar futuras refatoraccedilotildees e obter informaccedilotildees estatiacutesticas de forma raacutepida epraacutetica [41]

Seguindo esse princiacutepio o static-analysis foi projetado para receber um arquivo deentrada csv seguindo o padratildeo

Tipo da Aplicaccedilatildeo Inicio do projeto Antes ou Apoacutes Java 5 Nome do ProjetoVersatildeo Caminho absolutoQuantidade de linhas de coacutedigo

Atraveacutes da informaccedilatildeo do caminho absoluto do projeto o static-analysis varre osdiretoacuterios em busca dos arquivos fonte java realiza o parse desses arquivos e utilizade Visitors para extrair as informaccedilotildees desejadas e exporta-las em arquivos csv Ouso de Visitors permite que sejam escolhidas as informaccedilotildees desejadas para a consultacomo expressotildees Lambda e AIC s aleacutem de possibilitar que sejam implementados novosVisitors conforme a linguagem evolua ou as necessidades mudem

Para este trabalho foram utilizados os Visitors de expressotildees Lambda map() filter()AICs e declaraccedilotildees de meacutetodos

432 BDAnalisador

Apoacutes obter todas as informaccedilotildees necessaacuterias geradas pelo static-analysis era preciso ma-nipular os dados de forma que facilitasse a coleta de dados para o estudo proposto Comovaacuterios arquivos em formato csv satildeo de difiacutecil manipulaccedilatildeo foi desenvolvido entatildeo umaferramenta chamada BDAnalisador Esta ferramenta eacute responsaacutevel por processar os arqui-vos em csv gerados pelo static-analysis e popular uma base de dados relacional MySQLcom as informaccedilotildees pertinentes a este estudo

O BDAnalisador foi desenvolvido com a intenccedilatildeo de tornar mais simples o trabalhocom os dados resultantes do static-analysis de forma que consultas em SQL pudessemser feitas a ponto de permitir a obtenccedilatildeo de resultados mais complexos Seguindo esseobjetivo o framework Hibernate foi escolhido como ferramenta para persistecircncia devidoa ser um framework jaacute consolidado no mercado e que de forma simples relaciona osobjetos Java ao banco de dados MySQL [42] A divisatildeo de classes foi projetada em quatroentidades Projeto Versao Classe e Metodo cada uma com seus respectivos camposcontendo as informaccedilotildees necessaacuterias para a pesquisa como pode ser visto na Figura 44Eacute importante ressaltar que a tabela de Versao guarda hashs de commits devido agrave escolhade utilizar commits para obter mais informaccedilatildeo de evoluccedilatildeo de coacutedigo em um menor

27

espaccedilo de tempo Aleacutem disso para este trabalho optou-se por persistir todos os meacutetodose classes de cada versatildeo sem se importar com a repeticcedilatildeo desses dados pois a hipoacutetesede haver grandes refatoraccedilotildees entre versotildees poderia comprometer a confiabilidade dasinformaccedilotildees

Figura 43 Diagrama de classes UML do BDAnalisador

Como visto na Figura 43 seguindo parcialmente a arquitetura MVC cada entidadepossui sua respectiva classe DAO(Data Access Object) para persistecircncia dos dados eapenas uma classe Controlador no projeto responsaacutevel pela manipulaccedilatildeo e parse dosdados dos arquivos csv gerados pelo static analysis para serem enviados agraves classes DAOO sistema inicia chamando o meacutetodo inicializar() da classe Controlador Esse meacutetodoeacute responsaacutevel por ler um arquivo de entrada csv que segue o mesmo modelo do arquivo dostatic-analysis citado na seccedilatildeo anterior O arquivo conteacutem os dados de todos os projetose suas respectivas versotildees dessa forma o meacutetodo instancia um objeto da classe Projetoe persiste o projeto no banco de dados Para cada versatildeo encontrada no arquivo deentrada o inicializar() aciona os meacutetodos responsaacuteveis por instanciar e preencher aslistas da classe Classe e Metodo Os meacutetodos responsaacuteveis por preencher as listas varremos arquivos csv gerados pelo static-analysis e fazem o parse das informaccedilotildees relevantescomo nomes dos meacutetodos e quantidades de lambdas para construir os objetos que seratildeogravados Ao final dos preenchimentos o objeto Versatildeo eacute instanciado e gravado no bancode dados atraveacutes de sua classe DAO ao mesmo tempo que grava suas respectivas Classese Metodos

28

Apoacutes vaacuterios testes e correccedilotildees de bugs o banco de dados se encontrava finalmente comas informaccedilotildees de 99 projetos Java open-source separados por um commit por mecircs desde2013 cada um com suas respectivas informaccedilotildees de classes meacutetodos e a quantidade deexpressotildees lambda filters e maps em cada meacutetodo Filter ou Filter pattern eacute o padratildeode projeto que tem como objetivo filtrar objetos de uma coleccedilatildeo (Collection) de acordocom algum criteacuterio Jaacute o map ou map pattern eacute um padratildeo que ldquomapeia os elementosde uma coleccedilatildeo aplicando uma funccedilatildeo a eles para uma nova coleccedilatildeo [43] A coleta deinformaccedilotildees sobre esses padrotildees podem ser uacuteteis para possiacuteveis anaacutelises de oportunidadesde uso de expressotildees lambda para refatoraccedilatildeo de coacutedigo

A Figura 44 mostra o esquema de como o banco de dados resultante foi gerado

Figura 44 Modelo relacional do banco de dados populado pelo BDAnalisador Imagemgerada com software DBeaver [2]

44 Classificaccedilatildeo e Anaacutelise

Com o banco de dados populado restam apenas as etapas de classificaccedilatildeo e anaacutelise pararesponder as questotildees de pesquisa propostas Para isso inicialmente houve uma tentativade se utilizar apenas queries SQL para analisar os dados de acordo com as informaccedilotildeesrelevantes Poreacutem devido ao fato de o banco de dados conter todas as informaccedilotildees detodos os projetos e todas as suas versotildees queries que possuem uma alta complexidadedemoravam muito tempo para retornar os dados

Assim com o objetivo de facilitar o trabalho alguns scripts python foram desenvolvi-dos para rodar as queries separadamente e individualmente para cada projeto de formaautomatizada a fim de melhorar o tempo de resposta para obtenccedilatildeo dos resultados

29

441 Meacutedia de Lambda

O primeiro script retorna a quantidade de expressotildees lambda (ou AICs) por n snapshotsque contenha expressotildees lambda O objetivo eacute ter uma visatildeo geral da meacutedia de expressotildeeslambda e AICs utilizadas por cada projeto e como nem todos os snapshots coletados decada projeto possuem expressotildees lambda e AICs apenas aqueles com alguma expressatildeolambda ou AIC satildeo incluiacutedos no caacutelculo da meacutedia

Mmedia =sumn qtdLambdai

n

442 Anaacutelise Temporal

O segundo script retorna para cada projeto a soma total da quantidade de expressotildeeslambda AIC map() e filter() no projeto inteiro para cada versatildeo Ou seja tem-seo total de cada uma das quatro propriedades selecionadas para cada mecircs do projetoobtendo assim uma visatildeo temporal de evoluccedilatildeo do uso das caracteriacutesticas descritas ATabela 41 ilustra parcialmente o resultado obtido para o projeto agera onde idVersaoeacute o identificador no banco de dados referente ao hash do commit mensal coletado qtd eacutea quantidade de cada uma das caracteriacutesticas escolhidas e a data do commit encontra-seno formato americano

Tabela 41 Informaccedilotildees mensais sobre o projeto ageraidVersao Data do Commit qtd lambda qtd AIC qtd maps qtd filter

823 512016 0 29 4 0755 612016 13 28 4 0686 6152016 13 29 4 0621 812016 13 29 4 0555 8162016 13 30 4 0485 922016 13 30 4 0422 10132016 14 30 4 0356 11282016 14 30 4 0295 12212016 21 30 5 0232 212017 21 30 5 0175 312017 21 30 5 0112 3312017 21 36 5 048 4242017 21 48 5 0

Os resultados obtidos com esta anaacutelise temporal permitiu a identificaccedilatildeo de padrotildees nautilizaccedilatildeo de expressotildees lambda em relaccedilatildeo a utilizaccedilatildeo de AIC por todos os projetos Foi

30

possiacutevel classificar todos os projetos em 6 grupos ilustrado na Figura 45 Primeiramenteseparou-se os projetos entre os que possuem expressotildees lambda e os que natildeo possuemDentre os que possuem identificou-se cinco categorias

1 Grupo 1 Quantidade de AICs e expressotildees lambda aumentam com o tempo pro-porcionalmente

2 Grupo 2 Quantidade de AICs diminui agrave medida que a quantidade de expressotildeeslambda aumentam e a quantidade de expressotildees lambda ultrapassa a quantidade deAIC em um determinado momento

3 Grupo 3 Quantidade de AICs diminui agrave medida que a quantidade de expressotildeeslambda aumentam mas a quantidade de AIC permanece superior agrave quantidade delambda

4 Grupo 4 Expressotildees lambda satildeo introduzidas e existem por um pequeno periacuteodode tempo mas satildeo completamente removidas posteriormente

5 Grupo 5 Quantidade de expressotildees lambda eacute constante e muito inferior compa-rado com a quantidade de AICs no projeto Foi determinado que para pertencera esta classificaccedilatildeo o projeto precisa ter uma razatildeo de meacutedia de expressotildees lamb-dasnapshot por meacutedia de AICsnapshot inferior a 020 Esse paracircmetro foi esta-belecido com o objetivo de definir um padratildeo para o que pode ser considerado umprojeto com poucas expressotildees lambda

Figura 45 Classificaccedilatildeo dos projetos

31

443 Refatoraccedilatildeo de Coacutedigo

O uacuteltimo script teve como objetivo realizar uma tentativa inicial de identificar refatoraccedilatildeode coacutedigo da seguinte maneira para todos os projetos que possuem expressotildees lambdaforam identificados o mecircs imediatamente antes da introduccedilatildeo de expressotildees lambda e omecircs seguinte onde houve a primeira ocorrecircncia de lambda no projeto Assim realizou-se uma anaacutelise do tamanho em quantidade de linhas de coacutedigo de todos os meacutetodosdo projeto que no mecircs seguinte tiveram introduccedilatildeo de lambda Em seguida fez-se umacomparaccedilatildeo com os mesmos meacutetodos em relaccedilatildeo ao mecircs anterior e assim foi possiacuteveldetectar quais meacutetodos tiveram a quantidade de linhas de coacutedigo reduzidas o que seriaum indicativo natildeo necessariamente exclusivo de que uma refatoraccedilatildeo de coacutedigo possa terocorrido

Sabe-se que este meacutetodo de detecccedilatildeo de refatoraccedilatildeo de coacutedigo possui suas limitaccedilotildeesuma vez que as comparaccedilotildees para saber se um meacutetodo existe em ambas versotildees eacute feitopuramente por comparaccedilatildeo de String (nome do meacutetodo) e a classe que este pertence

444 Casos de Uso

Os meacutetodos descritos acima ajudaram a identificar alguns padrotildees e facilitar a anaacutelise dosdados Poreacutem natildeo satildeo suficientes para que se possa responder agraves questotildees de pesquisaDessa forma apoacutes a identificaccedilatildeo dos grupos de classificaccedilatildeo para os projetos foramescolhidos um projeto de cada grupo (com exceccedilatildeo do grupo dos projetos sem expressotildeeslambda) para realizar um breve estudo de caso com o objetivo de identificar e caracterizarmelhor a adoccedilatildeo de expressotildees lambda Os projetos escolhidos foram agera vertxAndroid-CleanArchitecture RxJava e guava

32

Capiacutetulo 5

Resultados Obtidos e Anaacutelise

Neste capiacutetulo seratildeo apresentados os dados obtidos e anaacutelise com o objetivo de responderagraves questotildees de pesquisa propostas Como mencionado anteriormente as perguntas seratildeorespondidas de duas maneiras algumas com informaccedilotildees gerais sobre todos os projetose outras com breve estudos de caso envolvendo cinco projetos

51 Visatildeo Geral

Dentre os repositoacuterios coletados para a anaacutelise 74 (7474) natildeo utilizaram nenhumaexpressatildeo lambda no projeto durante todo o periacuteodo analisado (Janeiro de 2013 a Abrilde 2017) restando apenas 25 repositoacuterios (2525) com expressotildees lambda Eacute interessantedestacar que apesar de a quantidade de repositoacuterios que natildeo possuem expressotildees lambdaser relativamente expressiva muitos destes repositoacuterios satildeo de projetos em Java que umdia foram populares e atualmente natildeo estatildeo sendo mais desenvolvidos (por exemplo umaplicativo que soacute funciona para Android 23 atualmente descontinuado)

Levando em consideraccedilatildeo apenas os projetos que possuem expressotildees lambda exis-tem dois tipos de dados que podem ser analisados para responder agrave primeira questatildeo depesquisa atraveacutes dos dados obtidos pelo meacutetodo anteriormente mencionado como anaacutelisetemporal e a meacutedia de lambda por snapshot mencionados no capiacutetulo anterior

Com relaccedilatildeo ao ano em que a primeira ocorrecircncia foi encontrada 6 projetos introduzi-ram expressotildees lambda jaacute em 2014 8 comeccedilaram a utilizar em 2015 7 em 2016 e apenas4 tiveram a primeira ocorrecircncia de expressotildees lambda em 2017 Dessa forma percebe-seque os projetos estatildeo relativamente bem distribuiacutedos em grupos quanto ao ano em que seintroduziu expressotildees lambda

Pela meacutedia de lambda por snapshot (lambdasnapshot) a maioria (11 projetos) possuiuma quantidade expressiva acima de 100 lambdasnapshot (com 6 projetos entre 20 e 100lambdasnapshot e 8 projetos com menos de 20 lambdasnapshot) como apresentados no

33

graacutefico da Figura 51 Isso mostra que essa nova caracteriacutestica jaacute estaacute sendo bem utilizadanos projetos que comeccedilaram a migrar para a nova versatildeo do Java

Figura 51 Graacuteficos dos projetos separados por ano de introduccedilatildeo de expressotildees lambdae meacutedia de lambda por snapshot

Com isso pode-se observar que apesar de a quantidade de projetos que possuemexpressotildees lambda natildeo ser tatildeo alta eacute possiacutevel obter resultados expressivos uma vez quea quantidade dos projetos com lambda estatildeo bem dispersos quanto ao periacuteodo em quecomeccedilaram a adotar essa caracteriacutestica e a quantidade de expressotildees lambda por snapshot

511 Projetos Selecionados

Atraveacutes dos grupos de classificaccedilatildeo identificados pela anaacutelise temporal descritos na Figura45 cinco projetos foram selecionados para uma anaacutelise detalhada levando em consideraccedilatildeoo grupo em que eles pertencem Estes projetos seratildeo apresentados a seguir

512 agera

Agera eacute uma biblioteca Android que ajuda a introduzir programaccedilatildeo funcional reativa(functional reactive programming) em projetos Android Eacute um projeto recente lanccediladoem 2016 pela Google [44] e encontra-se no grupo dos projetos que introduziram expressotildeeslambda em 2016 no mesmo ano de seu lanccedilamento contendo uma meacutedia de expressotildeeslambda de 16 lambdasnapshot

Na classificaccedilatildeo estabelecida agera pertence ao Grupo 1 onde a quantidade de ex-pressotildees lambda no projeto com o tempo aumentam juntamente com a quantidade deAICs como mostra o graacutefico de anaacutelise temporal na Figura 52

34

Figura 52 Graacuteficos de anaacutelise temporal do projeto agera

513 vertx

Eclipse Vertx eacute um conjunto de ferramentas para criaccedilatildeo de reactive applications namaacutequina virtual Java (JVM) em grande escala [45] Seu primeiro lanccedilamento aconteceuem 2011 e a primeira ocorrecircncia de expressotildees lambda no projeto aconteceu em 2014 Esteprojeto possui uma meacutedia de 2867 lambdasnapshot e dentre os projetos consideradosneste trabalho eacute o que possui a maior quantidade de expressotildees lambda

Este projeto pertence ao Grupo 2 onde a quantidade de expressotildees lambda aumen-tou consideravelmente pelos meses ultrapassando a quantidade de AICs que diminuiudrasticamente como mostra a Figura 53

35

Figura 53 Graacuteficos de anaacutelise temporal do projeto Vertx

514 Android-CleanArchitecture

Apesar de ser uma amostra de projeto Android-CleanArchitecture que tem como objetivoconstruir aplicaccedilotildees Android utilizando clean architecture foi lanccedilado em 2014 mas semanteacutem sempre atualizado [46]

A introduccedilatildeo de expressotildees lambda que aconteceu no ano de 2015 se deu de formatiacutemida com uma meacutedia de 35 lambdasnapshot De qualquer forma este projeto conseguerepresentar com seu graacutefico de anaacutelise temporal o grupo 3 composto por projetos em quea quantidade de expressotildees lambda aumentou mas sem ultrapassar AICs que diminuiacuteramdemonstrado no graacutefico da Figura 54

36

Figura 54 Graacuteficos de anaacutelise temporal do projeto Android-CleanArchitecture

515 RxJava

Dentre os repositoacuterios estudados RxJava eacute considerado o mais popular Como umaimplementaccedilatildeo de Reactive Extensions para a JVM RxJava teve seu lanccedilamento dadoem 2013 [47] Expressotildees lambda apareceram pela primeira vez no ano de 2015 comuma meacutedia de 766 lambdasnapshot

Apesar de uma meacutedia relativamente alta o tempo de vida das expressotildees lambda nesteprojeto foi bem curto caracterizando assim projetos do grupo 4 houve a introduccedilatildeo dasexpressotildees lambda no projeto poreacutem houve a remoccedilatildeo completa de todas as expressotildeeslambda previamente introduzidas desaparecendo completamente do projeto ateacute a datada coleta de dados (Figura 55)

37

Figura 55 Graacuteficos de anaacutelise temporal do projeto RxJava

516 guava

Guava eacute um conjunto de bibliotecas para Java da Google lanccedilado em 2011 A atualizaccedilatildeodo coacutedigo do projeto para Java 8 aconteceu somente em 2016 e apesar do projeto conteruma meacutedia de 281 lambdasnapshot ele foi escolhido como representante dos projetosdo Grupo 5 (Figura 56) que possuem expressotildees lambda mas de forma natildeo expressiva osuficiente quando comparado com a quantidade de AIC pelo fato de sua razatildeo de meacutedia delambdasnapshot por meacutedia de AICsnapshot ser 004 Ou seja embora o projeto tenhaexpressotildees lambda estas satildeo consideradas muito poucas quando inseridas no contextogeral deste projeto que eacute considerado um projeto grande

38

Figura 56 Graacuteficos de anaacutelise temporal do projeto Guava

52 Refatoraccedilatildeo de Coacutedigo

Com o objetivo de caracterizar melhor como as expressotildees lambda estatildeo sendo utilizadaseacute interessante identificar se estas estatildeo sendo introduzidas atraveacutes de refatoraccedilatildeo de coacutedigoou em coacutedigo novo

Os projetos classificados como pertencentes ao Grupo 2 possuem em comum o fatode expressotildees lambda aumentarem a medida que AICs diminuem ultrapassando-as eessa caracteriacutestica em comum pode indicar que nestes projetos possivelmente houve re-fatoraccedilatildeo de coacutedigo visto que AIC sendo substituiacutedo por expressotildees lambda dentro dascondiccedilotildees determinadas eacute a maneira mais comum de se identificar refatoraccedilatildeo de coacute-digo para introduccedilatildeo de expressotildees lambda [12] Os projetos que compotildeem o grupo 2representam 44 de todos os projetos estudados que possuem expressotildees lambda o quepode ser um indicativo caso a hipoacutetese de refatoraccedilatildeo de coacutedigo seja positiva de quemuitos projetos que estatildeo adotando o Java 8 estatildeo se preocupando de alguma formacom refatoraccedilatildeo se coacutedigo Fazem parte desse grupo os seguintes projetos elasticsearchjava-design-patterns PocketHub presto RxJava-Android-Samples spark vertx zipkinjava8-tutorial dropwizard e material-dialogs

39

Outra maneira de verificar possiacuteveis indicadores de refatoraccedilatildeo de coacutedigo foi atraveacutesda anaacutelise dos tamanhos (em quantidade de linhas de coacutedigo) dos meacutetodos com expressotildeeslambda no mecircs em que se introduziu expressotildees lambda e um mecircs imediatamente antesdeste Essa anaacutelise mostra que dos 25 projetos com expressotildees lambda 12 (48) projetostiveram ao menos um meacutetodo em que houve uma diminuiccedilatildeo no tamanho o que podeser considerado um indicativo de refatoraccedilatildeo de coacutedigo A Figura 57 mostra todos osprojetos em relaccedilatildeo agrave quantidade total de meacutetodos que possuem lambda no primeiro mecircsde introduccedilatildeo do mesmo em vermelho comparado com a quantidade desses meacutetodos quetiveram uma diminuiccedilatildeo no tamanho quando comparados com o coacutedigo do mecircs anteriorem azul

Figura 57 Comparaccedilatildeo entre todos os projetos com expressatildeo lambda sobre refatoraccedilatildeode coacutedigo no mecircs de introduccedilatildeo da caracteriacutestica

Ainda observando a figura 57 com relaccedilatildeo aos projetos que natildeo tiveram nenhummeacutetodo com diminuiccedilatildeo de tamanho (barra azul) percebe-se que todos os 13 projetossequer tiveram uma quantidade significativa de meacutetodos que possuem expressotildees lambda(com o maior tendo apenas 5 meacutetodos) no mecircs de introduccedilatildeo da caracteriacutestica no projetoe ao mesmo tempo jaacute existiam no mecircs em que natildeo existia lambda no projeto Essa eacuteuma observaccedilatildeo importante porque projetos como vertx sendo este o que possui a maiormeacutedia de lambdasnapshot de todos os projetos e ao mesmo tempo tendo apenas trecircsmeacutetodos que continham expressotildees lambda no mecircs da introduccedilatildeo e que existiam no mecircs

40

anterior permitem inferir que todas as outras expressotildees lambda existentes no projetopara este determinado mecircs de introduccedilatildeo encontram-se em coacutedigo novo introduzido

Eacute importante ressaltar que somente essa anaacutelise natildeo eacute exclusivamente suficiente paradeterminar se estes projetos estatildeo realmente introduzindo lambda em coacutedigo novo ourealizando refatoraccedilatildeo uma vez que como a comparaccedilatildeo aconteceu apenas no mecircs deintroduccedilatildeo com o mecircs imediatamente anterior natildeo reflete todo o ciclo de vida do pro-jeto Por exemplo algumas equipes podem escolher refatorar o coacutedigo depois de umtempo de adaptaccedilatildeo apoacutes a transiccedilatildeo para a nova versatildeo da linguagem Assim paraobter uma melhor anaacutelise sobre refatoraccedilatildeo de coacutedigo ou natildeo feita nestes projetos aleacutemde outras anaacutelises referentes aos padrotildees tipicamente adotados para implementaccedilatildeo delambda nestes projetos seratildeo apresentados a seguir os estudos de caso dos cinco projetospreviamente selecionados

Outro ponto importante eacute o fato de que apesar das informaccedilotildees quanto agraves quantida-des de filter e map terem sido incluiacutedas inicialmente no trabalho para observar possiacuteveispadrotildees de refatoraccedilatildeo de coacutedigo percebeu-se que estas natildeo satildeo utilizadas de forma con-sideraacutevel pelos projetos estudados e para fins de anaacutelises generalizadas natildeo apresentaramtanta influecircncia na utilizaccedilatildeo de expressotildees lambda quanto a quantidade de AICs noprojeto

53 Estudos de Caso

Dentre os projetos analisados verificou-se que os projetos de pequeno e meacutedio porte op-taram por refatorar de uma vez seus coacutedigos para incluir expressotildees lambda em situaccedilotildeesem que se utilizava AICs anteriormente ou em alguns poucos casos de utilizaccedilatildeo deCollection Os projetos de grande porte natildeo apresentaram nenhuma refatoraccedilatildeo de coacute-digo ou uma refatoraccedilatildeo parcial gradativa provavelmente devido agrave grande quantidade dearquivos e coacutedigo que possuem o que pode tornar o trabalho de refatoraccedilatildeo extenso ecansativo

O projeto vertx que pertence ao grupo 2 dos projetos em que a quantidade de ex-pressotildees lambda aumentaram e as de AICs diminuiacuteram com lambda ultrapassando AICsexecutou inicialmente commits em maio de 2014 com adiccedilatildeo de coacutedigo novo utilizandoexpressotildees lambda e apoacutes um mecircs realizou um commit maior com a refatoraccedilatildeo de todasas AICs para expressotildees lambda Apoacutes a refatoraccedilatildeo o projeto se preocupou em mantera utilizaccedilatildeo de expressotildees lambda ao mesmo tempo que o uso de AICs se manteve apenasaos casos de classes com interfaces natildeo funcionais A Figura 58 apresenta uma parte docommit de refatoraccedilatildeo de coacutedigo que mostra em vermelho a parte eliminada do coacutedigo(AIC) e em verde o coacutedigo novo representando a substituiccedilatildeo por uma expressatildeo lambda

41

Figura 58 Commit de refatoraccedilatildeo de coacutedigo do projeto Vertx [3]

Alguns projetos ainda natildeo se preocuparam em refatorar o coacutedigo para o uso de ex-pressotildees lambda ateacute a data deste trabalho que eacute o caso do projeto guava que apresentouum commit em 03112016 com a atualizaccedilatildeo do projeto para Java 8 Mas a partir daatualizaccedilatildeo se preocupou em utilizar as expressotildees lambda apenas na implementaccedilatildeo decoacutedigo novo O cenaacuterio em que a refatoraccedilatildeo natildeo eacute prioridade ainda eacute a realidade de vaacuteriosprojetos de grande porte visto que os dados de projetos sem nenhuma expressatildeo lambdasatildeo o maior nuacutemero neste trabalho Poreacutem projetos que jaacute adotaram a utilizaccedilatildeo do Java8 tendem a mudar isso com o passar do tempo A Figura 59 apresenta em verde umaadiccedilatildeo de coacutedigo novo com expressatildeo lambda sem a eliminaccedilatildeo de algum coacutedigo anteriora esse que estaria em vermelho

42

Figura 59 Exemplo de um arquivo do commit de adiccedilatildeo de coacutedigo novo em Java 8 doprojeto Guava [4]

Na categoria de projetos em que os AICs e expressotildees lambda aumentam proporci-onalmente (grupo 1) o projeto agera realizou um commit em 19052016 com a adiccedilatildeoda biblioteca retrolambda como dependecircncia do projeto Essa biblioteca utilizada prin-cipalmente por projetos Android permite executar coacutedigo Java 8 contendo expressotildeeslambda em Java 5 6 e 7 [48] O commit tambeacutem apresenta refatoraccedilatildeo dos AICs ad-vindos de interfaces funcionais para expressotildees lambda Apesar de o projeto continuar autilizar as expressotildees lambda em seus commits posteriores o nuacutemero de AICs tambeacutemcontinuou a aumentar visualizando os commits posteriores notou-se que esses AICs satildeorelativos a interfaces natildeo funcionais ou seja que possuem mais de um meacutetodo O projetoAndroid-CleanArchitecture eacute similar ao agera pois tambeacutem optou pela instalaccedilatildeo da bi-blioteca retrolambda para uso de expressotildees lambda em seus coacutedigos e como tambeacutem eacuteum projeto de pequeno porte houve uma pequena refatoraccedilatildeo dos AICs A Figura 510mostra a parte do commit de refatoraccedilatildeo de coacutedigo em que o desenvolvedor adiciona abiblioteca retrolambda como dependecircncia

43

Figura 510 Commit de adiccedilatildeo da biblioteca Retrolambda no projeto Agera [5]

Outro caso interessante eacute o do projeto RxJava que em 2015 optou pela refatoraccedilatildeodo coacutedigo para a utilizaccedilatildeo de expressotildees lambda quase eliminando por completo o usode AICs mas que no ano seguinte reverteu os commits de forma que eliminasse comple-tamente o uso de expressotildees lambda para manter a retrocompatibilidade com o Java 6A Figura 511 demonstra uma parte do commit de reversatildeo do coacutedigo para Java 6 emque pode ser visto em vermelho o coacutedigo anterior com expressotildees lambda e o verde como novo coacutedigo utilizando AIC novamente

44

Figura 511 Commit de remoccedilatildeo de Lambdas e volta para o uso de AICs no projetoRXJava [6]

Essa preocupaccedilatildeo com retrocompatibilidade de coacutedigo pode ser um fator crucial nadecisatildeo das equipes de desenvolvimento na hora de decidir como fazer o software co-evoluircom a linguagem sem perder a compatibilidade com versotildees anteriores

45

Capiacutetulo 6

Consideraccedilotildees Finais

Este estudo permitiu entender melhor como projetos estatildeo realizando a migraccedilatildeo para oJava 8 em especial utilizando uma nova caracteriacutestica introduzida expressatildeo lambdaApesar de a maioria dos projetos populares considerados natildeo possuiacuterem nenhuma ocor-recircncia de expressotildees lambda os projetos que tinham expressotildees lambda foram suficientespara realizar um primeiro estudo de caracterizaccedilatildeo no uso desta caracteriacutestica e com osprojetos efetivamente utilizados para estudo foi possiacutevel agrupaacute-los quanto a maneira emque as expressotildees lambda estavam sendo utilizadas quando comparadas com AICs em 5grandes grupos quando AIC e lambda aumentam proporcionalmente quando AIC dimi-nui e lambda aumenta ultrapassando AIC quando AIC diminui mas continua superior aolambda crescente expressotildees lambda que foram introduzidas e retiradas completamentedo coacutedigo e expressotildees lambda que natildeo existem em quantidades expressivas

Foi possiacutevel entatildeo realizar um estudo aprofundado levando em consideraccedilatildeo as di-ferentes maneiras com que as expressotildees lambda foram adotadas nos projetos atraveacutes daescolha de um projeto que representasse cada grupo para anaacutelise Dentre os cinco projetosestudados foi possiacutevel observar alguns padrotildees tipicamente adotados por desenvolvedorespara implementar expressotildees lambda em seus projetos como a utilizaccedilatildeo da bibliotecas(retrolambda) que permitissem uma flexibilizaccedilatildeo na utilizaccedilatildeo de expressotildees lambda oucomo lambda eacute primariamente utilizada para substituir determinados AICs ou operaccedilotildeesem Collection

Aleacutem disso foi possiacutevel observar como a refatoraccedilatildeo de coacutedigo acontece em cada umdesses projetos Observou-se como projetos menores tendem a refatorar coacutedigo maisfacilmente ao passo que projetos maiores e mais complexos fazem menos refatoraccedilatildeo oudemoram mais entre o periacuteodo em que houve a primeira migraccedilatildeo de coacutedigo para a novaversatildeo da linguagem ateacute o periacuteodo em que realmente decidem refatorar coacutedigo Aleacutem dacomplexidade do projeto influenciar na decisatildeo de migrar o projeto para uma versatildeo maisrecente da linguagem a preocupaccedilatildeo com retrocompatibilidade com versotildees anteriores da

46

linguagem tambeacutem podem ser uma barreira para que projetos comecem a evoluir o coacutedigojuntamente com a evoluccedilatildeo da linguagem

Ainda assim foi possiacutevel observar que a preocupaccedilatildeo com a co-evoluccedilatildeo do software-linguagem existe entre os desenvolvedores de projetos mas a realizaccedilatildeo da migraccedilatildeo aindaacontece lentamente devido agrave diversos fatores que precisam ser levados em consideraccedilatildeopara a manutenccedilatildeo do projeto

Para trabalhos e contribuiccedilotildees futuras seria interessante desenvolver uma ferramentaque pudesse analisar diretamente no coacutedigo-fonte as oportunidades de aplicaccedilatildeo de ex-pressotildees lambda dessa forma poderiam ser analisadas as porcentagens de conversatildeo decoacutedigo para Java 8 e obter melhores conclusotildees sobre a importacircncia que os projetos estatildeodando para a evoluccedilatildeo de seus coacutedigos Outro fator interessante seria aplicar mais Visitorsagrave ferramenta static-analysis e fazer este mesmo estudo aplicado agrave outras caracteriacutesticasda linguagem

47

Referecircncias

[1] Kagdi Huzefa Michael L Collard e Jonathan I Maletic A survey and taxonomyof approaches for mining software repositories in the context of software evolution2007 ix 3 8 9 10 11

[2] DBeaver Dbeaver - features httpdbeaverjkissorgdocsfeatures ix 29

[3] Eclipse Vertx commit Java8-ify code httpsgithubcomeclipsevertxcommit93f95e9c77419f442a42fe711b6eeaef88192fd3 ix 42

[4] Google Guava commit Release java 8 changes to guava httpsgithubcomgoogleguavacommit73e382fa877f80994817a136b0adcc4365ccd904 ix 43

[5] Google Agera commit Collapsed testapp with retrolambda httpsgithubcomgoogleageracommit5e518b7b05f9e7a34a314945f68deff7b2c3e334 ix 44

[6] ReactiveX Rxjava commit 2x full jdk 6 compatible backport + includ-ing bugfixes up to today httpsgithubcomReactiveXRxJavacommit000a174d87a901135f9665d3b11f3627fd2dc4ed ix 45

[7] Godfrey M W e D M German The past present and future of software evolutionEm 2008 Frontiers of Maintenance paacuteginas 129ndash138 Sept 2008 1 6

[8] Favre J M Languages evolve too changing the software time scale Em Principles ofSoftware Evolution Eighth International Workshop on paacuteginas 33ndash42 IEEE 20051 5 7

[9] Overbey Jeffrey L e Ralph E Johnson Regrowing a language refactoring tools allowprogramming languages to evolve Em ACM SIGPLAN Notices volume 44 paacuteginas493ndash502 ACM 2009 1 5 7 8 12

[10] Grechanik Mark Collin McMillan Luca DeFerrari Marco Comi Stefano CrespiDenys Poshyvanyk Chen Fu Qing Xie e Carlo Ghezzi An empirical investiga-tion into a large-scale java open source code repository Em Proceedings of the2010 ACM-IEEE International Symposium on Empirical Software Engineering andMeasurement ESEM rsquo10 paacuteginas 111ndash1110 New York NY USA 2010 ACMISBN 978-1-4503-0039-1 httpdoiacmorg10114518527861852801 1

[11] TIOBE Tiobe httpswwwtiobecomtiobe-index 1 14

48

[12] Gyori Alex Lyle Franklin Danny Dig e Jan Lahoda Crossing the gap from im-perative to functional programming through refactoring Em Proceedings of the 20139th Joint Meeting on Foundations of Software Engineering ESECFSE 2013 paacute-ginas 543ndash553 New York NY USA 2013 ACM ISBN 978-1-4503-2237-9 httpdoiacmorg10114524914112491461 2 11 24 39

[13] OpenJDK State of the lambda httpcropenjdkjavanet~briangoetzlambdalambda-state-4html 2

[14] Han Jiawei Micheline Kamber e Jian Pei Data Mining Concepts and TechniquesMorgan Kaufmann Publishers Inc San Francisco CA USA 3rd ediccedilatildeo 2011ISBN 0123814790 9780123814791 3

[15] Fowler Martin e Kent Beck Refactoring improving the design of existing codeAddison-Wesley Professional 1999 5 7

[16] Lehman M M J F Ramil P D Wernick D E Perry e W M Turski Met-rics and laws of software evolution - the nineties view Em Proceedings of the4th International Symposium on Software Metrics METRICS rsquo97 paacuteginas 20ndashWashington DC USA 1997 IEEE Computer Society ISBN 0-8186-8093-8 httpdlacmorgcitationcfmid=823454823901 6

[17] Hassan Ahmed E e Tao Xie Software intelligence The future of mining softwareengineering data Em Proceedings of the FSESDP Workshop on Future of SoftwareEngineering Research FoSER rsquo10 paacuteginas 161ndash166 New York NY USA 2010ACM ISBN 978-1-4503-0427-6 httpdoiacmorg101145188236218823978 9

[18] Hassan Ahmed E The road ahead for mining software repositories Em Frontiers ofSoftware Maintenance 2008 FoSM 2008 paacuteginas 48ndash57 IEEE 2008 8

[19] Berry Michael J e Gordon Linoff Data Mining Techniques For Marketing Salesand Customer Support John Wiley amp Sons Inc New York NY USA 1997ISBN 0471179809 10

[20] Parnin Chris Christian Bird e Emerson Murphy-Hill Java generics adoption hownew features are introduced championed or ignored Em Proceedings of the 8thWorking Conference on Mining Software Repositories paacuteginas 3ndash12 ACM 2011 12

[21] Oracle The java language specification httpsdocsoraclecomjavasespecsjlsse8jls8pdf 13

[22] Oracle The history of java technology httpwwworaclecomtechnetworkjavajavaseoverviewjavahistory-index-198355html 13

[23] Murphy Kieron So why did they decide to call itjava httpwwwjavaworldcomarticle2077265core-javaso-why-did-they-decide-to-call-it-java-html 13

[24] McGraw Tata Object-oriented Programming with Java Essentials and ApplicationsHill Education 13

49

[25] Oracle Differences between java ee and java se httpdocsoraclecomjavaee6firstcupdocgkhoyhtml 13

[26] Lindsey Clark S The History of Java Cambridge 14

[27] Oracle The java language environment httpwwworaclecomtechnetworkjavaintro-141325html 14

[28] Oracle Jdk 8 httpopenjdkjavanetprojectsjdk8 15 24

[29] Oracle Enhancements in java se 8 httpdocsoraclecomjavase8docstechnotesguideslanguageenhancementshtmljavase8 15 16 17

[30] Oracle Lambda expressions httpdocsoraclecomjavasetutorialjavajavaOOlambdaexpressionshtml 16 18 21

[31] Oracle Method references httpdocsoraclecomjavasetutorialjavajavaOOmethodreferenceshtml 16

[32] Oracle Default methods httpdocsoraclecomjavasetutorialjavaIandIdefaultmethodshtml 17

[33] Oracle Repeating annotations httpdocsoraclecomjavasetutorialjavaannotationsrepeatinghtml 17

[34] Oracle Type annotations httpdocsoraclecomjavasetutorialjavaannotationstype_annotationshtml 17

[35] Oracle Anonymous inner classes httpsdocsoraclecomjavasetutorialjavajavaOOanonymousclasseshtml 19

[36] Kothari CR Research Methodology Methods and Techniques New Age Interna-tional (P) Limited 2004 ISBN 9788122415223 httpsbooksgooglecombrbooksid=8c6gkbKi-F4C 22

[37] Nakakoji Kumiyo Yasuhiro Yamamoto Yoshiyuki Nishinaka Kouichi Kishida eYunwen Ye Evolution patterns of open-source software systems and communitiesEm IWPSE rsquo02 Proceedings of the International Workshop on Principles of SoftwareEvolution paacuteginas 76ndash85 New York NY USA 2002 ACM Press ISBN 1581135459httpdxdoiorg101145512035512055 23

[38] Rahman Foyzur Christian Bird e Premkumar Devanbu Clones What is that smellEmpirical Software Engineering 17(4-5)503ndash530 2012 24

[39] Chacon Scott Pro Git Apress Berkely CA USA 1st ediccedilatildeo 2009ISBN 1430218339 9781430218333 25

[40] Cavalcanti Thiago Gomes e Viniacutecius Correa de Almeida Caracterizaccedilatildeo do uso deconstruccedilotildees da linguagem java em projetos open-source Publicaccedilatildeo online 2016httpbdmunbbrhandle1048315733 27

50

[41] Parr Terence Language Implementation Patterns Create Your Own Domain-Specific and General Programming Languages Pragmatic Bookshelf 1st ediccedilatildeo 2009ISBN 193435645X 9781934356456 27

[42] Janssen Thorben 5 reasons to use jpa hibernate Publicaccedilatildeo online httpswwwsitepointcom5-reasons-to-use-jpa-hibernate 27

[43] Franklin Lyle Alex Gyori Jan Lahoda e Danny Dig Lambdaficator From imperativeto functional programming through automated refactoring Em Proceedings of the2013 International Conference on Software Engineering ICSE rsquo13 paacuteginas 1287ndash1290 Piscataway NJ USA 2013 IEEE Press ISBN 978-1-4673-3076-3 httpdlacmorgcitationcfmid=24867882486986 29

[44] Google Agera httpsgithubcomgoogleagerawiki 34

[45] Eclipse Eclipse vertx httpvertxio 35

[46] Cejas Fernando Android cleanarchitecture httpsgithubcomandroid10Android-CleanArchitecture 36

[47] ReactiveX Rxjava httpsgithubcomReactiveXRxJava 37

[48] Luontola Esko Retrolambda httpsgithubcomorfjackalretrolambda 43

51

Anexo I

Projetos utilizados

fastjson

platform_frameworks_base

netty

material-dialogs

kotlin

okhttp

tinker

AndroidUtilCode

RxJava

spring-boot

java-design-patterns

elasticsearch

ExoPlayer

kafka

vertx

realm-java

guava

zipkin

bazel

stetho

Signal-Android

glide

agera

fresco

plaid

presto

libgdx

spark

52

disruptor

lottie-android

flexbox-layout

PocketHub

zxing

spring-framework

deeplearning4j

dropwizard

interviews

BaseRecyclerViewAdapterHelper

uCrop

DanmakuFlameMaster

lottie-react-native

android-UniversalMusicPlayer

AndroidInterview-Q-A

greenDAO

retrofit

MaterialDrawer

BottomBar

druid

MPAndroidChart

Hystrix

guice

recyclerview-animators

dubbo

androidannotations

RxJava-Android-Samples

PhotoView

clojure

CircleImageView

AndroidSwipeLayout

jedis

MaterialViewPager

butterknife

junit4

RxBinding

leakcanary

SimianArmy

picasso

UltimateRecyclerView

53

AndroidViewAnimations

AppIntro

FizzBuzzEnterpriseEdition

ion

cheesesquare

physical-web

RxAndroid

Android-CleanArchitecture

Calligraphy

Android-Bootstrap

iosched

Android_Data

MaterialDesignLibrary

ListViewAnimations

EventBus

java8-tutorial

AndroidSlidingUpPanel

dagger

okhttputils

logger

HomeMirror

Material-Animations

android-Ultra-Pull-To-Refresh

android-async-http

Android-ObservableScrollView

Android-Universal-Image-Loader

ActionBarSherlock

SlidingMenu

storm

PagerSlidingTabStrip

Android-PullToRefresh

54

  • Dedicatoacuteria
  • Agradecimentos
  • Resumo
  • Abstract
  • Introduccedilatildeo
    • Contexto
    • Objetivos
      • Objetivos Gerais
      • Objetivos Especiacuteficos
        • Metodologia
        • Organizaccedilatildeo do Trabalho
          • Evoluccedilatildeo e Mineraccedilatildeo de Repositoacuterios de Software
            • Evoluccedilatildeo de Software
            • MSR Mineraccedilatildeo de dados e a Engenharia de Software
              • Classificaccedilatildeo
                • Trabalhos Relacionados
                  • Java SE 8 e JDK 8
                    • Histoacuterico
                    • Princiacutepios
                    • Evoluccedilatildeo
                    • Expressotildees Lambda
                      • Sintaxe
                      • Principais formas de uso
                          • Estudo e o Processo de Mineraccedilatildeo
                            • Questotildees de Pesquisa
                            • Fonte de Dados e Objetos de Estudo
                            • Processo de Mineraccedilatildeo
                              • static-analysis
                              • BDAnalisador
                                • Classificaccedilatildeo e Anaacutelise
                                  • Meacutedia de Lambda
                                  • Anaacutelise Temporal
                                  • Refatoraccedilatildeo de Coacutedigo
                                  • Casos de Uso
                                      • Resultados Obtidos e Anaacutelise
                                        • Visatildeo Geral
                                          • Projetos Selecionados
                                          • agera
                                          • vertx
                                          • Android-CleanArchitecture
                                          • RxJava
                                          • guava
                                            • Refatoraccedilatildeo de Coacutedigo
                                            • Estudos de Caso
                                              • Consideraccedilotildees Finais
                                              • Referecircncias
                                              • Anexo
                                              • Projetos utilizados

Capiacutetulo 4

Estudo e o Processo de Mineraccedilatildeo

A definiccedilatildeo da metodologia utilizada para realizaccedilatildeo deste trabalho eacute importante para queexista uma padronizaccedilatildeo e melhor entendimento de como os resultados foram obtidos paraque a replicaccedilatildeo do mesmo possa ser realizada em trabalhos futuros [36]

Figura 41 Processo utilizado para realizaccedilatildeo do estudo

O esquema representado na Figura 41 descreve o processo seguido para a realizaccedilatildeodeste trabalho que foi divido em trecircs grandes etapas a de planejamento definindo osobjetivos questotildees de pesquisa e meios de investigaccedilatildeo deste projeto a etapa de execuccedilatildeorealizando todo o procedimento metodoloacutegico definido para a coleta e refinamento de

22

dados e a etapa de avaliaccedilatildeo onde foram classificados e avaliados os dados coletadospara responder agraves questotildees de pesquisa

A seguir na primeira seccedilatildeo seratildeo apresentadas em detalhes as questotildees de pesquisa aserem respondidas Em seguida seraacute feito uma breve descriccedilatildeo da fonte de dados utilizada- especificamente os projetos utilizados como objetos de estudo deste trabalho e por fimtodo o restante da metodologia que foi de fato desenvolvida para obter os resultadosnecessaacuterios

41 Questotildees de Pesquisa

Com o objetivo de entender e caracterizar melhor o uso de expressotildees lambda foramdefinidas as seguintes questotildees de pesquisa a serem respondidas

bull PQ-1 Quando os projetos comeccedilaram a introduzir o uso de expressotildees lambda emseus coacutedigos e qual a meacutedia de expressotildees lambda por snapshots caso existam

bull PQ-2 Como as equipes de desenvolvimento estatildeo utilizando expressotildees lambdaatraveacutes de refatoraccedilatildeo de coacutedigo ou introduzindo apenas em coacutedigo novo

bull PQ-3 Quais satildeo os padrotildees tipicamente adotados para o uso de expressotildees lambda

A primeira pergunta de pesquisa gira em torno de como projetos populares open-sourceestatildeo se adaptando agrave introduccedilatildeo de expressotildees lambda em Java muitos projetos jaacute estatildeoutilizando as expressotildees lambda Se sim a partir de quando comeccedilaram a utilizaacute-lasdesde o iniacutecio da introduccedilatildeo das mesmas no Java 8 ou em um periacuteodo mais tardio Aleacutemdisso eacute interessante descobrir se a utilizaccedilatildeo dessa nova caracteriacutestica tem acontecido deforma expressiva ou natildeo

Em seguida para melhor entender a forma como as expressotildees lambda estatildeo sendointroduzidas em projetos eacute interessante investigar se as equipes de desenvolvimento estatildeose preocupando em refatorar coacutedigo com o objetivo de evoluir o software ou se estatildeoexperimentando utilizar expressotildees lambda apenas em coacutedigo novo introduzido

Como a introduccedilatildeo de novas funcionalidades em projetos open-source de grande escaladepende do objetivo do projeto e os padrotildees de projeto utilizados [37] espera-se obser-var diversas abordagens quanto a utilizaccedilatildeo de expressotildees lambda para entatildeo poderclassificar estes softwares quanto a abordagem utilizada

Eacute de grande importacircncia para este estudo conseguir identificar na praacutetica comoexpressotildees lambda estatildeo sendo tipicamente adotadas nestes projetos Assim a terceirapergunta de pesquisa busca identificar alguns exemplos de utilizaccedilatildeo atraveacutes da realizaccedilatildeode alguns estudos de caso

23

Eacute importante ressaltar que apesar de as expressotildees lambda serem uma alternativa aouso de AIC elas natildeo os substituem completamente Existem precondiccedilotildees para que umaAIC possa ser substituiacuteda por expressotildees lambda [12] descritas a seguir

bull AIC deve instanciar-se de uma interface

bull AIC natildeo deve possuir nenhum campo e declarar apenas um meacutetodo

bull AIC natildeo deve possuir uma referecircncia para this ou super

bull AIC natildeo deve declarar um meacutetodo recursivo

Para responder agrave primeira pergunta apenas dados gerais sobre todos os projetos seratildeonecessaacuterios ao passo que pelas perguntas 2 e 3 possuiacuterem uma natureza mais complexaseraacute necessaacuterio aleacutem de uma anaacutelise geral estatiacutestica a realizaccedilatildeo de alguns estudos decaso para obter resultados mais completos

42 Fonte de Dados e Objetos de Estudo

Para responder agraves perguntas de pesquisa estabelecidas foram selecionados os 99 projetosmais populares na linguagem Java dentro da plataforma github ateacute a data da coleta dosdados feita em Abril de 2017 Satildeo considerados populares os repositoacuterios que possuema maior quantidade possiacutevel de estrelas (stars) A decisatildeo de escolher os 99 projetos maispopulares foi por sua natureza imparcial e ao mesmo tempo para que se possa analisarprojetos que satildeo de familiaridade e conhecimento da comunidade do github e de domiacuteniopuacuteblico Os 99 projetos estatildeo listados no Anexo I

Para entender a transiccedilatildeo feita por esses projetos entre as versotildees anteriores do Java eo Java 8 com as expressotildees lambda eacute necessaacuterio analisar o coacutedigo de vaacuterias versotildees a fimde observar alguma mudanccedila para cada projeto Como satildeo 99 projetos e vaacuterios dessesprojetos possuem milhares de linhas de coacutedigo e commits seria impossiacutevel avaliar todosos commits Optou-se entatildeo por coletar snapshots mensais de cada projeto conformeprocedimento tambeacutem seguido anteriormente [38] Cada snapshots representa o estadodo projeto em um determinado mecircs e como criteacuterio de escolha padratildeo todos os snapshotsequivalem ao uacuteltimo commit realizado no determinado mecircs que este representa

O proacuteximo passo eacute determinar o periacuteodo de tempo em que esses snapshots seriamcoletados Como Java 8 (e consequentemente as expressotildees lambda) foi introduzidoapenas em meados de 2014 [28] coletar dados de projetos a partir de um periacuteodo muitoantes deste ano natildeo agregaria valor ao estudo em questatildeo Definiu-se entatildeo um periacuteodopara a coleta mensal desses snapshots atraveacutes dos anos Janeiro de 2013 um ano antesda introduccedilatildeo do Java 8 para que se pudesse identificar para todos os projetos o mecircs

24

exato em que expressotildees lambda foram introduzidas ateacute o mecircs da coleta de dados Abrilde 2017

Eacute importante ressaltar que a definiccedilatildeo dos meses foi definida do dia primeiro de ummecircs ao dia primeiro do proacuteximo mecircs e por consequecircncia alguns snapshots que deveriamrepresentar o final de determinado mecircs correspondem na verdade a commits realizadosno dia primeiro do mecircs seguinte Por exemplo pode existir casos em que o commit querepresente o mecircs de Marccedilo de 2016 seja na verdade o commit realizado no dia primeirode Abril de 2016 Isso se deve a natureza da forma como os resultados de log de commitssatildeo obtidos pelo git [39] Poreacutem isso natildeo interfere nas anaacutelises ou no propoacutesito destetrabalho uma vez que foram realizadas verificaccedilotildees e validaccedilotildees para que natildeo existamdatas repetidas (e consequentemente commits repetidos) por repositoacuterio

Neste trabalho o termo projeto e repositoacuterio foram utilizados de forma intercaladapara representar a mesma coisa o software desenvolvido que possui um repositoacuterio naplataforma github Os termos commit snapshops e versotildees tambeacutem representam a mesmacoisa uma vez que foi definido que seriam utilizados apenas um commit por mecircs pararepresentar um determinado snapshot ou versatildeo do repositoacuterio em questatildeo

Todos os 99 projetos seratildeo utilizados para a realizaccedilatildeo de uma anaacutelise geral de ca-racterizaccedilatildeo do uso de expressotildees lambda Para as anaacutelises aprofundadas foi feito umcriteacuterio de classificaccedilatildeo para que apenas alguns projetos possam ser analisados em niacutevelde coacutedigo como estudos de caso

Resumindo foram escolhidos os 99 projetos mais populares de Java no github cole-tando dados mensais de seus commits a partir do ano de 2013 ateacute a data da coleta dosdados lembrando que nem todos os projetos existem desde 2013 (projetos mais recentes)

43 Processo de Mineraccedilatildeo

A abordagem utilizada para coletar e analisar os 99 projetos escolhidos como mostra aFigura 42 foi realizada de forma automatizada utilizando scripts python e dois projetosdesenvolvidos em Java para a coleta e tratamento de dados como descrito a seguir

Primeiramente foi realizado uma coacutepia dos repositoacuterios atuais de todos os 99 projetosmais populares do github em Java Para automatizar o processo foi desenvolvido umscript em python que lista todos os projetos escolhidos clona todos os repositoacuterios emuma pasta na maacutequina local e cria um arquivo temporaacuterio com as informaccedilotildees do nomede cada repositoacuterio e seu caminho absoluto na maacutequina local

25

Figura 42 Metodologia implementada para coleta e tratamento de dados

Em seguida foi necessaacuterio realizar o checkout de todas as versotildees entre Janeiro de2013 a Abril de 2017 de cada projeto Por motivos de otimizaccedilatildeo de espaccedilo da maacutequinalocal e automatizaccedilatildeo no processo de checkout utilizou-se de um segundo script pythonque realizava as seguintes tarefas para cada mecircs em cada projeto verificar se dentreo mecircs estipulado houve algum commit para aquele projeto se sim pega-se o hash douacuteltimo commit do mecircs realiza o checkout conta-se a quantidade de linhas de coacutedigo emJava que o projeto tem utilizando a biblioteca cloc e armazena todas as informaccedilotildeespertinentes referentes a todos os projetos que naquele mecircs tiveram commits para que oprojeto static-analysis possa entatildeo ser executado sobre esses projetos naquele determinadomomento As informaccedilotildees coletadas que satildeo utilizadas pelo static-analysis correspondemao nome do projeto o hash do commit para aquela versatildeo a pasta onde o projeto estaacutearmazenado na maacutequina local a quantidade de linhas de coacutedigo Java do projeto e datareferente ao commit Essas informaccedilotildees satildeo pertinentes para que o projeto static-analysisconsiga funcionar de forma correta projeto este descrito em detalhes a seguir

431 static-analysis

O static-analysis foi um projeto desenvolvido anteriormente a este trabalho pelos alunosThiago Cavalcanti e Vinicius de Almeida cujo objetivo eacute realizar a anaacutelise estaacutetica de

26

coacutedigos-fonte Java e gerar arquivos de saiacuteda contendo informaccedilotildees de classes e meacutetodoscom suas devidas ocorrecircncias de caracteriacutesticas da linguagem [40]

A anaacutelise estaacutetica de coacutedigo consiste em analisar um coacutedigo-fonte sem a necessidadede executaacute-lo Esse tipo de anaacutelise eacute de extrema importacircncia para manter um coacutedigo dequalidade evitar futuras refatoraccedilotildees e obter informaccedilotildees estatiacutesticas de forma raacutepida epraacutetica [41]

Seguindo esse princiacutepio o static-analysis foi projetado para receber um arquivo deentrada csv seguindo o padratildeo

Tipo da Aplicaccedilatildeo Inicio do projeto Antes ou Apoacutes Java 5 Nome do ProjetoVersatildeo Caminho absolutoQuantidade de linhas de coacutedigo

Atraveacutes da informaccedilatildeo do caminho absoluto do projeto o static-analysis varre osdiretoacuterios em busca dos arquivos fonte java realiza o parse desses arquivos e utilizade Visitors para extrair as informaccedilotildees desejadas e exporta-las em arquivos csv Ouso de Visitors permite que sejam escolhidas as informaccedilotildees desejadas para a consultacomo expressotildees Lambda e AIC s aleacutem de possibilitar que sejam implementados novosVisitors conforme a linguagem evolua ou as necessidades mudem

Para este trabalho foram utilizados os Visitors de expressotildees Lambda map() filter()AICs e declaraccedilotildees de meacutetodos

432 BDAnalisador

Apoacutes obter todas as informaccedilotildees necessaacuterias geradas pelo static-analysis era preciso ma-nipular os dados de forma que facilitasse a coleta de dados para o estudo proposto Comovaacuterios arquivos em formato csv satildeo de difiacutecil manipulaccedilatildeo foi desenvolvido entatildeo umaferramenta chamada BDAnalisador Esta ferramenta eacute responsaacutevel por processar os arqui-vos em csv gerados pelo static-analysis e popular uma base de dados relacional MySQLcom as informaccedilotildees pertinentes a este estudo

O BDAnalisador foi desenvolvido com a intenccedilatildeo de tornar mais simples o trabalhocom os dados resultantes do static-analysis de forma que consultas em SQL pudessemser feitas a ponto de permitir a obtenccedilatildeo de resultados mais complexos Seguindo esseobjetivo o framework Hibernate foi escolhido como ferramenta para persistecircncia devidoa ser um framework jaacute consolidado no mercado e que de forma simples relaciona osobjetos Java ao banco de dados MySQL [42] A divisatildeo de classes foi projetada em quatroentidades Projeto Versao Classe e Metodo cada uma com seus respectivos camposcontendo as informaccedilotildees necessaacuterias para a pesquisa como pode ser visto na Figura 44Eacute importante ressaltar que a tabela de Versao guarda hashs de commits devido agrave escolhade utilizar commits para obter mais informaccedilatildeo de evoluccedilatildeo de coacutedigo em um menor

27

espaccedilo de tempo Aleacutem disso para este trabalho optou-se por persistir todos os meacutetodose classes de cada versatildeo sem se importar com a repeticcedilatildeo desses dados pois a hipoacutetesede haver grandes refatoraccedilotildees entre versotildees poderia comprometer a confiabilidade dasinformaccedilotildees

Figura 43 Diagrama de classes UML do BDAnalisador

Como visto na Figura 43 seguindo parcialmente a arquitetura MVC cada entidadepossui sua respectiva classe DAO(Data Access Object) para persistecircncia dos dados eapenas uma classe Controlador no projeto responsaacutevel pela manipulaccedilatildeo e parse dosdados dos arquivos csv gerados pelo static analysis para serem enviados agraves classes DAOO sistema inicia chamando o meacutetodo inicializar() da classe Controlador Esse meacutetodoeacute responsaacutevel por ler um arquivo de entrada csv que segue o mesmo modelo do arquivo dostatic-analysis citado na seccedilatildeo anterior O arquivo conteacutem os dados de todos os projetose suas respectivas versotildees dessa forma o meacutetodo instancia um objeto da classe Projetoe persiste o projeto no banco de dados Para cada versatildeo encontrada no arquivo deentrada o inicializar() aciona os meacutetodos responsaacuteveis por instanciar e preencher aslistas da classe Classe e Metodo Os meacutetodos responsaacuteveis por preencher as listas varremos arquivos csv gerados pelo static-analysis e fazem o parse das informaccedilotildees relevantescomo nomes dos meacutetodos e quantidades de lambdas para construir os objetos que seratildeogravados Ao final dos preenchimentos o objeto Versatildeo eacute instanciado e gravado no bancode dados atraveacutes de sua classe DAO ao mesmo tempo que grava suas respectivas Classese Metodos

28

Apoacutes vaacuterios testes e correccedilotildees de bugs o banco de dados se encontrava finalmente comas informaccedilotildees de 99 projetos Java open-source separados por um commit por mecircs desde2013 cada um com suas respectivas informaccedilotildees de classes meacutetodos e a quantidade deexpressotildees lambda filters e maps em cada meacutetodo Filter ou Filter pattern eacute o padratildeode projeto que tem como objetivo filtrar objetos de uma coleccedilatildeo (Collection) de acordocom algum criteacuterio Jaacute o map ou map pattern eacute um padratildeo que ldquomapeia os elementosde uma coleccedilatildeo aplicando uma funccedilatildeo a eles para uma nova coleccedilatildeo [43] A coleta deinformaccedilotildees sobre esses padrotildees podem ser uacuteteis para possiacuteveis anaacutelises de oportunidadesde uso de expressotildees lambda para refatoraccedilatildeo de coacutedigo

A Figura 44 mostra o esquema de como o banco de dados resultante foi gerado

Figura 44 Modelo relacional do banco de dados populado pelo BDAnalisador Imagemgerada com software DBeaver [2]

44 Classificaccedilatildeo e Anaacutelise

Com o banco de dados populado restam apenas as etapas de classificaccedilatildeo e anaacutelise pararesponder as questotildees de pesquisa propostas Para isso inicialmente houve uma tentativade se utilizar apenas queries SQL para analisar os dados de acordo com as informaccedilotildeesrelevantes Poreacutem devido ao fato de o banco de dados conter todas as informaccedilotildees detodos os projetos e todas as suas versotildees queries que possuem uma alta complexidadedemoravam muito tempo para retornar os dados

Assim com o objetivo de facilitar o trabalho alguns scripts python foram desenvolvi-dos para rodar as queries separadamente e individualmente para cada projeto de formaautomatizada a fim de melhorar o tempo de resposta para obtenccedilatildeo dos resultados

29

441 Meacutedia de Lambda

O primeiro script retorna a quantidade de expressotildees lambda (ou AICs) por n snapshotsque contenha expressotildees lambda O objetivo eacute ter uma visatildeo geral da meacutedia de expressotildeeslambda e AICs utilizadas por cada projeto e como nem todos os snapshots coletados decada projeto possuem expressotildees lambda e AICs apenas aqueles com alguma expressatildeolambda ou AIC satildeo incluiacutedos no caacutelculo da meacutedia

Mmedia =sumn qtdLambdai

n

442 Anaacutelise Temporal

O segundo script retorna para cada projeto a soma total da quantidade de expressotildeeslambda AIC map() e filter() no projeto inteiro para cada versatildeo Ou seja tem-seo total de cada uma das quatro propriedades selecionadas para cada mecircs do projetoobtendo assim uma visatildeo temporal de evoluccedilatildeo do uso das caracteriacutesticas descritas ATabela 41 ilustra parcialmente o resultado obtido para o projeto agera onde idVersaoeacute o identificador no banco de dados referente ao hash do commit mensal coletado qtd eacutea quantidade de cada uma das caracteriacutesticas escolhidas e a data do commit encontra-seno formato americano

Tabela 41 Informaccedilotildees mensais sobre o projeto ageraidVersao Data do Commit qtd lambda qtd AIC qtd maps qtd filter

823 512016 0 29 4 0755 612016 13 28 4 0686 6152016 13 29 4 0621 812016 13 29 4 0555 8162016 13 30 4 0485 922016 13 30 4 0422 10132016 14 30 4 0356 11282016 14 30 4 0295 12212016 21 30 5 0232 212017 21 30 5 0175 312017 21 30 5 0112 3312017 21 36 5 048 4242017 21 48 5 0

Os resultados obtidos com esta anaacutelise temporal permitiu a identificaccedilatildeo de padrotildees nautilizaccedilatildeo de expressotildees lambda em relaccedilatildeo a utilizaccedilatildeo de AIC por todos os projetos Foi

30

possiacutevel classificar todos os projetos em 6 grupos ilustrado na Figura 45 Primeiramenteseparou-se os projetos entre os que possuem expressotildees lambda e os que natildeo possuemDentre os que possuem identificou-se cinco categorias

1 Grupo 1 Quantidade de AICs e expressotildees lambda aumentam com o tempo pro-porcionalmente

2 Grupo 2 Quantidade de AICs diminui agrave medida que a quantidade de expressotildeeslambda aumentam e a quantidade de expressotildees lambda ultrapassa a quantidade deAIC em um determinado momento

3 Grupo 3 Quantidade de AICs diminui agrave medida que a quantidade de expressotildeeslambda aumentam mas a quantidade de AIC permanece superior agrave quantidade delambda

4 Grupo 4 Expressotildees lambda satildeo introduzidas e existem por um pequeno periacuteodode tempo mas satildeo completamente removidas posteriormente

5 Grupo 5 Quantidade de expressotildees lambda eacute constante e muito inferior compa-rado com a quantidade de AICs no projeto Foi determinado que para pertencera esta classificaccedilatildeo o projeto precisa ter uma razatildeo de meacutedia de expressotildees lamb-dasnapshot por meacutedia de AICsnapshot inferior a 020 Esse paracircmetro foi esta-belecido com o objetivo de definir um padratildeo para o que pode ser considerado umprojeto com poucas expressotildees lambda

Figura 45 Classificaccedilatildeo dos projetos

31

443 Refatoraccedilatildeo de Coacutedigo

O uacuteltimo script teve como objetivo realizar uma tentativa inicial de identificar refatoraccedilatildeode coacutedigo da seguinte maneira para todos os projetos que possuem expressotildees lambdaforam identificados o mecircs imediatamente antes da introduccedilatildeo de expressotildees lambda e omecircs seguinte onde houve a primeira ocorrecircncia de lambda no projeto Assim realizou-se uma anaacutelise do tamanho em quantidade de linhas de coacutedigo de todos os meacutetodosdo projeto que no mecircs seguinte tiveram introduccedilatildeo de lambda Em seguida fez-se umacomparaccedilatildeo com os mesmos meacutetodos em relaccedilatildeo ao mecircs anterior e assim foi possiacuteveldetectar quais meacutetodos tiveram a quantidade de linhas de coacutedigo reduzidas o que seriaum indicativo natildeo necessariamente exclusivo de que uma refatoraccedilatildeo de coacutedigo possa terocorrido

Sabe-se que este meacutetodo de detecccedilatildeo de refatoraccedilatildeo de coacutedigo possui suas limitaccedilotildeesuma vez que as comparaccedilotildees para saber se um meacutetodo existe em ambas versotildees eacute feitopuramente por comparaccedilatildeo de String (nome do meacutetodo) e a classe que este pertence

444 Casos de Uso

Os meacutetodos descritos acima ajudaram a identificar alguns padrotildees e facilitar a anaacutelise dosdados Poreacutem natildeo satildeo suficientes para que se possa responder agraves questotildees de pesquisaDessa forma apoacutes a identificaccedilatildeo dos grupos de classificaccedilatildeo para os projetos foramescolhidos um projeto de cada grupo (com exceccedilatildeo do grupo dos projetos sem expressotildeeslambda) para realizar um breve estudo de caso com o objetivo de identificar e caracterizarmelhor a adoccedilatildeo de expressotildees lambda Os projetos escolhidos foram agera vertxAndroid-CleanArchitecture RxJava e guava

32

Capiacutetulo 5

Resultados Obtidos e Anaacutelise

Neste capiacutetulo seratildeo apresentados os dados obtidos e anaacutelise com o objetivo de responderagraves questotildees de pesquisa propostas Como mencionado anteriormente as perguntas seratildeorespondidas de duas maneiras algumas com informaccedilotildees gerais sobre todos os projetose outras com breve estudos de caso envolvendo cinco projetos

51 Visatildeo Geral

Dentre os repositoacuterios coletados para a anaacutelise 74 (7474) natildeo utilizaram nenhumaexpressatildeo lambda no projeto durante todo o periacuteodo analisado (Janeiro de 2013 a Abrilde 2017) restando apenas 25 repositoacuterios (2525) com expressotildees lambda Eacute interessantedestacar que apesar de a quantidade de repositoacuterios que natildeo possuem expressotildees lambdaser relativamente expressiva muitos destes repositoacuterios satildeo de projetos em Java que umdia foram populares e atualmente natildeo estatildeo sendo mais desenvolvidos (por exemplo umaplicativo que soacute funciona para Android 23 atualmente descontinuado)

Levando em consideraccedilatildeo apenas os projetos que possuem expressotildees lambda exis-tem dois tipos de dados que podem ser analisados para responder agrave primeira questatildeo depesquisa atraveacutes dos dados obtidos pelo meacutetodo anteriormente mencionado como anaacutelisetemporal e a meacutedia de lambda por snapshot mencionados no capiacutetulo anterior

Com relaccedilatildeo ao ano em que a primeira ocorrecircncia foi encontrada 6 projetos introduzi-ram expressotildees lambda jaacute em 2014 8 comeccedilaram a utilizar em 2015 7 em 2016 e apenas4 tiveram a primeira ocorrecircncia de expressotildees lambda em 2017 Dessa forma percebe-seque os projetos estatildeo relativamente bem distribuiacutedos em grupos quanto ao ano em que seintroduziu expressotildees lambda

Pela meacutedia de lambda por snapshot (lambdasnapshot) a maioria (11 projetos) possuiuma quantidade expressiva acima de 100 lambdasnapshot (com 6 projetos entre 20 e 100lambdasnapshot e 8 projetos com menos de 20 lambdasnapshot) como apresentados no

33

graacutefico da Figura 51 Isso mostra que essa nova caracteriacutestica jaacute estaacute sendo bem utilizadanos projetos que comeccedilaram a migrar para a nova versatildeo do Java

Figura 51 Graacuteficos dos projetos separados por ano de introduccedilatildeo de expressotildees lambdae meacutedia de lambda por snapshot

Com isso pode-se observar que apesar de a quantidade de projetos que possuemexpressotildees lambda natildeo ser tatildeo alta eacute possiacutevel obter resultados expressivos uma vez quea quantidade dos projetos com lambda estatildeo bem dispersos quanto ao periacuteodo em quecomeccedilaram a adotar essa caracteriacutestica e a quantidade de expressotildees lambda por snapshot

511 Projetos Selecionados

Atraveacutes dos grupos de classificaccedilatildeo identificados pela anaacutelise temporal descritos na Figura45 cinco projetos foram selecionados para uma anaacutelise detalhada levando em consideraccedilatildeoo grupo em que eles pertencem Estes projetos seratildeo apresentados a seguir

512 agera

Agera eacute uma biblioteca Android que ajuda a introduzir programaccedilatildeo funcional reativa(functional reactive programming) em projetos Android Eacute um projeto recente lanccediladoem 2016 pela Google [44] e encontra-se no grupo dos projetos que introduziram expressotildeeslambda em 2016 no mesmo ano de seu lanccedilamento contendo uma meacutedia de expressotildeeslambda de 16 lambdasnapshot

Na classificaccedilatildeo estabelecida agera pertence ao Grupo 1 onde a quantidade de ex-pressotildees lambda no projeto com o tempo aumentam juntamente com a quantidade deAICs como mostra o graacutefico de anaacutelise temporal na Figura 52

34

Figura 52 Graacuteficos de anaacutelise temporal do projeto agera

513 vertx

Eclipse Vertx eacute um conjunto de ferramentas para criaccedilatildeo de reactive applications namaacutequina virtual Java (JVM) em grande escala [45] Seu primeiro lanccedilamento aconteceuem 2011 e a primeira ocorrecircncia de expressotildees lambda no projeto aconteceu em 2014 Esteprojeto possui uma meacutedia de 2867 lambdasnapshot e dentre os projetos consideradosneste trabalho eacute o que possui a maior quantidade de expressotildees lambda

Este projeto pertence ao Grupo 2 onde a quantidade de expressotildees lambda aumen-tou consideravelmente pelos meses ultrapassando a quantidade de AICs que diminuiudrasticamente como mostra a Figura 53

35

Figura 53 Graacuteficos de anaacutelise temporal do projeto Vertx

514 Android-CleanArchitecture

Apesar de ser uma amostra de projeto Android-CleanArchitecture que tem como objetivoconstruir aplicaccedilotildees Android utilizando clean architecture foi lanccedilado em 2014 mas semanteacutem sempre atualizado [46]

A introduccedilatildeo de expressotildees lambda que aconteceu no ano de 2015 se deu de formatiacutemida com uma meacutedia de 35 lambdasnapshot De qualquer forma este projeto conseguerepresentar com seu graacutefico de anaacutelise temporal o grupo 3 composto por projetos em quea quantidade de expressotildees lambda aumentou mas sem ultrapassar AICs que diminuiacuteramdemonstrado no graacutefico da Figura 54

36

Figura 54 Graacuteficos de anaacutelise temporal do projeto Android-CleanArchitecture

515 RxJava

Dentre os repositoacuterios estudados RxJava eacute considerado o mais popular Como umaimplementaccedilatildeo de Reactive Extensions para a JVM RxJava teve seu lanccedilamento dadoem 2013 [47] Expressotildees lambda apareceram pela primeira vez no ano de 2015 comuma meacutedia de 766 lambdasnapshot

Apesar de uma meacutedia relativamente alta o tempo de vida das expressotildees lambda nesteprojeto foi bem curto caracterizando assim projetos do grupo 4 houve a introduccedilatildeo dasexpressotildees lambda no projeto poreacutem houve a remoccedilatildeo completa de todas as expressotildeeslambda previamente introduzidas desaparecendo completamente do projeto ateacute a datada coleta de dados (Figura 55)

37

Figura 55 Graacuteficos de anaacutelise temporal do projeto RxJava

516 guava

Guava eacute um conjunto de bibliotecas para Java da Google lanccedilado em 2011 A atualizaccedilatildeodo coacutedigo do projeto para Java 8 aconteceu somente em 2016 e apesar do projeto conteruma meacutedia de 281 lambdasnapshot ele foi escolhido como representante dos projetosdo Grupo 5 (Figura 56) que possuem expressotildees lambda mas de forma natildeo expressiva osuficiente quando comparado com a quantidade de AIC pelo fato de sua razatildeo de meacutedia delambdasnapshot por meacutedia de AICsnapshot ser 004 Ou seja embora o projeto tenhaexpressotildees lambda estas satildeo consideradas muito poucas quando inseridas no contextogeral deste projeto que eacute considerado um projeto grande

38

Figura 56 Graacuteficos de anaacutelise temporal do projeto Guava

52 Refatoraccedilatildeo de Coacutedigo

Com o objetivo de caracterizar melhor como as expressotildees lambda estatildeo sendo utilizadaseacute interessante identificar se estas estatildeo sendo introduzidas atraveacutes de refatoraccedilatildeo de coacutedigoou em coacutedigo novo

Os projetos classificados como pertencentes ao Grupo 2 possuem em comum o fatode expressotildees lambda aumentarem a medida que AICs diminuem ultrapassando-as eessa caracteriacutestica em comum pode indicar que nestes projetos possivelmente houve re-fatoraccedilatildeo de coacutedigo visto que AIC sendo substituiacutedo por expressotildees lambda dentro dascondiccedilotildees determinadas eacute a maneira mais comum de se identificar refatoraccedilatildeo de coacute-digo para introduccedilatildeo de expressotildees lambda [12] Os projetos que compotildeem o grupo 2representam 44 de todos os projetos estudados que possuem expressotildees lambda o quepode ser um indicativo caso a hipoacutetese de refatoraccedilatildeo de coacutedigo seja positiva de quemuitos projetos que estatildeo adotando o Java 8 estatildeo se preocupando de alguma formacom refatoraccedilatildeo se coacutedigo Fazem parte desse grupo os seguintes projetos elasticsearchjava-design-patterns PocketHub presto RxJava-Android-Samples spark vertx zipkinjava8-tutorial dropwizard e material-dialogs

39

Outra maneira de verificar possiacuteveis indicadores de refatoraccedilatildeo de coacutedigo foi atraveacutesda anaacutelise dos tamanhos (em quantidade de linhas de coacutedigo) dos meacutetodos com expressotildeeslambda no mecircs em que se introduziu expressotildees lambda e um mecircs imediatamente antesdeste Essa anaacutelise mostra que dos 25 projetos com expressotildees lambda 12 (48) projetostiveram ao menos um meacutetodo em que houve uma diminuiccedilatildeo no tamanho o que podeser considerado um indicativo de refatoraccedilatildeo de coacutedigo A Figura 57 mostra todos osprojetos em relaccedilatildeo agrave quantidade total de meacutetodos que possuem lambda no primeiro mecircsde introduccedilatildeo do mesmo em vermelho comparado com a quantidade desses meacutetodos quetiveram uma diminuiccedilatildeo no tamanho quando comparados com o coacutedigo do mecircs anteriorem azul

Figura 57 Comparaccedilatildeo entre todos os projetos com expressatildeo lambda sobre refatoraccedilatildeode coacutedigo no mecircs de introduccedilatildeo da caracteriacutestica

Ainda observando a figura 57 com relaccedilatildeo aos projetos que natildeo tiveram nenhummeacutetodo com diminuiccedilatildeo de tamanho (barra azul) percebe-se que todos os 13 projetossequer tiveram uma quantidade significativa de meacutetodos que possuem expressotildees lambda(com o maior tendo apenas 5 meacutetodos) no mecircs de introduccedilatildeo da caracteriacutestica no projetoe ao mesmo tempo jaacute existiam no mecircs em que natildeo existia lambda no projeto Essa eacuteuma observaccedilatildeo importante porque projetos como vertx sendo este o que possui a maiormeacutedia de lambdasnapshot de todos os projetos e ao mesmo tempo tendo apenas trecircsmeacutetodos que continham expressotildees lambda no mecircs da introduccedilatildeo e que existiam no mecircs

40

anterior permitem inferir que todas as outras expressotildees lambda existentes no projetopara este determinado mecircs de introduccedilatildeo encontram-se em coacutedigo novo introduzido

Eacute importante ressaltar que somente essa anaacutelise natildeo eacute exclusivamente suficiente paradeterminar se estes projetos estatildeo realmente introduzindo lambda em coacutedigo novo ourealizando refatoraccedilatildeo uma vez que como a comparaccedilatildeo aconteceu apenas no mecircs deintroduccedilatildeo com o mecircs imediatamente anterior natildeo reflete todo o ciclo de vida do pro-jeto Por exemplo algumas equipes podem escolher refatorar o coacutedigo depois de umtempo de adaptaccedilatildeo apoacutes a transiccedilatildeo para a nova versatildeo da linguagem Assim paraobter uma melhor anaacutelise sobre refatoraccedilatildeo de coacutedigo ou natildeo feita nestes projetos aleacutemde outras anaacutelises referentes aos padrotildees tipicamente adotados para implementaccedilatildeo delambda nestes projetos seratildeo apresentados a seguir os estudos de caso dos cinco projetospreviamente selecionados

Outro ponto importante eacute o fato de que apesar das informaccedilotildees quanto agraves quantida-des de filter e map terem sido incluiacutedas inicialmente no trabalho para observar possiacuteveispadrotildees de refatoraccedilatildeo de coacutedigo percebeu-se que estas natildeo satildeo utilizadas de forma con-sideraacutevel pelos projetos estudados e para fins de anaacutelises generalizadas natildeo apresentaramtanta influecircncia na utilizaccedilatildeo de expressotildees lambda quanto a quantidade de AICs noprojeto

53 Estudos de Caso

Dentre os projetos analisados verificou-se que os projetos de pequeno e meacutedio porte op-taram por refatorar de uma vez seus coacutedigos para incluir expressotildees lambda em situaccedilotildeesem que se utilizava AICs anteriormente ou em alguns poucos casos de utilizaccedilatildeo deCollection Os projetos de grande porte natildeo apresentaram nenhuma refatoraccedilatildeo de coacute-digo ou uma refatoraccedilatildeo parcial gradativa provavelmente devido agrave grande quantidade dearquivos e coacutedigo que possuem o que pode tornar o trabalho de refatoraccedilatildeo extenso ecansativo

O projeto vertx que pertence ao grupo 2 dos projetos em que a quantidade de ex-pressotildees lambda aumentaram e as de AICs diminuiacuteram com lambda ultrapassando AICsexecutou inicialmente commits em maio de 2014 com adiccedilatildeo de coacutedigo novo utilizandoexpressotildees lambda e apoacutes um mecircs realizou um commit maior com a refatoraccedilatildeo de todasas AICs para expressotildees lambda Apoacutes a refatoraccedilatildeo o projeto se preocupou em mantera utilizaccedilatildeo de expressotildees lambda ao mesmo tempo que o uso de AICs se manteve apenasaos casos de classes com interfaces natildeo funcionais A Figura 58 apresenta uma parte docommit de refatoraccedilatildeo de coacutedigo que mostra em vermelho a parte eliminada do coacutedigo(AIC) e em verde o coacutedigo novo representando a substituiccedilatildeo por uma expressatildeo lambda

41

Figura 58 Commit de refatoraccedilatildeo de coacutedigo do projeto Vertx [3]

Alguns projetos ainda natildeo se preocuparam em refatorar o coacutedigo para o uso de ex-pressotildees lambda ateacute a data deste trabalho que eacute o caso do projeto guava que apresentouum commit em 03112016 com a atualizaccedilatildeo do projeto para Java 8 Mas a partir daatualizaccedilatildeo se preocupou em utilizar as expressotildees lambda apenas na implementaccedilatildeo decoacutedigo novo O cenaacuterio em que a refatoraccedilatildeo natildeo eacute prioridade ainda eacute a realidade de vaacuteriosprojetos de grande porte visto que os dados de projetos sem nenhuma expressatildeo lambdasatildeo o maior nuacutemero neste trabalho Poreacutem projetos que jaacute adotaram a utilizaccedilatildeo do Java8 tendem a mudar isso com o passar do tempo A Figura 59 apresenta em verde umaadiccedilatildeo de coacutedigo novo com expressatildeo lambda sem a eliminaccedilatildeo de algum coacutedigo anteriora esse que estaria em vermelho

42

Figura 59 Exemplo de um arquivo do commit de adiccedilatildeo de coacutedigo novo em Java 8 doprojeto Guava [4]

Na categoria de projetos em que os AICs e expressotildees lambda aumentam proporci-onalmente (grupo 1) o projeto agera realizou um commit em 19052016 com a adiccedilatildeoda biblioteca retrolambda como dependecircncia do projeto Essa biblioteca utilizada prin-cipalmente por projetos Android permite executar coacutedigo Java 8 contendo expressotildeeslambda em Java 5 6 e 7 [48] O commit tambeacutem apresenta refatoraccedilatildeo dos AICs ad-vindos de interfaces funcionais para expressotildees lambda Apesar de o projeto continuar autilizar as expressotildees lambda em seus commits posteriores o nuacutemero de AICs tambeacutemcontinuou a aumentar visualizando os commits posteriores notou-se que esses AICs satildeorelativos a interfaces natildeo funcionais ou seja que possuem mais de um meacutetodo O projetoAndroid-CleanArchitecture eacute similar ao agera pois tambeacutem optou pela instalaccedilatildeo da bi-blioteca retrolambda para uso de expressotildees lambda em seus coacutedigos e como tambeacutem eacuteum projeto de pequeno porte houve uma pequena refatoraccedilatildeo dos AICs A Figura 510mostra a parte do commit de refatoraccedilatildeo de coacutedigo em que o desenvolvedor adiciona abiblioteca retrolambda como dependecircncia

43

Figura 510 Commit de adiccedilatildeo da biblioteca Retrolambda no projeto Agera [5]

Outro caso interessante eacute o do projeto RxJava que em 2015 optou pela refatoraccedilatildeodo coacutedigo para a utilizaccedilatildeo de expressotildees lambda quase eliminando por completo o usode AICs mas que no ano seguinte reverteu os commits de forma que eliminasse comple-tamente o uso de expressotildees lambda para manter a retrocompatibilidade com o Java 6A Figura 511 demonstra uma parte do commit de reversatildeo do coacutedigo para Java 6 emque pode ser visto em vermelho o coacutedigo anterior com expressotildees lambda e o verde como novo coacutedigo utilizando AIC novamente

44

Figura 511 Commit de remoccedilatildeo de Lambdas e volta para o uso de AICs no projetoRXJava [6]

Essa preocupaccedilatildeo com retrocompatibilidade de coacutedigo pode ser um fator crucial nadecisatildeo das equipes de desenvolvimento na hora de decidir como fazer o software co-evoluircom a linguagem sem perder a compatibilidade com versotildees anteriores

45

Capiacutetulo 6

Consideraccedilotildees Finais

Este estudo permitiu entender melhor como projetos estatildeo realizando a migraccedilatildeo para oJava 8 em especial utilizando uma nova caracteriacutestica introduzida expressatildeo lambdaApesar de a maioria dos projetos populares considerados natildeo possuiacuterem nenhuma ocor-recircncia de expressotildees lambda os projetos que tinham expressotildees lambda foram suficientespara realizar um primeiro estudo de caracterizaccedilatildeo no uso desta caracteriacutestica e com osprojetos efetivamente utilizados para estudo foi possiacutevel agrupaacute-los quanto a maneira emque as expressotildees lambda estavam sendo utilizadas quando comparadas com AICs em 5grandes grupos quando AIC e lambda aumentam proporcionalmente quando AIC dimi-nui e lambda aumenta ultrapassando AIC quando AIC diminui mas continua superior aolambda crescente expressotildees lambda que foram introduzidas e retiradas completamentedo coacutedigo e expressotildees lambda que natildeo existem em quantidades expressivas

Foi possiacutevel entatildeo realizar um estudo aprofundado levando em consideraccedilatildeo as di-ferentes maneiras com que as expressotildees lambda foram adotadas nos projetos atraveacutes daescolha de um projeto que representasse cada grupo para anaacutelise Dentre os cinco projetosestudados foi possiacutevel observar alguns padrotildees tipicamente adotados por desenvolvedorespara implementar expressotildees lambda em seus projetos como a utilizaccedilatildeo da bibliotecas(retrolambda) que permitissem uma flexibilizaccedilatildeo na utilizaccedilatildeo de expressotildees lambda oucomo lambda eacute primariamente utilizada para substituir determinados AICs ou operaccedilotildeesem Collection

Aleacutem disso foi possiacutevel observar como a refatoraccedilatildeo de coacutedigo acontece em cada umdesses projetos Observou-se como projetos menores tendem a refatorar coacutedigo maisfacilmente ao passo que projetos maiores e mais complexos fazem menos refatoraccedilatildeo oudemoram mais entre o periacuteodo em que houve a primeira migraccedilatildeo de coacutedigo para a novaversatildeo da linguagem ateacute o periacuteodo em que realmente decidem refatorar coacutedigo Aleacutem dacomplexidade do projeto influenciar na decisatildeo de migrar o projeto para uma versatildeo maisrecente da linguagem a preocupaccedilatildeo com retrocompatibilidade com versotildees anteriores da

46

linguagem tambeacutem podem ser uma barreira para que projetos comecem a evoluir o coacutedigojuntamente com a evoluccedilatildeo da linguagem

Ainda assim foi possiacutevel observar que a preocupaccedilatildeo com a co-evoluccedilatildeo do software-linguagem existe entre os desenvolvedores de projetos mas a realizaccedilatildeo da migraccedilatildeo aindaacontece lentamente devido agrave diversos fatores que precisam ser levados em consideraccedilatildeopara a manutenccedilatildeo do projeto

Para trabalhos e contribuiccedilotildees futuras seria interessante desenvolver uma ferramentaque pudesse analisar diretamente no coacutedigo-fonte as oportunidades de aplicaccedilatildeo de ex-pressotildees lambda dessa forma poderiam ser analisadas as porcentagens de conversatildeo decoacutedigo para Java 8 e obter melhores conclusotildees sobre a importacircncia que os projetos estatildeodando para a evoluccedilatildeo de seus coacutedigos Outro fator interessante seria aplicar mais Visitorsagrave ferramenta static-analysis e fazer este mesmo estudo aplicado agrave outras caracteriacutesticasda linguagem

47

Referecircncias

[1] Kagdi Huzefa Michael L Collard e Jonathan I Maletic A survey and taxonomyof approaches for mining software repositories in the context of software evolution2007 ix 3 8 9 10 11

[2] DBeaver Dbeaver - features httpdbeaverjkissorgdocsfeatures ix 29

[3] Eclipse Vertx commit Java8-ify code httpsgithubcomeclipsevertxcommit93f95e9c77419f442a42fe711b6eeaef88192fd3 ix 42

[4] Google Guava commit Release java 8 changes to guava httpsgithubcomgoogleguavacommit73e382fa877f80994817a136b0adcc4365ccd904 ix 43

[5] Google Agera commit Collapsed testapp with retrolambda httpsgithubcomgoogleageracommit5e518b7b05f9e7a34a314945f68deff7b2c3e334 ix 44

[6] ReactiveX Rxjava commit 2x full jdk 6 compatible backport + includ-ing bugfixes up to today httpsgithubcomReactiveXRxJavacommit000a174d87a901135f9665d3b11f3627fd2dc4ed ix 45

[7] Godfrey M W e D M German The past present and future of software evolutionEm 2008 Frontiers of Maintenance paacuteginas 129ndash138 Sept 2008 1 6

[8] Favre J M Languages evolve too changing the software time scale Em Principles ofSoftware Evolution Eighth International Workshop on paacuteginas 33ndash42 IEEE 20051 5 7

[9] Overbey Jeffrey L e Ralph E Johnson Regrowing a language refactoring tools allowprogramming languages to evolve Em ACM SIGPLAN Notices volume 44 paacuteginas493ndash502 ACM 2009 1 5 7 8 12

[10] Grechanik Mark Collin McMillan Luca DeFerrari Marco Comi Stefano CrespiDenys Poshyvanyk Chen Fu Qing Xie e Carlo Ghezzi An empirical investiga-tion into a large-scale java open source code repository Em Proceedings of the2010 ACM-IEEE International Symposium on Empirical Software Engineering andMeasurement ESEM rsquo10 paacuteginas 111ndash1110 New York NY USA 2010 ACMISBN 978-1-4503-0039-1 httpdoiacmorg10114518527861852801 1

[11] TIOBE Tiobe httpswwwtiobecomtiobe-index 1 14

48

[12] Gyori Alex Lyle Franklin Danny Dig e Jan Lahoda Crossing the gap from im-perative to functional programming through refactoring Em Proceedings of the 20139th Joint Meeting on Foundations of Software Engineering ESECFSE 2013 paacute-ginas 543ndash553 New York NY USA 2013 ACM ISBN 978-1-4503-2237-9 httpdoiacmorg10114524914112491461 2 11 24 39

[13] OpenJDK State of the lambda httpcropenjdkjavanet~briangoetzlambdalambda-state-4html 2

[14] Han Jiawei Micheline Kamber e Jian Pei Data Mining Concepts and TechniquesMorgan Kaufmann Publishers Inc San Francisco CA USA 3rd ediccedilatildeo 2011ISBN 0123814790 9780123814791 3

[15] Fowler Martin e Kent Beck Refactoring improving the design of existing codeAddison-Wesley Professional 1999 5 7

[16] Lehman M M J F Ramil P D Wernick D E Perry e W M Turski Met-rics and laws of software evolution - the nineties view Em Proceedings of the4th International Symposium on Software Metrics METRICS rsquo97 paacuteginas 20ndashWashington DC USA 1997 IEEE Computer Society ISBN 0-8186-8093-8 httpdlacmorgcitationcfmid=823454823901 6

[17] Hassan Ahmed E e Tao Xie Software intelligence The future of mining softwareengineering data Em Proceedings of the FSESDP Workshop on Future of SoftwareEngineering Research FoSER rsquo10 paacuteginas 161ndash166 New York NY USA 2010ACM ISBN 978-1-4503-0427-6 httpdoiacmorg101145188236218823978 9

[18] Hassan Ahmed E The road ahead for mining software repositories Em Frontiers ofSoftware Maintenance 2008 FoSM 2008 paacuteginas 48ndash57 IEEE 2008 8

[19] Berry Michael J e Gordon Linoff Data Mining Techniques For Marketing Salesand Customer Support John Wiley amp Sons Inc New York NY USA 1997ISBN 0471179809 10

[20] Parnin Chris Christian Bird e Emerson Murphy-Hill Java generics adoption hownew features are introduced championed or ignored Em Proceedings of the 8thWorking Conference on Mining Software Repositories paacuteginas 3ndash12 ACM 2011 12

[21] Oracle The java language specification httpsdocsoraclecomjavasespecsjlsse8jls8pdf 13

[22] Oracle The history of java technology httpwwworaclecomtechnetworkjavajavaseoverviewjavahistory-index-198355html 13

[23] Murphy Kieron So why did they decide to call itjava httpwwwjavaworldcomarticle2077265core-javaso-why-did-they-decide-to-call-it-java-html 13

[24] McGraw Tata Object-oriented Programming with Java Essentials and ApplicationsHill Education 13

49

[25] Oracle Differences between java ee and java se httpdocsoraclecomjavaee6firstcupdocgkhoyhtml 13

[26] Lindsey Clark S The History of Java Cambridge 14

[27] Oracle The java language environment httpwwworaclecomtechnetworkjavaintro-141325html 14

[28] Oracle Jdk 8 httpopenjdkjavanetprojectsjdk8 15 24

[29] Oracle Enhancements in java se 8 httpdocsoraclecomjavase8docstechnotesguideslanguageenhancementshtmljavase8 15 16 17

[30] Oracle Lambda expressions httpdocsoraclecomjavasetutorialjavajavaOOlambdaexpressionshtml 16 18 21

[31] Oracle Method references httpdocsoraclecomjavasetutorialjavajavaOOmethodreferenceshtml 16

[32] Oracle Default methods httpdocsoraclecomjavasetutorialjavaIandIdefaultmethodshtml 17

[33] Oracle Repeating annotations httpdocsoraclecomjavasetutorialjavaannotationsrepeatinghtml 17

[34] Oracle Type annotations httpdocsoraclecomjavasetutorialjavaannotationstype_annotationshtml 17

[35] Oracle Anonymous inner classes httpsdocsoraclecomjavasetutorialjavajavaOOanonymousclasseshtml 19

[36] Kothari CR Research Methodology Methods and Techniques New Age Interna-tional (P) Limited 2004 ISBN 9788122415223 httpsbooksgooglecombrbooksid=8c6gkbKi-F4C 22

[37] Nakakoji Kumiyo Yasuhiro Yamamoto Yoshiyuki Nishinaka Kouichi Kishida eYunwen Ye Evolution patterns of open-source software systems and communitiesEm IWPSE rsquo02 Proceedings of the International Workshop on Principles of SoftwareEvolution paacuteginas 76ndash85 New York NY USA 2002 ACM Press ISBN 1581135459httpdxdoiorg101145512035512055 23

[38] Rahman Foyzur Christian Bird e Premkumar Devanbu Clones What is that smellEmpirical Software Engineering 17(4-5)503ndash530 2012 24

[39] Chacon Scott Pro Git Apress Berkely CA USA 1st ediccedilatildeo 2009ISBN 1430218339 9781430218333 25

[40] Cavalcanti Thiago Gomes e Viniacutecius Correa de Almeida Caracterizaccedilatildeo do uso deconstruccedilotildees da linguagem java em projetos open-source Publicaccedilatildeo online 2016httpbdmunbbrhandle1048315733 27

50

[41] Parr Terence Language Implementation Patterns Create Your Own Domain-Specific and General Programming Languages Pragmatic Bookshelf 1st ediccedilatildeo 2009ISBN 193435645X 9781934356456 27

[42] Janssen Thorben 5 reasons to use jpa hibernate Publicaccedilatildeo online httpswwwsitepointcom5-reasons-to-use-jpa-hibernate 27

[43] Franklin Lyle Alex Gyori Jan Lahoda e Danny Dig Lambdaficator From imperativeto functional programming through automated refactoring Em Proceedings of the2013 International Conference on Software Engineering ICSE rsquo13 paacuteginas 1287ndash1290 Piscataway NJ USA 2013 IEEE Press ISBN 978-1-4673-3076-3 httpdlacmorgcitationcfmid=24867882486986 29

[44] Google Agera httpsgithubcomgoogleagerawiki 34

[45] Eclipse Eclipse vertx httpvertxio 35

[46] Cejas Fernando Android cleanarchitecture httpsgithubcomandroid10Android-CleanArchitecture 36

[47] ReactiveX Rxjava httpsgithubcomReactiveXRxJava 37

[48] Luontola Esko Retrolambda httpsgithubcomorfjackalretrolambda 43

51

Anexo I

Projetos utilizados

fastjson

platform_frameworks_base

netty

material-dialogs

kotlin

okhttp

tinker

AndroidUtilCode

RxJava

spring-boot

java-design-patterns

elasticsearch

ExoPlayer

kafka

vertx

realm-java

guava

zipkin

bazel

stetho

Signal-Android

glide

agera

fresco

plaid

presto

libgdx

spark

52

disruptor

lottie-android

flexbox-layout

PocketHub

zxing

spring-framework

deeplearning4j

dropwizard

interviews

BaseRecyclerViewAdapterHelper

uCrop

DanmakuFlameMaster

lottie-react-native

android-UniversalMusicPlayer

AndroidInterview-Q-A

greenDAO

retrofit

MaterialDrawer

BottomBar

druid

MPAndroidChart

Hystrix

guice

recyclerview-animators

dubbo

androidannotations

RxJava-Android-Samples

PhotoView

clojure

CircleImageView

AndroidSwipeLayout

jedis

MaterialViewPager

butterknife

junit4

RxBinding

leakcanary

SimianArmy

picasso

UltimateRecyclerView

53

AndroidViewAnimations

AppIntro

FizzBuzzEnterpriseEdition

ion

cheesesquare

physical-web

RxAndroid

Android-CleanArchitecture

Calligraphy

Android-Bootstrap

iosched

Android_Data

MaterialDesignLibrary

ListViewAnimations

EventBus

java8-tutorial

AndroidSlidingUpPanel

dagger

okhttputils

logger

HomeMirror

Material-Animations

android-Ultra-Pull-To-Refresh

android-async-http

Android-ObservableScrollView

Android-Universal-Image-Loader

ActionBarSherlock

SlidingMenu

storm

PagerSlidingTabStrip

Android-PullToRefresh

54

  • Dedicatoacuteria
  • Agradecimentos
  • Resumo
  • Abstract
  • Introduccedilatildeo
    • Contexto
    • Objetivos
      • Objetivos Gerais
      • Objetivos Especiacuteficos
        • Metodologia
        • Organizaccedilatildeo do Trabalho
          • Evoluccedilatildeo e Mineraccedilatildeo de Repositoacuterios de Software
            • Evoluccedilatildeo de Software
            • MSR Mineraccedilatildeo de dados e a Engenharia de Software
              • Classificaccedilatildeo
                • Trabalhos Relacionados
                  • Java SE 8 e JDK 8
                    • Histoacuterico
                    • Princiacutepios
                    • Evoluccedilatildeo
                    • Expressotildees Lambda
                      • Sintaxe
                      • Principais formas de uso
                          • Estudo e o Processo de Mineraccedilatildeo
                            • Questotildees de Pesquisa
                            • Fonte de Dados e Objetos de Estudo
                            • Processo de Mineraccedilatildeo
                              • static-analysis
                              • BDAnalisador
                                • Classificaccedilatildeo e Anaacutelise
                                  • Meacutedia de Lambda
                                  • Anaacutelise Temporal
                                  • Refatoraccedilatildeo de Coacutedigo
                                  • Casos de Uso
                                      • Resultados Obtidos e Anaacutelise
                                        • Visatildeo Geral
                                          • Projetos Selecionados
                                          • agera
                                          • vertx
                                          • Android-CleanArchitecture
                                          • RxJava
                                          • guava
                                            • Refatoraccedilatildeo de Coacutedigo
                                            • Estudos de Caso
                                              • Consideraccedilotildees Finais
                                              • Referecircncias
                                              • Anexo
                                              • Projetos utilizados

dados e a etapa de avaliaccedilatildeo onde foram classificados e avaliados os dados coletadospara responder agraves questotildees de pesquisa

A seguir na primeira seccedilatildeo seratildeo apresentadas em detalhes as questotildees de pesquisa aserem respondidas Em seguida seraacute feito uma breve descriccedilatildeo da fonte de dados utilizada- especificamente os projetos utilizados como objetos de estudo deste trabalho e por fimtodo o restante da metodologia que foi de fato desenvolvida para obter os resultadosnecessaacuterios

41 Questotildees de Pesquisa

Com o objetivo de entender e caracterizar melhor o uso de expressotildees lambda foramdefinidas as seguintes questotildees de pesquisa a serem respondidas

bull PQ-1 Quando os projetos comeccedilaram a introduzir o uso de expressotildees lambda emseus coacutedigos e qual a meacutedia de expressotildees lambda por snapshots caso existam

bull PQ-2 Como as equipes de desenvolvimento estatildeo utilizando expressotildees lambdaatraveacutes de refatoraccedilatildeo de coacutedigo ou introduzindo apenas em coacutedigo novo

bull PQ-3 Quais satildeo os padrotildees tipicamente adotados para o uso de expressotildees lambda

A primeira pergunta de pesquisa gira em torno de como projetos populares open-sourceestatildeo se adaptando agrave introduccedilatildeo de expressotildees lambda em Java muitos projetos jaacute estatildeoutilizando as expressotildees lambda Se sim a partir de quando comeccedilaram a utilizaacute-lasdesde o iniacutecio da introduccedilatildeo das mesmas no Java 8 ou em um periacuteodo mais tardio Aleacutemdisso eacute interessante descobrir se a utilizaccedilatildeo dessa nova caracteriacutestica tem acontecido deforma expressiva ou natildeo

Em seguida para melhor entender a forma como as expressotildees lambda estatildeo sendointroduzidas em projetos eacute interessante investigar se as equipes de desenvolvimento estatildeose preocupando em refatorar coacutedigo com o objetivo de evoluir o software ou se estatildeoexperimentando utilizar expressotildees lambda apenas em coacutedigo novo introduzido

Como a introduccedilatildeo de novas funcionalidades em projetos open-source de grande escaladepende do objetivo do projeto e os padrotildees de projeto utilizados [37] espera-se obser-var diversas abordagens quanto a utilizaccedilatildeo de expressotildees lambda para entatildeo poderclassificar estes softwares quanto a abordagem utilizada

Eacute de grande importacircncia para este estudo conseguir identificar na praacutetica comoexpressotildees lambda estatildeo sendo tipicamente adotadas nestes projetos Assim a terceirapergunta de pesquisa busca identificar alguns exemplos de utilizaccedilatildeo atraveacutes da realizaccedilatildeode alguns estudos de caso

23

Eacute importante ressaltar que apesar de as expressotildees lambda serem uma alternativa aouso de AIC elas natildeo os substituem completamente Existem precondiccedilotildees para que umaAIC possa ser substituiacuteda por expressotildees lambda [12] descritas a seguir

bull AIC deve instanciar-se de uma interface

bull AIC natildeo deve possuir nenhum campo e declarar apenas um meacutetodo

bull AIC natildeo deve possuir uma referecircncia para this ou super

bull AIC natildeo deve declarar um meacutetodo recursivo

Para responder agrave primeira pergunta apenas dados gerais sobre todos os projetos seratildeonecessaacuterios ao passo que pelas perguntas 2 e 3 possuiacuterem uma natureza mais complexaseraacute necessaacuterio aleacutem de uma anaacutelise geral estatiacutestica a realizaccedilatildeo de alguns estudos decaso para obter resultados mais completos

42 Fonte de Dados e Objetos de Estudo

Para responder agraves perguntas de pesquisa estabelecidas foram selecionados os 99 projetosmais populares na linguagem Java dentro da plataforma github ateacute a data da coleta dosdados feita em Abril de 2017 Satildeo considerados populares os repositoacuterios que possuema maior quantidade possiacutevel de estrelas (stars) A decisatildeo de escolher os 99 projetos maispopulares foi por sua natureza imparcial e ao mesmo tempo para que se possa analisarprojetos que satildeo de familiaridade e conhecimento da comunidade do github e de domiacuteniopuacuteblico Os 99 projetos estatildeo listados no Anexo I

Para entender a transiccedilatildeo feita por esses projetos entre as versotildees anteriores do Java eo Java 8 com as expressotildees lambda eacute necessaacuterio analisar o coacutedigo de vaacuterias versotildees a fimde observar alguma mudanccedila para cada projeto Como satildeo 99 projetos e vaacuterios dessesprojetos possuem milhares de linhas de coacutedigo e commits seria impossiacutevel avaliar todosos commits Optou-se entatildeo por coletar snapshots mensais de cada projeto conformeprocedimento tambeacutem seguido anteriormente [38] Cada snapshots representa o estadodo projeto em um determinado mecircs e como criteacuterio de escolha padratildeo todos os snapshotsequivalem ao uacuteltimo commit realizado no determinado mecircs que este representa

O proacuteximo passo eacute determinar o periacuteodo de tempo em que esses snapshots seriamcoletados Como Java 8 (e consequentemente as expressotildees lambda) foi introduzidoapenas em meados de 2014 [28] coletar dados de projetos a partir de um periacuteodo muitoantes deste ano natildeo agregaria valor ao estudo em questatildeo Definiu-se entatildeo um periacuteodopara a coleta mensal desses snapshots atraveacutes dos anos Janeiro de 2013 um ano antesda introduccedilatildeo do Java 8 para que se pudesse identificar para todos os projetos o mecircs

24

exato em que expressotildees lambda foram introduzidas ateacute o mecircs da coleta de dados Abrilde 2017

Eacute importante ressaltar que a definiccedilatildeo dos meses foi definida do dia primeiro de ummecircs ao dia primeiro do proacuteximo mecircs e por consequecircncia alguns snapshots que deveriamrepresentar o final de determinado mecircs correspondem na verdade a commits realizadosno dia primeiro do mecircs seguinte Por exemplo pode existir casos em que o commit querepresente o mecircs de Marccedilo de 2016 seja na verdade o commit realizado no dia primeirode Abril de 2016 Isso se deve a natureza da forma como os resultados de log de commitssatildeo obtidos pelo git [39] Poreacutem isso natildeo interfere nas anaacutelises ou no propoacutesito destetrabalho uma vez que foram realizadas verificaccedilotildees e validaccedilotildees para que natildeo existamdatas repetidas (e consequentemente commits repetidos) por repositoacuterio

Neste trabalho o termo projeto e repositoacuterio foram utilizados de forma intercaladapara representar a mesma coisa o software desenvolvido que possui um repositoacuterio naplataforma github Os termos commit snapshops e versotildees tambeacutem representam a mesmacoisa uma vez que foi definido que seriam utilizados apenas um commit por mecircs pararepresentar um determinado snapshot ou versatildeo do repositoacuterio em questatildeo

Todos os 99 projetos seratildeo utilizados para a realizaccedilatildeo de uma anaacutelise geral de ca-racterizaccedilatildeo do uso de expressotildees lambda Para as anaacutelises aprofundadas foi feito umcriteacuterio de classificaccedilatildeo para que apenas alguns projetos possam ser analisados em niacutevelde coacutedigo como estudos de caso

Resumindo foram escolhidos os 99 projetos mais populares de Java no github cole-tando dados mensais de seus commits a partir do ano de 2013 ateacute a data da coleta dosdados lembrando que nem todos os projetos existem desde 2013 (projetos mais recentes)

43 Processo de Mineraccedilatildeo

A abordagem utilizada para coletar e analisar os 99 projetos escolhidos como mostra aFigura 42 foi realizada de forma automatizada utilizando scripts python e dois projetosdesenvolvidos em Java para a coleta e tratamento de dados como descrito a seguir

Primeiramente foi realizado uma coacutepia dos repositoacuterios atuais de todos os 99 projetosmais populares do github em Java Para automatizar o processo foi desenvolvido umscript em python que lista todos os projetos escolhidos clona todos os repositoacuterios emuma pasta na maacutequina local e cria um arquivo temporaacuterio com as informaccedilotildees do nomede cada repositoacuterio e seu caminho absoluto na maacutequina local

25

Figura 42 Metodologia implementada para coleta e tratamento de dados

Em seguida foi necessaacuterio realizar o checkout de todas as versotildees entre Janeiro de2013 a Abril de 2017 de cada projeto Por motivos de otimizaccedilatildeo de espaccedilo da maacutequinalocal e automatizaccedilatildeo no processo de checkout utilizou-se de um segundo script pythonque realizava as seguintes tarefas para cada mecircs em cada projeto verificar se dentreo mecircs estipulado houve algum commit para aquele projeto se sim pega-se o hash douacuteltimo commit do mecircs realiza o checkout conta-se a quantidade de linhas de coacutedigo emJava que o projeto tem utilizando a biblioteca cloc e armazena todas as informaccedilotildeespertinentes referentes a todos os projetos que naquele mecircs tiveram commits para que oprojeto static-analysis possa entatildeo ser executado sobre esses projetos naquele determinadomomento As informaccedilotildees coletadas que satildeo utilizadas pelo static-analysis correspondemao nome do projeto o hash do commit para aquela versatildeo a pasta onde o projeto estaacutearmazenado na maacutequina local a quantidade de linhas de coacutedigo Java do projeto e datareferente ao commit Essas informaccedilotildees satildeo pertinentes para que o projeto static-analysisconsiga funcionar de forma correta projeto este descrito em detalhes a seguir

431 static-analysis

O static-analysis foi um projeto desenvolvido anteriormente a este trabalho pelos alunosThiago Cavalcanti e Vinicius de Almeida cujo objetivo eacute realizar a anaacutelise estaacutetica de

26

coacutedigos-fonte Java e gerar arquivos de saiacuteda contendo informaccedilotildees de classes e meacutetodoscom suas devidas ocorrecircncias de caracteriacutesticas da linguagem [40]

A anaacutelise estaacutetica de coacutedigo consiste em analisar um coacutedigo-fonte sem a necessidadede executaacute-lo Esse tipo de anaacutelise eacute de extrema importacircncia para manter um coacutedigo dequalidade evitar futuras refatoraccedilotildees e obter informaccedilotildees estatiacutesticas de forma raacutepida epraacutetica [41]

Seguindo esse princiacutepio o static-analysis foi projetado para receber um arquivo deentrada csv seguindo o padratildeo

Tipo da Aplicaccedilatildeo Inicio do projeto Antes ou Apoacutes Java 5 Nome do ProjetoVersatildeo Caminho absolutoQuantidade de linhas de coacutedigo

Atraveacutes da informaccedilatildeo do caminho absoluto do projeto o static-analysis varre osdiretoacuterios em busca dos arquivos fonte java realiza o parse desses arquivos e utilizade Visitors para extrair as informaccedilotildees desejadas e exporta-las em arquivos csv Ouso de Visitors permite que sejam escolhidas as informaccedilotildees desejadas para a consultacomo expressotildees Lambda e AIC s aleacutem de possibilitar que sejam implementados novosVisitors conforme a linguagem evolua ou as necessidades mudem

Para este trabalho foram utilizados os Visitors de expressotildees Lambda map() filter()AICs e declaraccedilotildees de meacutetodos

432 BDAnalisador

Apoacutes obter todas as informaccedilotildees necessaacuterias geradas pelo static-analysis era preciso ma-nipular os dados de forma que facilitasse a coleta de dados para o estudo proposto Comovaacuterios arquivos em formato csv satildeo de difiacutecil manipulaccedilatildeo foi desenvolvido entatildeo umaferramenta chamada BDAnalisador Esta ferramenta eacute responsaacutevel por processar os arqui-vos em csv gerados pelo static-analysis e popular uma base de dados relacional MySQLcom as informaccedilotildees pertinentes a este estudo

O BDAnalisador foi desenvolvido com a intenccedilatildeo de tornar mais simples o trabalhocom os dados resultantes do static-analysis de forma que consultas em SQL pudessemser feitas a ponto de permitir a obtenccedilatildeo de resultados mais complexos Seguindo esseobjetivo o framework Hibernate foi escolhido como ferramenta para persistecircncia devidoa ser um framework jaacute consolidado no mercado e que de forma simples relaciona osobjetos Java ao banco de dados MySQL [42] A divisatildeo de classes foi projetada em quatroentidades Projeto Versao Classe e Metodo cada uma com seus respectivos camposcontendo as informaccedilotildees necessaacuterias para a pesquisa como pode ser visto na Figura 44Eacute importante ressaltar que a tabela de Versao guarda hashs de commits devido agrave escolhade utilizar commits para obter mais informaccedilatildeo de evoluccedilatildeo de coacutedigo em um menor

27

espaccedilo de tempo Aleacutem disso para este trabalho optou-se por persistir todos os meacutetodose classes de cada versatildeo sem se importar com a repeticcedilatildeo desses dados pois a hipoacutetesede haver grandes refatoraccedilotildees entre versotildees poderia comprometer a confiabilidade dasinformaccedilotildees

Figura 43 Diagrama de classes UML do BDAnalisador

Como visto na Figura 43 seguindo parcialmente a arquitetura MVC cada entidadepossui sua respectiva classe DAO(Data Access Object) para persistecircncia dos dados eapenas uma classe Controlador no projeto responsaacutevel pela manipulaccedilatildeo e parse dosdados dos arquivos csv gerados pelo static analysis para serem enviados agraves classes DAOO sistema inicia chamando o meacutetodo inicializar() da classe Controlador Esse meacutetodoeacute responsaacutevel por ler um arquivo de entrada csv que segue o mesmo modelo do arquivo dostatic-analysis citado na seccedilatildeo anterior O arquivo conteacutem os dados de todos os projetose suas respectivas versotildees dessa forma o meacutetodo instancia um objeto da classe Projetoe persiste o projeto no banco de dados Para cada versatildeo encontrada no arquivo deentrada o inicializar() aciona os meacutetodos responsaacuteveis por instanciar e preencher aslistas da classe Classe e Metodo Os meacutetodos responsaacuteveis por preencher as listas varremos arquivos csv gerados pelo static-analysis e fazem o parse das informaccedilotildees relevantescomo nomes dos meacutetodos e quantidades de lambdas para construir os objetos que seratildeogravados Ao final dos preenchimentos o objeto Versatildeo eacute instanciado e gravado no bancode dados atraveacutes de sua classe DAO ao mesmo tempo que grava suas respectivas Classese Metodos

28

Apoacutes vaacuterios testes e correccedilotildees de bugs o banco de dados se encontrava finalmente comas informaccedilotildees de 99 projetos Java open-source separados por um commit por mecircs desde2013 cada um com suas respectivas informaccedilotildees de classes meacutetodos e a quantidade deexpressotildees lambda filters e maps em cada meacutetodo Filter ou Filter pattern eacute o padratildeode projeto que tem como objetivo filtrar objetos de uma coleccedilatildeo (Collection) de acordocom algum criteacuterio Jaacute o map ou map pattern eacute um padratildeo que ldquomapeia os elementosde uma coleccedilatildeo aplicando uma funccedilatildeo a eles para uma nova coleccedilatildeo [43] A coleta deinformaccedilotildees sobre esses padrotildees podem ser uacuteteis para possiacuteveis anaacutelises de oportunidadesde uso de expressotildees lambda para refatoraccedilatildeo de coacutedigo

A Figura 44 mostra o esquema de como o banco de dados resultante foi gerado

Figura 44 Modelo relacional do banco de dados populado pelo BDAnalisador Imagemgerada com software DBeaver [2]

44 Classificaccedilatildeo e Anaacutelise

Com o banco de dados populado restam apenas as etapas de classificaccedilatildeo e anaacutelise pararesponder as questotildees de pesquisa propostas Para isso inicialmente houve uma tentativade se utilizar apenas queries SQL para analisar os dados de acordo com as informaccedilotildeesrelevantes Poreacutem devido ao fato de o banco de dados conter todas as informaccedilotildees detodos os projetos e todas as suas versotildees queries que possuem uma alta complexidadedemoravam muito tempo para retornar os dados

Assim com o objetivo de facilitar o trabalho alguns scripts python foram desenvolvi-dos para rodar as queries separadamente e individualmente para cada projeto de formaautomatizada a fim de melhorar o tempo de resposta para obtenccedilatildeo dos resultados

29

441 Meacutedia de Lambda

O primeiro script retorna a quantidade de expressotildees lambda (ou AICs) por n snapshotsque contenha expressotildees lambda O objetivo eacute ter uma visatildeo geral da meacutedia de expressotildeeslambda e AICs utilizadas por cada projeto e como nem todos os snapshots coletados decada projeto possuem expressotildees lambda e AICs apenas aqueles com alguma expressatildeolambda ou AIC satildeo incluiacutedos no caacutelculo da meacutedia

Mmedia =sumn qtdLambdai

n

442 Anaacutelise Temporal

O segundo script retorna para cada projeto a soma total da quantidade de expressotildeeslambda AIC map() e filter() no projeto inteiro para cada versatildeo Ou seja tem-seo total de cada uma das quatro propriedades selecionadas para cada mecircs do projetoobtendo assim uma visatildeo temporal de evoluccedilatildeo do uso das caracteriacutesticas descritas ATabela 41 ilustra parcialmente o resultado obtido para o projeto agera onde idVersaoeacute o identificador no banco de dados referente ao hash do commit mensal coletado qtd eacutea quantidade de cada uma das caracteriacutesticas escolhidas e a data do commit encontra-seno formato americano

Tabela 41 Informaccedilotildees mensais sobre o projeto ageraidVersao Data do Commit qtd lambda qtd AIC qtd maps qtd filter

823 512016 0 29 4 0755 612016 13 28 4 0686 6152016 13 29 4 0621 812016 13 29 4 0555 8162016 13 30 4 0485 922016 13 30 4 0422 10132016 14 30 4 0356 11282016 14 30 4 0295 12212016 21 30 5 0232 212017 21 30 5 0175 312017 21 30 5 0112 3312017 21 36 5 048 4242017 21 48 5 0

Os resultados obtidos com esta anaacutelise temporal permitiu a identificaccedilatildeo de padrotildees nautilizaccedilatildeo de expressotildees lambda em relaccedilatildeo a utilizaccedilatildeo de AIC por todos os projetos Foi

30

possiacutevel classificar todos os projetos em 6 grupos ilustrado na Figura 45 Primeiramenteseparou-se os projetos entre os que possuem expressotildees lambda e os que natildeo possuemDentre os que possuem identificou-se cinco categorias

1 Grupo 1 Quantidade de AICs e expressotildees lambda aumentam com o tempo pro-porcionalmente

2 Grupo 2 Quantidade de AICs diminui agrave medida que a quantidade de expressotildeeslambda aumentam e a quantidade de expressotildees lambda ultrapassa a quantidade deAIC em um determinado momento

3 Grupo 3 Quantidade de AICs diminui agrave medida que a quantidade de expressotildeeslambda aumentam mas a quantidade de AIC permanece superior agrave quantidade delambda

4 Grupo 4 Expressotildees lambda satildeo introduzidas e existem por um pequeno periacuteodode tempo mas satildeo completamente removidas posteriormente

5 Grupo 5 Quantidade de expressotildees lambda eacute constante e muito inferior compa-rado com a quantidade de AICs no projeto Foi determinado que para pertencera esta classificaccedilatildeo o projeto precisa ter uma razatildeo de meacutedia de expressotildees lamb-dasnapshot por meacutedia de AICsnapshot inferior a 020 Esse paracircmetro foi esta-belecido com o objetivo de definir um padratildeo para o que pode ser considerado umprojeto com poucas expressotildees lambda

Figura 45 Classificaccedilatildeo dos projetos

31

443 Refatoraccedilatildeo de Coacutedigo

O uacuteltimo script teve como objetivo realizar uma tentativa inicial de identificar refatoraccedilatildeode coacutedigo da seguinte maneira para todos os projetos que possuem expressotildees lambdaforam identificados o mecircs imediatamente antes da introduccedilatildeo de expressotildees lambda e omecircs seguinte onde houve a primeira ocorrecircncia de lambda no projeto Assim realizou-se uma anaacutelise do tamanho em quantidade de linhas de coacutedigo de todos os meacutetodosdo projeto que no mecircs seguinte tiveram introduccedilatildeo de lambda Em seguida fez-se umacomparaccedilatildeo com os mesmos meacutetodos em relaccedilatildeo ao mecircs anterior e assim foi possiacuteveldetectar quais meacutetodos tiveram a quantidade de linhas de coacutedigo reduzidas o que seriaum indicativo natildeo necessariamente exclusivo de que uma refatoraccedilatildeo de coacutedigo possa terocorrido

Sabe-se que este meacutetodo de detecccedilatildeo de refatoraccedilatildeo de coacutedigo possui suas limitaccedilotildeesuma vez que as comparaccedilotildees para saber se um meacutetodo existe em ambas versotildees eacute feitopuramente por comparaccedilatildeo de String (nome do meacutetodo) e a classe que este pertence

444 Casos de Uso

Os meacutetodos descritos acima ajudaram a identificar alguns padrotildees e facilitar a anaacutelise dosdados Poreacutem natildeo satildeo suficientes para que se possa responder agraves questotildees de pesquisaDessa forma apoacutes a identificaccedilatildeo dos grupos de classificaccedilatildeo para os projetos foramescolhidos um projeto de cada grupo (com exceccedilatildeo do grupo dos projetos sem expressotildeeslambda) para realizar um breve estudo de caso com o objetivo de identificar e caracterizarmelhor a adoccedilatildeo de expressotildees lambda Os projetos escolhidos foram agera vertxAndroid-CleanArchitecture RxJava e guava

32

Capiacutetulo 5

Resultados Obtidos e Anaacutelise

Neste capiacutetulo seratildeo apresentados os dados obtidos e anaacutelise com o objetivo de responderagraves questotildees de pesquisa propostas Como mencionado anteriormente as perguntas seratildeorespondidas de duas maneiras algumas com informaccedilotildees gerais sobre todos os projetose outras com breve estudos de caso envolvendo cinco projetos

51 Visatildeo Geral

Dentre os repositoacuterios coletados para a anaacutelise 74 (7474) natildeo utilizaram nenhumaexpressatildeo lambda no projeto durante todo o periacuteodo analisado (Janeiro de 2013 a Abrilde 2017) restando apenas 25 repositoacuterios (2525) com expressotildees lambda Eacute interessantedestacar que apesar de a quantidade de repositoacuterios que natildeo possuem expressotildees lambdaser relativamente expressiva muitos destes repositoacuterios satildeo de projetos em Java que umdia foram populares e atualmente natildeo estatildeo sendo mais desenvolvidos (por exemplo umaplicativo que soacute funciona para Android 23 atualmente descontinuado)

Levando em consideraccedilatildeo apenas os projetos que possuem expressotildees lambda exis-tem dois tipos de dados que podem ser analisados para responder agrave primeira questatildeo depesquisa atraveacutes dos dados obtidos pelo meacutetodo anteriormente mencionado como anaacutelisetemporal e a meacutedia de lambda por snapshot mencionados no capiacutetulo anterior

Com relaccedilatildeo ao ano em que a primeira ocorrecircncia foi encontrada 6 projetos introduzi-ram expressotildees lambda jaacute em 2014 8 comeccedilaram a utilizar em 2015 7 em 2016 e apenas4 tiveram a primeira ocorrecircncia de expressotildees lambda em 2017 Dessa forma percebe-seque os projetos estatildeo relativamente bem distribuiacutedos em grupos quanto ao ano em que seintroduziu expressotildees lambda

Pela meacutedia de lambda por snapshot (lambdasnapshot) a maioria (11 projetos) possuiuma quantidade expressiva acima de 100 lambdasnapshot (com 6 projetos entre 20 e 100lambdasnapshot e 8 projetos com menos de 20 lambdasnapshot) como apresentados no

33

graacutefico da Figura 51 Isso mostra que essa nova caracteriacutestica jaacute estaacute sendo bem utilizadanos projetos que comeccedilaram a migrar para a nova versatildeo do Java

Figura 51 Graacuteficos dos projetos separados por ano de introduccedilatildeo de expressotildees lambdae meacutedia de lambda por snapshot

Com isso pode-se observar que apesar de a quantidade de projetos que possuemexpressotildees lambda natildeo ser tatildeo alta eacute possiacutevel obter resultados expressivos uma vez quea quantidade dos projetos com lambda estatildeo bem dispersos quanto ao periacuteodo em quecomeccedilaram a adotar essa caracteriacutestica e a quantidade de expressotildees lambda por snapshot

511 Projetos Selecionados

Atraveacutes dos grupos de classificaccedilatildeo identificados pela anaacutelise temporal descritos na Figura45 cinco projetos foram selecionados para uma anaacutelise detalhada levando em consideraccedilatildeoo grupo em que eles pertencem Estes projetos seratildeo apresentados a seguir

512 agera

Agera eacute uma biblioteca Android que ajuda a introduzir programaccedilatildeo funcional reativa(functional reactive programming) em projetos Android Eacute um projeto recente lanccediladoem 2016 pela Google [44] e encontra-se no grupo dos projetos que introduziram expressotildeeslambda em 2016 no mesmo ano de seu lanccedilamento contendo uma meacutedia de expressotildeeslambda de 16 lambdasnapshot

Na classificaccedilatildeo estabelecida agera pertence ao Grupo 1 onde a quantidade de ex-pressotildees lambda no projeto com o tempo aumentam juntamente com a quantidade deAICs como mostra o graacutefico de anaacutelise temporal na Figura 52

34

Figura 52 Graacuteficos de anaacutelise temporal do projeto agera

513 vertx

Eclipse Vertx eacute um conjunto de ferramentas para criaccedilatildeo de reactive applications namaacutequina virtual Java (JVM) em grande escala [45] Seu primeiro lanccedilamento aconteceuem 2011 e a primeira ocorrecircncia de expressotildees lambda no projeto aconteceu em 2014 Esteprojeto possui uma meacutedia de 2867 lambdasnapshot e dentre os projetos consideradosneste trabalho eacute o que possui a maior quantidade de expressotildees lambda

Este projeto pertence ao Grupo 2 onde a quantidade de expressotildees lambda aumen-tou consideravelmente pelos meses ultrapassando a quantidade de AICs que diminuiudrasticamente como mostra a Figura 53

35

Figura 53 Graacuteficos de anaacutelise temporal do projeto Vertx

514 Android-CleanArchitecture

Apesar de ser uma amostra de projeto Android-CleanArchitecture que tem como objetivoconstruir aplicaccedilotildees Android utilizando clean architecture foi lanccedilado em 2014 mas semanteacutem sempre atualizado [46]

A introduccedilatildeo de expressotildees lambda que aconteceu no ano de 2015 se deu de formatiacutemida com uma meacutedia de 35 lambdasnapshot De qualquer forma este projeto conseguerepresentar com seu graacutefico de anaacutelise temporal o grupo 3 composto por projetos em quea quantidade de expressotildees lambda aumentou mas sem ultrapassar AICs que diminuiacuteramdemonstrado no graacutefico da Figura 54

36

Figura 54 Graacuteficos de anaacutelise temporal do projeto Android-CleanArchitecture

515 RxJava

Dentre os repositoacuterios estudados RxJava eacute considerado o mais popular Como umaimplementaccedilatildeo de Reactive Extensions para a JVM RxJava teve seu lanccedilamento dadoem 2013 [47] Expressotildees lambda apareceram pela primeira vez no ano de 2015 comuma meacutedia de 766 lambdasnapshot

Apesar de uma meacutedia relativamente alta o tempo de vida das expressotildees lambda nesteprojeto foi bem curto caracterizando assim projetos do grupo 4 houve a introduccedilatildeo dasexpressotildees lambda no projeto poreacutem houve a remoccedilatildeo completa de todas as expressotildeeslambda previamente introduzidas desaparecendo completamente do projeto ateacute a datada coleta de dados (Figura 55)

37

Figura 55 Graacuteficos de anaacutelise temporal do projeto RxJava

516 guava

Guava eacute um conjunto de bibliotecas para Java da Google lanccedilado em 2011 A atualizaccedilatildeodo coacutedigo do projeto para Java 8 aconteceu somente em 2016 e apesar do projeto conteruma meacutedia de 281 lambdasnapshot ele foi escolhido como representante dos projetosdo Grupo 5 (Figura 56) que possuem expressotildees lambda mas de forma natildeo expressiva osuficiente quando comparado com a quantidade de AIC pelo fato de sua razatildeo de meacutedia delambdasnapshot por meacutedia de AICsnapshot ser 004 Ou seja embora o projeto tenhaexpressotildees lambda estas satildeo consideradas muito poucas quando inseridas no contextogeral deste projeto que eacute considerado um projeto grande

38

Figura 56 Graacuteficos de anaacutelise temporal do projeto Guava

52 Refatoraccedilatildeo de Coacutedigo

Com o objetivo de caracterizar melhor como as expressotildees lambda estatildeo sendo utilizadaseacute interessante identificar se estas estatildeo sendo introduzidas atraveacutes de refatoraccedilatildeo de coacutedigoou em coacutedigo novo

Os projetos classificados como pertencentes ao Grupo 2 possuem em comum o fatode expressotildees lambda aumentarem a medida que AICs diminuem ultrapassando-as eessa caracteriacutestica em comum pode indicar que nestes projetos possivelmente houve re-fatoraccedilatildeo de coacutedigo visto que AIC sendo substituiacutedo por expressotildees lambda dentro dascondiccedilotildees determinadas eacute a maneira mais comum de se identificar refatoraccedilatildeo de coacute-digo para introduccedilatildeo de expressotildees lambda [12] Os projetos que compotildeem o grupo 2representam 44 de todos os projetos estudados que possuem expressotildees lambda o quepode ser um indicativo caso a hipoacutetese de refatoraccedilatildeo de coacutedigo seja positiva de quemuitos projetos que estatildeo adotando o Java 8 estatildeo se preocupando de alguma formacom refatoraccedilatildeo se coacutedigo Fazem parte desse grupo os seguintes projetos elasticsearchjava-design-patterns PocketHub presto RxJava-Android-Samples spark vertx zipkinjava8-tutorial dropwizard e material-dialogs

39

Outra maneira de verificar possiacuteveis indicadores de refatoraccedilatildeo de coacutedigo foi atraveacutesda anaacutelise dos tamanhos (em quantidade de linhas de coacutedigo) dos meacutetodos com expressotildeeslambda no mecircs em que se introduziu expressotildees lambda e um mecircs imediatamente antesdeste Essa anaacutelise mostra que dos 25 projetos com expressotildees lambda 12 (48) projetostiveram ao menos um meacutetodo em que houve uma diminuiccedilatildeo no tamanho o que podeser considerado um indicativo de refatoraccedilatildeo de coacutedigo A Figura 57 mostra todos osprojetos em relaccedilatildeo agrave quantidade total de meacutetodos que possuem lambda no primeiro mecircsde introduccedilatildeo do mesmo em vermelho comparado com a quantidade desses meacutetodos quetiveram uma diminuiccedilatildeo no tamanho quando comparados com o coacutedigo do mecircs anteriorem azul

Figura 57 Comparaccedilatildeo entre todos os projetos com expressatildeo lambda sobre refatoraccedilatildeode coacutedigo no mecircs de introduccedilatildeo da caracteriacutestica

Ainda observando a figura 57 com relaccedilatildeo aos projetos que natildeo tiveram nenhummeacutetodo com diminuiccedilatildeo de tamanho (barra azul) percebe-se que todos os 13 projetossequer tiveram uma quantidade significativa de meacutetodos que possuem expressotildees lambda(com o maior tendo apenas 5 meacutetodos) no mecircs de introduccedilatildeo da caracteriacutestica no projetoe ao mesmo tempo jaacute existiam no mecircs em que natildeo existia lambda no projeto Essa eacuteuma observaccedilatildeo importante porque projetos como vertx sendo este o que possui a maiormeacutedia de lambdasnapshot de todos os projetos e ao mesmo tempo tendo apenas trecircsmeacutetodos que continham expressotildees lambda no mecircs da introduccedilatildeo e que existiam no mecircs

40

anterior permitem inferir que todas as outras expressotildees lambda existentes no projetopara este determinado mecircs de introduccedilatildeo encontram-se em coacutedigo novo introduzido

Eacute importante ressaltar que somente essa anaacutelise natildeo eacute exclusivamente suficiente paradeterminar se estes projetos estatildeo realmente introduzindo lambda em coacutedigo novo ourealizando refatoraccedilatildeo uma vez que como a comparaccedilatildeo aconteceu apenas no mecircs deintroduccedilatildeo com o mecircs imediatamente anterior natildeo reflete todo o ciclo de vida do pro-jeto Por exemplo algumas equipes podem escolher refatorar o coacutedigo depois de umtempo de adaptaccedilatildeo apoacutes a transiccedilatildeo para a nova versatildeo da linguagem Assim paraobter uma melhor anaacutelise sobre refatoraccedilatildeo de coacutedigo ou natildeo feita nestes projetos aleacutemde outras anaacutelises referentes aos padrotildees tipicamente adotados para implementaccedilatildeo delambda nestes projetos seratildeo apresentados a seguir os estudos de caso dos cinco projetospreviamente selecionados

Outro ponto importante eacute o fato de que apesar das informaccedilotildees quanto agraves quantida-des de filter e map terem sido incluiacutedas inicialmente no trabalho para observar possiacuteveispadrotildees de refatoraccedilatildeo de coacutedigo percebeu-se que estas natildeo satildeo utilizadas de forma con-sideraacutevel pelos projetos estudados e para fins de anaacutelises generalizadas natildeo apresentaramtanta influecircncia na utilizaccedilatildeo de expressotildees lambda quanto a quantidade de AICs noprojeto

53 Estudos de Caso

Dentre os projetos analisados verificou-se que os projetos de pequeno e meacutedio porte op-taram por refatorar de uma vez seus coacutedigos para incluir expressotildees lambda em situaccedilotildeesem que se utilizava AICs anteriormente ou em alguns poucos casos de utilizaccedilatildeo deCollection Os projetos de grande porte natildeo apresentaram nenhuma refatoraccedilatildeo de coacute-digo ou uma refatoraccedilatildeo parcial gradativa provavelmente devido agrave grande quantidade dearquivos e coacutedigo que possuem o que pode tornar o trabalho de refatoraccedilatildeo extenso ecansativo

O projeto vertx que pertence ao grupo 2 dos projetos em que a quantidade de ex-pressotildees lambda aumentaram e as de AICs diminuiacuteram com lambda ultrapassando AICsexecutou inicialmente commits em maio de 2014 com adiccedilatildeo de coacutedigo novo utilizandoexpressotildees lambda e apoacutes um mecircs realizou um commit maior com a refatoraccedilatildeo de todasas AICs para expressotildees lambda Apoacutes a refatoraccedilatildeo o projeto se preocupou em mantera utilizaccedilatildeo de expressotildees lambda ao mesmo tempo que o uso de AICs se manteve apenasaos casos de classes com interfaces natildeo funcionais A Figura 58 apresenta uma parte docommit de refatoraccedilatildeo de coacutedigo que mostra em vermelho a parte eliminada do coacutedigo(AIC) e em verde o coacutedigo novo representando a substituiccedilatildeo por uma expressatildeo lambda

41

Figura 58 Commit de refatoraccedilatildeo de coacutedigo do projeto Vertx [3]

Alguns projetos ainda natildeo se preocuparam em refatorar o coacutedigo para o uso de ex-pressotildees lambda ateacute a data deste trabalho que eacute o caso do projeto guava que apresentouum commit em 03112016 com a atualizaccedilatildeo do projeto para Java 8 Mas a partir daatualizaccedilatildeo se preocupou em utilizar as expressotildees lambda apenas na implementaccedilatildeo decoacutedigo novo O cenaacuterio em que a refatoraccedilatildeo natildeo eacute prioridade ainda eacute a realidade de vaacuteriosprojetos de grande porte visto que os dados de projetos sem nenhuma expressatildeo lambdasatildeo o maior nuacutemero neste trabalho Poreacutem projetos que jaacute adotaram a utilizaccedilatildeo do Java8 tendem a mudar isso com o passar do tempo A Figura 59 apresenta em verde umaadiccedilatildeo de coacutedigo novo com expressatildeo lambda sem a eliminaccedilatildeo de algum coacutedigo anteriora esse que estaria em vermelho

42

Figura 59 Exemplo de um arquivo do commit de adiccedilatildeo de coacutedigo novo em Java 8 doprojeto Guava [4]

Na categoria de projetos em que os AICs e expressotildees lambda aumentam proporci-onalmente (grupo 1) o projeto agera realizou um commit em 19052016 com a adiccedilatildeoda biblioteca retrolambda como dependecircncia do projeto Essa biblioteca utilizada prin-cipalmente por projetos Android permite executar coacutedigo Java 8 contendo expressotildeeslambda em Java 5 6 e 7 [48] O commit tambeacutem apresenta refatoraccedilatildeo dos AICs ad-vindos de interfaces funcionais para expressotildees lambda Apesar de o projeto continuar autilizar as expressotildees lambda em seus commits posteriores o nuacutemero de AICs tambeacutemcontinuou a aumentar visualizando os commits posteriores notou-se que esses AICs satildeorelativos a interfaces natildeo funcionais ou seja que possuem mais de um meacutetodo O projetoAndroid-CleanArchitecture eacute similar ao agera pois tambeacutem optou pela instalaccedilatildeo da bi-blioteca retrolambda para uso de expressotildees lambda em seus coacutedigos e como tambeacutem eacuteum projeto de pequeno porte houve uma pequena refatoraccedilatildeo dos AICs A Figura 510mostra a parte do commit de refatoraccedilatildeo de coacutedigo em que o desenvolvedor adiciona abiblioteca retrolambda como dependecircncia

43

Figura 510 Commit de adiccedilatildeo da biblioteca Retrolambda no projeto Agera [5]

Outro caso interessante eacute o do projeto RxJava que em 2015 optou pela refatoraccedilatildeodo coacutedigo para a utilizaccedilatildeo de expressotildees lambda quase eliminando por completo o usode AICs mas que no ano seguinte reverteu os commits de forma que eliminasse comple-tamente o uso de expressotildees lambda para manter a retrocompatibilidade com o Java 6A Figura 511 demonstra uma parte do commit de reversatildeo do coacutedigo para Java 6 emque pode ser visto em vermelho o coacutedigo anterior com expressotildees lambda e o verde como novo coacutedigo utilizando AIC novamente

44

Figura 511 Commit de remoccedilatildeo de Lambdas e volta para o uso de AICs no projetoRXJava [6]

Essa preocupaccedilatildeo com retrocompatibilidade de coacutedigo pode ser um fator crucial nadecisatildeo das equipes de desenvolvimento na hora de decidir como fazer o software co-evoluircom a linguagem sem perder a compatibilidade com versotildees anteriores

45

Capiacutetulo 6

Consideraccedilotildees Finais

Este estudo permitiu entender melhor como projetos estatildeo realizando a migraccedilatildeo para oJava 8 em especial utilizando uma nova caracteriacutestica introduzida expressatildeo lambdaApesar de a maioria dos projetos populares considerados natildeo possuiacuterem nenhuma ocor-recircncia de expressotildees lambda os projetos que tinham expressotildees lambda foram suficientespara realizar um primeiro estudo de caracterizaccedilatildeo no uso desta caracteriacutestica e com osprojetos efetivamente utilizados para estudo foi possiacutevel agrupaacute-los quanto a maneira emque as expressotildees lambda estavam sendo utilizadas quando comparadas com AICs em 5grandes grupos quando AIC e lambda aumentam proporcionalmente quando AIC dimi-nui e lambda aumenta ultrapassando AIC quando AIC diminui mas continua superior aolambda crescente expressotildees lambda que foram introduzidas e retiradas completamentedo coacutedigo e expressotildees lambda que natildeo existem em quantidades expressivas

Foi possiacutevel entatildeo realizar um estudo aprofundado levando em consideraccedilatildeo as di-ferentes maneiras com que as expressotildees lambda foram adotadas nos projetos atraveacutes daescolha de um projeto que representasse cada grupo para anaacutelise Dentre os cinco projetosestudados foi possiacutevel observar alguns padrotildees tipicamente adotados por desenvolvedorespara implementar expressotildees lambda em seus projetos como a utilizaccedilatildeo da bibliotecas(retrolambda) que permitissem uma flexibilizaccedilatildeo na utilizaccedilatildeo de expressotildees lambda oucomo lambda eacute primariamente utilizada para substituir determinados AICs ou operaccedilotildeesem Collection

Aleacutem disso foi possiacutevel observar como a refatoraccedilatildeo de coacutedigo acontece em cada umdesses projetos Observou-se como projetos menores tendem a refatorar coacutedigo maisfacilmente ao passo que projetos maiores e mais complexos fazem menos refatoraccedilatildeo oudemoram mais entre o periacuteodo em que houve a primeira migraccedilatildeo de coacutedigo para a novaversatildeo da linguagem ateacute o periacuteodo em que realmente decidem refatorar coacutedigo Aleacutem dacomplexidade do projeto influenciar na decisatildeo de migrar o projeto para uma versatildeo maisrecente da linguagem a preocupaccedilatildeo com retrocompatibilidade com versotildees anteriores da

46

linguagem tambeacutem podem ser uma barreira para que projetos comecem a evoluir o coacutedigojuntamente com a evoluccedilatildeo da linguagem

Ainda assim foi possiacutevel observar que a preocupaccedilatildeo com a co-evoluccedilatildeo do software-linguagem existe entre os desenvolvedores de projetos mas a realizaccedilatildeo da migraccedilatildeo aindaacontece lentamente devido agrave diversos fatores que precisam ser levados em consideraccedilatildeopara a manutenccedilatildeo do projeto

Para trabalhos e contribuiccedilotildees futuras seria interessante desenvolver uma ferramentaque pudesse analisar diretamente no coacutedigo-fonte as oportunidades de aplicaccedilatildeo de ex-pressotildees lambda dessa forma poderiam ser analisadas as porcentagens de conversatildeo decoacutedigo para Java 8 e obter melhores conclusotildees sobre a importacircncia que os projetos estatildeodando para a evoluccedilatildeo de seus coacutedigos Outro fator interessante seria aplicar mais Visitorsagrave ferramenta static-analysis e fazer este mesmo estudo aplicado agrave outras caracteriacutesticasda linguagem

47

Referecircncias

[1] Kagdi Huzefa Michael L Collard e Jonathan I Maletic A survey and taxonomyof approaches for mining software repositories in the context of software evolution2007 ix 3 8 9 10 11

[2] DBeaver Dbeaver - features httpdbeaverjkissorgdocsfeatures ix 29

[3] Eclipse Vertx commit Java8-ify code httpsgithubcomeclipsevertxcommit93f95e9c77419f442a42fe711b6eeaef88192fd3 ix 42

[4] Google Guava commit Release java 8 changes to guava httpsgithubcomgoogleguavacommit73e382fa877f80994817a136b0adcc4365ccd904 ix 43

[5] Google Agera commit Collapsed testapp with retrolambda httpsgithubcomgoogleageracommit5e518b7b05f9e7a34a314945f68deff7b2c3e334 ix 44

[6] ReactiveX Rxjava commit 2x full jdk 6 compatible backport + includ-ing bugfixes up to today httpsgithubcomReactiveXRxJavacommit000a174d87a901135f9665d3b11f3627fd2dc4ed ix 45

[7] Godfrey M W e D M German The past present and future of software evolutionEm 2008 Frontiers of Maintenance paacuteginas 129ndash138 Sept 2008 1 6

[8] Favre J M Languages evolve too changing the software time scale Em Principles ofSoftware Evolution Eighth International Workshop on paacuteginas 33ndash42 IEEE 20051 5 7

[9] Overbey Jeffrey L e Ralph E Johnson Regrowing a language refactoring tools allowprogramming languages to evolve Em ACM SIGPLAN Notices volume 44 paacuteginas493ndash502 ACM 2009 1 5 7 8 12

[10] Grechanik Mark Collin McMillan Luca DeFerrari Marco Comi Stefano CrespiDenys Poshyvanyk Chen Fu Qing Xie e Carlo Ghezzi An empirical investiga-tion into a large-scale java open source code repository Em Proceedings of the2010 ACM-IEEE International Symposium on Empirical Software Engineering andMeasurement ESEM rsquo10 paacuteginas 111ndash1110 New York NY USA 2010 ACMISBN 978-1-4503-0039-1 httpdoiacmorg10114518527861852801 1

[11] TIOBE Tiobe httpswwwtiobecomtiobe-index 1 14

48

[12] Gyori Alex Lyle Franklin Danny Dig e Jan Lahoda Crossing the gap from im-perative to functional programming through refactoring Em Proceedings of the 20139th Joint Meeting on Foundations of Software Engineering ESECFSE 2013 paacute-ginas 543ndash553 New York NY USA 2013 ACM ISBN 978-1-4503-2237-9 httpdoiacmorg10114524914112491461 2 11 24 39

[13] OpenJDK State of the lambda httpcropenjdkjavanet~briangoetzlambdalambda-state-4html 2

[14] Han Jiawei Micheline Kamber e Jian Pei Data Mining Concepts and TechniquesMorgan Kaufmann Publishers Inc San Francisco CA USA 3rd ediccedilatildeo 2011ISBN 0123814790 9780123814791 3

[15] Fowler Martin e Kent Beck Refactoring improving the design of existing codeAddison-Wesley Professional 1999 5 7

[16] Lehman M M J F Ramil P D Wernick D E Perry e W M Turski Met-rics and laws of software evolution - the nineties view Em Proceedings of the4th International Symposium on Software Metrics METRICS rsquo97 paacuteginas 20ndashWashington DC USA 1997 IEEE Computer Society ISBN 0-8186-8093-8 httpdlacmorgcitationcfmid=823454823901 6

[17] Hassan Ahmed E e Tao Xie Software intelligence The future of mining softwareengineering data Em Proceedings of the FSESDP Workshop on Future of SoftwareEngineering Research FoSER rsquo10 paacuteginas 161ndash166 New York NY USA 2010ACM ISBN 978-1-4503-0427-6 httpdoiacmorg101145188236218823978 9

[18] Hassan Ahmed E The road ahead for mining software repositories Em Frontiers ofSoftware Maintenance 2008 FoSM 2008 paacuteginas 48ndash57 IEEE 2008 8

[19] Berry Michael J e Gordon Linoff Data Mining Techniques For Marketing Salesand Customer Support John Wiley amp Sons Inc New York NY USA 1997ISBN 0471179809 10

[20] Parnin Chris Christian Bird e Emerson Murphy-Hill Java generics adoption hownew features are introduced championed or ignored Em Proceedings of the 8thWorking Conference on Mining Software Repositories paacuteginas 3ndash12 ACM 2011 12

[21] Oracle The java language specification httpsdocsoraclecomjavasespecsjlsse8jls8pdf 13

[22] Oracle The history of java technology httpwwworaclecomtechnetworkjavajavaseoverviewjavahistory-index-198355html 13

[23] Murphy Kieron So why did they decide to call itjava httpwwwjavaworldcomarticle2077265core-javaso-why-did-they-decide-to-call-it-java-html 13

[24] McGraw Tata Object-oriented Programming with Java Essentials and ApplicationsHill Education 13

49

[25] Oracle Differences between java ee and java se httpdocsoraclecomjavaee6firstcupdocgkhoyhtml 13

[26] Lindsey Clark S The History of Java Cambridge 14

[27] Oracle The java language environment httpwwworaclecomtechnetworkjavaintro-141325html 14

[28] Oracle Jdk 8 httpopenjdkjavanetprojectsjdk8 15 24

[29] Oracle Enhancements in java se 8 httpdocsoraclecomjavase8docstechnotesguideslanguageenhancementshtmljavase8 15 16 17

[30] Oracle Lambda expressions httpdocsoraclecomjavasetutorialjavajavaOOlambdaexpressionshtml 16 18 21

[31] Oracle Method references httpdocsoraclecomjavasetutorialjavajavaOOmethodreferenceshtml 16

[32] Oracle Default methods httpdocsoraclecomjavasetutorialjavaIandIdefaultmethodshtml 17

[33] Oracle Repeating annotations httpdocsoraclecomjavasetutorialjavaannotationsrepeatinghtml 17

[34] Oracle Type annotations httpdocsoraclecomjavasetutorialjavaannotationstype_annotationshtml 17

[35] Oracle Anonymous inner classes httpsdocsoraclecomjavasetutorialjavajavaOOanonymousclasseshtml 19

[36] Kothari CR Research Methodology Methods and Techniques New Age Interna-tional (P) Limited 2004 ISBN 9788122415223 httpsbooksgooglecombrbooksid=8c6gkbKi-F4C 22

[37] Nakakoji Kumiyo Yasuhiro Yamamoto Yoshiyuki Nishinaka Kouichi Kishida eYunwen Ye Evolution patterns of open-source software systems and communitiesEm IWPSE rsquo02 Proceedings of the International Workshop on Principles of SoftwareEvolution paacuteginas 76ndash85 New York NY USA 2002 ACM Press ISBN 1581135459httpdxdoiorg101145512035512055 23

[38] Rahman Foyzur Christian Bird e Premkumar Devanbu Clones What is that smellEmpirical Software Engineering 17(4-5)503ndash530 2012 24

[39] Chacon Scott Pro Git Apress Berkely CA USA 1st ediccedilatildeo 2009ISBN 1430218339 9781430218333 25

[40] Cavalcanti Thiago Gomes e Viniacutecius Correa de Almeida Caracterizaccedilatildeo do uso deconstruccedilotildees da linguagem java em projetos open-source Publicaccedilatildeo online 2016httpbdmunbbrhandle1048315733 27

50

[41] Parr Terence Language Implementation Patterns Create Your Own Domain-Specific and General Programming Languages Pragmatic Bookshelf 1st ediccedilatildeo 2009ISBN 193435645X 9781934356456 27

[42] Janssen Thorben 5 reasons to use jpa hibernate Publicaccedilatildeo online httpswwwsitepointcom5-reasons-to-use-jpa-hibernate 27

[43] Franklin Lyle Alex Gyori Jan Lahoda e Danny Dig Lambdaficator From imperativeto functional programming through automated refactoring Em Proceedings of the2013 International Conference on Software Engineering ICSE rsquo13 paacuteginas 1287ndash1290 Piscataway NJ USA 2013 IEEE Press ISBN 978-1-4673-3076-3 httpdlacmorgcitationcfmid=24867882486986 29

[44] Google Agera httpsgithubcomgoogleagerawiki 34

[45] Eclipse Eclipse vertx httpvertxio 35

[46] Cejas Fernando Android cleanarchitecture httpsgithubcomandroid10Android-CleanArchitecture 36

[47] ReactiveX Rxjava httpsgithubcomReactiveXRxJava 37

[48] Luontola Esko Retrolambda httpsgithubcomorfjackalretrolambda 43

51

Anexo I

Projetos utilizados

fastjson

platform_frameworks_base

netty

material-dialogs

kotlin

okhttp

tinker

AndroidUtilCode

RxJava

spring-boot

java-design-patterns

elasticsearch

ExoPlayer

kafka

vertx

realm-java

guava

zipkin

bazel

stetho

Signal-Android

glide

agera

fresco

plaid

presto

libgdx

spark

52

disruptor

lottie-android

flexbox-layout

PocketHub

zxing

spring-framework

deeplearning4j

dropwizard

interviews

BaseRecyclerViewAdapterHelper

uCrop

DanmakuFlameMaster

lottie-react-native

android-UniversalMusicPlayer

AndroidInterview-Q-A

greenDAO

retrofit

MaterialDrawer

BottomBar

druid

MPAndroidChart

Hystrix

guice

recyclerview-animators

dubbo

androidannotations

RxJava-Android-Samples

PhotoView

clojure

CircleImageView

AndroidSwipeLayout

jedis

MaterialViewPager

butterknife

junit4

RxBinding

leakcanary

SimianArmy

picasso

UltimateRecyclerView

53

AndroidViewAnimations

AppIntro

FizzBuzzEnterpriseEdition

ion

cheesesquare

physical-web

RxAndroid

Android-CleanArchitecture

Calligraphy

Android-Bootstrap

iosched

Android_Data

MaterialDesignLibrary

ListViewAnimations

EventBus

java8-tutorial

AndroidSlidingUpPanel

dagger

okhttputils

logger

HomeMirror

Material-Animations

android-Ultra-Pull-To-Refresh

android-async-http

Android-ObservableScrollView

Android-Universal-Image-Loader

ActionBarSherlock

SlidingMenu

storm

PagerSlidingTabStrip

Android-PullToRefresh

54

  • Dedicatoacuteria
  • Agradecimentos
  • Resumo
  • Abstract
  • Introduccedilatildeo
    • Contexto
    • Objetivos
      • Objetivos Gerais
      • Objetivos Especiacuteficos
        • Metodologia
        • Organizaccedilatildeo do Trabalho
          • Evoluccedilatildeo e Mineraccedilatildeo de Repositoacuterios de Software
            • Evoluccedilatildeo de Software
            • MSR Mineraccedilatildeo de dados e a Engenharia de Software
              • Classificaccedilatildeo
                • Trabalhos Relacionados
                  • Java SE 8 e JDK 8
                    • Histoacuterico
                    • Princiacutepios
                    • Evoluccedilatildeo
                    • Expressotildees Lambda
                      • Sintaxe
                      • Principais formas de uso
                          • Estudo e o Processo de Mineraccedilatildeo
                            • Questotildees de Pesquisa
                            • Fonte de Dados e Objetos de Estudo
                            • Processo de Mineraccedilatildeo
                              • static-analysis
                              • BDAnalisador
                                • Classificaccedilatildeo e Anaacutelise
                                  • Meacutedia de Lambda
                                  • Anaacutelise Temporal
                                  • Refatoraccedilatildeo de Coacutedigo
                                  • Casos de Uso
                                      • Resultados Obtidos e Anaacutelise
                                        • Visatildeo Geral
                                          • Projetos Selecionados
                                          • agera
                                          • vertx
                                          • Android-CleanArchitecture
                                          • RxJava
                                          • guava
                                            • Refatoraccedilatildeo de Coacutedigo
                                            • Estudos de Caso
                                              • Consideraccedilotildees Finais
                                              • Referecircncias
                                              • Anexo
                                              • Projetos utilizados

Eacute importante ressaltar que apesar de as expressotildees lambda serem uma alternativa aouso de AIC elas natildeo os substituem completamente Existem precondiccedilotildees para que umaAIC possa ser substituiacuteda por expressotildees lambda [12] descritas a seguir

bull AIC deve instanciar-se de uma interface

bull AIC natildeo deve possuir nenhum campo e declarar apenas um meacutetodo

bull AIC natildeo deve possuir uma referecircncia para this ou super

bull AIC natildeo deve declarar um meacutetodo recursivo

Para responder agrave primeira pergunta apenas dados gerais sobre todos os projetos seratildeonecessaacuterios ao passo que pelas perguntas 2 e 3 possuiacuterem uma natureza mais complexaseraacute necessaacuterio aleacutem de uma anaacutelise geral estatiacutestica a realizaccedilatildeo de alguns estudos decaso para obter resultados mais completos

42 Fonte de Dados e Objetos de Estudo

Para responder agraves perguntas de pesquisa estabelecidas foram selecionados os 99 projetosmais populares na linguagem Java dentro da plataforma github ateacute a data da coleta dosdados feita em Abril de 2017 Satildeo considerados populares os repositoacuterios que possuema maior quantidade possiacutevel de estrelas (stars) A decisatildeo de escolher os 99 projetos maispopulares foi por sua natureza imparcial e ao mesmo tempo para que se possa analisarprojetos que satildeo de familiaridade e conhecimento da comunidade do github e de domiacuteniopuacuteblico Os 99 projetos estatildeo listados no Anexo I

Para entender a transiccedilatildeo feita por esses projetos entre as versotildees anteriores do Java eo Java 8 com as expressotildees lambda eacute necessaacuterio analisar o coacutedigo de vaacuterias versotildees a fimde observar alguma mudanccedila para cada projeto Como satildeo 99 projetos e vaacuterios dessesprojetos possuem milhares de linhas de coacutedigo e commits seria impossiacutevel avaliar todosos commits Optou-se entatildeo por coletar snapshots mensais de cada projeto conformeprocedimento tambeacutem seguido anteriormente [38] Cada snapshots representa o estadodo projeto em um determinado mecircs e como criteacuterio de escolha padratildeo todos os snapshotsequivalem ao uacuteltimo commit realizado no determinado mecircs que este representa

O proacuteximo passo eacute determinar o periacuteodo de tempo em que esses snapshots seriamcoletados Como Java 8 (e consequentemente as expressotildees lambda) foi introduzidoapenas em meados de 2014 [28] coletar dados de projetos a partir de um periacuteodo muitoantes deste ano natildeo agregaria valor ao estudo em questatildeo Definiu-se entatildeo um periacuteodopara a coleta mensal desses snapshots atraveacutes dos anos Janeiro de 2013 um ano antesda introduccedilatildeo do Java 8 para que se pudesse identificar para todos os projetos o mecircs

24

exato em que expressotildees lambda foram introduzidas ateacute o mecircs da coleta de dados Abrilde 2017

Eacute importante ressaltar que a definiccedilatildeo dos meses foi definida do dia primeiro de ummecircs ao dia primeiro do proacuteximo mecircs e por consequecircncia alguns snapshots que deveriamrepresentar o final de determinado mecircs correspondem na verdade a commits realizadosno dia primeiro do mecircs seguinte Por exemplo pode existir casos em que o commit querepresente o mecircs de Marccedilo de 2016 seja na verdade o commit realizado no dia primeirode Abril de 2016 Isso se deve a natureza da forma como os resultados de log de commitssatildeo obtidos pelo git [39] Poreacutem isso natildeo interfere nas anaacutelises ou no propoacutesito destetrabalho uma vez que foram realizadas verificaccedilotildees e validaccedilotildees para que natildeo existamdatas repetidas (e consequentemente commits repetidos) por repositoacuterio

Neste trabalho o termo projeto e repositoacuterio foram utilizados de forma intercaladapara representar a mesma coisa o software desenvolvido que possui um repositoacuterio naplataforma github Os termos commit snapshops e versotildees tambeacutem representam a mesmacoisa uma vez que foi definido que seriam utilizados apenas um commit por mecircs pararepresentar um determinado snapshot ou versatildeo do repositoacuterio em questatildeo

Todos os 99 projetos seratildeo utilizados para a realizaccedilatildeo de uma anaacutelise geral de ca-racterizaccedilatildeo do uso de expressotildees lambda Para as anaacutelises aprofundadas foi feito umcriteacuterio de classificaccedilatildeo para que apenas alguns projetos possam ser analisados em niacutevelde coacutedigo como estudos de caso

Resumindo foram escolhidos os 99 projetos mais populares de Java no github cole-tando dados mensais de seus commits a partir do ano de 2013 ateacute a data da coleta dosdados lembrando que nem todos os projetos existem desde 2013 (projetos mais recentes)

43 Processo de Mineraccedilatildeo

A abordagem utilizada para coletar e analisar os 99 projetos escolhidos como mostra aFigura 42 foi realizada de forma automatizada utilizando scripts python e dois projetosdesenvolvidos em Java para a coleta e tratamento de dados como descrito a seguir

Primeiramente foi realizado uma coacutepia dos repositoacuterios atuais de todos os 99 projetosmais populares do github em Java Para automatizar o processo foi desenvolvido umscript em python que lista todos os projetos escolhidos clona todos os repositoacuterios emuma pasta na maacutequina local e cria um arquivo temporaacuterio com as informaccedilotildees do nomede cada repositoacuterio e seu caminho absoluto na maacutequina local

25

Figura 42 Metodologia implementada para coleta e tratamento de dados

Em seguida foi necessaacuterio realizar o checkout de todas as versotildees entre Janeiro de2013 a Abril de 2017 de cada projeto Por motivos de otimizaccedilatildeo de espaccedilo da maacutequinalocal e automatizaccedilatildeo no processo de checkout utilizou-se de um segundo script pythonque realizava as seguintes tarefas para cada mecircs em cada projeto verificar se dentreo mecircs estipulado houve algum commit para aquele projeto se sim pega-se o hash douacuteltimo commit do mecircs realiza o checkout conta-se a quantidade de linhas de coacutedigo emJava que o projeto tem utilizando a biblioteca cloc e armazena todas as informaccedilotildeespertinentes referentes a todos os projetos que naquele mecircs tiveram commits para que oprojeto static-analysis possa entatildeo ser executado sobre esses projetos naquele determinadomomento As informaccedilotildees coletadas que satildeo utilizadas pelo static-analysis correspondemao nome do projeto o hash do commit para aquela versatildeo a pasta onde o projeto estaacutearmazenado na maacutequina local a quantidade de linhas de coacutedigo Java do projeto e datareferente ao commit Essas informaccedilotildees satildeo pertinentes para que o projeto static-analysisconsiga funcionar de forma correta projeto este descrito em detalhes a seguir

431 static-analysis

O static-analysis foi um projeto desenvolvido anteriormente a este trabalho pelos alunosThiago Cavalcanti e Vinicius de Almeida cujo objetivo eacute realizar a anaacutelise estaacutetica de

26

coacutedigos-fonte Java e gerar arquivos de saiacuteda contendo informaccedilotildees de classes e meacutetodoscom suas devidas ocorrecircncias de caracteriacutesticas da linguagem [40]

A anaacutelise estaacutetica de coacutedigo consiste em analisar um coacutedigo-fonte sem a necessidadede executaacute-lo Esse tipo de anaacutelise eacute de extrema importacircncia para manter um coacutedigo dequalidade evitar futuras refatoraccedilotildees e obter informaccedilotildees estatiacutesticas de forma raacutepida epraacutetica [41]

Seguindo esse princiacutepio o static-analysis foi projetado para receber um arquivo deentrada csv seguindo o padratildeo

Tipo da Aplicaccedilatildeo Inicio do projeto Antes ou Apoacutes Java 5 Nome do ProjetoVersatildeo Caminho absolutoQuantidade de linhas de coacutedigo

Atraveacutes da informaccedilatildeo do caminho absoluto do projeto o static-analysis varre osdiretoacuterios em busca dos arquivos fonte java realiza o parse desses arquivos e utilizade Visitors para extrair as informaccedilotildees desejadas e exporta-las em arquivos csv Ouso de Visitors permite que sejam escolhidas as informaccedilotildees desejadas para a consultacomo expressotildees Lambda e AIC s aleacutem de possibilitar que sejam implementados novosVisitors conforme a linguagem evolua ou as necessidades mudem

Para este trabalho foram utilizados os Visitors de expressotildees Lambda map() filter()AICs e declaraccedilotildees de meacutetodos

432 BDAnalisador

Apoacutes obter todas as informaccedilotildees necessaacuterias geradas pelo static-analysis era preciso ma-nipular os dados de forma que facilitasse a coleta de dados para o estudo proposto Comovaacuterios arquivos em formato csv satildeo de difiacutecil manipulaccedilatildeo foi desenvolvido entatildeo umaferramenta chamada BDAnalisador Esta ferramenta eacute responsaacutevel por processar os arqui-vos em csv gerados pelo static-analysis e popular uma base de dados relacional MySQLcom as informaccedilotildees pertinentes a este estudo

O BDAnalisador foi desenvolvido com a intenccedilatildeo de tornar mais simples o trabalhocom os dados resultantes do static-analysis de forma que consultas em SQL pudessemser feitas a ponto de permitir a obtenccedilatildeo de resultados mais complexos Seguindo esseobjetivo o framework Hibernate foi escolhido como ferramenta para persistecircncia devidoa ser um framework jaacute consolidado no mercado e que de forma simples relaciona osobjetos Java ao banco de dados MySQL [42] A divisatildeo de classes foi projetada em quatroentidades Projeto Versao Classe e Metodo cada uma com seus respectivos camposcontendo as informaccedilotildees necessaacuterias para a pesquisa como pode ser visto na Figura 44Eacute importante ressaltar que a tabela de Versao guarda hashs de commits devido agrave escolhade utilizar commits para obter mais informaccedilatildeo de evoluccedilatildeo de coacutedigo em um menor

27

espaccedilo de tempo Aleacutem disso para este trabalho optou-se por persistir todos os meacutetodose classes de cada versatildeo sem se importar com a repeticcedilatildeo desses dados pois a hipoacutetesede haver grandes refatoraccedilotildees entre versotildees poderia comprometer a confiabilidade dasinformaccedilotildees

Figura 43 Diagrama de classes UML do BDAnalisador

Como visto na Figura 43 seguindo parcialmente a arquitetura MVC cada entidadepossui sua respectiva classe DAO(Data Access Object) para persistecircncia dos dados eapenas uma classe Controlador no projeto responsaacutevel pela manipulaccedilatildeo e parse dosdados dos arquivos csv gerados pelo static analysis para serem enviados agraves classes DAOO sistema inicia chamando o meacutetodo inicializar() da classe Controlador Esse meacutetodoeacute responsaacutevel por ler um arquivo de entrada csv que segue o mesmo modelo do arquivo dostatic-analysis citado na seccedilatildeo anterior O arquivo conteacutem os dados de todos os projetose suas respectivas versotildees dessa forma o meacutetodo instancia um objeto da classe Projetoe persiste o projeto no banco de dados Para cada versatildeo encontrada no arquivo deentrada o inicializar() aciona os meacutetodos responsaacuteveis por instanciar e preencher aslistas da classe Classe e Metodo Os meacutetodos responsaacuteveis por preencher as listas varremos arquivos csv gerados pelo static-analysis e fazem o parse das informaccedilotildees relevantescomo nomes dos meacutetodos e quantidades de lambdas para construir os objetos que seratildeogravados Ao final dos preenchimentos o objeto Versatildeo eacute instanciado e gravado no bancode dados atraveacutes de sua classe DAO ao mesmo tempo que grava suas respectivas Classese Metodos

28

Apoacutes vaacuterios testes e correccedilotildees de bugs o banco de dados se encontrava finalmente comas informaccedilotildees de 99 projetos Java open-source separados por um commit por mecircs desde2013 cada um com suas respectivas informaccedilotildees de classes meacutetodos e a quantidade deexpressotildees lambda filters e maps em cada meacutetodo Filter ou Filter pattern eacute o padratildeode projeto que tem como objetivo filtrar objetos de uma coleccedilatildeo (Collection) de acordocom algum criteacuterio Jaacute o map ou map pattern eacute um padratildeo que ldquomapeia os elementosde uma coleccedilatildeo aplicando uma funccedilatildeo a eles para uma nova coleccedilatildeo [43] A coleta deinformaccedilotildees sobre esses padrotildees podem ser uacuteteis para possiacuteveis anaacutelises de oportunidadesde uso de expressotildees lambda para refatoraccedilatildeo de coacutedigo

A Figura 44 mostra o esquema de como o banco de dados resultante foi gerado

Figura 44 Modelo relacional do banco de dados populado pelo BDAnalisador Imagemgerada com software DBeaver [2]

44 Classificaccedilatildeo e Anaacutelise

Com o banco de dados populado restam apenas as etapas de classificaccedilatildeo e anaacutelise pararesponder as questotildees de pesquisa propostas Para isso inicialmente houve uma tentativade se utilizar apenas queries SQL para analisar os dados de acordo com as informaccedilotildeesrelevantes Poreacutem devido ao fato de o banco de dados conter todas as informaccedilotildees detodos os projetos e todas as suas versotildees queries que possuem uma alta complexidadedemoravam muito tempo para retornar os dados

Assim com o objetivo de facilitar o trabalho alguns scripts python foram desenvolvi-dos para rodar as queries separadamente e individualmente para cada projeto de formaautomatizada a fim de melhorar o tempo de resposta para obtenccedilatildeo dos resultados

29

441 Meacutedia de Lambda

O primeiro script retorna a quantidade de expressotildees lambda (ou AICs) por n snapshotsque contenha expressotildees lambda O objetivo eacute ter uma visatildeo geral da meacutedia de expressotildeeslambda e AICs utilizadas por cada projeto e como nem todos os snapshots coletados decada projeto possuem expressotildees lambda e AICs apenas aqueles com alguma expressatildeolambda ou AIC satildeo incluiacutedos no caacutelculo da meacutedia

Mmedia =sumn qtdLambdai

n

442 Anaacutelise Temporal

O segundo script retorna para cada projeto a soma total da quantidade de expressotildeeslambda AIC map() e filter() no projeto inteiro para cada versatildeo Ou seja tem-seo total de cada uma das quatro propriedades selecionadas para cada mecircs do projetoobtendo assim uma visatildeo temporal de evoluccedilatildeo do uso das caracteriacutesticas descritas ATabela 41 ilustra parcialmente o resultado obtido para o projeto agera onde idVersaoeacute o identificador no banco de dados referente ao hash do commit mensal coletado qtd eacutea quantidade de cada uma das caracteriacutesticas escolhidas e a data do commit encontra-seno formato americano

Tabela 41 Informaccedilotildees mensais sobre o projeto ageraidVersao Data do Commit qtd lambda qtd AIC qtd maps qtd filter

823 512016 0 29 4 0755 612016 13 28 4 0686 6152016 13 29 4 0621 812016 13 29 4 0555 8162016 13 30 4 0485 922016 13 30 4 0422 10132016 14 30 4 0356 11282016 14 30 4 0295 12212016 21 30 5 0232 212017 21 30 5 0175 312017 21 30 5 0112 3312017 21 36 5 048 4242017 21 48 5 0

Os resultados obtidos com esta anaacutelise temporal permitiu a identificaccedilatildeo de padrotildees nautilizaccedilatildeo de expressotildees lambda em relaccedilatildeo a utilizaccedilatildeo de AIC por todos os projetos Foi

30

possiacutevel classificar todos os projetos em 6 grupos ilustrado na Figura 45 Primeiramenteseparou-se os projetos entre os que possuem expressotildees lambda e os que natildeo possuemDentre os que possuem identificou-se cinco categorias

1 Grupo 1 Quantidade de AICs e expressotildees lambda aumentam com o tempo pro-porcionalmente

2 Grupo 2 Quantidade de AICs diminui agrave medida que a quantidade de expressotildeeslambda aumentam e a quantidade de expressotildees lambda ultrapassa a quantidade deAIC em um determinado momento

3 Grupo 3 Quantidade de AICs diminui agrave medida que a quantidade de expressotildeeslambda aumentam mas a quantidade de AIC permanece superior agrave quantidade delambda

4 Grupo 4 Expressotildees lambda satildeo introduzidas e existem por um pequeno periacuteodode tempo mas satildeo completamente removidas posteriormente

5 Grupo 5 Quantidade de expressotildees lambda eacute constante e muito inferior compa-rado com a quantidade de AICs no projeto Foi determinado que para pertencera esta classificaccedilatildeo o projeto precisa ter uma razatildeo de meacutedia de expressotildees lamb-dasnapshot por meacutedia de AICsnapshot inferior a 020 Esse paracircmetro foi esta-belecido com o objetivo de definir um padratildeo para o que pode ser considerado umprojeto com poucas expressotildees lambda

Figura 45 Classificaccedilatildeo dos projetos

31

443 Refatoraccedilatildeo de Coacutedigo

O uacuteltimo script teve como objetivo realizar uma tentativa inicial de identificar refatoraccedilatildeode coacutedigo da seguinte maneira para todos os projetos que possuem expressotildees lambdaforam identificados o mecircs imediatamente antes da introduccedilatildeo de expressotildees lambda e omecircs seguinte onde houve a primeira ocorrecircncia de lambda no projeto Assim realizou-se uma anaacutelise do tamanho em quantidade de linhas de coacutedigo de todos os meacutetodosdo projeto que no mecircs seguinte tiveram introduccedilatildeo de lambda Em seguida fez-se umacomparaccedilatildeo com os mesmos meacutetodos em relaccedilatildeo ao mecircs anterior e assim foi possiacuteveldetectar quais meacutetodos tiveram a quantidade de linhas de coacutedigo reduzidas o que seriaum indicativo natildeo necessariamente exclusivo de que uma refatoraccedilatildeo de coacutedigo possa terocorrido

Sabe-se que este meacutetodo de detecccedilatildeo de refatoraccedilatildeo de coacutedigo possui suas limitaccedilotildeesuma vez que as comparaccedilotildees para saber se um meacutetodo existe em ambas versotildees eacute feitopuramente por comparaccedilatildeo de String (nome do meacutetodo) e a classe que este pertence

444 Casos de Uso

Os meacutetodos descritos acima ajudaram a identificar alguns padrotildees e facilitar a anaacutelise dosdados Poreacutem natildeo satildeo suficientes para que se possa responder agraves questotildees de pesquisaDessa forma apoacutes a identificaccedilatildeo dos grupos de classificaccedilatildeo para os projetos foramescolhidos um projeto de cada grupo (com exceccedilatildeo do grupo dos projetos sem expressotildeeslambda) para realizar um breve estudo de caso com o objetivo de identificar e caracterizarmelhor a adoccedilatildeo de expressotildees lambda Os projetos escolhidos foram agera vertxAndroid-CleanArchitecture RxJava e guava

32

Capiacutetulo 5

Resultados Obtidos e Anaacutelise

Neste capiacutetulo seratildeo apresentados os dados obtidos e anaacutelise com o objetivo de responderagraves questotildees de pesquisa propostas Como mencionado anteriormente as perguntas seratildeorespondidas de duas maneiras algumas com informaccedilotildees gerais sobre todos os projetose outras com breve estudos de caso envolvendo cinco projetos

51 Visatildeo Geral

Dentre os repositoacuterios coletados para a anaacutelise 74 (7474) natildeo utilizaram nenhumaexpressatildeo lambda no projeto durante todo o periacuteodo analisado (Janeiro de 2013 a Abrilde 2017) restando apenas 25 repositoacuterios (2525) com expressotildees lambda Eacute interessantedestacar que apesar de a quantidade de repositoacuterios que natildeo possuem expressotildees lambdaser relativamente expressiva muitos destes repositoacuterios satildeo de projetos em Java que umdia foram populares e atualmente natildeo estatildeo sendo mais desenvolvidos (por exemplo umaplicativo que soacute funciona para Android 23 atualmente descontinuado)

Levando em consideraccedilatildeo apenas os projetos que possuem expressotildees lambda exis-tem dois tipos de dados que podem ser analisados para responder agrave primeira questatildeo depesquisa atraveacutes dos dados obtidos pelo meacutetodo anteriormente mencionado como anaacutelisetemporal e a meacutedia de lambda por snapshot mencionados no capiacutetulo anterior

Com relaccedilatildeo ao ano em que a primeira ocorrecircncia foi encontrada 6 projetos introduzi-ram expressotildees lambda jaacute em 2014 8 comeccedilaram a utilizar em 2015 7 em 2016 e apenas4 tiveram a primeira ocorrecircncia de expressotildees lambda em 2017 Dessa forma percebe-seque os projetos estatildeo relativamente bem distribuiacutedos em grupos quanto ao ano em que seintroduziu expressotildees lambda

Pela meacutedia de lambda por snapshot (lambdasnapshot) a maioria (11 projetos) possuiuma quantidade expressiva acima de 100 lambdasnapshot (com 6 projetos entre 20 e 100lambdasnapshot e 8 projetos com menos de 20 lambdasnapshot) como apresentados no

33

graacutefico da Figura 51 Isso mostra que essa nova caracteriacutestica jaacute estaacute sendo bem utilizadanos projetos que comeccedilaram a migrar para a nova versatildeo do Java

Figura 51 Graacuteficos dos projetos separados por ano de introduccedilatildeo de expressotildees lambdae meacutedia de lambda por snapshot

Com isso pode-se observar que apesar de a quantidade de projetos que possuemexpressotildees lambda natildeo ser tatildeo alta eacute possiacutevel obter resultados expressivos uma vez quea quantidade dos projetos com lambda estatildeo bem dispersos quanto ao periacuteodo em quecomeccedilaram a adotar essa caracteriacutestica e a quantidade de expressotildees lambda por snapshot

511 Projetos Selecionados

Atraveacutes dos grupos de classificaccedilatildeo identificados pela anaacutelise temporal descritos na Figura45 cinco projetos foram selecionados para uma anaacutelise detalhada levando em consideraccedilatildeoo grupo em que eles pertencem Estes projetos seratildeo apresentados a seguir

512 agera

Agera eacute uma biblioteca Android que ajuda a introduzir programaccedilatildeo funcional reativa(functional reactive programming) em projetos Android Eacute um projeto recente lanccediladoem 2016 pela Google [44] e encontra-se no grupo dos projetos que introduziram expressotildeeslambda em 2016 no mesmo ano de seu lanccedilamento contendo uma meacutedia de expressotildeeslambda de 16 lambdasnapshot

Na classificaccedilatildeo estabelecida agera pertence ao Grupo 1 onde a quantidade de ex-pressotildees lambda no projeto com o tempo aumentam juntamente com a quantidade deAICs como mostra o graacutefico de anaacutelise temporal na Figura 52

34

Figura 52 Graacuteficos de anaacutelise temporal do projeto agera

513 vertx

Eclipse Vertx eacute um conjunto de ferramentas para criaccedilatildeo de reactive applications namaacutequina virtual Java (JVM) em grande escala [45] Seu primeiro lanccedilamento aconteceuem 2011 e a primeira ocorrecircncia de expressotildees lambda no projeto aconteceu em 2014 Esteprojeto possui uma meacutedia de 2867 lambdasnapshot e dentre os projetos consideradosneste trabalho eacute o que possui a maior quantidade de expressotildees lambda

Este projeto pertence ao Grupo 2 onde a quantidade de expressotildees lambda aumen-tou consideravelmente pelos meses ultrapassando a quantidade de AICs que diminuiudrasticamente como mostra a Figura 53

35

Figura 53 Graacuteficos de anaacutelise temporal do projeto Vertx

514 Android-CleanArchitecture

Apesar de ser uma amostra de projeto Android-CleanArchitecture que tem como objetivoconstruir aplicaccedilotildees Android utilizando clean architecture foi lanccedilado em 2014 mas semanteacutem sempre atualizado [46]

A introduccedilatildeo de expressotildees lambda que aconteceu no ano de 2015 se deu de formatiacutemida com uma meacutedia de 35 lambdasnapshot De qualquer forma este projeto conseguerepresentar com seu graacutefico de anaacutelise temporal o grupo 3 composto por projetos em quea quantidade de expressotildees lambda aumentou mas sem ultrapassar AICs que diminuiacuteramdemonstrado no graacutefico da Figura 54

36

Figura 54 Graacuteficos de anaacutelise temporal do projeto Android-CleanArchitecture

515 RxJava

Dentre os repositoacuterios estudados RxJava eacute considerado o mais popular Como umaimplementaccedilatildeo de Reactive Extensions para a JVM RxJava teve seu lanccedilamento dadoem 2013 [47] Expressotildees lambda apareceram pela primeira vez no ano de 2015 comuma meacutedia de 766 lambdasnapshot

Apesar de uma meacutedia relativamente alta o tempo de vida das expressotildees lambda nesteprojeto foi bem curto caracterizando assim projetos do grupo 4 houve a introduccedilatildeo dasexpressotildees lambda no projeto poreacutem houve a remoccedilatildeo completa de todas as expressotildeeslambda previamente introduzidas desaparecendo completamente do projeto ateacute a datada coleta de dados (Figura 55)

37

Figura 55 Graacuteficos de anaacutelise temporal do projeto RxJava

516 guava

Guava eacute um conjunto de bibliotecas para Java da Google lanccedilado em 2011 A atualizaccedilatildeodo coacutedigo do projeto para Java 8 aconteceu somente em 2016 e apesar do projeto conteruma meacutedia de 281 lambdasnapshot ele foi escolhido como representante dos projetosdo Grupo 5 (Figura 56) que possuem expressotildees lambda mas de forma natildeo expressiva osuficiente quando comparado com a quantidade de AIC pelo fato de sua razatildeo de meacutedia delambdasnapshot por meacutedia de AICsnapshot ser 004 Ou seja embora o projeto tenhaexpressotildees lambda estas satildeo consideradas muito poucas quando inseridas no contextogeral deste projeto que eacute considerado um projeto grande

38

Figura 56 Graacuteficos de anaacutelise temporal do projeto Guava

52 Refatoraccedilatildeo de Coacutedigo

Com o objetivo de caracterizar melhor como as expressotildees lambda estatildeo sendo utilizadaseacute interessante identificar se estas estatildeo sendo introduzidas atraveacutes de refatoraccedilatildeo de coacutedigoou em coacutedigo novo

Os projetos classificados como pertencentes ao Grupo 2 possuem em comum o fatode expressotildees lambda aumentarem a medida que AICs diminuem ultrapassando-as eessa caracteriacutestica em comum pode indicar que nestes projetos possivelmente houve re-fatoraccedilatildeo de coacutedigo visto que AIC sendo substituiacutedo por expressotildees lambda dentro dascondiccedilotildees determinadas eacute a maneira mais comum de se identificar refatoraccedilatildeo de coacute-digo para introduccedilatildeo de expressotildees lambda [12] Os projetos que compotildeem o grupo 2representam 44 de todos os projetos estudados que possuem expressotildees lambda o quepode ser um indicativo caso a hipoacutetese de refatoraccedilatildeo de coacutedigo seja positiva de quemuitos projetos que estatildeo adotando o Java 8 estatildeo se preocupando de alguma formacom refatoraccedilatildeo se coacutedigo Fazem parte desse grupo os seguintes projetos elasticsearchjava-design-patterns PocketHub presto RxJava-Android-Samples spark vertx zipkinjava8-tutorial dropwizard e material-dialogs

39

Outra maneira de verificar possiacuteveis indicadores de refatoraccedilatildeo de coacutedigo foi atraveacutesda anaacutelise dos tamanhos (em quantidade de linhas de coacutedigo) dos meacutetodos com expressotildeeslambda no mecircs em que se introduziu expressotildees lambda e um mecircs imediatamente antesdeste Essa anaacutelise mostra que dos 25 projetos com expressotildees lambda 12 (48) projetostiveram ao menos um meacutetodo em que houve uma diminuiccedilatildeo no tamanho o que podeser considerado um indicativo de refatoraccedilatildeo de coacutedigo A Figura 57 mostra todos osprojetos em relaccedilatildeo agrave quantidade total de meacutetodos que possuem lambda no primeiro mecircsde introduccedilatildeo do mesmo em vermelho comparado com a quantidade desses meacutetodos quetiveram uma diminuiccedilatildeo no tamanho quando comparados com o coacutedigo do mecircs anteriorem azul

Figura 57 Comparaccedilatildeo entre todos os projetos com expressatildeo lambda sobre refatoraccedilatildeode coacutedigo no mecircs de introduccedilatildeo da caracteriacutestica

Ainda observando a figura 57 com relaccedilatildeo aos projetos que natildeo tiveram nenhummeacutetodo com diminuiccedilatildeo de tamanho (barra azul) percebe-se que todos os 13 projetossequer tiveram uma quantidade significativa de meacutetodos que possuem expressotildees lambda(com o maior tendo apenas 5 meacutetodos) no mecircs de introduccedilatildeo da caracteriacutestica no projetoe ao mesmo tempo jaacute existiam no mecircs em que natildeo existia lambda no projeto Essa eacuteuma observaccedilatildeo importante porque projetos como vertx sendo este o que possui a maiormeacutedia de lambdasnapshot de todos os projetos e ao mesmo tempo tendo apenas trecircsmeacutetodos que continham expressotildees lambda no mecircs da introduccedilatildeo e que existiam no mecircs

40

anterior permitem inferir que todas as outras expressotildees lambda existentes no projetopara este determinado mecircs de introduccedilatildeo encontram-se em coacutedigo novo introduzido

Eacute importante ressaltar que somente essa anaacutelise natildeo eacute exclusivamente suficiente paradeterminar se estes projetos estatildeo realmente introduzindo lambda em coacutedigo novo ourealizando refatoraccedilatildeo uma vez que como a comparaccedilatildeo aconteceu apenas no mecircs deintroduccedilatildeo com o mecircs imediatamente anterior natildeo reflete todo o ciclo de vida do pro-jeto Por exemplo algumas equipes podem escolher refatorar o coacutedigo depois de umtempo de adaptaccedilatildeo apoacutes a transiccedilatildeo para a nova versatildeo da linguagem Assim paraobter uma melhor anaacutelise sobre refatoraccedilatildeo de coacutedigo ou natildeo feita nestes projetos aleacutemde outras anaacutelises referentes aos padrotildees tipicamente adotados para implementaccedilatildeo delambda nestes projetos seratildeo apresentados a seguir os estudos de caso dos cinco projetospreviamente selecionados

Outro ponto importante eacute o fato de que apesar das informaccedilotildees quanto agraves quantida-des de filter e map terem sido incluiacutedas inicialmente no trabalho para observar possiacuteveispadrotildees de refatoraccedilatildeo de coacutedigo percebeu-se que estas natildeo satildeo utilizadas de forma con-sideraacutevel pelos projetos estudados e para fins de anaacutelises generalizadas natildeo apresentaramtanta influecircncia na utilizaccedilatildeo de expressotildees lambda quanto a quantidade de AICs noprojeto

53 Estudos de Caso

Dentre os projetos analisados verificou-se que os projetos de pequeno e meacutedio porte op-taram por refatorar de uma vez seus coacutedigos para incluir expressotildees lambda em situaccedilotildeesem que se utilizava AICs anteriormente ou em alguns poucos casos de utilizaccedilatildeo deCollection Os projetos de grande porte natildeo apresentaram nenhuma refatoraccedilatildeo de coacute-digo ou uma refatoraccedilatildeo parcial gradativa provavelmente devido agrave grande quantidade dearquivos e coacutedigo que possuem o que pode tornar o trabalho de refatoraccedilatildeo extenso ecansativo

O projeto vertx que pertence ao grupo 2 dos projetos em que a quantidade de ex-pressotildees lambda aumentaram e as de AICs diminuiacuteram com lambda ultrapassando AICsexecutou inicialmente commits em maio de 2014 com adiccedilatildeo de coacutedigo novo utilizandoexpressotildees lambda e apoacutes um mecircs realizou um commit maior com a refatoraccedilatildeo de todasas AICs para expressotildees lambda Apoacutes a refatoraccedilatildeo o projeto se preocupou em mantera utilizaccedilatildeo de expressotildees lambda ao mesmo tempo que o uso de AICs se manteve apenasaos casos de classes com interfaces natildeo funcionais A Figura 58 apresenta uma parte docommit de refatoraccedilatildeo de coacutedigo que mostra em vermelho a parte eliminada do coacutedigo(AIC) e em verde o coacutedigo novo representando a substituiccedilatildeo por uma expressatildeo lambda

41

Figura 58 Commit de refatoraccedilatildeo de coacutedigo do projeto Vertx [3]

Alguns projetos ainda natildeo se preocuparam em refatorar o coacutedigo para o uso de ex-pressotildees lambda ateacute a data deste trabalho que eacute o caso do projeto guava que apresentouum commit em 03112016 com a atualizaccedilatildeo do projeto para Java 8 Mas a partir daatualizaccedilatildeo se preocupou em utilizar as expressotildees lambda apenas na implementaccedilatildeo decoacutedigo novo O cenaacuterio em que a refatoraccedilatildeo natildeo eacute prioridade ainda eacute a realidade de vaacuteriosprojetos de grande porte visto que os dados de projetos sem nenhuma expressatildeo lambdasatildeo o maior nuacutemero neste trabalho Poreacutem projetos que jaacute adotaram a utilizaccedilatildeo do Java8 tendem a mudar isso com o passar do tempo A Figura 59 apresenta em verde umaadiccedilatildeo de coacutedigo novo com expressatildeo lambda sem a eliminaccedilatildeo de algum coacutedigo anteriora esse que estaria em vermelho

42

Figura 59 Exemplo de um arquivo do commit de adiccedilatildeo de coacutedigo novo em Java 8 doprojeto Guava [4]

Na categoria de projetos em que os AICs e expressotildees lambda aumentam proporci-onalmente (grupo 1) o projeto agera realizou um commit em 19052016 com a adiccedilatildeoda biblioteca retrolambda como dependecircncia do projeto Essa biblioteca utilizada prin-cipalmente por projetos Android permite executar coacutedigo Java 8 contendo expressotildeeslambda em Java 5 6 e 7 [48] O commit tambeacutem apresenta refatoraccedilatildeo dos AICs ad-vindos de interfaces funcionais para expressotildees lambda Apesar de o projeto continuar autilizar as expressotildees lambda em seus commits posteriores o nuacutemero de AICs tambeacutemcontinuou a aumentar visualizando os commits posteriores notou-se que esses AICs satildeorelativos a interfaces natildeo funcionais ou seja que possuem mais de um meacutetodo O projetoAndroid-CleanArchitecture eacute similar ao agera pois tambeacutem optou pela instalaccedilatildeo da bi-blioteca retrolambda para uso de expressotildees lambda em seus coacutedigos e como tambeacutem eacuteum projeto de pequeno porte houve uma pequena refatoraccedilatildeo dos AICs A Figura 510mostra a parte do commit de refatoraccedilatildeo de coacutedigo em que o desenvolvedor adiciona abiblioteca retrolambda como dependecircncia

43

Figura 510 Commit de adiccedilatildeo da biblioteca Retrolambda no projeto Agera [5]

Outro caso interessante eacute o do projeto RxJava que em 2015 optou pela refatoraccedilatildeodo coacutedigo para a utilizaccedilatildeo de expressotildees lambda quase eliminando por completo o usode AICs mas que no ano seguinte reverteu os commits de forma que eliminasse comple-tamente o uso de expressotildees lambda para manter a retrocompatibilidade com o Java 6A Figura 511 demonstra uma parte do commit de reversatildeo do coacutedigo para Java 6 emque pode ser visto em vermelho o coacutedigo anterior com expressotildees lambda e o verde como novo coacutedigo utilizando AIC novamente

44

Figura 511 Commit de remoccedilatildeo de Lambdas e volta para o uso de AICs no projetoRXJava [6]

Essa preocupaccedilatildeo com retrocompatibilidade de coacutedigo pode ser um fator crucial nadecisatildeo das equipes de desenvolvimento na hora de decidir como fazer o software co-evoluircom a linguagem sem perder a compatibilidade com versotildees anteriores

45

Capiacutetulo 6

Consideraccedilotildees Finais

Este estudo permitiu entender melhor como projetos estatildeo realizando a migraccedilatildeo para oJava 8 em especial utilizando uma nova caracteriacutestica introduzida expressatildeo lambdaApesar de a maioria dos projetos populares considerados natildeo possuiacuterem nenhuma ocor-recircncia de expressotildees lambda os projetos que tinham expressotildees lambda foram suficientespara realizar um primeiro estudo de caracterizaccedilatildeo no uso desta caracteriacutestica e com osprojetos efetivamente utilizados para estudo foi possiacutevel agrupaacute-los quanto a maneira emque as expressotildees lambda estavam sendo utilizadas quando comparadas com AICs em 5grandes grupos quando AIC e lambda aumentam proporcionalmente quando AIC dimi-nui e lambda aumenta ultrapassando AIC quando AIC diminui mas continua superior aolambda crescente expressotildees lambda que foram introduzidas e retiradas completamentedo coacutedigo e expressotildees lambda que natildeo existem em quantidades expressivas

Foi possiacutevel entatildeo realizar um estudo aprofundado levando em consideraccedilatildeo as di-ferentes maneiras com que as expressotildees lambda foram adotadas nos projetos atraveacutes daescolha de um projeto que representasse cada grupo para anaacutelise Dentre os cinco projetosestudados foi possiacutevel observar alguns padrotildees tipicamente adotados por desenvolvedorespara implementar expressotildees lambda em seus projetos como a utilizaccedilatildeo da bibliotecas(retrolambda) que permitissem uma flexibilizaccedilatildeo na utilizaccedilatildeo de expressotildees lambda oucomo lambda eacute primariamente utilizada para substituir determinados AICs ou operaccedilotildeesem Collection

Aleacutem disso foi possiacutevel observar como a refatoraccedilatildeo de coacutedigo acontece em cada umdesses projetos Observou-se como projetos menores tendem a refatorar coacutedigo maisfacilmente ao passo que projetos maiores e mais complexos fazem menos refatoraccedilatildeo oudemoram mais entre o periacuteodo em que houve a primeira migraccedilatildeo de coacutedigo para a novaversatildeo da linguagem ateacute o periacuteodo em que realmente decidem refatorar coacutedigo Aleacutem dacomplexidade do projeto influenciar na decisatildeo de migrar o projeto para uma versatildeo maisrecente da linguagem a preocupaccedilatildeo com retrocompatibilidade com versotildees anteriores da

46

linguagem tambeacutem podem ser uma barreira para que projetos comecem a evoluir o coacutedigojuntamente com a evoluccedilatildeo da linguagem

Ainda assim foi possiacutevel observar que a preocupaccedilatildeo com a co-evoluccedilatildeo do software-linguagem existe entre os desenvolvedores de projetos mas a realizaccedilatildeo da migraccedilatildeo aindaacontece lentamente devido agrave diversos fatores que precisam ser levados em consideraccedilatildeopara a manutenccedilatildeo do projeto

Para trabalhos e contribuiccedilotildees futuras seria interessante desenvolver uma ferramentaque pudesse analisar diretamente no coacutedigo-fonte as oportunidades de aplicaccedilatildeo de ex-pressotildees lambda dessa forma poderiam ser analisadas as porcentagens de conversatildeo decoacutedigo para Java 8 e obter melhores conclusotildees sobre a importacircncia que os projetos estatildeodando para a evoluccedilatildeo de seus coacutedigos Outro fator interessante seria aplicar mais Visitorsagrave ferramenta static-analysis e fazer este mesmo estudo aplicado agrave outras caracteriacutesticasda linguagem

47

Referecircncias

[1] Kagdi Huzefa Michael L Collard e Jonathan I Maletic A survey and taxonomyof approaches for mining software repositories in the context of software evolution2007 ix 3 8 9 10 11

[2] DBeaver Dbeaver - features httpdbeaverjkissorgdocsfeatures ix 29

[3] Eclipse Vertx commit Java8-ify code httpsgithubcomeclipsevertxcommit93f95e9c77419f442a42fe711b6eeaef88192fd3 ix 42

[4] Google Guava commit Release java 8 changes to guava httpsgithubcomgoogleguavacommit73e382fa877f80994817a136b0adcc4365ccd904 ix 43

[5] Google Agera commit Collapsed testapp with retrolambda httpsgithubcomgoogleageracommit5e518b7b05f9e7a34a314945f68deff7b2c3e334 ix 44

[6] ReactiveX Rxjava commit 2x full jdk 6 compatible backport + includ-ing bugfixes up to today httpsgithubcomReactiveXRxJavacommit000a174d87a901135f9665d3b11f3627fd2dc4ed ix 45

[7] Godfrey M W e D M German The past present and future of software evolutionEm 2008 Frontiers of Maintenance paacuteginas 129ndash138 Sept 2008 1 6

[8] Favre J M Languages evolve too changing the software time scale Em Principles ofSoftware Evolution Eighth International Workshop on paacuteginas 33ndash42 IEEE 20051 5 7

[9] Overbey Jeffrey L e Ralph E Johnson Regrowing a language refactoring tools allowprogramming languages to evolve Em ACM SIGPLAN Notices volume 44 paacuteginas493ndash502 ACM 2009 1 5 7 8 12

[10] Grechanik Mark Collin McMillan Luca DeFerrari Marco Comi Stefano CrespiDenys Poshyvanyk Chen Fu Qing Xie e Carlo Ghezzi An empirical investiga-tion into a large-scale java open source code repository Em Proceedings of the2010 ACM-IEEE International Symposium on Empirical Software Engineering andMeasurement ESEM rsquo10 paacuteginas 111ndash1110 New York NY USA 2010 ACMISBN 978-1-4503-0039-1 httpdoiacmorg10114518527861852801 1

[11] TIOBE Tiobe httpswwwtiobecomtiobe-index 1 14

48

[12] Gyori Alex Lyle Franklin Danny Dig e Jan Lahoda Crossing the gap from im-perative to functional programming through refactoring Em Proceedings of the 20139th Joint Meeting on Foundations of Software Engineering ESECFSE 2013 paacute-ginas 543ndash553 New York NY USA 2013 ACM ISBN 978-1-4503-2237-9 httpdoiacmorg10114524914112491461 2 11 24 39

[13] OpenJDK State of the lambda httpcropenjdkjavanet~briangoetzlambdalambda-state-4html 2

[14] Han Jiawei Micheline Kamber e Jian Pei Data Mining Concepts and TechniquesMorgan Kaufmann Publishers Inc San Francisco CA USA 3rd ediccedilatildeo 2011ISBN 0123814790 9780123814791 3

[15] Fowler Martin e Kent Beck Refactoring improving the design of existing codeAddison-Wesley Professional 1999 5 7

[16] Lehman M M J F Ramil P D Wernick D E Perry e W M Turski Met-rics and laws of software evolution - the nineties view Em Proceedings of the4th International Symposium on Software Metrics METRICS rsquo97 paacuteginas 20ndashWashington DC USA 1997 IEEE Computer Society ISBN 0-8186-8093-8 httpdlacmorgcitationcfmid=823454823901 6

[17] Hassan Ahmed E e Tao Xie Software intelligence The future of mining softwareengineering data Em Proceedings of the FSESDP Workshop on Future of SoftwareEngineering Research FoSER rsquo10 paacuteginas 161ndash166 New York NY USA 2010ACM ISBN 978-1-4503-0427-6 httpdoiacmorg101145188236218823978 9

[18] Hassan Ahmed E The road ahead for mining software repositories Em Frontiers ofSoftware Maintenance 2008 FoSM 2008 paacuteginas 48ndash57 IEEE 2008 8

[19] Berry Michael J e Gordon Linoff Data Mining Techniques For Marketing Salesand Customer Support John Wiley amp Sons Inc New York NY USA 1997ISBN 0471179809 10

[20] Parnin Chris Christian Bird e Emerson Murphy-Hill Java generics adoption hownew features are introduced championed or ignored Em Proceedings of the 8thWorking Conference on Mining Software Repositories paacuteginas 3ndash12 ACM 2011 12

[21] Oracle The java language specification httpsdocsoraclecomjavasespecsjlsse8jls8pdf 13

[22] Oracle The history of java technology httpwwworaclecomtechnetworkjavajavaseoverviewjavahistory-index-198355html 13

[23] Murphy Kieron So why did they decide to call itjava httpwwwjavaworldcomarticle2077265core-javaso-why-did-they-decide-to-call-it-java-html 13

[24] McGraw Tata Object-oriented Programming with Java Essentials and ApplicationsHill Education 13

49

[25] Oracle Differences between java ee and java se httpdocsoraclecomjavaee6firstcupdocgkhoyhtml 13

[26] Lindsey Clark S The History of Java Cambridge 14

[27] Oracle The java language environment httpwwworaclecomtechnetworkjavaintro-141325html 14

[28] Oracle Jdk 8 httpopenjdkjavanetprojectsjdk8 15 24

[29] Oracle Enhancements in java se 8 httpdocsoraclecomjavase8docstechnotesguideslanguageenhancementshtmljavase8 15 16 17

[30] Oracle Lambda expressions httpdocsoraclecomjavasetutorialjavajavaOOlambdaexpressionshtml 16 18 21

[31] Oracle Method references httpdocsoraclecomjavasetutorialjavajavaOOmethodreferenceshtml 16

[32] Oracle Default methods httpdocsoraclecomjavasetutorialjavaIandIdefaultmethodshtml 17

[33] Oracle Repeating annotations httpdocsoraclecomjavasetutorialjavaannotationsrepeatinghtml 17

[34] Oracle Type annotations httpdocsoraclecomjavasetutorialjavaannotationstype_annotationshtml 17

[35] Oracle Anonymous inner classes httpsdocsoraclecomjavasetutorialjavajavaOOanonymousclasseshtml 19

[36] Kothari CR Research Methodology Methods and Techniques New Age Interna-tional (P) Limited 2004 ISBN 9788122415223 httpsbooksgooglecombrbooksid=8c6gkbKi-F4C 22

[37] Nakakoji Kumiyo Yasuhiro Yamamoto Yoshiyuki Nishinaka Kouichi Kishida eYunwen Ye Evolution patterns of open-source software systems and communitiesEm IWPSE rsquo02 Proceedings of the International Workshop on Principles of SoftwareEvolution paacuteginas 76ndash85 New York NY USA 2002 ACM Press ISBN 1581135459httpdxdoiorg101145512035512055 23

[38] Rahman Foyzur Christian Bird e Premkumar Devanbu Clones What is that smellEmpirical Software Engineering 17(4-5)503ndash530 2012 24

[39] Chacon Scott Pro Git Apress Berkely CA USA 1st ediccedilatildeo 2009ISBN 1430218339 9781430218333 25

[40] Cavalcanti Thiago Gomes e Viniacutecius Correa de Almeida Caracterizaccedilatildeo do uso deconstruccedilotildees da linguagem java em projetos open-source Publicaccedilatildeo online 2016httpbdmunbbrhandle1048315733 27

50

[41] Parr Terence Language Implementation Patterns Create Your Own Domain-Specific and General Programming Languages Pragmatic Bookshelf 1st ediccedilatildeo 2009ISBN 193435645X 9781934356456 27

[42] Janssen Thorben 5 reasons to use jpa hibernate Publicaccedilatildeo online httpswwwsitepointcom5-reasons-to-use-jpa-hibernate 27

[43] Franklin Lyle Alex Gyori Jan Lahoda e Danny Dig Lambdaficator From imperativeto functional programming through automated refactoring Em Proceedings of the2013 International Conference on Software Engineering ICSE rsquo13 paacuteginas 1287ndash1290 Piscataway NJ USA 2013 IEEE Press ISBN 978-1-4673-3076-3 httpdlacmorgcitationcfmid=24867882486986 29

[44] Google Agera httpsgithubcomgoogleagerawiki 34

[45] Eclipse Eclipse vertx httpvertxio 35

[46] Cejas Fernando Android cleanarchitecture httpsgithubcomandroid10Android-CleanArchitecture 36

[47] ReactiveX Rxjava httpsgithubcomReactiveXRxJava 37

[48] Luontola Esko Retrolambda httpsgithubcomorfjackalretrolambda 43

51

Anexo I

Projetos utilizados

fastjson

platform_frameworks_base

netty

material-dialogs

kotlin

okhttp

tinker

AndroidUtilCode

RxJava

spring-boot

java-design-patterns

elasticsearch

ExoPlayer

kafka

vertx

realm-java

guava

zipkin

bazel

stetho

Signal-Android

glide

agera

fresco

plaid

presto

libgdx

spark

52

disruptor

lottie-android

flexbox-layout

PocketHub

zxing

spring-framework

deeplearning4j

dropwizard

interviews

BaseRecyclerViewAdapterHelper

uCrop

DanmakuFlameMaster

lottie-react-native

android-UniversalMusicPlayer

AndroidInterview-Q-A

greenDAO

retrofit

MaterialDrawer

BottomBar

druid

MPAndroidChart

Hystrix

guice

recyclerview-animators

dubbo

androidannotations

RxJava-Android-Samples

PhotoView

clojure

CircleImageView

AndroidSwipeLayout

jedis

MaterialViewPager

butterknife

junit4

RxBinding

leakcanary

SimianArmy

picasso

UltimateRecyclerView

53

AndroidViewAnimations

AppIntro

FizzBuzzEnterpriseEdition

ion

cheesesquare

physical-web

RxAndroid

Android-CleanArchitecture

Calligraphy

Android-Bootstrap

iosched

Android_Data

MaterialDesignLibrary

ListViewAnimations

EventBus

java8-tutorial

AndroidSlidingUpPanel

dagger

okhttputils

logger

HomeMirror

Material-Animations

android-Ultra-Pull-To-Refresh

android-async-http

Android-ObservableScrollView

Android-Universal-Image-Loader

ActionBarSherlock

SlidingMenu

storm

PagerSlidingTabStrip

Android-PullToRefresh

54

  • Dedicatoacuteria
  • Agradecimentos
  • Resumo
  • Abstract
  • Introduccedilatildeo
    • Contexto
    • Objetivos
      • Objetivos Gerais
      • Objetivos Especiacuteficos
        • Metodologia
        • Organizaccedilatildeo do Trabalho
          • Evoluccedilatildeo e Mineraccedilatildeo de Repositoacuterios de Software
            • Evoluccedilatildeo de Software
            • MSR Mineraccedilatildeo de dados e a Engenharia de Software
              • Classificaccedilatildeo
                • Trabalhos Relacionados
                  • Java SE 8 e JDK 8
                    • Histoacuterico
                    • Princiacutepios
                    • Evoluccedilatildeo
                    • Expressotildees Lambda
                      • Sintaxe
                      • Principais formas de uso
                          • Estudo e o Processo de Mineraccedilatildeo
                            • Questotildees de Pesquisa
                            • Fonte de Dados e Objetos de Estudo
                            • Processo de Mineraccedilatildeo
                              • static-analysis
                              • BDAnalisador
                                • Classificaccedilatildeo e Anaacutelise
                                  • Meacutedia de Lambda
                                  • Anaacutelise Temporal
                                  • Refatoraccedilatildeo de Coacutedigo
                                  • Casos de Uso
                                      • Resultados Obtidos e Anaacutelise
                                        • Visatildeo Geral
                                          • Projetos Selecionados
                                          • agera
                                          • vertx
                                          • Android-CleanArchitecture
                                          • RxJava
                                          • guava
                                            • Refatoraccedilatildeo de Coacutedigo
                                            • Estudos de Caso
                                              • Consideraccedilotildees Finais
                                              • Referecircncias
                                              • Anexo
                                              • Projetos utilizados

exato em que expressotildees lambda foram introduzidas ateacute o mecircs da coleta de dados Abrilde 2017

Eacute importante ressaltar que a definiccedilatildeo dos meses foi definida do dia primeiro de ummecircs ao dia primeiro do proacuteximo mecircs e por consequecircncia alguns snapshots que deveriamrepresentar o final de determinado mecircs correspondem na verdade a commits realizadosno dia primeiro do mecircs seguinte Por exemplo pode existir casos em que o commit querepresente o mecircs de Marccedilo de 2016 seja na verdade o commit realizado no dia primeirode Abril de 2016 Isso se deve a natureza da forma como os resultados de log de commitssatildeo obtidos pelo git [39] Poreacutem isso natildeo interfere nas anaacutelises ou no propoacutesito destetrabalho uma vez que foram realizadas verificaccedilotildees e validaccedilotildees para que natildeo existamdatas repetidas (e consequentemente commits repetidos) por repositoacuterio

Neste trabalho o termo projeto e repositoacuterio foram utilizados de forma intercaladapara representar a mesma coisa o software desenvolvido que possui um repositoacuterio naplataforma github Os termos commit snapshops e versotildees tambeacutem representam a mesmacoisa uma vez que foi definido que seriam utilizados apenas um commit por mecircs pararepresentar um determinado snapshot ou versatildeo do repositoacuterio em questatildeo

Todos os 99 projetos seratildeo utilizados para a realizaccedilatildeo de uma anaacutelise geral de ca-racterizaccedilatildeo do uso de expressotildees lambda Para as anaacutelises aprofundadas foi feito umcriteacuterio de classificaccedilatildeo para que apenas alguns projetos possam ser analisados em niacutevelde coacutedigo como estudos de caso

Resumindo foram escolhidos os 99 projetos mais populares de Java no github cole-tando dados mensais de seus commits a partir do ano de 2013 ateacute a data da coleta dosdados lembrando que nem todos os projetos existem desde 2013 (projetos mais recentes)

43 Processo de Mineraccedilatildeo

A abordagem utilizada para coletar e analisar os 99 projetos escolhidos como mostra aFigura 42 foi realizada de forma automatizada utilizando scripts python e dois projetosdesenvolvidos em Java para a coleta e tratamento de dados como descrito a seguir

Primeiramente foi realizado uma coacutepia dos repositoacuterios atuais de todos os 99 projetosmais populares do github em Java Para automatizar o processo foi desenvolvido umscript em python que lista todos os projetos escolhidos clona todos os repositoacuterios emuma pasta na maacutequina local e cria um arquivo temporaacuterio com as informaccedilotildees do nomede cada repositoacuterio e seu caminho absoluto na maacutequina local

25

Figura 42 Metodologia implementada para coleta e tratamento de dados

Em seguida foi necessaacuterio realizar o checkout de todas as versotildees entre Janeiro de2013 a Abril de 2017 de cada projeto Por motivos de otimizaccedilatildeo de espaccedilo da maacutequinalocal e automatizaccedilatildeo no processo de checkout utilizou-se de um segundo script pythonque realizava as seguintes tarefas para cada mecircs em cada projeto verificar se dentreo mecircs estipulado houve algum commit para aquele projeto se sim pega-se o hash douacuteltimo commit do mecircs realiza o checkout conta-se a quantidade de linhas de coacutedigo emJava que o projeto tem utilizando a biblioteca cloc e armazena todas as informaccedilotildeespertinentes referentes a todos os projetos que naquele mecircs tiveram commits para que oprojeto static-analysis possa entatildeo ser executado sobre esses projetos naquele determinadomomento As informaccedilotildees coletadas que satildeo utilizadas pelo static-analysis correspondemao nome do projeto o hash do commit para aquela versatildeo a pasta onde o projeto estaacutearmazenado na maacutequina local a quantidade de linhas de coacutedigo Java do projeto e datareferente ao commit Essas informaccedilotildees satildeo pertinentes para que o projeto static-analysisconsiga funcionar de forma correta projeto este descrito em detalhes a seguir

431 static-analysis

O static-analysis foi um projeto desenvolvido anteriormente a este trabalho pelos alunosThiago Cavalcanti e Vinicius de Almeida cujo objetivo eacute realizar a anaacutelise estaacutetica de

26

coacutedigos-fonte Java e gerar arquivos de saiacuteda contendo informaccedilotildees de classes e meacutetodoscom suas devidas ocorrecircncias de caracteriacutesticas da linguagem [40]

A anaacutelise estaacutetica de coacutedigo consiste em analisar um coacutedigo-fonte sem a necessidadede executaacute-lo Esse tipo de anaacutelise eacute de extrema importacircncia para manter um coacutedigo dequalidade evitar futuras refatoraccedilotildees e obter informaccedilotildees estatiacutesticas de forma raacutepida epraacutetica [41]

Seguindo esse princiacutepio o static-analysis foi projetado para receber um arquivo deentrada csv seguindo o padratildeo

Tipo da Aplicaccedilatildeo Inicio do projeto Antes ou Apoacutes Java 5 Nome do ProjetoVersatildeo Caminho absolutoQuantidade de linhas de coacutedigo

Atraveacutes da informaccedilatildeo do caminho absoluto do projeto o static-analysis varre osdiretoacuterios em busca dos arquivos fonte java realiza o parse desses arquivos e utilizade Visitors para extrair as informaccedilotildees desejadas e exporta-las em arquivos csv Ouso de Visitors permite que sejam escolhidas as informaccedilotildees desejadas para a consultacomo expressotildees Lambda e AIC s aleacutem de possibilitar que sejam implementados novosVisitors conforme a linguagem evolua ou as necessidades mudem

Para este trabalho foram utilizados os Visitors de expressotildees Lambda map() filter()AICs e declaraccedilotildees de meacutetodos

432 BDAnalisador

Apoacutes obter todas as informaccedilotildees necessaacuterias geradas pelo static-analysis era preciso ma-nipular os dados de forma que facilitasse a coleta de dados para o estudo proposto Comovaacuterios arquivos em formato csv satildeo de difiacutecil manipulaccedilatildeo foi desenvolvido entatildeo umaferramenta chamada BDAnalisador Esta ferramenta eacute responsaacutevel por processar os arqui-vos em csv gerados pelo static-analysis e popular uma base de dados relacional MySQLcom as informaccedilotildees pertinentes a este estudo

O BDAnalisador foi desenvolvido com a intenccedilatildeo de tornar mais simples o trabalhocom os dados resultantes do static-analysis de forma que consultas em SQL pudessemser feitas a ponto de permitir a obtenccedilatildeo de resultados mais complexos Seguindo esseobjetivo o framework Hibernate foi escolhido como ferramenta para persistecircncia devidoa ser um framework jaacute consolidado no mercado e que de forma simples relaciona osobjetos Java ao banco de dados MySQL [42] A divisatildeo de classes foi projetada em quatroentidades Projeto Versao Classe e Metodo cada uma com seus respectivos camposcontendo as informaccedilotildees necessaacuterias para a pesquisa como pode ser visto na Figura 44Eacute importante ressaltar que a tabela de Versao guarda hashs de commits devido agrave escolhade utilizar commits para obter mais informaccedilatildeo de evoluccedilatildeo de coacutedigo em um menor

27

espaccedilo de tempo Aleacutem disso para este trabalho optou-se por persistir todos os meacutetodose classes de cada versatildeo sem se importar com a repeticcedilatildeo desses dados pois a hipoacutetesede haver grandes refatoraccedilotildees entre versotildees poderia comprometer a confiabilidade dasinformaccedilotildees

Figura 43 Diagrama de classes UML do BDAnalisador

Como visto na Figura 43 seguindo parcialmente a arquitetura MVC cada entidadepossui sua respectiva classe DAO(Data Access Object) para persistecircncia dos dados eapenas uma classe Controlador no projeto responsaacutevel pela manipulaccedilatildeo e parse dosdados dos arquivos csv gerados pelo static analysis para serem enviados agraves classes DAOO sistema inicia chamando o meacutetodo inicializar() da classe Controlador Esse meacutetodoeacute responsaacutevel por ler um arquivo de entrada csv que segue o mesmo modelo do arquivo dostatic-analysis citado na seccedilatildeo anterior O arquivo conteacutem os dados de todos os projetose suas respectivas versotildees dessa forma o meacutetodo instancia um objeto da classe Projetoe persiste o projeto no banco de dados Para cada versatildeo encontrada no arquivo deentrada o inicializar() aciona os meacutetodos responsaacuteveis por instanciar e preencher aslistas da classe Classe e Metodo Os meacutetodos responsaacuteveis por preencher as listas varremos arquivos csv gerados pelo static-analysis e fazem o parse das informaccedilotildees relevantescomo nomes dos meacutetodos e quantidades de lambdas para construir os objetos que seratildeogravados Ao final dos preenchimentos o objeto Versatildeo eacute instanciado e gravado no bancode dados atraveacutes de sua classe DAO ao mesmo tempo que grava suas respectivas Classese Metodos

28

Apoacutes vaacuterios testes e correccedilotildees de bugs o banco de dados se encontrava finalmente comas informaccedilotildees de 99 projetos Java open-source separados por um commit por mecircs desde2013 cada um com suas respectivas informaccedilotildees de classes meacutetodos e a quantidade deexpressotildees lambda filters e maps em cada meacutetodo Filter ou Filter pattern eacute o padratildeode projeto que tem como objetivo filtrar objetos de uma coleccedilatildeo (Collection) de acordocom algum criteacuterio Jaacute o map ou map pattern eacute um padratildeo que ldquomapeia os elementosde uma coleccedilatildeo aplicando uma funccedilatildeo a eles para uma nova coleccedilatildeo [43] A coleta deinformaccedilotildees sobre esses padrotildees podem ser uacuteteis para possiacuteveis anaacutelises de oportunidadesde uso de expressotildees lambda para refatoraccedilatildeo de coacutedigo

A Figura 44 mostra o esquema de como o banco de dados resultante foi gerado

Figura 44 Modelo relacional do banco de dados populado pelo BDAnalisador Imagemgerada com software DBeaver [2]

44 Classificaccedilatildeo e Anaacutelise

Com o banco de dados populado restam apenas as etapas de classificaccedilatildeo e anaacutelise pararesponder as questotildees de pesquisa propostas Para isso inicialmente houve uma tentativade se utilizar apenas queries SQL para analisar os dados de acordo com as informaccedilotildeesrelevantes Poreacutem devido ao fato de o banco de dados conter todas as informaccedilotildees detodos os projetos e todas as suas versotildees queries que possuem uma alta complexidadedemoravam muito tempo para retornar os dados

Assim com o objetivo de facilitar o trabalho alguns scripts python foram desenvolvi-dos para rodar as queries separadamente e individualmente para cada projeto de formaautomatizada a fim de melhorar o tempo de resposta para obtenccedilatildeo dos resultados

29

441 Meacutedia de Lambda

O primeiro script retorna a quantidade de expressotildees lambda (ou AICs) por n snapshotsque contenha expressotildees lambda O objetivo eacute ter uma visatildeo geral da meacutedia de expressotildeeslambda e AICs utilizadas por cada projeto e como nem todos os snapshots coletados decada projeto possuem expressotildees lambda e AICs apenas aqueles com alguma expressatildeolambda ou AIC satildeo incluiacutedos no caacutelculo da meacutedia

Mmedia =sumn qtdLambdai

n

442 Anaacutelise Temporal

O segundo script retorna para cada projeto a soma total da quantidade de expressotildeeslambda AIC map() e filter() no projeto inteiro para cada versatildeo Ou seja tem-seo total de cada uma das quatro propriedades selecionadas para cada mecircs do projetoobtendo assim uma visatildeo temporal de evoluccedilatildeo do uso das caracteriacutesticas descritas ATabela 41 ilustra parcialmente o resultado obtido para o projeto agera onde idVersaoeacute o identificador no banco de dados referente ao hash do commit mensal coletado qtd eacutea quantidade de cada uma das caracteriacutesticas escolhidas e a data do commit encontra-seno formato americano

Tabela 41 Informaccedilotildees mensais sobre o projeto ageraidVersao Data do Commit qtd lambda qtd AIC qtd maps qtd filter

823 512016 0 29 4 0755 612016 13 28 4 0686 6152016 13 29 4 0621 812016 13 29 4 0555 8162016 13 30 4 0485 922016 13 30 4 0422 10132016 14 30 4 0356 11282016 14 30 4 0295 12212016 21 30 5 0232 212017 21 30 5 0175 312017 21 30 5 0112 3312017 21 36 5 048 4242017 21 48 5 0

Os resultados obtidos com esta anaacutelise temporal permitiu a identificaccedilatildeo de padrotildees nautilizaccedilatildeo de expressotildees lambda em relaccedilatildeo a utilizaccedilatildeo de AIC por todos os projetos Foi

30

possiacutevel classificar todos os projetos em 6 grupos ilustrado na Figura 45 Primeiramenteseparou-se os projetos entre os que possuem expressotildees lambda e os que natildeo possuemDentre os que possuem identificou-se cinco categorias

1 Grupo 1 Quantidade de AICs e expressotildees lambda aumentam com o tempo pro-porcionalmente

2 Grupo 2 Quantidade de AICs diminui agrave medida que a quantidade de expressotildeeslambda aumentam e a quantidade de expressotildees lambda ultrapassa a quantidade deAIC em um determinado momento

3 Grupo 3 Quantidade de AICs diminui agrave medida que a quantidade de expressotildeeslambda aumentam mas a quantidade de AIC permanece superior agrave quantidade delambda

4 Grupo 4 Expressotildees lambda satildeo introduzidas e existem por um pequeno periacuteodode tempo mas satildeo completamente removidas posteriormente

5 Grupo 5 Quantidade de expressotildees lambda eacute constante e muito inferior compa-rado com a quantidade de AICs no projeto Foi determinado que para pertencera esta classificaccedilatildeo o projeto precisa ter uma razatildeo de meacutedia de expressotildees lamb-dasnapshot por meacutedia de AICsnapshot inferior a 020 Esse paracircmetro foi esta-belecido com o objetivo de definir um padratildeo para o que pode ser considerado umprojeto com poucas expressotildees lambda

Figura 45 Classificaccedilatildeo dos projetos

31

443 Refatoraccedilatildeo de Coacutedigo

O uacuteltimo script teve como objetivo realizar uma tentativa inicial de identificar refatoraccedilatildeode coacutedigo da seguinte maneira para todos os projetos que possuem expressotildees lambdaforam identificados o mecircs imediatamente antes da introduccedilatildeo de expressotildees lambda e omecircs seguinte onde houve a primeira ocorrecircncia de lambda no projeto Assim realizou-se uma anaacutelise do tamanho em quantidade de linhas de coacutedigo de todos os meacutetodosdo projeto que no mecircs seguinte tiveram introduccedilatildeo de lambda Em seguida fez-se umacomparaccedilatildeo com os mesmos meacutetodos em relaccedilatildeo ao mecircs anterior e assim foi possiacuteveldetectar quais meacutetodos tiveram a quantidade de linhas de coacutedigo reduzidas o que seriaum indicativo natildeo necessariamente exclusivo de que uma refatoraccedilatildeo de coacutedigo possa terocorrido

Sabe-se que este meacutetodo de detecccedilatildeo de refatoraccedilatildeo de coacutedigo possui suas limitaccedilotildeesuma vez que as comparaccedilotildees para saber se um meacutetodo existe em ambas versotildees eacute feitopuramente por comparaccedilatildeo de String (nome do meacutetodo) e a classe que este pertence

444 Casos de Uso

Os meacutetodos descritos acima ajudaram a identificar alguns padrotildees e facilitar a anaacutelise dosdados Poreacutem natildeo satildeo suficientes para que se possa responder agraves questotildees de pesquisaDessa forma apoacutes a identificaccedilatildeo dos grupos de classificaccedilatildeo para os projetos foramescolhidos um projeto de cada grupo (com exceccedilatildeo do grupo dos projetos sem expressotildeeslambda) para realizar um breve estudo de caso com o objetivo de identificar e caracterizarmelhor a adoccedilatildeo de expressotildees lambda Os projetos escolhidos foram agera vertxAndroid-CleanArchitecture RxJava e guava

32

Capiacutetulo 5

Resultados Obtidos e Anaacutelise

Neste capiacutetulo seratildeo apresentados os dados obtidos e anaacutelise com o objetivo de responderagraves questotildees de pesquisa propostas Como mencionado anteriormente as perguntas seratildeorespondidas de duas maneiras algumas com informaccedilotildees gerais sobre todos os projetose outras com breve estudos de caso envolvendo cinco projetos

51 Visatildeo Geral

Dentre os repositoacuterios coletados para a anaacutelise 74 (7474) natildeo utilizaram nenhumaexpressatildeo lambda no projeto durante todo o periacuteodo analisado (Janeiro de 2013 a Abrilde 2017) restando apenas 25 repositoacuterios (2525) com expressotildees lambda Eacute interessantedestacar que apesar de a quantidade de repositoacuterios que natildeo possuem expressotildees lambdaser relativamente expressiva muitos destes repositoacuterios satildeo de projetos em Java que umdia foram populares e atualmente natildeo estatildeo sendo mais desenvolvidos (por exemplo umaplicativo que soacute funciona para Android 23 atualmente descontinuado)

Levando em consideraccedilatildeo apenas os projetos que possuem expressotildees lambda exis-tem dois tipos de dados que podem ser analisados para responder agrave primeira questatildeo depesquisa atraveacutes dos dados obtidos pelo meacutetodo anteriormente mencionado como anaacutelisetemporal e a meacutedia de lambda por snapshot mencionados no capiacutetulo anterior

Com relaccedilatildeo ao ano em que a primeira ocorrecircncia foi encontrada 6 projetos introduzi-ram expressotildees lambda jaacute em 2014 8 comeccedilaram a utilizar em 2015 7 em 2016 e apenas4 tiveram a primeira ocorrecircncia de expressotildees lambda em 2017 Dessa forma percebe-seque os projetos estatildeo relativamente bem distribuiacutedos em grupos quanto ao ano em que seintroduziu expressotildees lambda

Pela meacutedia de lambda por snapshot (lambdasnapshot) a maioria (11 projetos) possuiuma quantidade expressiva acima de 100 lambdasnapshot (com 6 projetos entre 20 e 100lambdasnapshot e 8 projetos com menos de 20 lambdasnapshot) como apresentados no

33

graacutefico da Figura 51 Isso mostra que essa nova caracteriacutestica jaacute estaacute sendo bem utilizadanos projetos que comeccedilaram a migrar para a nova versatildeo do Java

Figura 51 Graacuteficos dos projetos separados por ano de introduccedilatildeo de expressotildees lambdae meacutedia de lambda por snapshot

Com isso pode-se observar que apesar de a quantidade de projetos que possuemexpressotildees lambda natildeo ser tatildeo alta eacute possiacutevel obter resultados expressivos uma vez quea quantidade dos projetos com lambda estatildeo bem dispersos quanto ao periacuteodo em quecomeccedilaram a adotar essa caracteriacutestica e a quantidade de expressotildees lambda por snapshot

511 Projetos Selecionados

Atraveacutes dos grupos de classificaccedilatildeo identificados pela anaacutelise temporal descritos na Figura45 cinco projetos foram selecionados para uma anaacutelise detalhada levando em consideraccedilatildeoo grupo em que eles pertencem Estes projetos seratildeo apresentados a seguir

512 agera

Agera eacute uma biblioteca Android que ajuda a introduzir programaccedilatildeo funcional reativa(functional reactive programming) em projetos Android Eacute um projeto recente lanccediladoem 2016 pela Google [44] e encontra-se no grupo dos projetos que introduziram expressotildeeslambda em 2016 no mesmo ano de seu lanccedilamento contendo uma meacutedia de expressotildeeslambda de 16 lambdasnapshot

Na classificaccedilatildeo estabelecida agera pertence ao Grupo 1 onde a quantidade de ex-pressotildees lambda no projeto com o tempo aumentam juntamente com a quantidade deAICs como mostra o graacutefico de anaacutelise temporal na Figura 52

34

Figura 52 Graacuteficos de anaacutelise temporal do projeto agera

513 vertx

Eclipse Vertx eacute um conjunto de ferramentas para criaccedilatildeo de reactive applications namaacutequina virtual Java (JVM) em grande escala [45] Seu primeiro lanccedilamento aconteceuem 2011 e a primeira ocorrecircncia de expressotildees lambda no projeto aconteceu em 2014 Esteprojeto possui uma meacutedia de 2867 lambdasnapshot e dentre os projetos consideradosneste trabalho eacute o que possui a maior quantidade de expressotildees lambda

Este projeto pertence ao Grupo 2 onde a quantidade de expressotildees lambda aumen-tou consideravelmente pelos meses ultrapassando a quantidade de AICs que diminuiudrasticamente como mostra a Figura 53

35

Figura 53 Graacuteficos de anaacutelise temporal do projeto Vertx

514 Android-CleanArchitecture

Apesar de ser uma amostra de projeto Android-CleanArchitecture que tem como objetivoconstruir aplicaccedilotildees Android utilizando clean architecture foi lanccedilado em 2014 mas semanteacutem sempre atualizado [46]

A introduccedilatildeo de expressotildees lambda que aconteceu no ano de 2015 se deu de formatiacutemida com uma meacutedia de 35 lambdasnapshot De qualquer forma este projeto conseguerepresentar com seu graacutefico de anaacutelise temporal o grupo 3 composto por projetos em quea quantidade de expressotildees lambda aumentou mas sem ultrapassar AICs que diminuiacuteramdemonstrado no graacutefico da Figura 54

36

Figura 54 Graacuteficos de anaacutelise temporal do projeto Android-CleanArchitecture

515 RxJava

Dentre os repositoacuterios estudados RxJava eacute considerado o mais popular Como umaimplementaccedilatildeo de Reactive Extensions para a JVM RxJava teve seu lanccedilamento dadoem 2013 [47] Expressotildees lambda apareceram pela primeira vez no ano de 2015 comuma meacutedia de 766 lambdasnapshot

Apesar de uma meacutedia relativamente alta o tempo de vida das expressotildees lambda nesteprojeto foi bem curto caracterizando assim projetos do grupo 4 houve a introduccedilatildeo dasexpressotildees lambda no projeto poreacutem houve a remoccedilatildeo completa de todas as expressotildeeslambda previamente introduzidas desaparecendo completamente do projeto ateacute a datada coleta de dados (Figura 55)

37

Figura 55 Graacuteficos de anaacutelise temporal do projeto RxJava

516 guava

Guava eacute um conjunto de bibliotecas para Java da Google lanccedilado em 2011 A atualizaccedilatildeodo coacutedigo do projeto para Java 8 aconteceu somente em 2016 e apesar do projeto conteruma meacutedia de 281 lambdasnapshot ele foi escolhido como representante dos projetosdo Grupo 5 (Figura 56) que possuem expressotildees lambda mas de forma natildeo expressiva osuficiente quando comparado com a quantidade de AIC pelo fato de sua razatildeo de meacutedia delambdasnapshot por meacutedia de AICsnapshot ser 004 Ou seja embora o projeto tenhaexpressotildees lambda estas satildeo consideradas muito poucas quando inseridas no contextogeral deste projeto que eacute considerado um projeto grande

38

Figura 56 Graacuteficos de anaacutelise temporal do projeto Guava

52 Refatoraccedilatildeo de Coacutedigo

Com o objetivo de caracterizar melhor como as expressotildees lambda estatildeo sendo utilizadaseacute interessante identificar se estas estatildeo sendo introduzidas atraveacutes de refatoraccedilatildeo de coacutedigoou em coacutedigo novo

Os projetos classificados como pertencentes ao Grupo 2 possuem em comum o fatode expressotildees lambda aumentarem a medida que AICs diminuem ultrapassando-as eessa caracteriacutestica em comum pode indicar que nestes projetos possivelmente houve re-fatoraccedilatildeo de coacutedigo visto que AIC sendo substituiacutedo por expressotildees lambda dentro dascondiccedilotildees determinadas eacute a maneira mais comum de se identificar refatoraccedilatildeo de coacute-digo para introduccedilatildeo de expressotildees lambda [12] Os projetos que compotildeem o grupo 2representam 44 de todos os projetos estudados que possuem expressotildees lambda o quepode ser um indicativo caso a hipoacutetese de refatoraccedilatildeo de coacutedigo seja positiva de quemuitos projetos que estatildeo adotando o Java 8 estatildeo se preocupando de alguma formacom refatoraccedilatildeo se coacutedigo Fazem parte desse grupo os seguintes projetos elasticsearchjava-design-patterns PocketHub presto RxJava-Android-Samples spark vertx zipkinjava8-tutorial dropwizard e material-dialogs

39

Outra maneira de verificar possiacuteveis indicadores de refatoraccedilatildeo de coacutedigo foi atraveacutesda anaacutelise dos tamanhos (em quantidade de linhas de coacutedigo) dos meacutetodos com expressotildeeslambda no mecircs em que se introduziu expressotildees lambda e um mecircs imediatamente antesdeste Essa anaacutelise mostra que dos 25 projetos com expressotildees lambda 12 (48) projetostiveram ao menos um meacutetodo em que houve uma diminuiccedilatildeo no tamanho o que podeser considerado um indicativo de refatoraccedilatildeo de coacutedigo A Figura 57 mostra todos osprojetos em relaccedilatildeo agrave quantidade total de meacutetodos que possuem lambda no primeiro mecircsde introduccedilatildeo do mesmo em vermelho comparado com a quantidade desses meacutetodos quetiveram uma diminuiccedilatildeo no tamanho quando comparados com o coacutedigo do mecircs anteriorem azul

Figura 57 Comparaccedilatildeo entre todos os projetos com expressatildeo lambda sobre refatoraccedilatildeode coacutedigo no mecircs de introduccedilatildeo da caracteriacutestica

Ainda observando a figura 57 com relaccedilatildeo aos projetos que natildeo tiveram nenhummeacutetodo com diminuiccedilatildeo de tamanho (barra azul) percebe-se que todos os 13 projetossequer tiveram uma quantidade significativa de meacutetodos que possuem expressotildees lambda(com o maior tendo apenas 5 meacutetodos) no mecircs de introduccedilatildeo da caracteriacutestica no projetoe ao mesmo tempo jaacute existiam no mecircs em que natildeo existia lambda no projeto Essa eacuteuma observaccedilatildeo importante porque projetos como vertx sendo este o que possui a maiormeacutedia de lambdasnapshot de todos os projetos e ao mesmo tempo tendo apenas trecircsmeacutetodos que continham expressotildees lambda no mecircs da introduccedilatildeo e que existiam no mecircs

40

anterior permitem inferir que todas as outras expressotildees lambda existentes no projetopara este determinado mecircs de introduccedilatildeo encontram-se em coacutedigo novo introduzido

Eacute importante ressaltar que somente essa anaacutelise natildeo eacute exclusivamente suficiente paradeterminar se estes projetos estatildeo realmente introduzindo lambda em coacutedigo novo ourealizando refatoraccedilatildeo uma vez que como a comparaccedilatildeo aconteceu apenas no mecircs deintroduccedilatildeo com o mecircs imediatamente anterior natildeo reflete todo o ciclo de vida do pro-jeto Por exemplo algumas equipes podem escolher refatorar o coacutedigo depois de umtempo de adaptaccedilatildeo apoacutes a transiccedilatildeo para a nova versatildeo da linguagem Assim paraobter uma melhor anaacutelise sobre refatoraccedilatildeo de coacutedigo ou natildeo feita nestes projetos aleacutemde outras anaacutelises referentes aos padrotildees tipicamente adotados para implementaccedilatildeo delambda nestes projetos seratildeo apresentados a seguir os estudos de caso dos cinco projetospreviamente selecionados

Outro ponto importante eacute o fato de que apesar das informaccedilotildees quanto agraves quantida-des de filter e map terem sido incluiacutedas inicialmente no trabalho para observar possiacuteveispadrotildees de refatoraccedilatildeo de coacutedigo percebeu-se que estas natildeo satildeo utilizadas de forma con-sideraacutevel pelos projetos estudados e para fins de anaacutelises generalizadas natildeo apresentaramtanta influecircncia na utilizaccedilatildeo de expressotildees lambda quanto a quantidade de AICs noprojeto

53 Estudos de Caso

Dentre os projetos analisados verificou-se que os projetos de pequeno e meacutedio porte op-taram por refatorar de uma vez seus coacutedigos para incluir expressotildees lambda em situaccedilotildeesem que se utilizava AICs anteriormente ou em alguns poucos casos de utilizaccedilatildeo deCollection Os projetos de grande porte natildeo apresentaram nenhuma refatoraccedilatildeo de coacute-digo ou uma refatoraccedilatildeo parcial gradativa provavelmente devido agrave grande quantidade dearquivos e coacutedigo que possuem o que pode tornar o trabalho de refatoraccedilatildeo extenso ecansativo

O projeto vertx que pertence ao grupo 2 dos projetos em que a quantidade de ex-pressotildees lambda aumentaram e as de AICs diminuiacuteram com lambda ultrapassando AICsexecutou inicialmente commits em maio de 2014 com adiccedilatildeo de coacutedigo novo utilizandoexpressotildees lambda e apoacutes um mecircs realizou um commit maior com a refatoraccedilatildeo de todasas AICs para expressotildees lambda Apoacutes a refatoraccedilatildeo o projeto se preocupou em mantera utilizaccedilatildeo de expressotildees lambda ao mesmo tempo que o uso de AICs se manteve apenasaos casos de classes com interfaces natildeo funcionais A Figura 58 apresenta uma parte docommit de refatoraccedilatildeo de coacutedigo que mostra em vermelho a parte eliminada do coacutedigo(AIC) e em verde o coacutedigo novo representando a substituiccedilatildeo por uma expressatildeo lambda

41

Figura 58 Commit de refatoraccedilatildeo de coacutedigo do projeto Vertx [3]

Alguns projetos ainda natildeo se preocuparam em refatorar o coacutedigo para o uso de ex-pressotildees lambda ateacute a data deste trabalho que eacute o caso do projeto guava que apresentouum commit em 03112016 com a atualizaccedilatildeo do projeto para Java 8 Mas a partir daatualizaccedilatildeo se preocupou em utilizar as expressotildees lambda apenas na implementaccedilatildeo decoacutedigo novo O cenaacuterio em que a refatoraccedilatildeo natildeo eacute prioridade ainda eacute a realidade de vaacuteriosprojetos de grande porte visto que os dados de projetos sem nenhuma expressatildeo lambdasatildeo o maior nuacutemero neste trabalho Poreacutem projetos que jaacute adotaram a utilizaccedilatildeo do Java8 tendem a mudar isso com o passar do tempo A Figura 59 apresenta em verde umaadiccedilatildeo de coacutedigo novo com expressatildeo lambda sem a eliminaccedilatildeo de algum coacutedigo anteriora esse que estaria em vermelho

42

Figura 59 Exemplo de um arquivo do commit de adiccedilatildeo de coacutedigo novo em Java 8 doprojeto Guava [4]

Na categoria de projetos em que os AICs e expressotildees lambda aumentam proporci-onalmente (grupo 1) o projeto agera realizou um commit em 19052016 com a adiccedilatildeoda biblioteca retrolambda como dependecircncia do projeto Essa biblioteca utilizada prin-cipalmente por projetos Android permite executar coacutedigo Java 8 contendo expressotildeeslambda em Java 5 6 e 7 [48] O commit tambeacutem apresenta refatoraccedilatildeo dos AICs ad-vindos de interfaces funcionais para expressotildees lambda Apesar de o projeto continuar autilizar as expressotildees lambda em seus commits posteriores o nuacutemero de AICs tambeacutemcontinuou a aumentar visualizando os commits posteriores notou-se que esses AICs satildeorelativos a interfaces natildeo funcionais ou seja que possuem mais de um meacutetodo O projetoAndroid-CleanArchitecture eacute similar ao agera pois tambeacutem optou pela instalaccedilatildeo da bi-blioteca retrolambda para uso de expressotildees lambda em seus coacutedigos e como tambeacutem eacuteum projeto de pequeno porte houve uma pequena refatoraccedilatildeo dos AICs A Figura 510mostra a parte do commit de refatoraccedilatildeo de coacutedigo em que o desenvolvedor adiciona abiblioteca retrolambda como dependecircncia

43

Figura 510 Commit de adiccedilatildeo da biblioteca Retrolambda no projeto Agera [5]

Outro caso interessante eacute o do projeto RxJava que em 2015 optou pela refatoraccedilatildeodo coacutedigo para a utilizaccedilatildeo de expressotildees lambda quase eliminando por completo o usode AICs mas que no ano seguinte reverteu os commits de forma que eliminasse comple-tamente o uso de expressotildees lambda para manter a retrocompatibilidade com o Java 6A Figura 511 demonstra uma parte do commit de reversatildeo do coacutedigo para Java 6 emque pode ser visto em vermelho o coacutedigo anterior com expressotildees lambda e o verde como novo coacutedigo utilizando AIC novamente

44

Figura 511 Commit de remoccedilatildeo de Lambdas e volta para o uso de AICs no projetoRXJava [6]

Essa preocupaccedilatildeo com retrocompatibilidade de coacutedigo pode ser um fator crucial nadecisatildeo das equipes de desenvolvimento na hora de decidir como fazer o software co-evoluircom a linguagem sem perder a compatibilidade com versotildees anteriores

45

Capiacutetulo 6

Consideraccedilotildees Finais

Este estudo permitiu entender melhor como projetos estatildeo realizando a migraccedilatildeo para oJava 8 em especial utilizando uma nova caracteriacutestica introduzida expressatildeo lambdaApesar de a maioria dos projetos populares considerados natildeo possuiacuterem nenhuma ocor-recircncia de expressotildees lambda os projetos que tinham expressotildees lambda foram suficientespara realizar um primeiro estudo de caracterizaccedilatildeo no uso desta caracteriacutestica e com osprojetos efetivamente utilizados para estudo foi possiacutevel agrupaacute-los quanto a maneira emque as expressotildees lambda estavam sendo utilizadas quando comparadas com AICs em 5grandes grupos quando AIC e lambda aumentam proporcionalmente quando AIC dimi-nui e lambda aumenta ultrapassando AIC quando AIC diminui mas continua superior aolambda crescente expressotildees lambda que foram introduzidas e retiradas completamentedo coacutedigo e expressotildees lambda que natildeo existem em quantidades expressivas

Foi possiacutevel entatildeo realizar um estudo aprofundado levando em consideraccedilatildeo as di-ferentes maneiras com que as expressotildees lambda foram adotadas nos projetos atraveacutes daescolha de um projeto que representasse cada grupo para anaacutelise Dentre os cinco projetosestudados foi possiacutevel observar alguns padrotildees tipicamente adotados por desenvolvedorespara implementar expressotildees lambda em seus projetos como a utilizaccedilatildeo da bibliotecas(retrolambda) que permitissem uma flexibilizaccedilatildeo na utilizaccedilatildeo de expressotildees lambda oucomo lambda eacute primariamente utilizada para substituir determinados AICs ou operaccedilotildeesem Collection

Aleacutem disso foi possiacutevel observar como a refatoraccedilatildeo de coacutedigo acontece em cada umdesses projetos Observou-se como projetos menores tendem a refatorar coacutedigo maisfacilmente ao passo que projetos maiores e mais complexos fazem menos refatoraccedilatildeo oudemoram mais entre o periacuteodo em que houve a primeira migraccedilatildeo de coacutedigo para a novaversatildeo da linguagem ateacute o periacuteodo em que realmente decidem refatorar coacutedigo Aleacutem dacomplexidade do projeto influenciar na decisatildeo de migrar o projeto para uma versatildeo maisrecente da linguagem a preocupaccedilatildeo com retrocompatibilidade com versotildees anteriores da

46

linguagem tambeacutem podem ser uma barreira para que projetos comecem a evoluir o coacutedigojuntamente com a evoluccedilatildeo da linguagem

Ainda assim foi possiacutevel observar que a preocupaccedilatildeo com a co-evoluccedilatildeo do software-linguagem existe entre os desenvolvedores de projetos mas a realizaccedilatildeo da migraccedilatildeo aindaacontece lentamente devido agrave diversos fatores que precisam ser levados em consideraccedilatildeopara a manutenccedilatildeo do projeto

Para trabalhos e contribuiccedilotildees futuras seria interessante desenvolver uma ferramentaque pudesse analisar diretamente no coacutedigo-fonte as oportunidades de aplicaccedilatildeo de ex-pressotildees lambda dessa forma poderiam ser analisadas as porcentagens de conversatildeo decoacutedigo para Java 8 e obter melhores conclusotildees sobre a importacircncia que os projetos estatildeodando para a evoluccedilatildeo de seus coacutedigos Outro fator interessante seria aplicar mais Visitorsagrave ferramenta static-analysis e fazer este mesmo estudo aplicado agrave outras caracteriacutesticasda linguagem

47

Referecircncias

[1] Kagdi Huzefa Michael L Collard e Jonathan I Maletic A survey and taxonomyof approaches for mining software repositories in the context of software evolution2007 ix 3 8 9 10 11

[2] DBeaver Dbeaver - features httpdbeaverjkissorgdocsfeatures ix 29

[3] Eclipse Vertx commit Java8-ify code httpsgithubcomeclipsevertxcommit93f95e9c77419f442a42fe711b6eeaef88192fd3 ix 42

[4] Google Guava commit Release java 8 changes to guava httpsgithubcomgoogleguavacommit73e382fa877f80994817a136b0adcc4365ccd904 ix 43

[5] Google Agera commit Collapsed testapp with retrolambda httpsgithubcomgoogleageracommit5e518b7b05f9e7a34a314945f68deff7b2c3e334 ix 44

[6] ReactiveX Rxjava commit 2x full jdk 6 compatible backport + includ-ing bugfixes up to today httpsgithubcomReactiveXRxJavacommit000a174d87a901135f9665d3b11f3627fd2dc4ed ix 45

[7] Godfrey M W e D M German The past present and future of software evolutionEm 2008 Frontiers of Maintenance paacuteginas 129ndash138 Sept 2008 1 6

[8] Favre J M Languages evolve too changing the software time scale Em Principles ofSoftware Evolution Eighth International Workshop on paacuteginas 33ndash42 IEEE 20051 5 7

[9] Overbey Jeffrey L e Ralph E Johnson Regrowing a language refactoring tools allowprogramming languages to evolve Em ACM SIGPLAN Notices volume 44 paacuteginas493ndash502 ACM 2009 1 5 7 8 12

[10] Grechanik Mark Collin McMillan Luca DeFerrari Marco Comi Stefano CrespiDenys Poshyvanyk Chen Fu Qing Xie e Carlo Ghezzi An empirical investiga-tion into a large-scale java open source code repository Em Proceedings of the2010 ACM-IEEE International Symposium on Empirical Software Engineering andMeasurement ESEM rsquo10 paacuteginas 111ndash1110 New York NY USA 2010 ACMISBN 978-1-4503-0039-1 httpdoiacmorg10114518527861852801 1

[11] TIOBE Tiobe httpswwwtiobecomtiobe-index 1 14

48

[12] Gyori Alex Lyle Franklin Danny Dig e Jan Lahoda Crossing the gap from im-perative to functional programming through refactoring Em Proceedings of the 20139th Joint Meeting on Foundations of Software Engineering ESECFSE 2013 paacute-ginas 543ndash553 New York NY USA 2013 ACM ISBN 978-1-4503-2237-9 httpdoiacmorg10114524914112491461 2 11 24 39

[13] OpenJDK State of the lambda httpcropenjdkjavanet~briangoetzlambdalambda-state-4html 2

[14] Han Jiawei Micheline Kamber e Jian Pei Data Mining Concepts and TechniquesMorgan Kaufmann Publishers Inc San Francisco CA USA 3rd ediccedilatildeo 2011ISBN 0123814790 9780123814791 3

[15] Fowler Martin e Kent Beck Refactoring improving the design of existing codeAddison-Wesley Professional 1999 5 7

[16] Lehman M M J F Ramil P D Wernick D E Perry e W M Turski Met-rics and laws of software evolution - the nineties view Em Proceedings of the4th International Symposium on Software Metrics METRICS rsquo97 paacuteginas 20ndashWashington DC USA 1997 IEEE Computer Society ISBN 0-8186-8093-8 httpdlacmorgcitationcfmid=823454823901 6

[17] Hassan Ahmed E e Tao Xie Software intelligence The future of mining softwareengineering data Em Proceedings of the FSESDP Workshop on Future of SoftwareEngineering Research FoSER rsquo10 paacuteginas 161ndash166 New York NY USA 2010ACM ISBN 978-1-4503-0427-6 httpdoiacmorg101145188236218823978 9

[18] Hassan Ahmed E The road ahead for mining software repositories Em Frontiers ofSoftware Maintenance 2008 FoSM 2008 paacuteginas 48ndash57 IEEE 2008 8

[19] Berry Michael J e Gordon Linoff Data Mining Techniques For Marketing Salesand Customer Support John Wiley amp Sons Inc New York NY USA 1997ISBN 0471179809 10

[20] Parnin Chris Christian Bird e Emerson Murphy-Hill Java generics adoption hownew features are introduced championed or ignored Em Proceedings of the 8thWorking Conference on Mining Software Repositories paacuteginas 3ndash12 ACM 2011 12

[21] Oracle The java language specification httpsdocsoraclecomjavasespecsjlsse8jls8pdf 13

[22] Oracle The history of java technology httpwwworaclecomtechnetworkjavajavaseoverviewjavahistory-index-198355html 13

[23] Murphy Kieron So why did they decide to call itjava httpwwwjavaworldcomarticle2077265core-javaso-why-did-they-decide-to-call-it-java-html 13

[24] McGraw Tata Object-oriented Programming with Java Essentials and ApplicationsHill Education 13

49

[25] Oracle Differences between java ee and java se httpdocsoraclecomjavaee6firstcupdocgkhoyhtml 13

[26] Lindsey Clark S The History of Java Cambridge 14

[27] Oracle The java language environment httpwwworaclecomtechnetworkjavaintro-141325html 14

[28] Oracle Jdk 8 httpopenjdkjavanetprojectsjdk8 15 24

[29] Oracle Enhancements in java se 8 httpdocsoraclecomjavase8docstechnotesguideslanguageenhancementshtmljavase8 15 16 17

[30] Oracle Lambda expressions httpdocsoraclecomjavasetutorialjavajavaOOlambdaexpressionshtml 16 18 21

[31] Oracle Method references httpdocsoraclecomjavasetutorialjavajavaOOmethodreferenceshtml 16

[32] Oracle Default methods httpdocsoraclecomjavasetutorialjavaIandIdefaultmethodshtml 17

[33] Oracle Repeating annotations httpdocsoraclecomjavasetutorialjavaannotationsrepeatinghtml 17

[34] Oracle Type annotations httpdocsoraclecomjavasetutorialjavaannotationstype_annotationshtml 17

[35] Oracle Anonymous inner classes httpsdocsoraclecomjavasetutorialjavajavaOOanonymousclasseshtml 19

[36] Kothari CR Research Methodology Methods and Techniques New Age Interna-tional (P) Limited 2004 ISBN 9788122415223 httpsbooksgooglecombrbooksid=8c6gkbKi-F4C 22

[37] Nakakoji Kumiyo Yasuhiro Yamamoto Yoshiyuki Nishinaka Kouichi Kishida eYunwen Ye Evolution patterns of open-source software systems and communitiesEm IWPSE rsquo02 Proceedings of the International Workshop on Principles of SoftwareEvolution paacuteginas 76ndash85 New York NY USA 2002 ACM Press ISBN 1581135459httpdxdoiorg101145512035512055 23

[38] Rahman Foyzur Christian Bird e Premkumar Devanbu Clones What is that smellEmpirical Software Engineering 17(4-5)503ndash530 2012 24

[39] Chacon Scott Pro Git Apress Berkely CA USA 1st ediccedilatildeo 2009ISBN 1430218339 9781430218333 25

[40] Cavalcanti Thiago Gomes e Viniacutecius Correa de Almeida Caracterizaccedilatildeo do uso deconstruccedilotildees da linguagem java em projetos open-source Publicaccedilatildeo online 2016httpbdmunbbrhandle1048315733 27

50

[41] Parr Terence Language Implementation Patterns Create Your Own Domain-Specific and General Programming Languages Pragmatic Bookshelf 1st ediccedilatildeo 2009ISBN 193435645X 9781934356456 27

[42] Janssen Thorben 5 reasons to use jpa hibernate Publicaccedilatildeo online httpswwwsitepointcom5-reasons-to-use-jpa-hibernate 27

[43] Franklin Lyle Alex Gyori Jan Lahoda e Danny Dig Lambdaficator From imperativeto functional programming through automated refactoring Em Proceedings of the2013 International Conference on Software Engineering ICSE rsquo13 paacuteginas 1287ndash1290 Piscataway NJ USA 2013 IEEE Press ISBN 978-1-4673-3076-3 httpdlacmorgcitationcfmid=24867882486986 29

[44] Google Agera httpsgithubcomgoogleagerawiki 34

[45] Eclipse Eclipse vertx httpvertxio 35

[46] Cejas Fernando Android cleanarchitecture httpsgithubcomandroid10Android-CleanArchitecture 36

[47] ReactiveX Rxjava httpsgithubcomReactiveXRxJava 37

[48] Luontola Esko Retrolambda httpsgithubcomorfjackalretrolambda 43

51

Anexo I

Projetos utilizados

fastjson

platform_frameworks_base

netty

material-dialogs

kotlin

okhttp

tinker

AndroidUtilCode

RxJava

spring-boot

java-design-patterns

elasticsearch

ExoPlayer

kafka

vertx

realm-java

guava

zipkin

bazel

stetho

Signal-Android

glide

agera

fresco

plaid

presto

libgdx

spark

52

disruptor

lottie-android

flexbox-layout

PocketHub

zxing

spring-framework

deeplearning4j

dropwizard

interviews

BaseRecyclerViewAdapterHelper

uCrop

DanmakuFlameMaster

lottie-react-native

android-UniversalMusicPlayer

AndroidInterview-Q-A

greenDAO

retrofit

MaterialDrawer

BottomBar

druid

MPAndroidChart

Hystrix

guice

recyclerview-animators

dubbo

androidannotations

RxJava-Android-Samples

PhotoView

clojure

CircleImageView

AndroidSwipeLayout

jedis

MaterialViewPager

butterknife

junit4

RxBinding

leakcanary

SimianArmy

picasso

UltimateRecyclerView

53

AndroidViewAnimations

AppIntro

FizzBuzzEnterpriseEdition

ion

cheesesquare

physical-web

RxAndroid

Android-CleanArchitecture

Calligraphy

Android-Bootstrap

iosched

Android_Data

MaterialDesignLibrary

ListViewAnimations

EventBus

java8-tutorial

AndroidSlidingUpPanel

dagger

okhttputils

logger

HomeMirror

Material-Animations

android-Ultra-Pull-To-Refresh

android-async-http

Android-ObservableScrollView

Android-Universal-Image-Loader

ActionBarSherlock

SlidingMenu

storm

PagerSlidingTabStrip

Android-PullToRefresh

54

  • Dedicatoacuteria
  • Agradecimentos
  • Resumo
  • Abstract
  • Introduccedilatildeo
    • Contexto
    • Objetivos
      • Objetivos Gerais
      • Objetivos Especiacuteficos
        • Metodologia
        • Organizaccedilatildeo do Trabalho
          • Evoluccedilatildeo e Mineraccedilatildeo de Repositoacuterios de Software
            • Evoluccedilatildeo de Software
            • MSR Mineraccedilatildeo de dados e a Engenharia de Software
              • Classificaccedilatildeo
                • Trabalhos Relacionados
                  • Java SE 8 e JDK 8
                    • Histoacuterico
                    • Princiacutepios
                    • Evoluccedilatildeo
                    • Expressotildees Lambda
                      • Sintaxe
                      • Principais formas de uso
                          • Estudo e o Processo de Mineraccedilatildeo
                            • Questotildees de Pesquisa
                            • Fonte de Dados e Objetos de Estudo
                            • Processo de Mineraccedilatildeo
                              • static-analysis
                              • BDAnalisador
                                • Classificaccedilatildeo e Anaacutelise
                                  • Meacutedia de Lambda
                                  • Anaacutelise Temporal
                                  • Refatoraccedilatildeo de Coacutedigo
                                  • Casos de Uso
                                      • Resultados Obtidos e Anaacutelise
                                        • Visatildeo Geral
                                          • Projetos Selecionados
                                          • agera
                                          • vertx
                                          • Android-CleanArchitecture
                                          • RxJava
                                          • guava
                                            • Refatoraccedilatildeo de Coacutedigo
                                            • Estudos de Caso
                                              • Consideraccedilotildees Finais
                                              • Referecircncias
                                              • Anexo
                                              • Projetos utilizados

Figura 42 Metodologia implementada para coleta e tratamento de dados

Em seguida foi necessaacuterio realizar o checkout de todas as versotildees entre Janeiro de2013 a Abril de 2017 de cada projeto Por motivos de otimizaccedilatildeo de espaccedilo da maacutequinalocal e automatizaccedilatildeo no processo de checkout utilizou-se de um segundo script pythonque realizava as seguintes tarefas para cada mecircs em cada projeto verificar se dentreo mecircs estipulado houve algum commit para aquele projeto se sim pega-se o hash douacuteltimo commit do mecircs realiza o checkout conta-se a quantidade de linhas de coacutedigo emJava que o projeto tem utilizando a biblioteca cloc e armazena todas as informaccedilotildeespertinentes referentes a todos os projetos que naquele mecircs tiveram commits para que oprojeto static-analysis possa entatildeo ser executado sobre esses projetos naquele determinadomomento As informaccedilotildees coletadas que satildeo utilizadas pelo static-analysis correspondemao nome do projeto o hash do commit para aquela versatildeo a pasta onde o projeto estaacutearmazenado na maacutequina local a quantidade de linhas de coacutedigo Java do projeto e datareferente ao commit Essas informaccedilotildees satildeo pertinentes para que o projeto static-analysisconsiga funcionar de forma correta projeto este descrito em detalhes a seguir

431 static-analysis

O static-analysis foi um projeto desenvolvido anteriormente a este trabalho pelos alunosThiago Cavalcanti e Vinicius de Almeida cujo objetivo eacute realizar a anaacutelise estaacutetica de

26

coacutedigos-fonte Java e gerar arquivos de saiacuteda contendo informaccedilotildees de classes e meacutetodoscom suas devidas ocorrecircncias de caracteriacutesticas da linguagem [40]

A anaacutelise estaacutetica de coacutedigo consiste em analisar um coacutedigo-fonte sem a necessidadede executaacute-lo Esse tipo de anaacutelise eacute de extrema importacircncia para manter um coacutedigo dequalidade evitar futuras refatoraccedilotildees e obter informaccedilotildees estatiacutesticas de forma raacutepida epraacutetica [41]

Seguindo esse princiacutepio o static-analysis foi projetado para receber um arquivo deentrada csv seguindo o padratildeo

Tipo da Aplicaccedilatildeo Inicio do projeto Antes ou Apoacutes Java 5 Nome do ProjetoVersatildeo Caminho absolutoQuantidade de linhas de coacutedigo

Atraveacutes da informaccedilatildeo do caminho absoluto do projeto o static-analysis varre osdiretoacuterios em busca dos arquivos fonte java realiza o parse desses arquivos e utilizade Visitors para extrair as informaccedilotildees desejadas e exporta-las em arquivos csv Ouso de Visitors permite que sejam escolhidas as informaccedilotildees desejadas para a consultacomo expressotildees Lambda e AIC s aleacutem de possibilitar que sejam implementados novosVisitors conforme a linguagem evolua ou as necessidades mudem

Para este trabalho foram utilizados os Visitors de expressotildees Lambda map() filter()AICs e declaraccedilotildees de meacutetodos

432 BDAnalisador

Apoacutes obter todas as informaccedilotildees necessaacuterias geradas pelo static-analysis era preciso ma-nipular os dados de forma que facilitasse a coleta de dados para o estudo proposto Comovaacuterios arquivos em formato csv satildeo de difiacutecil manipulaccedilatildeo foi desenvolvido entatildeo umaferramenta chamada BDAnalisador Esta ferramenta eacute responsaacutevel por processar os arqui-vos em csv gerados pelo static-analysis e popular uma base de dados relacional MySQLcom as informaccedilotildees pertinentes a este estudo

O BDAnalisador foi desenvolvido com a intenccedilatildeo de tornar mais simples o trabalhocom os dados resultantes do static-analysis de forma que consultas em SQL pudessemser feitas a ponto de permitir a obtenccedilatildeo de resultados mais complexos Seguindo esseobjetivo o framework Hibernate foi escolhido como ferramenta para persistecircncia devidoa ser um framework jaacute consolidado no mercado e que de forma simples relaciona osobjetos Java ao banco de dados MySQL [42] A divisatildeo de classes foi projetada em quatroentidades Projeto Versao Classe e Metodo cada uma com seus respectivos camposcontendo as informaccedilotildees necessaacuterias para a pesquisa como pode ser visto na Figura 44Eacute importante ressaltar que a tabela de Versao guarda hashs de commits devido agrave escolhade utilizar commits para obter mais informaccedilatildeo de evoluccedilatildeo de coacutedigo em um menor

27

espaccedilo de tempo Aleacutem disso para este trabalho optou-se por persistir todos os meacutetodose classes de cada versatildeo sem se importar com a repeticcedilatildeo desses dados pois a hipoacutetesede haver grandes refatoraccedilotildees entre versotildees poderia comprometer a confiabilidade dasinformaccedilotildees

Figura 43 Diagrama de classes UML do BDAnalisador

Como visto na Figura 43 seguindo parcialmente a arquitetura MVC cada entidadepossui sua respectiva classe DAO(Data Access Object) para persistecircncia dos dados eapenas uma classe Controlador no projeto responsaacutevel pela manipulaccedilatildeo e parse dosdados dos arquivos csv gerados pelo static analysis para serem enviados agraves classes DAOO sistema inicia chamando o meacutetodo inicializar() da classe Controlador Esse meacutetodoeacute responsaacutevel por ler um arquivo de entrada csv que segue o mesmo modelo do arquivo dostatic-analysis citado na seccedilatildeo anterior O arquivo conteacutem os dados de todos os projetose suas respectivas versotildees dessa forma o meacutetodo instancia um objeto da classe Projetoe persiste o projeto no banco de dados Para cada versatildeo encontrada no arquivo deentrada o inicializar() aciona os meacutetodos responsaacuteveis por instanciar e preencher aslistas da classe Classe e Metodo Os meacutetodos responsaacuteveis por preencher as listas varremos arquivos csv gerados pelo static-analysis e fazem o parse das informaccedilotildees relevantescomo nomes dos meacutetodos e quantidades de lambdas para construir os objetos que seratildeogravados Ao final dos preenchimentos o objeto Versatildeo eacute instanciado e gravado no bancode dados atraveacutes de sua classe DAO ao mesmo tempo que grava suas respectivas Classese Metodos

28

Apoacutes vaacuterios testes e correccedilotildees de bugs o banco de dados se encontrava finalmente comas informaccedilotildees de 99 projetos Java open-source separados por um commit por mecircs desde2013 cada um com suas respectivas informaccedilotildees de classes meacutetodos e a quantidade deexpressotildees lambda filters e maps em cada meacutetodo Filter ou Filter pattern eacute o padratildeode projeto que tem como objetivo filtrar objetos de uma coleccedilatildeo (Collection) de acordocom algum criteacuterio Jaacute o map ou map pattern eacute um padratildeo que ldquomapeia os elementosde uma coleccedilatildeo aplicando uma funccedilatildeo a eles para uma nova coleccedilatildeo [43] A coleta deinformaccedilotildees sobre esses padrotildees podem ser uacuteteis para possiacuteveis anaacutelises de oportunidadesde uso de expressotildees lambda para refatoraccedilatildeo de coacutedigo

A Figura 44 mostra o esquema de como o banco de dados resultante foi gerado

Figura 44 Modelo relacional do banco de dados populado pelo BDAnalisador Imagemgerada com software DBeaver [2]

44 Classificaccedilatildeo e Anaacutelise

Com o banco de dados populado restam apenas as etapas de classificaccedilatildeo e anaacutelise pararesponder as questotildees de pesquisa propostas Para isso inicialmente houve uma tentativade se utilizar apenas queries SQL para analisar os dados de acordo com as informaccedilotildeesrelevantes Poreacutem devido ao fato de o banco de dados conter todas as informaccedilotildees detodos os projetos e todas as suas versotildees queries que possuem uma alta complexidadedemoravam muito tempo para retornar os dados

Assim com o objetivo de facilitar o trabalho alguns scripts python foram desenvolvi-dos para rodar as queries separadamente e individualmente para cada projeto de formaautomatizada a fim de melhorar o tempo de resposta para obtenccedilatildeo dos resultados

29

441 Meacutedia de Lambda

O primeiro script retorna a quantidade de expressotildees lambda (ou AICs) por n snapshotsque contenha expressotildees lambda O objetivo eacute ter uma visatildeo geral da meacutedia de expressotildeeslambda e AICs utilizadas por cada projeto e como nem todos os snapshots coletados decada projeto possuem expressotildees lambda e AICs apenas aqueles com alguma expressatildeolambda ou AIC satildeo incluiacutedos no caacutelculo da meacutedia

Mmedia =sumn qtdLambdai

n

442 Anaacutelise Temporal

O segundo script retorna para cada projeto a soma total da quantidade de expressotildeeslambda AIC map() e filter() no projeto inteiro para cada versatildeo Ou seja tem-seo total de cada uma das quatro propriedades selecionadas para cada mecircs do projetoobtendo assim uma visatildeo temporal de evoluccedilatildeo do uso das caracteriacutesticas descritas ATabela 41 ilustra parcialmente o resultado obtido para o projeto agera onde idVersaoeacute o identificador no banco de dados referente ao hash do commit mensal coletado qtd eacutea quantidade de cada uma das caracteriacutesticas escolhidas e a data do commit encontra-seno formato americano

Tabela 41 Informaccedilotildees mensais sobre o projeto ageraidVersao Data do Commit qtd lambda qtd AIC qtd maps qtd filter

823 512016 0 29 4 0755 612016 13 28 4 0686 6152016 13 29 4 0621 812016 13 29 4 0555 8162016 13 30 4 0485 922016 13 30 4 0422 10132016 14 30 4 0356 11282016 14 30 4 0295 12212016 21 30 5 0232 212017 21 30 5 0175 312017 21 30 5 0112 3312017 21 36 5 048 4242017 21 48 5 0

Os resultados obtidos com esta anaacutelise temporal permitiu a identificaccedilatildeo de padrotildees nautilizaccedilatildeo de expressotildees lambda em relaccedilatildeo a utilizaccedilatildeo de AIC por todos os projetos Foi

30

possiacutevel classificar todos os projetos em 6 grupos ilustrado na Figura 45 Primeiramenteseparou-se os projetos entre os que possuem expressotildees lambda e os que natildeo possuemDentre os que possuem identificou-se cinco categorias

1 Grupo 1 Quantidade de AICs e expressotildees lambda aumentam com o tempo pro-porcionalmente

2 Grupo 2 Quantidade de AICs diminui agrave medida que a quantidade de expressotildeeslambda aumentam e a quantidade de expressotildees lambda ultrapassa a quantidade deAIC em um determinado momento

3 Grupo 3 Quantidade de AICs diminui agrave medida que a quantidade de expressotildeeslambda aumentam mas a quantidade de AIC permanece superior agrave quantidade delambda

4 Grupo 4 Expressotildees lambda satildeo introduzidas e existem por um pequeno periacuteodode tempo mas satildeo completamente removidas posteriormente

5 Grupo 5 Quantidade de expressotildees lambda eacute constante e muito inferior compa-rado com a quantidade de AICs no projeto Foi determinado que para pertencera esta classificaccedilatildeo o projeto precisa ter uma razatildeo de meacutedia de expressotildees lamb-dasnapshot por meacutedia de AICsnapshot inferior a 020 Esse paracircmetro foi esta-belecido com o objetivo de definir um padratildeo para o que pode ser considerado umprojeto com poucas expressotildees lambda

Figura 45 Classificaccedilatildeo dos projetos

31

443 Refatoraccedilatildeo de Coacutedigo

O uacuteltimo script teve como objetivo realizar uma tentativa inicial de identificar refatoraccedilatildeode coacutedigo da seguinte maneira para todos os projetos que possuem expressotildees lambdaforam identificados o mecircs imediatamente antes da introduccedilatildeo de expressotildees lambda e omecircs seguinte onde houve a primeira ocorrecircncia de lambda no projeto Assim realizou-se uma anaacutelise do tamanho em quantidade de linhas de coacutedigo de todos os meacutetodosdo projeto que no mecircs seguinte tiveram introduccedilatildeo de lambda Em seguida fez-se umacomparaccedilatildeo com os mesmos meacutetodos em relaccedilatildeo ao mecircs anterior e assim foi possiacuteveldetectar quais meacutetodos tiveram a quantidade de linhas de coacutedigo reduzidas o que seriaum indicativo natildeo necessariamente exclusivo de que uma refatoraccedilatildeo de coacutedigo possa terocorrido

Sabe-se que este meacutetodo de detecccedilatildeo de refatoraccedilatildeo de coacutedigo possui suas limitaccedilotildeesuma vez que as comparaccedilotildees para saber se um meacutetodo existe em ambas versotildees eacute feitopuramente por comparaccedilatildeo de String (nome do meacutetodo) e a classe que este pertence

444 Casos de Uso

Os meacutetodos descritos acima ajudaram a identificar alguns padrotildees e facilitar a anaacutelise dosdados Poreacutem natildeo satildeo suficientes para que se possa responder agraves questotildees de pesquisaDessa forma apoacutes a identificaccedilatildeo dos grupos de classificaccedilatildeo para os projetos foramescolhidos um projeto de cada grupo (com exceccedilatildeo do grupo dos projetos sem expressotildeeslambda) para realizar um breve estudo de caso com o objetivo de identificar e caracterizarmelhor a adoccedilatildeo de expressotildees lambda Os projetos escolhidos foram agera vertxAndroid-CleanArchitecture RxJava e guava

32

Capiacutetulo 5

Resultados Obtidos e Anaacutelise

Neste capiacutetulo seratildeo apresentados os dados obtidos e anaacutelise com o objetivo de responderagraves questotildees de pesquisa propostas Como mencionado anteriormente as perguntas seratildeorespondidas de duas maneiras algumas com informaccedilotildees gerais sobre todos os projetose outras com breve estudos de caso envolvendo cinco projetos

51 Visatildeo Geral

Dentre os repositoacuterios coletados para a anaacutelise 74 (7474) natildeo utilizaram nenhumaexpressatildeo lambda no projeto durante todo o periacuteodo analisado (Janeiro de 2013 a Abrilde 2017) restando apenas 25 repositoacuterios (2525) com expressotildees lambda Eacute interessantedestacar que apesar de a quantidade de repositoacuterios que natildeo possuem expressotildees lambdaser relativamente expressiva muitos destes repositoacuterios satildeo de projetos em Java que umdia foram populares e atualmente natildeo estatildeo sendo mais desenvolvidos (por exemplo umaplicativo que soacute funciona para Android 23 atualmente descontinuado)

Levando em consideraccedilatildeo apenas os projetos que possuem expressotildees lambda exis-tem dois tipos de dados que podem ser analisados para responder agrave primeira questatildeo depesquisa atraveacutes dos dados obtidos pelo meacutetodo anteriormente mencionado como anaacutelisetemporal e a meacutedia de lambda por snapshot mencionados no capiacutetulo anterior

Com relaccedilatildeo ao ano em que a primeira ocorrecircncia foi encontrada 6 projetos introduzi-ram expressotildees lambda jaacute em 2014 8 comeccedilaram a utilizar em 2015 7 em 2016 e apenas4 tiveram a primeira ocorrecircncia de expressotildees lambda em 2017 Dessa forma percebe-seque os projetos estatildeo relativamente bem distribuiacutedos em grupos quanto ao ano em que seintroduziu expressotildees lambda

Pela meacutedia de lambda por snapshot (lambdasnapshot) a maioria (11 projetos) possuiuma quantidade expressiva acima de 100 lambdasnapshot (com 6 projetos entre 20 e 100lambdasnapshot e 8 projetos com menos de 20 lambdasnapshot) como apresentados no

33

graacutefico da Figura 51 Isso mostra que essa nova caracteriacutestica jaacute estaacute sendo bem utilizadanos projetos que comeccedilaram a migrar para a nova versatildeo do Java

Figura 51 Graacuteficos dos projetos separados por ano de introduccedilatildeo de expressotildees lambdae meacutedia de lambda por snapshot

Com isso pode-se observar que apesar de a quantidade de projetos que possuemexpressotildees lambda natildeo ser tatildeo alta eacute possiacutevel obter resultados expressivos uma vez quea quantidade dos projetos com lambda estatildeo bem dispersos quanto ao periacuteodo em quecomeccedilaram a adotar essa caracteriacutestica e a quantidade de expressotildees lambda por snapshot

511 Projetos Selecionados

Atraveacutes dos grupos de classificaccedilatildeo identificados pela anaacutelise temporal descritos na Figura45 cinco projetos foram selecionados para uma anaacutelise detalhada levando em consideraccedilatildeoo grupo em que eles pertencem Estes projetos seratildeo apresentados a seguir

512 agera

Agera eacute uma biblioteca Android que ajuda a introduzir programaccedilatildeo funcional reativa(functional reactive programming) em projetos Android Eacute um projeto recente lanccediladoem 2016 pela Google [44] e encontra-se no grupo dos projetos que introduziram expressotildeeslambda em 2016 no mesmo ano de seu lanccedilamento contendo uma meacutedia de expressotildeeslambda de 16 lambdasnapshot

Na classificaccedilatildeo estabelecida agera pertence ao Grupo 1 onde a quantidade de ex-pressotildees lambda no projeto com o tempo aumentam juntamente com a quantidade deAICs como mostra o graacutefico de anaacutelise temporal na Figura 52

34

Figura 52 Graacuteficos de anaacutelise temporal do projeto agera

513 vertx

Eclipse Vertx eacute um conjunto de ferramentas para criaccedilatildeo de reactive applications namaacutequina virtual Java (JVM) em grande escala [45] Seu primeiro lanccedilamento aconteceuem 2011 e a primeira ocorrecircncia de expressotildees lambda no projeto aconteceu em 2014 Esteprojeto possui uma meacutedia de 2867 lambdasnapshot e dentre os projetos consideradosneste trabalho eacute o que possui a maior quantidade de expressotildees lambda

Este projeto pertence ao Grupo 2 onde a quantidade de expressotildees lambda aumen-tou consideravelmente pelos meses ultrapassando a quantidade de AICs que diminuiudrasticamente como mostra a Figura 53

35

Figura 53 Graacuteficos de anaacutelise temporal do projeto Vertx

514 Android-CleanArchitecture

Apesar de ser uma amostra de projeto Android-CleanArchitecture que tem como objetivoconstruir aplicaccedilotildees Android utilizando clean architecture foi lanccedilado em 2014 mas semanteacutem sempre atualizado [46]

A introduccedilatildeo de expressotildees lambda que aconteceu no ano de 2015 se deu de formatiacutemida com uma meacutedia de 35 lambdasnapshot De qualquer forma este projeto conseguerepresentar com seu graacutefico de anaacutelise temporal o grupo 3 composto por projetos em quea quantidade de expressotildees lambda aumentou mas sem ultrapassar AICs que diminuiacuteramdemonstrado no graacutefico da Figura 54

36

Figura 54 Graacuteficos de anaacutelise temporal do projeto Android-CleanArchitecture

515 RxJava

Dentre os repositoacuterios estudados RxJava eacute considerado o mais popular Como umaimplementaccedilatildeo de Reactive Extensions para a JVM RxJava teve seu lanccedilamento dadoem 2013 [47] Expressotildees lambda apareceram pela primeira vez no ano de 2015 comuma meacutedia de 766 lambdasnapshot

Apesar de uma meacutedia relativamente alta o tempo de vida das expressotildees lambda nesteprojeto foi bem curto caracterizando assim projetos do grupo 4 houve a introduccedilatildeo dasexpressotildees lambda no projeto poreacutem houve a remoccedilatildeo completa de todas as expressotildeeslambda previamente introduzidas desaparecendo completamente do projeto ateacute a datada coleta de dados (Figura 55)

37

Figura 55 Graacuteficos de anaacutelise temporal do projeto RxJava

516 guava

Guava eacute um conjunto de bibliotecas para Java da Google lanccedilado em 2011 A atualizaccedilatildeodo coacutedigo do projeto para Java 8 aconteceu somente em 2016 e apesar do projeto conteruma meacutedia de 281 lambdasnapshot ele foi escolhido como representante dos projetosdo Grupo 5 (Figura 56) que possuem expressotildees lambda mas de forma natildeo expressiva osuficiente quando comparado com a quantidade de AIC pelo fato de sua razatildeo de meacutedia delambdasnapshot por meacutedia de AICsnapshot ser 004 Ou seja embora o projeto tenhaexpressotildees lambda estas satildeo consideradas muito poucas quando inseridas no contextogeral deste projeto que eacute considerado um projeto grande

38

Figura 56 Graacuteficos de anaacutelise temporal do projeto Guava

52 Refatoraccedilatildeo de Coacutedigo

Com o objetivo de caracterizar melhor como as expressotildees lambda estatildeo sendo utilizadaseacute interessante identificar se estas estatildeo sendo introduzidas atraveacutes de refatoraccedilatildeo de coacutedigoou em coacutedigo novo

Os projetos classificados como pertencentes ao Grupo 2 possuem em comum o fatode expressotildees lambda aumentarem a medida que AICs diminuem ultrapassando-as eessa caracteriacutestica em comum pode indicar que nestes projetos possivelmente houve re-fatoraccedilatildeo de coacutedigo visto que AIC sendo substituiacutedo por expressotildees lambda dentro dascondiccedilotildees determinadas eacute a maneira mais comum de se identificar refatoraccedilatildeo de coacute-digo para introduccedilatildeo de expressotildees lambda [12] Os projetos que compotildeem o grupo 2representam 44 de todos os projetos estudados que possuem expressotildees lambda o quepode ser um indicativo caso a hipoacutetese de refatoraccedilatildeo de coacutedigo seja positiva de quemuitos projetos que estatildeo adotando o Java 8 estatildeo se preocupando de alguma formacom refatoraccedilatildeo se coacutedigo Fazem parte desse grupo os seguintes projetos elasticsearchjava-design-patterns PocketHub presto RxJava-Android-Samples spark vertx zipkinjava8-tutorial dropwizard e material-dialogs

39

Outra maneira de verificar possiacuteveis indicadores de refatoraccedilatildeo de coacutedigo foi atraveacutesda anaacutelise dos tamanhos (em quantidade de linhas de coacutedigo) dos meacutetodos com expressotildeeslambda no mecircs em que se introduziu expressotildees lambda e um mecircs imediatamente antesdeste Essa anaacutelise mostra que dos 25 projetos com expressotildees lambda 12 (48) projetostiveram ao menos um meacutetodo em que houve uma diminuiccedilatildeo no tamanho o que podeser considerado um indicativo de refatoraccedilatildeo de coacutedigo A Figura 57 mostra todos osprojetos em relaccedilatildeo agrave quantidade total de meacutetodos que possuem lambda no primeiro mecircsde introduccedilatildeo do mesmo em vermelho comparado com a quantidade desses meacutetodos quetiveram uma diminuiccedilatildeo no tamanho quando comparados com o coacutedigo do mecircs anteriorem azul

Figura 57 Comparaccedilatildeo entre todos os projetos com expressatildeo lambda sobre refatoraccedilatildeode coacutedigo no mecircs de introduccedilatildeo da caracteriacutestica

Ainda observando a figura 57 com relaccedilatildeo aos projetos que natildeo tiveram nenhummeacutetodo com diminuiccedilatildeo de tamanho (barra azul) percebe-se que todos os 13 projetossequer tiveram uma quantidade significativa de meacutetodos que possuem expressotildees lambda(com o maior tendo apenas 5 meacutetodos) no mecircs de introduccedilatildeo da caracteriacutestica no projetoe ao mesmo tempo jaacute existiam no mecircs em que natildeo existia lambda no projeto Essa eacuteuma observaccedilatildeo importante porque projetos como vertx sendo este o que possui a maiormeacutedia de lambdasnapshot de todos os projetos e ao mesmo tempo tendo apenas trecircsmeacutetodos que continham expressotildees lambda no mecircs da introduccedilatildeo e que existiam no mecircs

40

anterior permitem inferir que todas as outras expressotildees lambda existentes no projetopara este determinado mecircs de introduccedilatildeo encontram-se em coacutedigo novo introduzido

Eacute importante ressaltar que somente essa anaacutelise natildeo eacute exclusivamente suficiente paradeterminar se estes projetos estatildeo realmente introduzindo lambda em coacutedigo novo ourealizando refatoraccedilatildeo uma vez que como a comparaccedilatildeo aconteceu apenas no mecircs deintroduccedilatildeo com o mecircs imediatamente anterior natildeo reflete todo o ciclo de vida do pro-jeto Por exemplo algumas equipes podem escolher refatorar o coacutedigo depois de umtempo de adaptaccedilatildeo apoacutes a transiccedilatildeo para a nova versatildeo da linguagem Assim paraobter uma melhor anaacutelise sobre refatoraccedilatildeo de coacutedigo ou natildeo feita nestes projetos aleacutemde outras anaacutelises referentes aos padrotildees tipicamente adotados para implementaccedilatildeo delambda nestes projetos seratildeo apresentados a seguir os estudos de caso dos cinco projetospreviamente selecionados

Outro ponto importante eacute o fato de que apesar das informaccedilotildees quanto agraves quantida-des de filter e map terem sido incluiacutedas inicialmente no trabalho para observar possiacuteveispadrotildees de refatoraccedilatildeo de coacutedigo percebeu-se que estas natildeo satildeo utilizadas de forma con-sideraacutevel pelos projetos estudados e para fins de anaacutelises generalizadas natildeo apresentaramtanta influecircncia na utilizaccedilatildeo de expressotildees lambda quanto a quantidade de AICs noprojeto

53 Estudos de Caso

Dentre os projetos analisados verificou-se que os projetos de pequeno e meacutedio porte op-taram por refatorar de uma vez seus coacutedigos para incluir expressotildees lambda em situaccedilotildeesem que se utilizava AICs anteriormente ou em alguns poucos casos de utilizaccedilatildeo deCollection Os projetos de grande porte natildeo apresentaram nenhuma refatoraccedilatildeo de coacute-digo ou uma refatoraccedilatildeo parcial gradativa provavelmente devido agrave grande quantidade dearquivos e coacutedigo que possuem o que pode tornar o trabalho de refatoraccedilatildeo extenso ecansativo

O projeto vertx que pertence ao grupo 2 dos projetos em que a quantidade de ex-pressotildees lambda aumentaram e as de AICs diminuiacuteram com lambda ultrapassando AICsexecutou inicialmente commits em maio de 2014 com adiccedilatildeo de coacutedigo novo utilizandoexpressotildees lambda e apoacutes um mecircs realizou um commit maior com a refatoraccedilatildeo de todasas AICs para expressotildees lambda Apoacutes a refatoraccedilatildeo o projeto se preocupou em mantera utilizaccedilatildeo de expressotildees lambda ao mesmo tempo que o uso de AICs se manteve apenasaos casos de classes com interfaces natildeo funcionais A Figura 58 apresenta uma parte docommit de refatoraccedilatildeo de coacutedigo que mostra em vermelho a parte eliminada do coacutedigo(AIC) e em verde o coacutedigo novo representando a substituiccedilatildeo por uma expressatildeo lambda

41

Figura 58 Commit de refatoraccedilatildeo de coacutedigo do projeto Vertx [3]

Alguns projetos ainda natildeo se preocuparam em refatorar o coacutedigo para o uso de ex-pressotildees lambda ateacute a data deste trabalho que eacute o caso do projeto guava que apresentouum commit em 03112016 com a atualizaccedilatildeo do projeto para Java 8 Mas a partir daatualizaccedilatildeo se preocupou em utilizar as expressotildees lambda apenas na implementaccedilatildeo decoacutedigo novo O cenaacuterio em que a refatoraccedilatildeo natildeo eacute prioridade ainda eacute a realidade de vaacuteriosprojetos de grande porte visto que os dados de projetos sem nenhuma expressatildeo lambdasatildeo o maior nuacutemero neste trabalho Poreacutem projetos que jaacute adotaram a utilizaccedilatildeo do Java8 tendem a mudar isso com o passar do tempo A Figura 59 apresenta em verde umaadiccedilatildeo de coacutedigo novo com expressatildeo lambda sem a eliminaccedilatildeo de algum coacutedigo anteriora esse que estaria em vermelho

42

Figura 59 Exemplo de um arquivo do commit de adiccedilatildeo de coacutedigo novo em Java 8 doprojeto Guava [4]

Na categoria de projetos em que os AICs e expressotildees lambda aumentam proporci-onalmente (grupo 1) o projeto agera realizou um commit em 19052016 com a adiccedilatildeoda biblioteca retrolambda como dependecircncia do projeto Essa biblioteca utilizada prin-cipalmente por projetos Android permite executar coacutedigo Java 8 contendo expressotildeeslambda em Java 5 6 e 7 [48] O commit tambeacutem apresenta refatoraccedilatildeo dos AICs ad-vindos de interfaces funcionais para expressotildees lambda Apesar de o projeto continuar autilizar as expressotildees lambda em seus commits posteriores o nuacutemero de AICs tambeacutemcontinuou a aumentar visualizando os commits posteriores notou-se que esses AICs satildeorelativos a interfaces natildeo funcionais ou seja que possuem mais de um meacutetodo O projetoAndroid-CleanArchitecture eacute similar ao agera pois tambeacutem optou pela instalaccedilatildeo da bi-blioteca retrolambda para uso de expressotildees lambda em seus coacutedigos e como tambeacutem eacuteum projeto de pequeno porte houve uma pequena refatoraccedilatildeo dos AICs A Figura 510mostra a parte do commit de refatoraccedilatildeo de coacutedigo em que o desenvolvedor adiciona abiblioteca retrolambda como dependecircncia

43

Figura 510 Commit de adiccedilatildeo da biblioteca Retrolambda no projeto Agera [5]

Outro caso interessante eacute o do projeto RxJava que em 2015 optou pela refatoraccedilatildeodo coacutedigo para a utilizaccedilatildeo de expressotildees lambda quase eliminando por completo o usode AICs mas que no ano seguinte reverteu os commits de forma que eliminasse comple-tamente o uso de expressotildees lambda para manter a retrocompatibilidade com o Java 6A Figura 511 demonstra uma parte do commit de reversatildeo do coacutedigo para Java 6 emque pode ser visto em vermelho o coacutedigo anterior com expressotildees lambda e o verde como novo coacutedigo utilizando AIC novamente

44

Figura 511 Commit de remoccedilatildeo de Lambdas e volta para o uso de AICs no projetoRXJava [6]

Essa preocupaccedilatildeo com retrocompatibilidade de coacutedigo pode ser um fator crucial nadecisatildeo das equipes de desenvolvimento na hora de decidir como fazer o software co-evoluircom a linguagem sem perder a compatibilidade com versotildees anteriores

45

Capiacutetulo 6

Consideraccedilotildees Finais

Este estudo permitiu entender melhor como projetos estatildeo realizando a migraccedilatildeo para oJava 8 em especial utilizando uma nova caracteriacutestica introduzida expressatildeo lambdaApesar de a maioria dos projetos populares considerados natildeo possuiacuterem nenhuma ocor-recircncia de expressotildees lambda os projetos que tinham expressotildees lambda foram suficientespara realizar um primeiro estudo de caracterizaccedilatildeo no uso desta caracteriacutestica e com osprojetos efetivamente utilizados para estudo foi possiacutevel agrupaacute-los quanto a maneira emque as expressotildees lambda estavam sendo utilizadas quando comparadas com AICs em 5grandes grupos quando AIC e lambda aumentam proporcionalmente quando AIC dimi-nui e lambda aumenta ultrapassando AIC quando AIC diminui mas continua superior aolambda crescente expressotildees lambda que foram introduzidas e retiradas completamentedo coacutedigo e expressotildees lambda que natildeo existem em quantidades expressivas

Foi possiacutevel entatildeo realizar um estudo aprofundado levando em consideraccedilatildeo as di-ferentes maneiras com que as expressotildees lambda foram adotadas nos projetos atraveacutes daescolha de um projeto que representasse cada grupo para anaacutelise Dentre os cinco projetosestudados foi possiacutevel observar alguns padrotildees tipicamente adotados por desenvolvedorespara implementar expressotildees lambda em seus projetos como a utilizaccedilatildeo da bibliotecas(retrolambda) que permitissem uma flexibilizaccedilatildeo na utilizaccedilatildeo de expressotildees lambda oucomo lambda eacute primariamente utilizada para substituir determinados AICs ou operaccedilotildeesem Collection

Aleacutem disso foi possiacutevel observar como a refatoraccedilatildeo de coacutedigo acontece em cada umdesses projetos Observou-se como projetos menores tendem a refatorar coacutedigo maisfacilmente ao passo que projetos maiores e mais complexos fazem menos refatoraccedilatildeo oudemoram mais entre o periacuteodo em que houve a primeira migraccedilatildeo de coacutedigo para a novaversatildeo da linguagem ateacute o periacuteodo em que realmente decidem refatorar coacutedigo Aleacutem dacomplexidade do projeto influenciar na decisatildeo de migrar o projeto para uma versatildeo maisrecente da linguagem a preocupaccedilatildeo com retrocompatibilidade com versotildees anteriores da

46

linguagem tambeacutem podem ser uma barreira para que projetos comecem a evoluir o coacutedigojuntamente com a evoluccedilatildeo da linguagem

Ainda assim foi possiacutevel observar que a preocupaccedilatildeo com a co-evoluccedilatildeo do software-linguagem existe entre os desenvolvedores de projetos mas a realizaccedilatildeo da migraccedilatildeo aindaacontece lentamente devido agrave diversos fatores que precisam ser levados em consideraccedilatildeopara a manutenccedilatildeo do projeto

Para trabalhos e contribuiccedilotildees futuras seria interessante desenvolver uma ferramentaque pudesse analisar diretamente no coacutedigo-fonte as oportunidades de aplicaccedilatildeo de ex-pressotildees lambda dessa forma poderiam ser analisadas as porcentagens de conversatildeo decoacutedigo para Java 8 e obter melhores conclusotildees sobre a importacircncia que os projetos estatildeodando para a evoluccedilatildeo de seus coacutedigos Outro fator interessante seria aplicar mais Visitorsagrave ferramenta static-analysis e fazer este mesmo estudo aplicado agrave outras caracteriacutesticasda linguagem

47

Referecircncias

[1] Kagdi Huzefa Michael L Collard e Jonathan I Maletic A survey and taxonomyof approaches for mining software repositories in the context of software evolution2007 ix 3 8 9 10 11

[2] DBeaver Dbeaver - features httpdbeaverjkissorgdocsfeatures ix 29

[3] Eclipse Vertx commit Java8-ify code httpsgithubcomeclipsevertxcommit93f95e9c77419f442a42fe711b6eeaef88192fd3 ix 42

[4] Google Guava commit Release java 8 changes to guava httpsgithubcomgoogleguavacommit73e382fa877f80994817a136b0adcc4365ccd904 ix 43

[5] Google Agera commit Collapsed testapp with retrolambda httpsgithubcomgoogleageracommit5e518b7b05f9e7a34a314945f68deff7b2c3e334 ix 44

[6] ReactiveX Rxjava commit 2x full jdk 6 compatible backport + includ-ing bugfixes up to today httpsgithubcomReactiveXRxJavacommit000a174d87a901135f9665d3b11f3627fd2dc4ed ix 45

[7] Godfrey M W e D M German The past present and future of software evolutionEm 2008 Frontiers of Maintenance paacuteginas 129ndash138 Sept 2008 1 6

[8] Favre J M Languages evolve too changing the software time scale Em Principles ofSoftware Evolution Eighth International Workshop on paacuteginas 33ndash42 IEEE 20051 5 7

[9] Overbey Jeffrey L e Ralph E Johnson Regrowing a language refactoring tools allowprogramming languages to evolve Em ACM SIGPLAN Notices volume 44 paacuteginas493ndash502 ACM 2009 1 5 7 8 12

[10] Grechanik Mark Collin McMillan Luca DeFerrari Marco Comi Stefano CrespiDenys Poshyvanyk Chen Fu Qing Xie e Carlo Ghezzi An empirical investiga-tion into a large-scale java open source code repository Em Proceedings of the2010 ACM-IEEE International Symposium on Empirical Software Engineering andMeasurement ESEM rsquo10 paacuteginas 111ndash1110 New York NY USA 2010 ACMISBN 978-1-4503-0039-1 httpdoiacmorg10114518527861852801 1

[11] TIOBE Tiobe httpswwwtiobecomtiobe-index 1 14

48

[12] Gyori Alex Lyle Franklin Danny Dig e Jan Lahoda Crossing the gap from im-perative to functional programming through refactoring Em Proceedings of the 20139th Joint Meeting on Foundations of Software Engineering ESECFSE 2013 paacute-ginas 543ndash553 New York NY USA 2013 ACM ISBN 978-1-4503-2237-9 httpdoiacmorg10114524914112491461 2 11 24 39

[13] OpenJDK State of the lambda httpcropenjdkjavanet~briangoetzlambdalambda-state-4html 2

[14] Han Jiawei Micheline Kamber e Jian Pei Data Mining Concepts and TechniquesMorgan Kaufmann Publishers Inc San Francisco CA USA 3rd ediccedilatildeo 2011ISBN 0123814790 9780123814791 3

[15] Fowler Martin e Kent Beck Refactoring improving the design of existing codeAddison-Wesley Professional 1999 5 7

[16] Lehman M M J F Ramil P D Wernick D E Perry e W M Turski Met-rics and laws of software evolution - the nineties view Em Proceedings of the4th International Symposium on Software Metrics METRICS rsquo97 paacuteginas 20ndashWashington DC USA 1997 IEEE Computer Society ISBN 0-8186-8093-8 httpdlacmorgcitationcfmid=823454823901 6

[17] Hassan Ahmed E e Tao Xie Software intelligence The future of mining softwareengineering data Em Proceedings of the FSESDP Workshop on Future of SoftwareEngineering Research FoSER rsquo10 paacuteginas 161ndash166 New York NY USA 2010ACM ISBN 978-1-4503-0427-6 httpdoiacmorg101145188236218823978 9

[18] Hassan Ahmed E The road ahead for mining software repositories Em Frontiers ofSoftware Maintenance 2008 FoSM 2008 paacuteginas 48ndash57 IEEE 2008 8

[19] Berry Michael J e Gordon Linoff Data Mining Techniques For Marketing Salesand Customer Support John Wiley amp Sons Inc New York NY USA 1997ISBN 0471179809 10

[20] Parnin Chris Christian Bird e Emerson Murphy-Hill Java generics adoption hownew features are introduced championed or ignored Em Proceedings of the 8thWorking Conference on Mining Software Repositories paacuteginas 3ndash12 ACM 2011 12

[21] Oracle The java language specification httpsdocsoraclecomjavasespecsjlsse8jls8pdf 13

[22] Oracle The history of java technology httpwwworaclecomtechnetworkjavajavaseoverviewjavahistory-index-198355html 13

[23] Murphy Kieron So why did they decide to call itjava httpwwwjavaworldcomarticle2077265core-javaso-why-did-they-decide-to-call-it-java-html 13

[24] McGraw Tata Object-oriented Programming with Java Essentials and ApplicationsHill Education 13

49

[25] Oracle Differences between java ee and java se httpdocsoraclecomjavaee6firstcupdocgkhoyhtml 13

[26] Lindsey Clark S The History of Java Cambridge 14

[27] Oracle The java language environment httpwwworaclecomtechnetworkjavaintro-141325html 14

[28] Oracle Jdk 8 httpopenjdkjavanetprojectsjdk8 15 24

[29] Oracle Enhancements in java se 8 httpdocsoraclecomjavase8docstechnotesguideslanguageenhancementshtmljavase8 15 16 17

[30] Oracle Lambda expressions httpdocsoraclecomjavasetutorialjavajavaOOlambdaexpressionshtml 16 18 21

[31] Oracle Method references httpdocsoraclecomjavasetutorialjavajavaOOmethodreferenceshtml 16

[32] Oracle Default methods httpdocsoraclecomjavasetutorialjavaIandIdefaultmethodshtml 17

[33] Oracle Repeating annotations httpdocsoraclecomjavasetutorialjavaannotationsrepeatinghtml 17

[34] Oracle Type annotations httpdocsoraclecomjavasetutorialjavaannotationstype_annotationshtml 17

[35] Oracle Anonymous inner classes httpsdocsoraclecomjavasetutorialjavajavaOOanonymousclasseshtml 19

[36] Kothari CR Research Methodology Methods and Techniques New Age Interna-tional (P) Limited 2004 ISBN 9788122415223 httpsbooksgooglecombrbooksid=8c6gkbKi-F4C 22

[37] Nakakoji Kumiyo Yasuhiro Yamamoto Yoshiyuki Nishinaka Kouichi Kishida eYunwen Ye Evolution patterns of open-source software systems and communitiesEm IWPSE rsquo02 Proceedings of the International Workshop on Principles of SoftwareEvolution paacuteginas 76ndash85 New York NY USA 2002 ACM Press ISBN 1581135459httpdxdoiorg101145512035512055 23

[38] Rahman Foyzur Christian Bird e Premkumar Devanbu Clones What is that smellEmpirical Software Engineering 17(4-5)503ndash530 2012 24

[39] Chacon Scott Pro Git Apress Berkely CA USA 1st ediccedilatildeo 2009ISBN 1430218339 9781430218333 25

[40] Cavalcanti Thiago Gomes e Viniacutecius Correa de Almeida Caracterizaccedilatildeo do uso deconstruccedilotildees da linguagem java em projetos open-source Publicaccedilatildeo online 2016httpbdmunbbrhandle1048315733 27

50

[41] Parr Terence Language Implementation Patterns Create Your Own Domain-Specific and General Programming Languages Pragmatic Bookshelf 1st ediccedilatildeo 2009ISBN 193435645X 9781934356456 27

[42] Janssen Thorben 5 reasons to use jpa hibernate Publicaccedilatildeo online httpswwwsitepointcom5-reasons-to-use-jpa-hibernate 27

[43] Franklin Lyle Alex Gyori Jan Lahoda e Danny Dig Lambdaficator From imperativeto functional programming through automated refactoring Em Proceedings of the2013 International Conference on Software Engineering ICSE rsquo13 paacuteginas 1287ndash1290 Piscataway NJ USA 2013 IEEE Press ISBN 978-1-4673-3076-3 httpdlacmorgcitationcfmid=24867882486986 29

[44] Google Agera httpsgithubcomgoogleagerawiki 34

[45] Eclipse Eclipse vertx httpvertxio 35

[46] Cejas Fernando Android cleanarchitecture httpsgithubcomandroid10Android-CleanArchitecture 36

[47] ReactiveX Rxjava httpsgithubcomReactiveXRxJava 37

[48] Luontola Esko Retrolambda httpsgithubcomorfjackalretrolambda 43

51

Anexo I

Projetos utilizados

fastjson

platform_frameworks_base

netty

material-dialogs

kotlin

okhttp

tinker

AndroidUtilCode

RxJava

spring-boot

java-design-patterns

elasticsearch

ExoPlayer

kafka

vertx

realm-java

guava

zipkin

bazel

stetho

Signal-Android

glide

agera

fresco

plaid

presto

libgdx

spark

52

disruptor

lottie-android

flexbox-layout

PocketHub

zxing

spring-framework

deeplearning4j

dropwizard

interviews

BaseRecyclerViewAdapterHelper

uCrop

DanmakuFlameMaster

lottie-react-native

android-UniversalMusicPlayer

AndroidInterview-Q-A

greenDAO

retrofit

MaterialDrawer

BottomBar

druid

MPAndroidChart

Hystrix

guice

recyclerview-animators

dubbo

androidannotations

RxJava-Android-Samples

PhotoView

clojure

CircleImageView

AndroidSwipeLayout

jedis

MaterialViewPager

butterknife

junit4

RxBinding

leakcanary

SimianArmy

picasso

UltimateRecyclerView

53

AndroidViewAnimations

AppIntro

FizzBuzzEnterpriseEdition

ion

cheesesquare

physical-web

RxAndroid

Android-CleanArchitecture

Calligraphy

Android-Bootstrap

iosched

Android_Data

MaterialDesignLibrary

ListViewAnimations

EventBus

java8-tutorial

AndroidSlidingUpPanel

dagger

okhttputils

logger

HomeMirror

Material-Animations

android-Ultra-Pull-To-Refresh

android-async-http

Android-ObservableScrollView

Android-Universal-Image-Loader

ActionBarSherlock

SlidingMenu

storm

PagerSlidingTabStrip

Android-PullToRefresh

54

  • Dedicatoacuteria
  • Agradecimentos
  • Resumo
  • Abstract
  • Introduccedilatildeo
    • Contexto
    • Objetivos
      • Objetivos Gerais
      • Objetivos Especiacuteficos
        • Metodologia
        • Organizaccedilatildeo do Trabalho
          • Evoluccedilatildeo e Mineraccedilatildeo de Repositoacuterios de Software
            • Evoluccedilatildeo de Software
            • MSR Mineraccedilatildeo de dados e a Engenharia de Software
              • Classificaccedilatildeo
                • Trabalhos Relacionados
                  • Java SE 8 e JDK 8
                    • Histoacuterico
                    • Princiacutepios
                    • Evoluccedilatildeo
                    • Expressotildees Lambda
                      • Sintaxe
                      • Principais formas de uso
                          • Estudo e o Processo de Mineraccedilatildeo
                            • Questotildees de Pesquisa
                            • Fonte de Dados e Objetos de Estudo
                            • Processo de Mineraccedilatildeo
                              • static-analysis
                              • BDAnalisador
                                • Classificaccedilatildeo e Anaacutelise
                                  • Meacutedia de Lambda
                                  • Anaacutelise Temporal
                                  • Refatoraccedilatildeo de Coacutedigo
                                  • Casos de Uso
                                      • Resultados Obtidos e Anaacutelise
                                        • Visatildeo Geral
                                          • Projetos Selecionados
                                          • agera
                                          • vertx
                                          • Android-CleanArchitecture
                                          • RxJava
                                          • guava
                                            • Refatoraccedilatildeo de Coacutedigo
                                            • Estudos de Caso
                                              • Consideraccedilotildees Finais
                                              • Referecircncias
                                              • Anexo
                                              • Projetos utilizados

coacutedigos-fonte Java e gerar arquivos de saiacuteda contendo informaccedilotildees de classes e meacutetodoscom suas devidas ocorrecircncias de caracteriacutesticas da linguagem [40]

A anaacutelise estaacutetica de coacutedigo consiste em analisar um coacutedigo-fonte sem a necessidadede executaacute-lo Esse tipo de anaacutelise eacute de extrema importacircncia para manter um coacutedigo dequalidade evitar futuras refatoraccedilotildees e obter informaccedilotildees estatiacutesticas de forma raacutepida epraacutetica [41]

Seguindo esse princiacutepio o static-analysis foi projetado para receber um arquivo deentrada csv seguindo o padratildeo

Tipo da Aplicaccedilatildeo Inicio do projeto Antes ou Apoacutes Java 5 Nome do ProjetoVersatildeo Caminho absolutoQuantidade de linhas de coacutedigo

Atraveacutes da informaccedilatildeo do caminho absoluto do projeto o static-analysis varre osdiretoacuterios em busca dos arquivos fonte java realiza o parse desses arquivos e utilizade Visitors para extrair as informaccedilotildees desejadas e exporta-las em arquivos csv Ouso de Visitors permite que sejam escolhidas as informaccedilotildees desejadas para a consultacomo expressotildees Lambda e AIC s aleacutem de possibilitar que sejam implementados novosVisitors conforme a linguagem evolua ou as necessidades mudem

Para este trabalho foram utilizados os Visitors de expressotildees Lambda map() filter()AICs e declaraccedilotildees de meacutetodos

432 BDAnalisador

Apoacutes obter todas as informaccedilotildees necessaacuterias geradas pelo static-analysis era preciso ma-nipular os dados de forma que facilitasse a coleta de dados para o estudo proposto Comovaacuterios arquivos em formato csv satildeo de difiacutecil manipulaccedilatildeo foi desenvolvido entatildeo umaferramenta chamada BDAnalisador Esta ferramenta eacute responsaacutevel por processar os arqui-vos em csv gerados pelo static-analysis e popular uma base de dados relacional MySQLcom as informaccedilotildees pertinentes a este estudo

O BDAnalisador foi desenvolvido com a intenccedilatildeo de tornar mais simples o trabalhocom os dados resultantes do static-analysis de forma que consultas em SQL pudessemser feitas a ponto de permitir a obtenccedilatildeo de resultados mais complexos Seguindo esseobjetivo o framework Hibernate foi escolhido como ferramenta para persistecircncia devidoa ser um framework jaacute consolidado no mercado e que de forma simples relaciona osobjetos Java ao banco de dados MySQL [42] A divisatildeo de classes foi projetada em quatroentidades Projeto Versao Classe e Metodo cada uma com seus respectivos camposcontendo as informaccedilotildees necessaacuterias para a pesquisa como pode ser visto na Figura 44Eacute importante ressaltar que a tabela de Versao guarda hashs de commits devido agrave escolhade utilizar commits para obter mais informaccedilatildeo de evoluccedilatildeo de coacutedigo em um menor

27

espaccedilo de tempo Aleacutem disso para este trabalho optou-se por persistir todos os meacutetodose classes de cada versatildeo sem se importar com a repeticcedilatildeo desses dados pois a hipoacutetesede haver grandes refatoraccedilotildees entre versotildees poderia comprometer a confiabilidade dasinformaccedilotildees

Figura 43 Diagrama de classes UML do BDAnalisador

Como visto na Figura 43 seguindo parcialmente a arquitetura MVC cada entidadepossui sua respectiva classe DAO(Data Access Object) para persistecircncia dos dados eapenas uma classe Controlador no projeto responsaacutevel pela manipulaccedilatildeo e parse dosdados dos arquivos csv gerados pelo static analysis para serem enviados agraves classes DAOO sistema inicia chamando o meacutetodo inicializar() da classe Controlador Esse meacutetodoeacute responsaacutevel por ler um arquivo de entrada csv que segue o mesmo modelo do arquivo dostatic-analysis citado na seccedilatildeo anterior O arquivo conteacutem os dados de todos os projetose suas respectivas versotildees dessa forma o meacutetodo instancia um objeto da classe Projetoe persiste o projeto no banco de dados Para cada versatildeo encontrada no arquivo deentrada o inicializar() aciona os meacutetodos responsaacuteveis por instanciar e preencher aslistas da classe Classe e Metodo Os meacutetodos responsaacuteveis por preencher as listas varremos arquivos csv gerados pelo static-analysis e fazem o parse das informaccedilotildees relevantescomo nomes dos meacutetodos e quantidades de lambdas para construir os objetos que seratildeogravados Ao final dos preenchimentos o objeto Versatildeo eacute instanciado e gravado no bancode dados atraveacutes de sua classe DAO ao mesmo tempo que grava suas respectivas Classese Metodos

28

Apoacutes vaacuterios testes e correccedilotildees de bugs o banco de dados se encontrava finalmente comas informaccedilotildees de 99 projetos Java open-source separados por um commit por mecircs desde2013 cada um com suas respectivas informaccedilotildees de classes meacutetodos e a quantidade deexpressotildees lambda filters e maps em cada meacutetodo Filter ou Filter pattern eacute o padratildeode projeto que tem como objetivo filtrar objetos de uma coleccedilatildeo (Collection) de acordocom algum criteacuterio Jaacute o map ou map pattern eacute um padratildeo que ldquomapeia os elementosde uma coleccedilatildeo aplicando uma funccedilatildeo a eles para uma nova coleccedilatildeo [43] A coleta deinformaccedilotildees sobre esses padrotildees podem ser uacuteteis para possiacuteveis anaacutelises de oportunidadesde uso de expressotildees lambda para refatoraccedilatildeo de coacutedigo

A Figura 44 mostra o esquema de como o banco de dados resultante foi gerado

Figura 44 Modelo relacional do banco de dados populado pelo BDAnalisador Imagemgerada com software DBeaver [2]

44 Classificaccedilatildeo e Anaacutelise

Com o banco de dados populado restam apenas as etapas de classificaccedilatildeo e anaacutelise pararesponder as questotildees de pesquisa propostas Para isso inicialmente houve uma tentativade se utilizar apenas queries SQL para analisar os dados de acordo com as informaccedilotildeesrelevantes Poreacutem devido ao fato de o banco de dados conter todas as informaccedilotildees detodos os projetos e todas as suas versotildees queries que possuem uma alta complexidadedemoravam muito tempo para retornar os dados

Assim com o objetivo de facilitar o trabalho alguns scripts python foram desenvolvi-dos para rodar as queries separadamente e individualmente para cada projeto de formaautomatizada a fim de melhorar o tempo de resposta para obtenccedilatildeo dos resultados

29

441 Meacutedia de Lambda

O primeiro script retorna a quantidade de expressotildees lambda (ou AICs) por n snapshotsque contenha expressotildees lambda O objetivo eacute ter uma visatildeo geral da meacutedia de expressotildeeslambda e AICs utilizadas por cada projeto e como nem todos os snapshots coletados decada projeto possuem expressotildees lambda e AICs apenas aqueles com alguma expressatildeolambda ou AIC satildeo incluiacutedos no caacutelculo da meacutedia

Mmedia =sumn qtdLambdai

n

442 Anaacutelise Temporal

O segundo script retorna para cada projeto a soma total da quantidade de expressotildeeslambda AIC map() e filter() no projeto inteiro para cada versatildeo Ou seja tem-seo total de cada uma das quatro propriedades selecionadas para cada mecircs do projetoobtendo assim uma visatildeo temporal de evoluccedilatildeo do uso das caracteriacutesticas descritas ATabela 41 ilustra parcialmente o resultado obtido para o projeto agera onde idVersaoeacute o identificador no banco de dados referente ao hash do commit mensal coletado qtd eacutea quantidade de cada uma das caracteriacutesticas escolhidas e a data do commit encontra-seno formato americano

Tabela 41 Informaccedilotildees mensais sobre o projeto ageraidVersao Data do Commit qtd lambda qtd AIC qtd maps qtd filter

823 512016 0 29 4 0755 612016 13 28 4 0686 6152016 13 29 4 0621 812016 13 29 4 0555 8162016 13 30 4 0485 922016 13 30 4 0422 10132016 14 30 4 0356 11282016 14 30 4 0295 12212016 21 30 5 0232 212017 21 30 5 0175 312017 21 30 5 0112 3312017 21 36 5 048 4242017 21 48 5 0

Os resultados obtidos com esta anaacutelise temporal permitiu a identificaccedilatildeo de padrotildees nautilizaccedilatildeo de expressotildees lambda em relaccedilatildeo a utilizaccedilatildeo de AIC por todos os projetos Foi

30

possiacutevel classificar todos os projetos em 6 grupos ilustrado na Figura 45 Primeiramenteseparou-se os projetos entre os que possuem expressotildees lambda e os que natildeo possuemDentre os que possuem identificou-se cinco categorias

1 Grupo 1 Quantidade de AICs e expressotildees lambda aumentam com o tempo pro-porcionalmente

2 Grupo 2 Quantidade de AICs diminui agrave medida que a quantidade de expressotildeeslambda aumentam e a quantidade de expressotildees lambda ultrapassa a quantidade deAIC em um determinado momento

3 Grupo 3 Quantidade de AICs diminui agrave medida que a quantidade de expressotildeeslambda aumentam mas a quantidade de AIC permanece superior agrave quantidade delambda

4 Grupo 4 Expressotildees lambda satildeo introduzidas e existem por um pequeno periacuteodode tempo mas satildeo completamente removidas posteriormente

5 Grupo 5 Quantidade de expressotildees lambda eacute constante e muito inferior compa-rado com a quantidade de AICs no projeto Foi determinado que para pertencera esta classificaccedilatildeo o projeto precisa ter uma razatildeo de meacutedia de expressotildees lamb-dasnapshot por meacutedia de AICsnapshot inferior a 020 Esse paracircmetro foi esta-belecido com o objetivo de definir um padratildeo para o que pode ser considerado umprojeto com poucas expressotildees lambda

Figura 45 Classificaccedilatildeo dos projetos

31

443 Refatoraccedilatildeo de Coacutedigo

O uacuteltimo script teve como objetivo realizar uma tentativa inicial de identificar refatoraccedilatildeode coacutedigo da seguinte maneira para todos os projetos que possuem expressotildees lambdaforam identificados o mecircs imediatamente antes da introduccedilatildeo de expressotildees lambda e omecircs seguinte onde houve a primeira ocorrecircncia de lambda no projeto Assim realizou-se uma anaacutelise do tamanho em quantidade de linhas de coacutedigo de todos os meacutetodosdo projeto que no mecircs seguinte tiveram introduccedilatildeo de lambda Em seguida fez-se umacomparaccedilatildeo com os mesmos meacutetodos em relaccedilatildeo ao mecircs anterior e assim foi possiacuteveldetectar quais meacutetodos tiveram a quantidade de linhas de coacutedigo reduzidas o que seriaum indicativo natildeo necessariamente exclusivo de que uma refatoraccedilatildeo de coacutedigo possa terocorrido

Sabe-se que este meacutetodo de detecccedilatildeo de refatoraccedilatildeo de coacutedigo possui suas limitaccedilotildeesuma vez que as comparaccedilotildees para saber se um meacutetodo existe em ambas versotildees eacute feitopuramente por comparaccedilatildeo de String (nome do meacutetodo) e a classe que este pertence

444 Casos de Uso

Os meacutetodos descritos acima ajudaram a identificar alguns padrotildees e facilitar a anaacutelise dosdados Poreacutem natildeo satildeo suficientes para que se possa responder agraves questotildees de pesquisaDessa forma apoacutes a identificaccedilatildeo dos grupos de classificaccedilatildeo para os projetos foramescolhidos um projeto de cada grupo (com exceccedilatildeo do grupo dos projetos sem expressotildeeslambda) para realizar um breve estudo de caso com o objetivo de identificar e caracterizarmelhor a adoccedilatildeo de expressotildees lambda Os projetos escolhidos foram agera vertxAndroid-CleanArchitecture RxJava e guava

32

Capiacutetulo 5

Resultados Obtidos e Anaacutelise

Neste capiacutetulo seratildeo apresentados os dados obtidos e anaacutelise com o objetivo de responderagraves questotildees de pesquisa propostas Como mencionado anteriormente as perguntas seratildeorespondidas de duas maneiras algumas com informaccedilotildees gerais sobre todos os projetose outras com breve estudos de caso envolvendo cinco projetos

51 Visatildeo Geral

Dentre os repositoacuterios coletados para a anaacutelise 74 (7474) natildeo utilizaram nenhumaexpressatildeo lambda no projeto durante todo o periacuteodo analisado (Janeiro de 2013 a Abrilde 2017) restando apenas 25 repositoacuterios (2525) com expressotildees lambda Eacute interessantedestacar que apesar de a quantidade de repositoacuterios que natildeo possuem expressotildees lambdaser relativamente expressiva muitos destes repositoacuterios satildeo de projetos em Java que umdia foram populares e atualmente natildeo estatildeo sendo mais desenvolvidos (por exemplo umaplicativo que soacute funciona para Android 23 atualmente descontinuado)

Levando em consideraccedilatildeo apenas os projetos que possuem expressotildees lambda exis-tem dois tipos de dados que podem ser analisados para responder agrave primeira questatildeo depesquisa atraveacutes dos dados obtidos pelo meacutetodo anteriormente mencionado como anaacutelisetemporal e a meacutedia de lambda por snapshot mencionados no capiacutetulo anterior

Com relaccedilatildeo ao ano em que a primeira ocorrecircncia foi encontrada 6 projetos introduzi-ram expressotildees lambda jaacute em 2014 8 comeccedilaram a utilizar em 2015 7 em 2016 e apenas4 tiveram a primeira ocorrecircncia de expressotildees lambda em 2017 Dessa forma percebe-seque os projetos estatildeo relativamente bem distribuiacutedos em grupos quanto ao ano em que seintroduziu expressotildees lambda

Pela meacutedia de lambda por snapshot (lambdasnapshot) a maioria (11 projetos) possuiuma quantidade expressiva acima de 100 lambdasnapshot (com 6 projetos entre 20 e 100lambdasnapshot e 8 projetos com menos de 20 lambdasnapshot) como apresentados no

33

graacutefico da Figura 51 Isso mostra que essa nova caracteriacutestica jaacute estaacute sendo bem utilizadanos projetos que comeccedilaram a migrar para a nova versatildeo do Java

Figura 51 Graacuteficos dos projetos separados por ano de introduccedilatildeo de expressotildees lambdae meacutedia de lambda por snapshot

Com isso pode-se observar que apesar de a quantidade de projetos que possuemexpressotildees lambda natildeo ser tatildeo alta eacute possiacutevel obter resultados expressivos uma vez quea quantidade dos projetos com lambda estatildeo bem dispersos quanto ao periacuteodo em quecomeccedilaram a adotar essa caracteriacutestica e a quantidade de expressotildees lambda por snapshot

511 Projetos Selecionados

Atraveacutes dos grupos de classificaccedilatildeo identificados pela anaacutelise temporal descritos na Figura45 cinco projetos foram selecionados para uma anaacutelise detalhada levando em consideraccedilatildeoo grupo em que eles pertencem Estes projetos seratildeo apresentados a seguir

512 agera

Agera eacute uma biblioteca Android que ajuda a introduzir programaccedilatildeo funcional reativa(functional reactive programming) em projetos Android Eacute um projeto recente lanccediladoem 2016 pela Google [44] e encontra-se no grupo dos projetos que introduziram expressotildeeslambda em 2016 no mesmo ano de seu lanccedilamento contendo uma meacutedia de expressotildeeslambda de 16 lambdasnapshot

Na classificaccedilatildeo estabelecida agera pertence ao Grupo 1 onde a quantidade de ex-pressotildees lambda no projeto com o tempo aumentam juntamente com a quantidade deAICs como mostra o graacutefico de anaacutelise temporal na Figura 52

34

Figura 52 Graacuteficos de anaacutelise temporal do projeto agera

513 vertx

Eclipse Vertx eacute um conjunto de ferramentas para criaccedilatildeo de reactive applications namaacutequina virtual Java (JVM) em grande escala [45] Seu primeiro lanccedilamento aconteceuem 2011 e a primeira ocorrecircncia de expressotildees lambda no projeto aconteceu em 2014 Esteprojeto possui uma meacutedia de 2867 lambdasnapshot e dentre os projetos consideradosneste trabalho eacute o que possui a maior quantidade de expressotildees lambda

Este projeto pertence ao Grupo 2 onde a quantidade de expressotildees lambda aumen-tou consideravelmente pelos meses ultrapassando a quantidade de AICs que diminuiudrasticamente como mostra a Figura 53

35

Figura 53 Graacuteficos de anaacutelise temporal do projeto Vertx

514 Android-CleanArchitecture

Apesar de ser uma amostra de projeto Android-CleanArchitecture que tem como objetivoconstruir aplicaccedilotildees Android utilizando clean architecture foi lanccedilado em 2014 mas semanteacutem sempre atualizado [46]

A introduccedilatildeo de expressotildees lambda que aconteceu no ano de 2015 se deu de formatiacutemida com uma meacutedia de 35 lambdasnapshot De qualquer forma este projeto conseguerepresentar com seu graacutefico de anaacutelise temporal o grupo 3 composto por projetos em quea quantidade de expressotildees lambda aumentou mas sem ultrapassar AICs que diminuiacuteramdemonstrado no graacutefico da Figura 54

36

Figura 54 Graacuteficos de anaacutelise temporal do projeto Android-CleanArchitecture

515 RxJava

Dentre os repositoacuterios estudados RxJava eacute considerado o mais popular Como umaimplementaccedilatildeo de Reactive Extensions para a JVM RxJava teve seu lanccedilamento dadoem 2013 [47] Expressotildees lambda apareceram pela primeira vez no ano de 2015 comuma meacutedia de 766 lambdasnapshot

Apesar de uma meacutedia relativamente alta o tempo de vida das expressotildees lambda nesteprojeto foi bem curto caracterizando assim projetos do grupo 4 houve a introduccedilatildeo dasexpressotildees lambda no projeto poreacutem houve a remoccedilatildeo completa de todas as expressotildeeslambda previamente introduzidas desaparecendo completamente do projeto ateacute a datada coleta de dados (Figura 55)

37

Figura 55 Graacuteficos de anaacutelise temporal do projeto RxJava

516 guava

Guava eacute um conjunto de bibliotecas para Java da Google lanccedilado em 2011 A atualizaccedilatildeodo coacutedigo do projeto para Java 8 aconteceu somente em 2016 e apesar do projeto conteruma meacutedia de 281 lambdasnapshot ele foi escolhido como representante dos projetosdo Grupo 5 (Figura 56) que possuem expressotildees lambda mas de forma natildeo expressiva osuficiente quando comparado com a quantidade de AIC pelo fato de sua razatildeo de meacutedia delambdasnapshot por meacutedia de AICsnapshot ser 004 Ou seja embora o projeto tenhaexpressotildees lambda estas satildeo consideradas muito poucas quando inseridas no contextogeral deste projeto que eacute considerado um projeto grande

38

Figura 56 Graacuteficos de anaacutelise temporal do projeto Guava

52 Refatoraccedilatildeo de Coacutedigo

Com o objetivo de caracterizar melhor como as expressotildees lambda estatildeo sendo utilizadaseacute interessante identificar se estas estatildeo sendo introduzidas atraveacutes de refatoraccedilatildeo de coacutedigoou em coacutedigo novo

Os projetos classificados como pertencentes ao Grupo 2 possuem em comum o fatode expressotildees lambda aumentarem a medida que AICs diminuem ultrapassando-as eessa caracteriacutestica em comum pode indicar que nestes projetos possivelmente houve re-fatoraccedilatildeo de coacutedigo visto que AIC sendo substituiacutedo por expressotildees lambda dentro dascondiccedilotildees determinadas eacute a maneira mais comum de se identificar refatoraccedilatildeo de coacute-digo para introduccedilatildeo de expressotildees lambda [12] Os projetos que compotildeem o grupo 2representam 44 de todos os projetos estudados que possuem expressotildees lambda o quepode ser um indicativo caso a hipoacutetese de refatoraccedilatildeo de coacutedigo seja positiva de quemuitos projetos que estatildeo adotando o Java 8 estatildeo se preocupando de alguma formacom refatoraccedilatildeo se coacutedigo Fazem parte desse grupo os seguintes projetos elasticsearchjava-design-patterns PocketHub presto RxJava-Android-Samples spark vertx zipkinjava8-tutorial dropwizard e material-dialogs

39

Outra maneira de verificar possiacuteveis indicadores de refatoraccedilatildeo de coacutedigo foi atraveacutesda anaacutelise dos tamanhos (em quantidade de linhas de coacutedigo) dos meacutetodos com expressotildeeslambda no mecircs em que se introduziu expressotildees lambda e um mecircs imediatamente antesdeste Essa anaacutelise mostra que dos 25 projetos com expressotildees lambda 12 (48) projetostiveram ao menos um meacutetodo em que houve uma diminuiccedilatildeo no tamanho o que podeser considerado um indicativo de refatoraccedilatildeo de coacutedigo A Figura 57 mostra todos osprojetos em relaccedilatildeo agrave quantidade total de meacutetodos que possuem lambda no primeiro mecircsde introduccedilatildeo do mesmo em vermelho comparado com a quantidade desses meacutetodos quetiveram uma diminuiccedilatildeo no tamanho quando comparados com o coacutedigo do mecircs anteriorem azul

Figura 57 Comparaccedilatildeo entre todos os projetos com expressatildeo lambda sobre refatoraccedilatildeode coacutedigo no mecircs de introduccedilatildeo da caracteriacutestica

Ainda observando a figura 57 com relaccedilatildeo aos projetos que natildeo tiveram nenhummeacutetodo com diminuiccedilatildeo de tamanho (barra azul) percebe-se que todos os 13 projetossequer tiveram uma quantidade significativa de meacutetodos que possuem expressotildees lambda(com o maior tendo apenas 5 meacutetodos) no mecircs de introduccedilatildeo da caracteriacutestica no projetoe ao mesmo tempo jaacute existiam no mecircs em que natildeo existia lambda no projeto Essa eacuteuma observaccedilatildeo importante porque projetos como vertx sendo este o que possui a maiormeacutedia de lambdasnapshot de todos os projetos e ao mesmo tempo tendo apenas trecircsmeacutetodos que continham expressotildees lambda no mecircs da introduccedilatildeo e que existiam no mecircs

40

anterior permitem inferir que todas as outras expressotildees lambda existentes no projetopara este determinado mecircs de introduccedilatildeo encontram-se em coacutedigo novo introduzido

Eacute importante ressaltar que somente essa anaacutelise natildeo eacute exclusivamente suficiente paradeterminar se estes projetos estatildeo realmente introduzindo lambda em coacutedigo novo ourealizando refatoraccedilatildeo uma vez que como a comparaccedilatildeo aconteceu apenas no mecircs deintroduccedilatildeo com o mecircs imediatamente anterior natildeo reflete todo o ciclo de vida do pro-jeto Por exemplo algumas equipes podem escolher refatorar o coacutedigo depois de umtempo de adaptaccedilatildeo apoacutes a transiccedilatildeo para a nova versatildeo da linguagem Assim paraobter uma melhor anaacutelise sobre refatoraccedilatildeo de coacutedigo ou natildeo feita nestes projetos aleacutemde outras anaacutelises referentes aos padrotildees tipicamente adotados para implementaccedilatildeo delambda nestes projetos seratildeo apresentados a seguir os estudos de caso dos cinco projetospreviamente selecionados

Outro ponto importante eacute o fato de que apesar das informaccedilotildees quanto agraves quantida-des de filter e map terem sido incluiacutedas inicialmente no trabalho para observar possiacuteveispadrotildees de refatoraccedilatildeo de coacutedigo percebeu-se que estas natildeo satildeo utilizadas de forma con-sideraacutevel pelos projetos estudados e para fins de anaacutelises generalizadas natildeo apresentaramtanta influecircncia na utilizaccedilatildeo de expressotildees lambda quanto a quantidade de AICs noprojeto

53 Estudos de Caso

Dentre os projetos analisados verificou-se que os projetos de pequeno e meacutedio porte op-taram por refatorar de uma vez seus coacutedigos para incluir expressotildees lambda em situaccedilotildeesem que se utilizava AICs anteriormente ou em alguns poucos casos de utilizaccedilatildeo deCollection Os projetos de grande porte natildeo apresentaram nenhuma refatoraccedilatildeo de coacute-digo ou uma refatoraccedilatildeo parcial gradativa provavelmente devido agrave grande quantidade dearquivos e coacutedigo que possuem o que pode tornar o trabalho de refatoraccedilatildeo extenso ecansativo

O projeto vertx que pertence ao grupo 2 dos projetos em que a quantidade de ex-pressotildees lambda aumentaram e as de AICs diminuiacuteram com lambda ultrapassando AICsexecutou inicialmente commits em maio de 2014 com adiccedilatildeo de coacutedigo novo utilizandoexpressotildees lambda e apoacutes um mecircs realizou um commit maior com a refatoraccedilatildeo de todasas AICs para expressotildees lambda Apoacutes a refatoraccedilatildeo o projeto se preocupou em mantera utilizaccedilatildeo de expressotildees lambda ao mesmo tempo que o uso de AICs se manteve apenasaos casos de classes com interfaces natildeo funcionais A Figura 58 apresenta uma parte docommit de refatoraccedilatildeo de coacutedigo que mostra em vermelho a parte eliminada do coacutedigo(AIC) e em verde o coacutedigo novo representando a substituiccedilatildeo por uma expressatildeo lambda

41

Figura 58 Commit de refatoraccedilatildeo de coacutedigo do projeto Vertx [3]

Alguns projetos ainda natildeo se preocuparam em refatorar o coacutedigo para o uso de ex-pressotildees lambda ateacute a data deste trabalho que eacute o caso do projeto guava que apresentouum commit em 03112016 com a atualizaccedilatildeo do projeto para Java 8 Mas a partir daatualizaccedilatildeo se preocupou em utilizar as expressotildees lambda apenas na implementaccedilatildeo decoacutedigo novo O cenaacuterio em que a refatoraccedilatildeo natildeo eacute prioridade ainda eacute a realidade de vaacuteriosprojetos de grande porte visto que os dados de projetos sem nenhuma expressatildeo lambdasatildeo o maior nuacutemero neste trabalho Poreacutem projetos que jaacute adotaram a utilizaccedilatildeo do Java8 tendem a mudar isso com o passar do tempo A Figura 59 apresenta em verde umaadiccedilatildeo de coacutedigo novo com expressatildeo lambda sem a eliminaccedilatildeo de algum coacutedigo anteriora esse que estaria em vermelho

42

Figura 59 Exemplo de um arquivo do commit de adiccedilatildeo de coacutedigo novo em Java 8 doprojeto Guava [4]

Na categoria de projetos em que os AICs e expressotildees lambda aumentam proporci-onalmente (grupo 1) o projeto agera realizou um commit em 19052016 com a adiccedilatildeoda biblioteca retrolambda como dependecircncia do projeto Essa biblioteca utilizada prin-cipalmente por projetos Android permite executar coacutedigo Java 8 contendo expressotildeeslambda em Java 5 6 e 7 [48] O commit tambeacutem apresenta refatoraccedilatildeo dos AICs ad-vindos de interfaces funcionais para expressotildees lambda Apesar de o projeto continuar autilizar as expressotildees lambda em seus commits posteriores o nuacutemero de AICs tambeacutemcontinuou a aumentar visualizando os commits posteriores notou-se que esses AICs satildeorelativos a interfaces natildeo funcionais ou seja que possuem mais de um meacutetodo O projetoAndroid-CleanArchitecture eacute similar ao agera pois tambeacutem optou pela instalaccedilatildeo da bi-blioteca retrolambda para uso de expressotildees lambda em seus coacutedigos e como tambeacutem eacuteum projeto de pequeno porte houve uma pequena refatoraccedilatildeo dos AICs A Figura 510mostra a parte do commit de refatoraccedilatildeo de coacutedigo em que o desenvolvedor adiciona abiblioteca retrolambda como dependecircncia

43

Figura 510 Commit de adiccedilatildeo da biblioteca Retrolambda no projeto Agera [5]

Outro caso interessante eacute o do projeto RxJava que em 2015 optou pela refatoraccedilatildeodo coacutedigo para a utilizaccedilatildeo de expressotildees lambda quase eliminando por completo o usode AICs mas que no ano seguinte reverteu os commits de forma que eliminasse comple-tamente o uso de expressotildees lambda para manter a retrocompatibilidade com o Java 6A Figura 511 demonstra uma parte do commit de reversatildeo do coacutedigo para Java 6 emque pode ser visto em vermelho o coacutedigo anterior com expressotildees lambda e o verde como novo coacutedigo utilizando AIC novamente

44

Figura 511 Commit de remoccedilatildeo de Lambdas e volta para o uso de AICs no projetoRXJava [6]

Essa preocupaccedilatildeo com retrocompatibilidade de coacutedigo pode ser um fator crucial nadecisatildeo das equipes de desenvolvimento na hora de decidir como fazer o software co-evoluircom a linguagem sem perder a compatibilidade com versotildees anteriores

45

Capiacutetulo 6

Consideraccedilotildees Finais

Este estudo permitiu entender melhor como projetos estatildeo realizando a migraccedilatildeo para oJava 8 em especial utilizando uma nova caracteriacutestica introduzida expressatildeo lambdaApesar de a maioria dos projetos populares considerados natildeo possuiacuterem nenhuma ocor-recircncia de expressotildees lambda os projetos que tinham expressotildees lambda foram suficientespara realizar um primeiro estudo de caracterizaccedilatildeo no uso desta caracteriacutestica e com osprojetos efetivamente utilizados para estudo foi possiacutevel agrupaacute-los quanto a maneira emque as expressotildees lambda estavam sendo utilizadas quando comparadas com AICs em 5grandes grupos quando AIC e lambda aumentam proporcionalmente quando AIC dimi-nui e lambda aumenta ultrapassando AIC quando AIC diminui mas continua superior aolambda crescente expressotildees lambda que foram introduzidas e retiradas completamentedo coacutedigo e expressotildees lambda que natildeo existem em quantidades expressivas

Foi possiacutevel entatildeo realizar um estudo aprofundado levando em consideraccedilatildeo as di-ferentes maneiras com que as expressotildees lambda foram adotadas nos projetos atraveacutes daescolha de um projeto que representasse cada grupo para anaacutelise Dentre os cinco projetosestudados foi possiacutevel observar alguns padrotildees tipicamente adotados por desenvolvedorespara implementar expressotildees lambda em seus projetos como a utilizaccedilatildeo da bibliotecas(retrolambda) que permitissem uma flexibilizaccedilatildeo na utilizaccedilatildeo de expressotildees lambda oucomo lambda eacute primariamente utilizada para substituir determinados AICs ou operaccedilotildeesem Collection

Aleacutem disso foi possiacutevel observar como a refatoraccedilatildeo de coacutedigo acontece em cada umdesses projetos Observou-se como projetos menores tendem a refatorar coacutedigo maisfacilmente ao passo que projetos maiores e mais complexos fazem menos refatoraccedilatildeo oudemoram mais entre o periacuteodo em que houve a primeira migraccedilatildeo de coacutedigo para a novaversatildeo da linguagem ateacute o periacuteodo em que realmente decidem refatorar coacutedigo Aleacutem dacomplexidade do projeto influenciar na decisatildeo de migrar o projeto para uma versatildeo maisrecente da linguagem a preocupaccedilatildeo com retrocompatibilidade com versotildees anteriores da

46

linguagem tambeacutem podem ser uma barreira para que projetos comecem a evoluir o coacutedigojuntamente com a evoluccedilatildeo da linguagem

Ainda assim foi possiacutevel observar que a preocupaccedilatildeo com a co-evoluccedilatildeo do software-linguagem existe entre os desenvolvedores de projetos mas a realizaccedilatildeo da migraccedilatildeo aindaacontece lentamente devido agrave diversos fatores que precisam ser levados em consideraccedilatildeopara a manutenccedilatildeo do projeto

Para trabalhos e contribuiccedilotildees futuras seria interessante desenvolver uma ferramentaque pudesse analisar diretamente no coacutedigo-fonte as oportunidades de aplicaccedilatildeo de ex-pressotildees lambda dessa forma poderiam ser analisadas as porcentagens de conversatildeo decoacutedigo para Java 8 e obter melhores conclusotildees sobre a importacircncia que os projetos estatildeodando para a evoluccedilatildeo de seus coacutedigos Outro fator interessante seria aplicar mais Visitorsagrave ferramenta static-analysis e fazer este mesmo estudo aplicado agrave outras caracteriacutesticasda linguagem

47

Referecircncias

[1] Kagdi Huzefa Michael L Collard e Jonathan I Maletic A survey and taxonomyof approaches for mining software repositories in the context of software evolution2007 ix 3 8 9 10 11

[2] DBeaver Dbeaver - features httpdbeaverjkissorgdocsfeatures ix 29

[3] Eclipse Vertx commit Java8-ify code httpsgithubcomeclipsevertxcommit93f95e9c77419f442a42fe711b6eeaef88192fd3 ix 42

[4] Google Guava commit Release java 8 changes to guava httpsgithubcomgoogleguavacommit73e382fa877f80994817a136b0adcc4365ccd904 ix 43

[5] Google Agera commit Collapsed testapp with retrolambda httpsgithubcomgoogleageracommit5e518b7b05f9e7a34a314945f68deff7b2c3e334 ix 44

[6] ReactiveX Rxjava commit 2x full jdk 6 compatible backport + includ-ing bugfixes up to today httpsgithubcomReactiveXRxJavacommit000a174d87a901135f9665d3b11f3627fd2dc4ed ix 45

[7] Godfrey M W e D M German The past present and future of software evolutionEm 2008 Frontiers of Maintenance paacuteginas 129ndash138 Sept 2008 1 6

[8] Favre J M Languages evolve too changing the software time scale Em Principles ofSoftware Evolution Eighth International Workshop on paacuteginas 33ndash42 IEEE 20051 5 7

[9] Overbey Jeffrey L e Ralph E Johnson Regrowing a language refactoring tools allowprogramming languages to evolve Em ACM SIGPLAN Notices volume 44 paacuteginas493ndash502 ACM 2009 1 5 7 8 12

[10] Grechanik Mark Collin McMillan Luca DeFerrari Marco Comi Stefano CrespiDenys Poshyvanyk Chen Fu Qing Xie e Carlo Ghezzi An empirical investiga-tion into a large-scale java open source code repository Em Proceedings of the2010 ACM-IEEE International Symposium on Empirical Software Engineering andMeasurement ESEM rsquo10 paacuteginas 111ndash1110 New York NY USA 2010 ACMISBN 978-1-4503-0039-1 httpdoiacmorg10114518527861852801 1

[11] TIOBE Tiobe httpswwwtiobecomtiobe-index 1 14

48

[12] Gyori Alex Lyle Franklin Danny Dig e Jan Lahoda Crossing the gap from im-perative to functional programming through refactoring Em Proceedings of the 20139th Joint Meeting on Foundations of Software Engineering ESECFSE 2013 paacute-ginas 543ndash553 New York NY USA 2013 ACM ISBN 978-1-4503-2237-9 httpdoiacmorg10114524914112491461 2 11 24 39

[13] OpenJDK State of the lambda httpcropenjdkjavanet~briangoetzlambdalambda-state-4html 2

[14] Han Jiawei Micheline Kamber e Jian Pei Data Mining Concepts and TechniquesMorgan Kaufmann Publishers Inc San Francisco CA USA 3rd ediccedilatildeo 2011ISBN 0123814790 9780123814791 3

[15] Fowler Martin e Kent Beck Refactoring improving the design of existing codeAddison-Wesley Professional 1999 5 7

[16] Lehman M M J F Ramil P D Wernick D E Perry e W M Turski Met-rics and laws of software evolution - the nineties view Em Proceedings of the4th International Symposium on Software Metrics METRICS rsquo97 paacuteginas 20ndashWashington DC USA 1997 IEEE Computer Society ISBN 0-8186-8093-8 httpdlacmorgcitationcfmid=823454823901 6

[17] Hassan Ahmed E e Tao Xie Software intelligence The future of mining softwareengineering data Em Proceedings of the FSESDP Workshop on Future of SoftwareEngineering Research FoSER rsquo10 paacuteginas 161ndash166 New York NY USA 2010ACM ISBN 978-1-4503-0427-6 httpdoiacmorg101145188236218823978 9

[18] Hassan Ahmed E The road ahead for mining software repositories Em Frontiers ofSoftware Maintenance 2008 FoSM 2008 paacuteginas 48ndash57 IEEE 2008 8

[19] Berry Michael J e Gordon Linoff Data Mining Techniques For Marketing Salesand Customer Support John Wiley amp Sons Inc New York NY USA 1997ISBN 0471179809 10

[20] Parnin Chris Christian Bird e Emerson Murphy-Hill Java generics adoption hownew features are introduced championed or ignored Em Proceedings of the 8thWorking Conference on Mining Software Repositories paacuteginas 3ndash12 ACM 2011 12

[21] Oracle The java language specification httpsdocsoraclecomjavasespecsjlsse8jls8pdf 13

[22] Oracle The history of java technology httpwwworaclecomtechnetworkjavajavaseoverviewjavahistory-index-198355html 13

[23] Murphy Kieron So why did they decide to call itjava httpwwwjavaworldcomarticle2077265core-javaso-why-did-they-decide-to-call-it-java-html 13

[24] McGraw Tata Object-oriented Programming with Java Essentials and ApplicationsHill Education 13

49

[25] Oracle Differences between java ee and java se httpdocsoraclecomjavaee6firstcupdocgkhoyhtml 13

[26] Lindsey Clark S The History of Java Cambridge 14

[27] Oracle The java language environment httpwwworaclecomtechnetworkjavaintro-141325html 14

[28] Oracle Jdk 8 httpopenjdkjavanetprojectsjdk8 15 24

[29] Oracle Enhancements in java se 8 httpdocsoraclecomjavase8docstechnotesguideslanguageenhancementshtmljavase8 15 16 17

[30] Oracle Lambda expressions httpdocsoraclecomjavasetutorialjavajavaOOlambdaexpressionshtml 16 18 21

[31] Oracle Method references httpdocsoraclecomjavasetutorialjavajavaOOmethodreferenceshtml 16

[32] Oracle Default methods httpdocsoraclecomjavasetutorialjavaIandIdefaultmethodshtml 17

[33] Oracle Repeating annotations httpdocsoraclecomjavasetutorialjavaannotationsrepeatinghtml 17

[34] Oracle Type annotations httpdocsoraclecomjavasetutorialjavaannotationstype_annotationshtml 17

[35] Oracle Anonymous inner classes httpsdocsoraclecomjavasetutorialjavajavaOOanonymousclasseshtml 19

[36] Kothari CR Research Methodology Methods and Techniques New Age Interna-tional (P) Limited 2004 ISBN 9788122415223 httpsbooksgooglecombrbooksid=8c6gkbKi-F4C 22

[37] Nakakoji Kumiyo Yasuhiro Yamamoto Yoshiyuki Nishinaka Kouichi Kishida eYunwen Ye Evolution patterns of open-source software systems and communitiesEm IWPSE rsquo02 Proceedings of the International Workshop on Principles of SoftwareEvolution paacuteginas 76ndash85 New York NY USA 2002 ACM Press ISBN 1581135459httpdxdoiorg101145512035512055 23

[38] Rahman Foyzur Christian Bird e Premkumar Devanbu Clones What is that smellEmpirical Software Engineering 17(4-5)503ndash530 2012 24

[39] Chacon Scott Pro Git Apress Berkely CA USA 1st ediccedilatildeo 2009ISBN 1430218339 9781430218333 25

[40] Cavalcanti Thiago Gomes e Viniacutecius Correa de Almeida Caracterizaccedilatildeo do uso deconstruccedilotildees da linguagem java em projetos open-source Publicaccedilatildeo online 2016httpbdmunbbrhandle1048315733 27

50

[41] Parr Terence Language Implementation Patterns Create Your Own Domain-Specific and General Programming Languages Pragmatic Bookshelf 1st ediccedilatildeo 2009ISBN 193435645X 9781934356456 27

[42] Janssen Thorben 5 reasons to use jpa hibernate Publicaccedilatildeo online httpswwwsitepointcom5-reasons-to-use-jpa-hibernate 27

[43] Franklin Lyle Alex Gyori Jan Lahoda e Danny Dig Lambdaficator From imperativeto functional programming through automated refactoring Em Proceedings of the2013 International Conference on Software Engineering ICSE rsquo13 paacuteginas 1287ndash1290 Piscataway NJ USA 2013 IEEE Press ISBN 978-1-4673-3076-3 httpdlacmorgcitationcfmid=24867882486986 29

[44] Google Agera httpsgithubcomgoogleagerawiki 34

[45] Eclipse Eclipse vertx httpvertxio 35

[46] Cejas Fernando Android cleanarchitecture httpsgithubcomandroid10Android-CleanArchitecture 36

[47] ReactiveX Rxjava httpsgithubcomReactiveXRxJava 37

[48] Luontola Esko Retrolambda httpsgithubcomorfjackalretrolambda 43

51

Anexo I

Projetos utilizados

fastjson

platform_frameworks_base

netty

material-dialogs

kotlin

okhttp

tinker

AndroidUtilCode

RxJava

spring-boot

java-design-patterns

elasticsearch

ExoPlayer

kafka

vertx

realm-java

guava

zipkin

bazel

stetho

Signal-Android

glide

agera

fresco

plaid

presto

libgdx

spark

52

disruptor

lottie-android

flexbox-layout

PocketHub

zxing

spring-framework

deeplearning4j

dropwizard

interviews

BaseRecyclerViewAdapterHelper

uCrop

DanmakuFlameMaster

lottie-react-native

android-UniversalMusicPlayer

AndroidInterview-Q-A

greenDAO

retrofit

MaterialDrawer

BottomBar

druid

MPAndroidChart

Hystrix

guice

recyclerview-animators

dubbo

androidannotations

RxJava-Android-Samples

PhotoView

clojure

CircleImageView

AndroidSwipeLayout

jedis

MaterialViewPager

butterknife

junit4

RxBinding

leakcanary

SimianArmy

picasso

UltimateRecyclerView

53

AndroidViewAnimations

AppIntro

FizzBuzzEnterpriseEdition

ion

cheesesquare

physical-web

RxAndroid

Android-CleanArchitecture

Calligraphy

Android-Bootstrap

iosched

Android_Data

MaterialDesignLibrary

ListViewAnimations

EventBus

java8-tutorial

AndroidSlidingUpPanel

dagger

okhttputils

logger

HomeMirror

Material-Animations

android-Ultra-Pull-To-Refresh

android-async-http

Android-ObservableScrollView

Android-Universal-Image-Loader

ActionBarSherlock

SlidingMenu

storm

PagerSlidingTabStrip

Android-PullToRefresh

54

  • Dedicatoacuteria
  • Agradecimentos
  • Resumo
  • Abstract
  • Introduccedilatildeo
    • Contexto
    • Objetivos
      • Objetivos Gerais
      • Objetivos Especiacuteficos
        • Metodologia
        • Organizaccedilatildeo do Trabalho
          • Evoluccedilatildeo e Mineraccedilatildeo de Repositoacuterios de Software
            • Evoluccedilatildeo de Software
            • MSR Mineraccedilatildeo de dados e a Engenharia de Software
              • Classificaccedilatildeo
                • Trabalhos Relacionados
                  • Java SE 8 e JDK 8
                    • Histoacuterico
                    • Princiacutepios
                    • Evoluccedilatildeo
                    • Expressotildees Lambda
                      • Sintaxe
                      • Principais formas de uso
                          • Estudo e o Processo de Mineraccedilatildeo
                            • Questotildees de Pesquisa
                            • Fonte de Dados e Objetos de Estudo
                            • Processo de Mineraccedilatildeo
                              • static-analysis
                              • BDAnalisador
                                • Classificaccedilatildeo e Anaacutelise
                                  • Meacutedia de Lambda
                                  • Anaacutelise Temporal
                                  • Refatoraccedilatildeo de Coacutedigo
                                  • Casos de Uso
                                      • Resultados Obtidos e Anaacutelise
                                        • Visatildeo Geral
                                          • Projetos Selecionados
                                          • agera
                                          • vertx
                                          • Android-CleanArchitecture
                                          • RxJava
                                          • guava
                                            • Refatoraccedilatildeo de Coacutedigo
                                            • Estudos de Caso
                                              • Consideraccedilotildees Finais
                                              • Referecircncias
                                              • Anexo
                                              • Projetos utilizados

espaccedilo de tempo Aleacutem disso para este trabalho optou-se por persistir todos os meacutetodose classes de cada versatildeo sem se importar com a repeticcedilatildeo desses dados pois a hipoacutetesede haver grandes refatoraccedilotildees entre versotildees poderia comprometer a confiabilidade dasinformaccedilotildees

Figura 43 Diagrama de classes UML do BDAnalisador

Como visto na Figura 43 seguindo parcialmente a arquitetura MVC cada entidadepossui sua respectiva classe DAO(Data Access Object) para persistecircncia dos dados eapenas uma classe Controlador no projeto responsaacutevel pela manipulaccedilatildeo e parse dosdados dos arquivos csv gerados pelo static analysis para serem enviados agraves classes DAOO sistema inicia chamando o meacutetodo inicializar() da classe Controlador Esse meacutetodoeacute responsaacutevel por ler um arquivo de entrada csv que segue o mesmo modelo do arquivo dostatic-analysis citado na seccedilatildeo anterior O arquivo conteacutem os dados de todos os projetose suas respectivas versotildees dessa forma o meacutetodo instancia um objeto da classe Projetoe persiste o projeto no banco de dados Para cada versatildeo encontrada no arquivo deentrada o inicializar() aciona os meacutetodos responsaacuteveis por instanciar e preencher aslistas da classe Classe e Metodo Os meacutetodos responsaacuteveis por preencher as listas varremos arquivos csv gerados pelo static-analysis e fazem o parse das informaccedilotildees relevantescomo nomes dos meacutetodos e quantidades de lambdas para construir os objetos que seratildeogravados Ao final dos preenchimentos o objeto Versatildeo eacute instanciado e gravado no bancode dados atraveacutes de sua classe DAO ao mesmo tempo que grava suas respectivas Classese Metodos

28

Apoacutes vaacuterios testes e correccedilotildees de bugs o banco de dados se encontrava finalmente comas informaccedilotildees de 99 projetos Java open-source separados por um commit por mecircs desde2013 cada um com suas respectivas informaccedilotildees de classes meacutetodos e a quantidade deexpressotildees lambda filters e maps em cada meacutetodo Filter ou Filter pattern eacute o padratildeode projeto que tem como objetivo filtrar objetos de uma coleccedilatildeo (Collection) de acordocom algum criteacuterio Jaacute o map ou map pattern eacute um padratildeo que ldquomapeia os elementosde uma coleccedilatildeo aplicando uma funccedilatildeo a eles para uma nova coleccedilatildeo [43] A coleta deinformaccedilotildees sobre esses padrotildees podem ser uacuteteis para possiacuteveis anaacutelises de oportunidadesde uso de expressotildees lambda para refatoraccedilatildeo de coacutedigo

A Figura 44 mostra o esquema de como o banco de dados resultante foi gerado

Figura 44 Modelo relacional do banco de dados populado pelo BDAnalisador Imagemgerada com software DBeaver [2]

44 Classificaccedilatildeo e Anaacutelise

Com o banco de dados populado restam apenas as etapas de classificaccedilatildeo e anaacutelise pararesponder as questotildees de pesquisa propostas Para isso inicialmente houve uma tentativade se utilizar apenas queries SQL para analisar os dados de acordo com as informaccedilotildeesrelevantes Poreacutem devido ao fato de o banco de dados conter todas as informaccedilotildees detodos os projetos e todas as suas versotildees queries que possuem uma alta complexidadedemoravam muito tempo para retornar os dados

Assim com o objetivo de facilitar o trabalho alguns scripts python foram desenvolvi-dos para rodar as queries separadamente e individualmente para cada projeto de formaautomatizada a fim de melhorar o tempo de resposta para obtenccedilatildeo dos resultados

29

441 Meacutedia de Lambda

O primeiro script retorna a quantidade de expressotildees lambda (ou AICs) por n snapshotsque contenha expressotildees lambda O objetivo eacute ter uma visatildeo geral da meacutedia de expressotildeeslambda e AICs utilizadas por cada projeto e como nem todos os snapshots coletados decada projeto possuem expressotildees lambda e AICs apenas aqueles com alguma expressatildeolambda ou AIC satildeo incluiacutedos no caacutelculo da meacutedia

Mmedia =sumn qtdLambdai

n

442 Anaacutelise Temporal

O segundo script retorna para cada projeto a soma total da quantidade de expressotildeeslambda AIC map() e filter() no projeto inteiro para cada versatildeo Ou seja tem-seo total de cada uma das quatro propriedades selecionadas para cada mecircs do projetoobtendo assim uma visatildeo temporal de evoluccedilatildeo do uso das caracteriacutesticas descritas ATabela 41 ilustra parcialmente o resultado obtido para o projeto agera onde idVersaoeacute o identificador no banco de dados referente ao hash do commit mensal coletado qtd eacutea quantidade de cada uma das caracteriacutesticas escolhidas e a data do commit encontra-seno formato americano

Tabela 41 Informaccedilotildees mensais sobre o projeto ageraidVersao Data do Commit qtd lambda qtd AIC qtd maps qtd filter

823 512016 0 29 4 0755 612016 13 28 4 0686 6152016 13 29 4 0621 812016 13 29 4 0555 8162016 13 30 4 0485 922016 13 30 4 0422 10132016 14 30 4 0356 11282016 14 30 4 0295 12212016 21 30 5 0232 212017 21 30 5 0175 312017 21 30 5 0112 3312017 21 36 5 048 4242017 21 48 5 0

Os resultados obtidos com esta anaacutelise temporal permitiu a identificaccedilatildeo de padrotildees nautilizaccedilatildeo de expressotildees lambda em relaccedilatildeo a utilizaccedilatildeo de AIC por todos os projetos Foi

30

possiacutevel classificar todos os projetos em 6 grupos ilustrado na Figura 45 Primeiramenteseparou-se os projetos entre os que possuem expressotildees lambda e os que natildeo possuemDentre os que possuem identificou-se cinco categorias

1 Grupo 1 Quantidade de AICs e expressotildees lambda aumentam com o tempo pro-porcionalmente

2 Grupo 2 Quantidade de AICs diminui agrave medida que a quantidade de expressotildeeslambda aumentam e a quantidade de expressotildees lambda ultrapassa a quantidade deAIC em um determinado momento

3 Grupo 3 Quantidade de AICs diminui agrave medida que a quantidade de expressotildeeslambda aumentam mas a quantidade de AIC permanece superior agrave quantidade delambda

4 Grupo 4 Expressotildees lambda satildeo introduzidas e existem por um pequeno periacuteodode tempo mas satildeo completamente removidas posteriormente

5 Grupo 5 Quantidade de expressotildees lambda eacute constante e muito inferior compa-rado com a quantidade de AICs no projeto Foi determinado que para pertencera esta classificaccedilatildeo o projeto precisa ter uma razatildeo de meacutedia de expressotildees lamb-dasnapshot por meacutedia de AICsnapshot inferior a 020 Esse paracircmetro foi esta-belecido com o objetivo de definir um padratildeo para o que pode ser considerado umprojeto com poucas expressotildees lambda

Figura 45 Classificaccedilatildeo dos projetos

31

443 Refatoraccedilatildeo de Coacutedigo

O uacuteltimo script teve como objetivo realizar uma tentativa inicial de identificar refatoraccedilatildeode coacutedigo da seguinte maneira para todos os projetos que possuem expressotildees lambdaforam identificados o mecircs imediatamente antes da introduccedilatildeo de expressotildees lambda e omecircs seguinte onde houve a primeira ocorrecircncia de lambda no projeto Assim realizou-se uma anaacutelise do tamanho em quantidade de linhas de coacutedigo de todos os meacutetodosdo projeto que no mecircs seguinte tiveram introduccedilatildeo de lambda Em seguida fez-se umacomparaccedilatildeo com os mesmos meacutetodos em relaccedilatildeo ao mecircs anterior e assim foi possiacuteveldetectar quais meacutetodos tiveram a quantidade de linhas de coacutedigo reduzidas o que seriaum indicativo natildeo necessariamente exclusivo de que uma refatoraccedilatildeo de coacutedigo possa terocorrido

Sabe-se que este meacutetodo de detecccedilatildeo de refatoraccedilatildeo de coacutedigo possui suas limitaccedilotildeesuma vez que as comparaccedilotildees para saber se um meacutetodo existe em ambas versotildees eacute feitopuramente por comparaccedilatildeo de String (nome do meacutetodo) e a classe que este pertence

444 Casos de Uso

Os meacutetodos descritos acima ajudaram a identificar alguns padrotildees e facilitar a anaacutelise dosdados Poreacutem natildeo satildeo suficientes para que se possa responder agraves questotildees de pesquisaDessa forma apoacutes a identificaccedilatildeo dos grupos de classificaccedilatildeo para os projetos foramescolhidos um projeto de cada grupo (com exceccedilatildeo do grupo dos projetos sem expressotildeeslambda) para realizar um breve estudo de caso com o objetivo de identificar e caracterizarmelhor a adoccedilatildeo de expressotildees lambda Os projetos escolhidos foram agera vertxAndroid-CleanArchitecture RxJava e guava

32

Capiacutetulo 5

Resultados Obtidos e Anaacutelise

Neste capiacutetulo seratildeo apresentados os dados obtidos e anaacutelise com o objetivo de responderagraves questotildees de pesquisa propostas Como mencionado anteriormente as perguntas seratildeorespondidas de duas maneiras algumas com informaccedilotildees gerais sobre todos os projetose outras com breve estudos de caso envolvendo cinco projetos

51 Visatildeo Geral

Dentre os repositoacuterios coletados para a anaacutelise 74 (7474) natildeo utilizaram nenhumaexpressatildeo lambda no projeto durante todo o periacuteodo analisado (Janeiro de 2013 a Abrilde 2017) restando apenas 25 repositoacuterios (2525) com expressotildees lambda Eacute interessantedestacar que apesar de a quantidade de repositoacuterios que natildeo possuem expressotildees lambdaser relativamente expressiva muitos destes repositoacuterios satildeo de projetos em Java que umdia foram populares e atualmente natildeo estatildeo sendo mais desenvolvidos (por exemplo umaplicativo que soacute funciona para Android 23 atualmente descontinuado)

Levando em consideraccedilatildeo apenas os projetos que possuem expressotildees lambda exis-tem dois tipos de dados que podem ser analisados para responder agrave primeira questatildeo depesquisa atraveacutes dos dados obtidos pelo meacutetodo anteriormente mencionado como anaacutelisetemporal e a meacutedia de lambda por snapshot mencionados no capiacutetulo anterior

Com relaccedilatildeo ao ano em que a primeira ocorrecircncia foi encontrada 6 projetos introduzi-ram expressotildees lambda jaacute em 2014 8 comeccedilaram a utilizar em 2015 7 em 2016 e apenas4 tiveram a primeira ocorrecircncia de expressotildees lambda em 2017 Dessa forma percebe-seque os projetos estatildeo relativamente bem distribuiacutedos em grupos quanto ao ano em que seintroduziu expressotildees lambda

Pela meacutedia de lambda por snapshot (lambdasnapshot) a maioria (11 projetos) possuiuma quantidade expressiva acima de 100 lambdasnapshot (com 6 projetos entre 20 e 100lambdasnapshot e 8 projetos com menos de 20 lambdasnapshot) como apresentados no

33

graacutefico da Figura 51 Isso mostra que essa nova caracteriacutestica jaacute estaacute sendo bem utilizadanos projetos que comeccedilaram a migrar para a nova versatildeo do Java

Figura 51 Graacuteficos dos projetos separados por ano de introduccedilatildeo de expressotildees lambdae meacutedia de lambda por snapshot

Com isso pode-se observar que apesar de a quantidade de projetos que possuemexpressotildees lambda natildeo ser tatildeo alta eacute possiacutevel obter resultados expressivos uma vez quea quantidade dos projetos com lambda estatildeo bem dispersos quanto ao periacuteodo em quecomeccedilaram a adotar essa caracteriacutestica e a quantidade de expressotildees lambda por snapshot

511 Projetos Selecionados

Atraveacutes dos grupos de classificaccedilatildeo identificados pela anaacutelise temporal descritos na Figura45 cinco projetos foram selecionados para uma anaacutelise detalhada levando em consideraccedilatildeoo grupo em que eles pertencem Estes projetos seratildeo apresentados a seguir

512 agera

Agera eacute uma biblioteca Android que ajuda a introduzir programaccedilatildeo funcional reativa(functional reactive programming) em projetos Android Eacute um projeto recente lanccediladoem 2016 pela Google [44] e encontra-se no grupo dos projetos que introduziram expressotildeeslambda em 2016 no mesmo ano de seu lanccedilamento contendo uma meacutedia de expressotildeeslambda de 16 lambdasnapshot

Na classificaccedilatildeo estabelecida agera pertence ao Grupo 1 onde a quantidade de ex-pressotildees lambda no projeto com o tempo aumentam juntamente com a quantidade deAICs como mostra o graacutefico de anaacutelise temporal na Figura 52

34

Figura 52 Graacuteficos de anaacutelise temporal do projeto agera

513 vertx

Eclipse Vertx eacute um conjunto de ferramentas para criaccedilatildeo de reactive applications namaacutequina virtual Java (JVM) em grande escala [45] Seu primeiro lanccedilamento aconteceuem 2011 e a primeira ocorrecircncia de expressotildees lambda no projeto aconteceu em 2014 Esteprojeto possui uma meacutedia de 2867 lambdasnapshot e dentre os projetos consideradosneste trabalho eacute o que possui a maior quantidade de expressotildees lambda

Este projeto pertence ao Grupo 2 onde a quantidade de expressotildees lambda aumen-tou consideravelmente pelos meses ultrapassando a quantidade de AICs que diminuiudrasticamente como mostra a Figura 53

35

Figura 53 Graacuteficos de anaacutelise temporal do projeto Vertx

514 Android-CleanArchitecture

Apesar de ser uma amostra de projeto Android-CleanArchitecture que tem como objetivoconstruir aplicaccedilotildees Android utilizando clean architecture foi lanccedilado em 2014 mas semanteacutem sempre atualizado [46]

A introduccedilatildeo de expressotildees lambda que aconteceu no ano de 2015 se deu de formatiacutemida com uma meacutedia de 35 lambdasnapshot De qualquer forma este projeto conseguerepresentar com seu graacutefico de anaacutelise temporal o grupo 3 composto por projetos em quea quantidade de expressotildees lambda aumentou mas sem ultrapassar AICs que diminuiacuteramdemonstrado no graacutefico da Figura 54

36

Figura 54 Graacuteficos de anaacutelise temporal do projeto Android-CleanArchitecture

515 RxJava

Dentre os repositoacuterios estudados RxJava eacute considerado o mais popular Como umaimplementaccedilatildeo de Reactive Extensions para a JVM RxJava teve seu lanccedilamento dadoem 2013 [47] Expressotildees lambda apareceram pela primeira vez no ano de 2015 comuma meacutedia de 766 lambdasnapshot

Apesar de uma meacutedia relativamente alta o tempo de vida das expressotildees lambda nesteprojeto foi bem curto caracterizando assim projetos do grupo 4 houve a introduccedilatildeo dasexpressotildees lambda no projeto poreacutem houve a remoccedilatildeo completa de todas as expressotildeeslambda previamente introduzidas desaparecendo completamente do projeto ateacute a datada coleta de dados (Figura 55)

37

Figura 55 Graacuteficos de anaacutelise temporal do projeto RxJava

516 guava

Guava eacute um conjunto de bibliotecas para Java da Google lanccedilado em 2011 A atualizaccedilatildeodo coacutedigo do projeto para Java 8 aconteceu somente em 2016 e apesar do projeto conteruma meacutedia de 281 lambdasnapshot ele foi escolhido como representante dos projetosdo Grupo 5 (Figura 56) que possuem expressotildees lambda mas de forma natildeo expressiva osuficiente quando comparado com a quantidade de AIC pelo fato de sua razatildeo de meacutedia delambdasnapshot por meacutedia de AICsnapshot ser 004 Ou seja embora o projeto tenhaexpressotildees lambda estas satildeo consideradas muito poucas quando inseridas no contextogeral deste projeto que eacute considerado um projeto grande

38

Figura 56 Graacuteficos de anaacutelise temporal do projeto Guava

52 Refatoraccedilatildeo de Coacutedigo

Com o objetivo de caracterizar melhor como as expressotildees lambda estatildeo sendo utilizadaseacute interessante identificar se estas estatildeo sendo introduzidas atraveacutes de refatoraccedilatildeo de coacutedigoou em coacutedigo novo

Os projetos classificados como pertencentes ao Grupo 2 possuem em comum o fatode expressotildees lambda aumentarem a medida que AICs diminuem ultrapassando-as eessa caracteriacutestica em comum pode indicar que nestes projetos possivelmente houve re-fatoraccedilatildeo de coacutedigo visto que AIC sendo substituiacutedo por expressotildees lambda dentro dascondiccedilotildees determinadas eacute a maneira mais comum de se identificar refatoraccedilatildeo de coacute-digo para introduccedilatildeo de expressotildees lambda [12] Os projetos que compotildeem o grupo 2representam 44 de todos os projetos estudados que possuem expressotildees lambda o quepode ser um indicativo caso a hipoacutetese de refatoraccedilatildeo de coacutedigo seja positiva de quemuitos projetos que estatildeo adotando o Java 8 estatildeo se preocupando de alguma formacom refatoraccedilatildeo se coacutedigo Fazem parte desse grupo os seguintes projetos elasticsearchjava-design-patterns PocketHub presto RxJava-Android-Samples spark vertx zipkinjava8-tutorial dropwizard e material-dialogs

39

Outra maneira de verificar possiacuteveis indicadores de refatoraccedilatildeo de coacutedigo foi atraveacutesda anaacutelise dos tamanhos (em quantidade de linhas de coacutedigo) dos meacutetodos com expressotildeeslambda no mecircs em que se introduziu expressotildees lambda e um mecircs imediatamente antesdeste Essa anaacutelise mostra que dos 25 projetos com expressotildees lambda 12 (48) projetostiveram ao menos um meacutetodo em que houve uma diminuiccedilatildeo no tamanho o que podeser considerado um indicativo de refatoraccedilatildeo de coacutedigo A Figura 57 mostra todos osprojetos em relaccedilatildeo agrave quantidade total de meacutetodos que possuem lambda no primeiro mecircsde introduccedilatildeo do mesmo em vermelho comparado com a quantidade desses meacutetodos quetiveram uma diminuiccedilatildeo no tamanho quando comparados com o coacutedigo do mecircs anteriorem azul

Figura 57 Comparaccedilatildeo entre todos os projetos com expressatildeo lambda sobre refatoraccedilatildeode coacutedigo no mecircs de introduccedilatildeo da caracteriacutestica

Ainda observando a figura 57 com relaccedilatildeo aos projetos que natildeo tiveram nenhummeacutetodo com diminuiccedilatildeo de tamanho (barra azul) percebe-se que todos os 13 projetossequer tiveram uma quantidade significativa de meacutetodos que possuem expressotildees lambda(com o maior tendo apenas 5 meacutetodos) no mecircs de introduccedilatildeo da caracteriacutestica no projetoe ao mesmo tempo jaacute existiam no mecircs em que natildeo existia lambda no projeto Essa eacuteuma observaccedilatildeo importante porque projetos como vertx sendo este o que possui a maiormeacutedia de lambdasnapshot de todos os projetos e ao mesmo tempo tendo apenas trecircsmeacutetodos que continham expressotildees lambda no mecircs da introduccedilatildeo e que existiam no mecircs

40

anterior permitem inferir que todas as outras expressotildees lambda existentes no projetopara este determinado mecircs de introduccedilatildeo encontram-se em coacutedigo novo introduzido

Eacute importante ressaltar que somente essa anaacutelise natildeo eacute exclusivamente suficiente paradeterminar se estes projetos estatildeo realmente introduzindo lambda em coacutedigo novo ourealizando refatoraccedilatildeo uma vez que como a comparaccedilatildeo aconteceu apenas no mecircs deintroduccedilatildeo com o mecircs imediatamente anterior natildeo reflete todo o ciclo de vida do pro-jeto Por exemplo algumas equipes podem escolher refatorar o coacutedigo depois de umtempo de adaptaccedilatildeo apoacutes a transiccedilatildeo para a nova versatildeo da linguagem Assim paraobter uma melhor anaacutelise sobre refatoraccedilatildeo de coacutedigo ou natildeo feita nestes projetos aleacutemde outras anaacutelises referentes aos padrotildees tipicamente adotados para implementaccedilatildeo delambda nestes projetos seratildeo apresentados a seguir os estudos de caso dos cinco projetospreviamente selecionados

Outro ponto importante eacute o fato de que apesar das informaccedilotildees quanto agraves quantida-des de filter e map terem sido incluiacutedas inicialmente no trabalho para observar possiacuteveispadrotildees de refatoraccedilatildeo de coacutedigo percebeu-se que estas natildeo satildeo utilizadas de forma con-sideraacutevel pelos projetos estudados e para fins de anaacutelises generalizadas natildeo apresentaramtanta influecircncia na utilizaccedilatildeo de expressotildees lambda quanto a quantidade de AICs noprojeto

53 Estudos de Caso

Dentre os projetos analisados verificou-se que os projetos de pequeno e meacutedio porte op-taram por refatorar de uma vez seus coacutedigos para incluir expressotildees lambda em situaccedilotildeesem que se utilizava AICs anteriormente ou em alguns poucos casos de utilizaccedilatildeo deCollection Os projetos de grande porte natildeo apresentaram nenhuma refatoraccedilatildeo de coacute-digo ou uma refatoraccedilatildeo parcial gradativa provavelmente devido agrave grande quantidade dearquivos e coacutedigo que possuem o que pode tornar o trabalho de refatoraccedilatildeo extenso ecansativo

O projeto vertx que pertence ao grupo 2 dos projetos em que a quantidade de ex-pressotildees lambda aumentaram e as de AICs diminuiacuteram com lambda ultrapassando AICsexecutou inicialmente commits em maio de 2014 com adiccedilatildeo de coacutedigo novo utilizandoexpressotildees lambda e apoacutes um mecircs realizou um commit maior com a refatoraccedilatildeo de todasas AICs para expressotildees lambda Apoacutes a refatoraccedilatildeo o projeto se preocupou em mantera utilizaccedilatildeo de expressotildees lambda ao mesmo tempo que o uso de AICs se manteve apenasaos casos de classes com interfaces natildeo funcionais A Figura 58 apresenta uma parte docommit de refatoraccedilatildeo de coacutedigo que mostra em vermelho a parte eliminada do coacutedigo(AIC) e em verde o coacutedigo novo representando a substituiccedilatildeo por uma expressatildeo lambda

41

Figura 58 Commit de refatoraccedilatildeo de coacutedigo do projeto Vertx [3]

Alguns projetos ainda natildeo se preocuparam em refatorar o coacutedigo para o uso de ex-pressotildees lambda ateacute a data deste trabalho que eacute o caso do projeto guava que apresentouum commit em 03112016 com a atualizaccedilatildeo do projeto para Java 8 Mas a partir daatualizaccedilatildeo se preocupou em utilizar as expressotildees lambda apenas na implementaccedilatildeo decoacutedigo novo O cenaacuterio em que a refatoraccedilatildeo natildeo eacute prioridade ainda eacute a realidade de vaacuteriosprojetos de grande porte visto que os dados de projetos sem nenhuma expressatildeo lambdasatildeo o maior nuacutemero neste trabalho Poreacutem projetos que jaacute adotaram a utilizaccedilatildeo do Java8 tendem a mudar isso com o passar do tempo A Figura 59 apresenta em verde umaadiccedilatildeo de coacutedigo novo com expressatildeo lambda sem a eliminaccedilatildeo de algum coacutedigo anteriora esse que estaria em vermelho

42

Figura 59 Exemplo de um arquivo do commit de adiccedilatildeo de coacutedigo novo em Java 8 doprojeto Guava [4]

Na categoria de projetos em que os AICs e expressotildees lambda aumentam proporci-onalmente (grupo 1) o projeto agera realizou um commit em 19052016 com a adiccedilatildeoda biblioteca retrolambda como dependecircncia do projeto Essa biblioteca utilizada prin-cipalmente por projetos Android permite executar coacutedigo Java 8 contendo expressotildeeslambda em Java 5 6 e 7 [48] O commit tambeacutem apresenta refatoraccedilatildeo dos AICs ad-vindos de interfaces funcionais para expressotildees lambda Apesar de o projeto continuar autilizar as expressotildees lambda em seus commits posteriores o nuacutemero de AICs tambeacutemcontinuou a aumentar visualizando os commits posteriores notou-se que esses AICs satildeorelativos a interfaces natildeo funcionais ou seja que possuem mais de um meacutetodo O projetoAndroid-CleanArchitecture eacute similar ao agera pois tambeacutem optou pela instalaccedilatildeo da bi-blioteca retrolambda para uso de expressotildees lambda em seus coacutedigos e como tambeacutem eacuteum projeto de pequeno porte houve uma pequena refatoraccedilatildeo dos AICs A Figura 510mostra a parte do commit de refatoraccedilatildeo de coacutedigo em que o desenvolvedor adiciona abiblioteca retrolambda como dependecircncia

43

Figura 510 Commit de adiccedilatildeo da biblioteca Retrolambda no projeto Agera [5]

Outro caso interessante eacute o do projeto RxJava que em 2015 optou pela refatoraccedilatildeodo coacutedigo para a utilizaccedilatildeo de expressotildees lambda quase eliminando por completo o usode AICs mas que no ano seguinte reverteu os commits de forma que eliminasse comple-tamente o uso de expressotildees lambda para manter a retrocompatibilidade com o Java 6A Figura 511 demonstra uma parte do commit de reversatildeo do coacutedigo para Java 6 emque pode ser visto em vermelho o coacutedigo anterior com expressotildees lambda e o verde como novo coacutedigo utilizando AIC novamente

44

Figura 511 Commit de remoccedilatildeo de Lambdas e volta para o uso de AICs no projetoRXJava [6]

Essa preocupaccedilatildeo com retrocompatibilidade de coacutedigo pode ser um fator crucial nadecisatildeo das equipes de desenvolvimento na hora de decidir como fazer o software co-evoluircom a linguagem sem perder a compatibilidade com versotildees anteriores

45

Capiacutetulo 6

Consideraccedilotildees Finais

Este estudo permitiu entender melhor como projetos estatildeo realizando a migraccedilatildeo para oJava 8 em especial utilizando uma nova caracteriacutestica introduzida expressatildeo lambdaApesar de a maioria dos projetos populares considerados natildeo possuiacuterem nenhuma ocor-recircncia de expressotildees lambda os projetos que tinham expressotildees lambda foram suficientespara realizar um primeiro estudo de caracterizaccedilatildeo no uso desta caracteriacutestica e com osprojetos efetivamente utilizados para estudo foi possiacutevel agrupaacute-los quanto a maneira emque as expressotildees lambda estavam sendo utilizadas quando comparadas com AICs em 5grandes grupos quando AIC e lambda aumentam proporcionalmente quando AIC dimi-nui e lambda aumenta ultrapassando AIC quando AIC diminui mas continua superior aolambda crescente expressotildees lambda que foram introduzidas e retiradas completamentedo coacutedigo e expressotildees lambda que natildeo existem em quantidades expressivas

Foi possiacutevel entatildeo realizar um estudo aprofundado levando em consideraccedilatildeo as di-ferentes maneiras com que as expressotildees lambda foram adotadas nos projetos atraveacutes daescolha de um projeto que representasse cada grupo para anaacutelise Dentre os cinco projetosestudados foi possiacutevel observar alguns padrotildees tipicamente adotados por desenvolvedorespara implementar expressotildees lambda em seus projetos como a utilizaccedilatildeo da bibliotecas(retrolambda) que permitissem uma flexibilizaccedilatildeo na utilizaccedilatildeo de expressotildees lambda oucomo lambda eacute primariamente utilizada para substituir determinados AICs ou operaccedilotildeesem Collection

Aleacutem disso foi possiacutevel observar como a refatoraccedilatildeo de coacutedigo acontece em cada umdesses projetos Observou-se como projetos menores tendem a refatorar coacutedigo maisfacilmente ao passo que projetos maiores e mais complexos fazem menos refatoraccedilatildeo oudemoram mais entre o periacuteodo em que houve a primeira migraccedilatildeo de coacutedigo para a novaversatildeo da linguagem ateacute o periacuteodo em que realmente decidem refatorar coacutedigo Aleacutem dacomplexidade do projeto influenciar na decisatildeo de migrar o projeto para uma versatildeo maisrecente da linguagem a preocupaccedilatildeo com retrocompatibilidade com versotildees anteriores da

46

linguagem tambeacutem podem ser uma barreira para que projetos comecem a evoluir o coacutedigojuntamente com a evoluccedilatildeo da linguagem

Ainda assim foi possiacutevel observar que a preocupaccedilatildeo com a co-evoluccedilatildeo do software-linguagem existe entre os desenvolvedores de projetos mas a realizaccedilatildeo da migraccedilatildeo aindaacontece lentamente devido agrave diversos fatores que precisam ser levados em consideraccedilatildeopara a manutenccedilatildeo do projeto

Para trabalhos e contribuiccedilotildees futuras seria interessante desenvolver uma ferramentaque pudesse analisar diretamente no coacutedigo-fonte as oportunidades de aplicaccedilatildeo de ex-pressotildees lambda dessa forma poderiam ser analisadas as porcentagens de conversatildeo decoacutedigo para Java 8 e obter melhores conclusotildees sobre a importacircncia que os projetos estatildeodando para a evoluccedilatildeo de seus coacutedigos Outro fator interessante seria aplicar mais Visitorsagrave ferramenta static-analysis e fazer este mesmo estudo aplicado agrave outras caracteriacutesticasda linguagem

47

Referecircncias

[1] Kagdi Huzefa Michael L Collard e Jonathan I Maletic A survey and taxonomyof approaches for mining software repositories in the context of software evolution2007 ix 3 8 9 10 11

[2] DBeaver Dbeaver - features httpdbeaverjkissorgdocsfeatures ix 29

[3] Eclipse Vertx commit Java8-ify code httpsgithubcomeclipsevertxcommit93f95e9c77419f442a42fe711b6eeaef88192fd3 ix 42

[4] Google Guava commit Release java 8 changes to guava httpsgithubcomgoogleguavacommit73e382fa877f80994817a136b0adcc4365ccd904 ix 43

[5] Google Agera commit Collapsed testapp with retrolambda httpsgithubcomgoogleageracommit5e518b7b05f9e7a34a314945f68deff7b2c3e334 ix 44

[6] ReactiveX Rxjava commit 2x full jdk 6 compatible backport + includ-ing bugfixes up to today httpsgithubcomReactiveXRxJavacommit000a174d87a901135f9665d3b11f3627fd2dc4ed ix 45

[7] Godfrey M W e D M German The past present and future of software evolutionEm 2008 Frontiers of Maintenance paacuteginas 129ndash138 Sept 2008 1 6

[8] Favre J M Languages evolve too changing the software time scale Em Principles ofSoftware Evolution Eighth International Workshop on paacuteginas 33ndash42 IEEE 20051 5 7

[9] Overbey Jeffrey L e Ralph E Johnson Regrowing a language refactoring tools allowprogramming languages to evolve Em ACM SIGPLAN Notices volume 44 paacuteginas493ndash502 ACM 2009 1 5 7 8 12

[10] Grechanik Mark Collin McMillan Luca DeFerrari Marco Comi Stefano CrespiDenys Poshyvanyk Chen Fu Qing Xie e Carlo Ghezzi An empirical investiga-tion into a large-scale java open source code repository Em Proceedings of the2010 ACM-IEEE International Symposium on Empirical Software Engineering andMeasurement ESEM rsquo10 paacuteginas 111ndash1110 New York NY USA 2010 ACMISBN 978-1-4503-0039-1 httpdoiacmorg10114518527861852801 1

[11] TIOBE Tiobe httpswwwtiobecomtiobe-index 1 14

48

[12] Gyori Alex Lyle Franklin Danny Dig e Jan Lahoda Crossing the gap from im-perative to functional programming through refactoring Em Proceedings of the 20139th Joint Meeting on Foundations of Software Engineering ESECFSE 2013 paacute-ginas 543ndash553 New York NY USA 2013 ACM ISBN 978-1-4503-2237-9 httpdoiacmorg10114524914112491461 2 11 24 39

[13] OpenJDK State of the lambda httpcropenjdkjavanet~briangoetzlambdalambda-state-4html 2

[14] Han Jiawei Micheline Kamber e Jian Pei Data Mining Concepts and TechniquesMorgan Kaufmann Publishers Inc San Francisco CA USA 3rd ediccedilatildeo 2011ISBN 0123814790 9780123814791 3

[15] Fowler Martin e Kent Beck Refactoring improving the design of existing codeAddison-Wesley Professional 1999 5 7

[16] Lehman M M J F Ramil P D Wernick D E Perry e W M Turski Met-rics and laws of software evolution - the nineties view Em Proceedings of the4th International Symposium on Software Metrics METRICS rsquo97 paacuteginas 20ndashWashington DC USA 1997 IEEE Computer Society ISBN 0-8186-8093-8 httpdlacmorgcitationcfmid=823454823901 6

[17] Hassan Ahmed E e Tao Xie Software intelligence The future of mining softwareengineering data Em Proceedings of the FSESDP Workshop on Future of SoftwareEngineering Research FoSER rsquo10 paacuteginas 161ndash166 New York NY USA 2010ACM ISBN 978-1-4503-0427-6 httpdoiacmorg101145188236218823978 9

[18] Hassan Ahmed E The road ahead for mining software repositories Em Frontiers ofSoftware Maintenance 2008 FoSM 2008 paacuteginas 48ndash57 IEEE 2008 8

[19] Berry Michael J e Gordon Linoff Data Mining Techniques For Marketing Salesand Customer Support John Wiley amp Sons Inc New York NY USA 1997ISBN 0471179809 10

[20] Parnin Chris Christian Bird e Emerson Murphy-Hill Java generics adoption hownew features are introduced championed or ignored Em Proceedings of the 8thWorking Conference on Mining Software Repositories paacuteginas 3ndash12 ACM 2011 12

[21] Oracle The java language specification httpsdocsoraclecomjavasespecsjlsse8jls8pdf 13

[22] Oracle The history of java technology httpwwworaclecomtechnetworkjavajavaseoverviewjavahistory-index-198355html 13

[23] Murphy Kieron So why did they decide to call itjava httpwwwjavaworldcomarticle2077265core-javaso-why-did-they-decide-to-call-it-java-html 13

[24] McGraw Tata Object-oriented Programming with Java Essentials and ApplicationsHill Education 13

49

[25] Oracle Differences between java ee and java se httpdocsoraclecomjavaee6firstcupdocgkhoyhtml 13

[26] Lindsey Clark S The History of Java Cambridge 14

[27] Oracle The java language environment httpwwworaclecomtechnetworkjavaintro-141325html 14

[28] Oracle Jdk 8 httpopenjdkjavanetprojectsjdk8 15 24

[29] Oracle Enhancements in java se 8 httpdocsoraclecomjavase8docstechnotesguideslanguageenhancementshtmljavase8 15 16 17

[30] Oracle Lambda expressions httpdocsoraclecomjavasetutorialjavajavaOOlambdaexpressionshtml 16 18 21

[31] Oracle Method references httpdocsoraclecomjavasetutorialjavajavaOOmethodreferenceshtml 16

[32] Oracle Default methods httpdocsoraclecomjavasetutorialjavaIandIdefaultmethodshtml 17

[33] Oracle Repeating annotations httpdocsoraclecomjavasetutorialjavaannotationsrepeatinghtml 17

[34] Oracle Type annotations httpdocsoraclecomjavasetutorialjavaannotationstype_annotationshtml 17

[35] Oracle Anonymous inner classes httpsdocsoraclecomjavasetutorialjavajavaOOanonymousclasseshtml 19

[36] Kothari CR Research Methodology Methods and Techniques New Age Interna-tional (P) Limited 2004 ISBN 9788122415223 httpsbooksgooglecombrbooksid=8c6gkbKi-F4C 22

[37] Nakakoji Kumiyo Yasuhiro Yamamoto Yoshiyuki Nishinaka Kouichi Kishida eYunwen Ye Evolution patterns of open-source software systems and communitiesEm IWPSE rsquo02 Proceedings of the International Workshop on Principles of SoftwareEvolution paacuteginas 76ndash85 New York NY USA 2002 ACM Press ISBN 1581135459httpdxdoiorg101145512035512055 23

[38] Rahman Foyzur Christian Bird e Premkumar Devanbu Clones What is that smellEmpirical Software Engineering 17(4-5)503ndash530 2012 24

[39] Chacon Scott Pro Git Apress Berkely CA USA 1st ediccedilatildeo 2009ISBN 1430218339 9781430218333 25

[40] Cavalcanti Thiago Gomes e Viniacutecius Correa de Almeida Caracterizaccedilatildeo do uso deconstruccedilotildees da linguagem java em projetos open-source Publicaccedilatildeo online 2016httpbdmunbbrhandle1048315733 27

50

[41] Parr Terence Language Implementation Patterns Create Your Own Domain-Specific and General Programming Languages Pragmatic Bookshelf 1st ediccedilatildeo 2009ISBN 193435645X 9781934356456 27

[42] Janssen Thorben 5 reasons to use jpa hibernate Publicaccedilatildeo online httpswwwsitepointcom5-reasons-to-use-jpa-hibernate 27

[43] Franklin Lyle Alex Gyori Jan Lahoda e Danny Dig Lambdaficator From imperativeto functional programming through automated refactoring Em Proceedings of the2013 International Conference on Software Engineering ICSE rsquo13 paacuteginas 1287ndash1290 Piscataway NJ USA 2013 IEEE Press ISBN 978-1-4673-3076-3 httpdlacmorgcitationcfmid=24867882486986 29

[44] Google Agera httpsgithubcomgoogleagerawiki 34

[45] Eclipse Eclipse vertx httpvertxio 35

[46] Cejas Fernando Android cleanarchitecture httpsgithubcomandroid10Android-CleanArchitecture 36

[47] ReactiveX Rxjava httpsgithubcomReactiveXRxJava 37

[48] Luontola Esko Retrolambda httpsgithubcomorfjackalretrolambda 43

51

Anexo I

Projetos utilizados

fastjson

platform_frameworks_base

netty

material-dialogs

kotlin

okhttp

tinker

AndroidUtilCode

RxJava

spring-boot

java-design-patterns

elasticsearch

ExoPlayer

kafka

vertx

realm-java

guava

zipkin

bazel

stetho

Signal-Android

glide

agera

fresco

plaid

presto

libgdx

spark

52

disruptor

lottie-android

flexbox-layout

PocketHub

zxing

spring-framework

deeplearning4j

dropwizard

interviews

BaseRecyclerViewAdapterHelper

uCrop

DanmakuFlameMaster

lottie-react-native

android-UniversalMusicPlayer

AndroidInterview-Q-A

greenDAO

retrofit

MaterialDrawer

BottomBar

druid

MPAndroidChart

Hystrix

guice

recyclerview-animators

dubbo

androidannotations

RxJava-Android-Samples

PhotoView

clojure

CircleImageView

AndroidSwipeLayout

jedis

MaterialViewPager

butterknife

junit4

RxBinding

leakcanary

SimianArmy

picasso

UltimateRecyclerView

53

AndroidViewAnimations

AppIntro

FizzBuzzEnterpriseEdition

ion

cheesesquare

physical-web

RxAndroid

Android-CleanArchitecture

Calligraphy

Android-Bootstrap

iosched

Android_Data

MaterialDesignLibrary

ListViewAnimations

EventBus

java8-tutorial

AndroidSlidingUpPanel

dagger

okhttputils

logger

HomeMirror

Material-Animations

android-Ultra-Pull-To-Refresh

android-async-http

Android-ObservableScrollView

Android-Universal-Image-Loader

ActionBarSherlock

SlidingMenu

storm

PagerSlidingTabStrip

Android-PullToRefresh

54

  • Dedicatoacuteria
  • Agradecimentos
  • Resumo
  • Abstract
  • Introduccedilatildeo
    • Contexto
    • Objetivos
      • Objetivos Gerais
      • Objetivos Especiacuteficos
        • Metodologia
        • Organizaccedilatildeo do Trabalho
          • Evoluccedilatildeo e Mineraccedilatildeo de Repositoacuterios de Software
            • Evoluccedilatildeo de Software
            • MSR Mineraccedilatildeo de dados e a Engenharia de Software
              • Classificaccedilatildeo
                • Trabalhos Relacionados
                  • Java SE 8 e JDK 8
                    • Histoacuterico
                    • Princiacutepios
                    • Evoluccedilatildeo
                    • Expressotildees Lambda
                      • Sintaxe
                      • Principais formas de uso
                          • Estudo e o Processo de Mineraccedilatildeo
                            • Questotildees de Pesquisa
                            • Fonte de Dados e Objetos de Estudo
                            • Processo de Mineraccedilatildeo
                              • static-analysis
                              • BDAnalisador
                                • Classificaccedilatildeo e Anaacutelise
                                  • Meacutedia de Lambda
                                  • Anaacutelise Temporal
                                  • Refatoraccedilatildeo de Coacutedigo
                                  • Casos de Uso
                                      • Resultados Obtidos e Anaacutelise
                                        • Visatildeo Geral
                                          • Projetos Selecionados
                                          • agera
                                          • vertx
                                          • Android-CleanArchitecture
                                          • RxJava
                                          • guava
                                            • Refatoraccedilatildeo de Coacutedigo
                                            • Estudos de Caso
                                              • Consideraccedilotildees Finais
                                              • Referecircncias
                                              • Anexo
                                              • Projetos utilizados

Apoacutes vaacuterios testes e correccedilotildees de bugs o banco de dados se encontrava finalmente comas informaccedilotildees de 99 projetos Java open-source separados por um commit por mecircs desde2013 cada um com suas respectivas informaccedilotildees de classes meacutetodos e a quantidade deexpressotildees lambda filters e maps em cada meacutetodo Filter ou Filter pattern eacute o padratildeode projeto que tem como objetivo filtrar objetos de uma coleccedilatildeo (Collection) de acordocom algum criteacuterio Jaacute o map ou map pattern eacute um padratildeo que ldquomapeia os elementosde uma coleccedilatildeo aplicando uma funccedilatildeo a eles para uma nova coleccedilatildeo [43] A coleta deinformaccedilotildees sobre esses padrotildees podem ser uacuteteis para possiacuteveis anaacutelises de oportunidadesde uso de expressotildees lambda para refatoraccedilatildeo de coacutedigo

A Figura 44 mostra o esquema de como o banco de dados resultante foi gerado

Figura 44 Modelo relacional do banco de dados populado pelo BDAnalisador Imagemgerada com software DBeaver [2]

44 Classificaccedilatildeo e Anaacutelise

Com o banco de dados populado restam apenas as etapas de classificaccedilatildeo e anaacutelise pararesponder as questotildees de pesquisa propostas Para isso inicialmente houve uma tentativade se utilizar apenas queries SQL para analisar os dados de acordo com as informaccedilotildeesrelevantes Poreacutem devido ao fato de o banco de dados conter todas as informaccedilotildees detodos os projetos e todas as suas versotildees queries que possuem uma alta complexidadedemoravam muito tempo para retornar os dados

Assim com o objetivo de facilitar o trabalho alguns scripts python foram desenvolvi-dos para rodar as queries separadamente e individualmente para cada projeto de formaautomatizada a fim de melhorar o tempo de resposta para obtenccedilatildeo dos resultados

29

441 Meacutedia de Lambda

O primeiro script retorna a quantidade de expressotildees lambda (ou AICs) por n snapshotsque contenha expressotildees lambda O objetivo eacute ter uma visatildeo geral da meacutedia de expressotildeeslambda e AICs utilizadas por cada projeto e como nem todos os snapshots coletados decada projeto possuem expressotildees lambda e AICs apenas aqueles com alguma expressatildeolambda ou AIC satildeo incluiacutedos no caacutelculo da meacutedia

Mmedia =sumn qtdLambdai

n

442 Anaacutelise Temporal

O segundo script retorna para cada projeto a soma total da quantidade de expressotildeeslambda AIC map() e filter() no projeto inteiro para cada versatildeo Ou seja tem-seo total de cada uma das quatro propriedades selecionadas para cada mecircs do projetoobtendo assim uma visatildeo temporal de evoluccedilatildeo do uso das caracteriacutesticas descritas ATabela 41 ilustra parcialmente o resultado obtido para o projeto agera onde idVersaoeacute o identificador no banco de dados referente ao hash do commit mensal coletado qtd eacutea quantidade de cada uma das caracteriacutesticas escolhidas e a data do commit encontra-seno formato americano

Tabela 41 Informaccedilotildees mensais sobre o projeto ageraidVersao Data do Commit qtd lambda qtd AIC qtd maps qtd filter

823 512016 0 29 4 0755 612016 13 28 4 0686 6152016 13 29 4 0621 812016 13 29 4 0555 8162016 13 30 4 0485 922016 13 30 4 0422 10132016 14 30 4 0356 11282016 14 30 4 0295 12212016 21 30 5 0232 212017 21 30 5 0175 312017 21 30 5 0112 3312017 21 36 5 048 4242017 21 48 5 0

Os resultados obtidos com esta anaacutelise temporal permitiu a identificaccedilatildeo de padrotildees nautilizaccedilatildeo de expressotildees lambda em relaccedilatildeo a utilizaccedilatildeo de AIC por todos os projetos Foi

30

possiacutevel classificar todos os projetos em 6 grupos ilustrado na Figura 45 Primeiramenteseparou-se os projetos entre os que possuem expressotildees lambda e os que natildeo possuemDentre os que possuem identificou-se cinco categorias

1 Grupo 1 Quantidade de AICs e expressotildees lambda aumentam com o tempo pro-porcionalmente

2 Grupo 2 Quantidade de AICs diminui agrave medida que a quantidade de expressotildeeslambda aumentam e a quantidade de expressotildees lambda ultrapassa a quantidade deAIC em um determinado momento

3 Grupo 3 Quantidade de AICs diminui agrave medida que a quantidade de expressotildeeslambda aumentam mas a quantidade de AIC permanece superior agrave quantidade delambda

4 Grupo 4 Expressotildees lambda satildeo introduzidas e existem por um pequeno periacuteodode tempo mas satildeo completamente removidas posteriormente

5 Grupo 5 Quantidade de expressotildees lambda eacute constante e muito inferior compa-rado com a quantidade de AICs no projeto Foi determinado que para pertencera esta classificaccedilatildeo o projeto precisa ter uma razatildeo de meacutedia de expressotildees lamb-dasnapshot por meacutedia de AICsnapshot inferior a 020 Esse paracircmetro foi esta-belecido com o objetivo de definir um padratildeo para o que pode ser considerado umprojeto com poucas expressotildees lambda

Figura 45 Classificaccedilatildeo dos projetos

31

443 Refatoraccedilatildeo de Coacutedigo

O uacuteltimo script teve como objetivo realizar uma tentativa inicial de identificar refatoraccedilatildeode coacutedigo da seguinte maneira para todos os projetos que possuem expressotildees lambdaforam identificados o mecircs imediatamente antes da introduccedilatildeo de expressotildees lambda e omecircs seguinte onde houve a primeira ocorrecircncia de lambda no projeto Assim realizou-se uma anaacutelise do tamanho em quantidade de linhas de coacutedigo de todos os meacutetodosdo projeto que no mecircs seguinte tiveram introduccedilatildeo de lambda Em seguida fez-se umacomparaccedilatildeo com os mesmos meacutetodos em relaccedilatildeo ao mecircs anterior e assim foi possiacuteveldetectar quais meacutetodos tiveram a quantidade de linhas de coacutedigo reduzidas o que seriaum indicativo natildeo necessariamente exclusivo de que uma refatoraccedilatildeo de coacutedigo possa terocorrido

Sabe-se que este meacutetodo de detecccedilatildeo de refatoraccedilatildeo de coacutedigo possui suas limitaccedilotildeesuma vez que as comparaccedilotildees para saber se um meacutetodo existe em ambas versotildees eacute feitopuramente por comparaccedilatildeo de String (nome do meacutetodo) e a classe que este pertence

444 Casos de Uso

Os meacutetodos descritos acima ajudaram a identificar alguns padrotildees e facilitar a anaacutelise dosdados Poreacutem natildeo satildeo suficientes para que se possa responder agraves questotildees de pesquisaDessa forma apoacutes a identificaccedilatildeo dos grupos de classificaccedilatildeo para os projetos foramescolhidos um projeto de cada grupo (com exceccedilatildeo do grupo dos projetos sem expressotildeeslambda) para realizar um breve estudo de caso com o objetivo de identificar e caracterizarmelhor a adoccedilatildeo de expressotildees lambda Os projetos escolhidos foram agera vertxAndroid-CleanArchitecture RxJava e guava

32

Capiacutetulo 5

Resultados Obtidos e Anaacutelise

Neste capiacutetulo seratildeo apresentados os dados obtidos e anaacutelise com o objetivo de responderagraves questotildees de pesquisa propostas Como mencionado anteriormente as perguntas seratildeorespondidas de duas maneiras algumas com informaccedilotildees gerais sobre todos os projetose outras com breve estudos de caso envolvendo cinco projetos

51 Visatildeo Geral

Dentre os repositoacuterios coletados para a anaacutelise 74 (7474) natildeo utilizaram nenhumaexpressatildeo lambda no projeto durante todo o periacuteodo analisado (Janeiro de 2013 a Abrilde 2017) restando apenas 25 repositoacuterios (2525) com expressotildees lambda Eacute interessantedestacar que apesar de a quantidade de repositoacuterios que natildeo possuem expressotildees lambdaser relativamente expressiva muitos destes repositoacuterios satildeo de projetos em Java que umdia foram populares e atualmente natildeo estatildeo sendo mais desenvolvidos (por exemplo umaplicativo que soacute funciona para Android 23 atualmente descontinuado)

Levando em consideraccedilatildeo apenas os projetos que possuem expressotildees lambda exis-tem dois tipos de dados que podem ser analisados para responder agrave primeira questatildeo depesquisa atraveacutes dos dados obtidos pelo meacutetodo anteriormente mencionado como anaacutelisetemporal e a meacutedia de lambda por snapshot mencionados no capiacutetulo anterior

Com relaccedilatildeo ao ano em que a primeira ocorrecircncia foi encontrada 6 projetos introduzi-ram expressotildees lambda jaacute em 2014 8 comeccedilaram a utilizar em 2015 7 em 2016 e apenas4 tiveram a primeira ocorrecircncia de expressotildees lambda em 2017 Dessa forma percebe-seque os projetos estatildeo relativamente bem distribuiacutedos em grupos quanto ao ano em que seintroduziu expressotildees lambda

Pela meacutedia de lambda por snapshot (lambdasnapshot) a maioria (11 projetos) possuiuma quantidade expressiva acima de 100 lambdasnapshot (com 6 projetos entre 20 e 100lambdasnapshot e 8 projetos com menos de 20 lambdasnapshot) como apresentados no

33

graacutefico da Figura 51 Isso mostra que essa nova caracteriacutestica jaacute estaacute sendo bem utilizadanos projetos que comeccedilaram a migrar para a nova versatildeo do Java

Figura 51 Graacuteficos dos projetos separados por ano de introduccedilatildeo de expressotildees lambdae meacutedia de lambda por snapshot

Com isso pode-se observar que apesar de a quantidade de projetos que possuemexpressotildees lambda natildeo ser tatildeo alta eacute possiacutevel obter resultados expressivos uma vez quea quantidade dos projetos com lambda estatildeo bem dispersos quanto ao periacuteodo em quecomeccedilaram a adotar essa caracteriacutestica e a quantidade de expressotildees lambda por snapshot

511 Projetos Selecionados

Atraveacutes dos grupos de classificaccedilatildeo identificados pela anaacutelise temporal descritos na Figura45 cinco projetos foram selecionados para uma anaacutelise detalhada levando em consideraccedilatildeoo grupo em que eles pertencem Estes projetos seratildeo apresentados a seguir

512 agera

Agera eacute uma biblioteca Android que ajuda a introduzir programaccedilatildeo funcional reativa(functional reactive programming) em projetos Android Eacute um projeto recente lanccediladoem 2016 pela Google [44] e encontra-se no grupo dos projetos que introduziram expressotildeeslambda em 2016 no mesmo ano de seu lanccedilamento contendo uma meacutedia de expressotildeeslambda de 16 lambdasnapshot

Na classificaccedilatildeo estabelecida agera pertence ao Grupo 1 onde a quantidade de ex-pressotildees lambda no projeto com o tempo aumentam juntamente com a quantidade deAICs como mostra o graacutefico de anaacutelise temporal na Figura 52

34

Figura 52 Graacuteficos de anaacutelise temporal do projeto agera

513 vertx

Eclipse Vertx eacute um conjunto de ferramentas para criaccedilatildeo de reactive applications namaacutequina virtual Java (JVM) em grande escala [45] Seu primeiro lanccedilamento aconteceuem 2011 e a primeira ocorrecircncia de expressotildees lambda no projeto aconteceu em 2014 Esteprojeto possui uma meacutedia de 2867 lambdasnapshot e dentre os projetos consideradosneste trabalho eacute o que possui a maior quantidade de expressotildees lambda

Este projeto pertence ao Grupo 2 onde a quantidade de expressotildees lambda aumen-tou consideravelmente pelos meses ultrapassando a quantidade de AICs que diminuiudrasticamente como mostra a Figura 53

35

Figura 53 Graacuteficos de anaacutelise temporal do projeto Vertx

514 Android-CleanArchitecture

Apesar de ser uma amostra de projeto Android-CleanArchitecture que tem como objetivoconstruir aplicaccedilotildees Android utilizando clean architecture foi lanccedilado em 2014 mas semanteacutem sempre atualizado [46]

A introduccedilatildeo de expressotildees lambda que aconteceu no ano de 2015 se deu de formatiacutemida com uma meacutedia de 35 lambdasnapshot De qualquer forma este projeto conseguerepresentar com seu graacutefico de anaacutelise temporal o grupo 3 composto por projetos em quea quantidade de expressotildees lambda aumentou mas sem ultrapassar AICs que diminuiacuteramdemonstrado no graacutefico da Figura 54

36

Figura 54 Graacuteficos de anaacutelise temporal do projeto Android-CleanArchitecture

515 RxJava

Dentre os repositoacuterios estudados RxJava eacute considerado o mais popular Como umaimplementaccedilatildeo de Reactive Extensions para a JVM RxJava teve seu lanccedilamento dadoem 2013 [47] Expressotildees lambda apareceram pela primeira vez no ano de 2015 comuma meacutedia de 766 lambdasnapshot

Apesar de uma meacutedia relativamente alta o tempo de vida das expressotildees lambda nesteprojeto foi bem curto caracterizando assim projetos do grupo 4 houve a introduccedilatildeo dasexpressotildees lambda no projeto poreacutem houve a remoccedilatildeo completa de todas as expressotildeeslambda previamente introduzidas desaparecendo completamente do projeto ateacute a datada coleta de dados (Figura 55)

37

Figura 55 Graacuteficos de anaacutelise temporal do projeto RxJava

516 guava

Guava eacute um conjunto de bibliotecas para Java da Google lanccedilado em 2011 A atualizaccedilatildeodo coacutedigo do projeto para Java 8 aconteceu somente em 2016 e apesar do projeto conteruma meacutedia de 281 lambdasnapshot ele foi escolhido como representante dos projetosdo Grupo 5 (Figura 56) que possuem expressotildees lambda mas de forma natildeo expressiva osuficiente quando comparado com a quantidade de AIC pelo fato de sua razatildeo de meacutedia delambdasnapshot por meacutedia de AICsnapshot ser 004 Ou seja embora o projeto tenhaexpressotildees lambda estas satildeo consideradas muito poucas quando inseridas no contextogeral deste projeto que eacute considerado um projeto grande

38

Figura 56 Graacuteficos de anaacutelise temporal do projeto Guava

52 Refatoraccedilatildeo de Coacutedigo

Com o objetivo de caracterizar melhor como as expressotildees lambda estatildeo sendo utilizadaseacute interessante identificar se estas estatildeo sendo introduzidas atraveacutes de refatoraccedilatildeo de coacutedigoou em coacutedigo novo

Os projetos classificados como pertencentes ao Grupo 2 possuem em comum o fatode expressotildees lambda aumentarem a medida que AICs diminuem ultrapassando-as eessa caracteriacutestica em comum pode indicar que nestes projetos possivelmente houve re-fatoraccedilatildeo de coacutedigo visto que AIC sendo substituiacutedo por expressotildees lambda dentro dascondiccedilotildees determinadas eacute a maneira mais comum de se identificar refatoraccedilatildeo de coacute-digo para introduccedilatildeo de expressotildees lambda [12] Os projetos que compotildeem o grupo 2representam 44 de todos os projetos estudados que possuem expressotildees lambda o quepode ser um indicativo caso a hipoacutetese de refatoraccedilatildeo de coacutedigo seja positiva de quemuitos projetos que estatildeo adotando o Java 8 estatildeo se preocupando de alguma formacom refatoraccedilatildeo se coacutedigo Fazem parte desse grupo os seguintes projetos elasticsearchjava-design-patterns PocketHub presto RxJava-Android-Samples spark vertx zipkinjava8-tutorial dropwizard e material-dialogs

39

Outra maneira de verificar possiacuteveis indicadores de refatoraccedilatildeo de coacutedigo foi atraveacutesda anaacutelise dos tamanhos (em quantidade de linhas de coacutedigo) dos meacutetodos com expressotildeeslambda no mecircs em que se introduziu expressotildees lambda e um mecircs imediatamente antesdeste Essa anaacutelise mostra que dos 25 projetos com expressotildees lambda 12 (48) projetostiveram ao menos um meacutetodo em que houve uma diminuiccedilatildeo no tamanho o que podeser considerado um indicativo de refatoraccedilatildeo de coacutedigo A Figura 57 mostra todos osprojetos em relaccedilatildeo agrave quantidade total de meacutetodos que possuem lambda no primeiro mecircsde introduccedilatildeo do mesmo em vermelho comparado com a quantidade desses meacutetodos quetiveram uma diminuiccedilatildeo no tamanho quando comparados com o coacutedigo do mecircs anteriorem azul

Figura 57 Comparaccedilatildeo entre todos os projetos com expressatildeo lambda sobre refatoraccedilatildeode coacutedigo no mecircs de introduccedilatildeo da caracteriacutestica

Ainda observando a figura 57 com relaccedilatildeo aos projetos que natildeo tiveram nenhummeacutetodo com diminuiccedilatildeo de tamanho (barra azul) percebe-se que todos os 13 projetossequer tiveram uma quantidade significativa de meacutetodos que possuem expressotildees lambda(com o maior tendo apenas 5 meacutetodos) no mecircs de introduccedilatildeo da caracteriacutestica no projetoe ao mesmo tempo jaacute existiam no mecircs em que natildeo existia lambda no projeto Essa eacuteuma observaccedilatildeo importante porque projetos como vertx sendo este o que possui a maiormeacutedia de lambdasnapshot de todos os projetos e ao mesmo tempo tendo apenas trecircsmeacutetodos que continham expressotildees lambda no mecircs da introduccedilatildeo e que existiam no mecircs

40

anterior permitem inferir que todas as outras expressotildees lambda existentes no projetopara este determinado mecircs de introduccedilatildeo encontram-se em coacutedigo novo introduzido

Eacute importante ressaltar que somente essa anaacutelise natildeo eacute exclusivamente suficiente paradeterminar se estes projetos estatildeo realmente introduzindo lambda em coacutedigo novo ourealizando refatoraccedilatildeo uma vez que como a comparaccedilatildeo aconteceu apenas no mecircs deintroduccedilatildeo com o mecircs imediatamente anterior natildeo reflete todo o ciclo de vida do pro-jeto Por exemplo algumas equipes podem escolher refatorar o coacutedigo depois de umtempo de adaptaccedilatildeo apoacutes a transiccedilatildeo para a nova versatildeo da linguagem Assim paraobter uma melhor anaacutelise sobre refatoraccedilatildeo de coacutedigo ou natildeo feita nestes projetos aleacutemde outras anaacutelises referentes aos padrotildees tipicamente adotados para implementaccedilatildeo delambda nestes projetos seratildeo apresentados a seguir os estudos de caso dos cinco projetospreviamente selecionados

Outro ponto importante eacute o fato de que apesar das informaccedilotildees quanto agraves quantida-des de filter e map terem sido incluiacutedas inicialmente no trabalho para observar possiacuteveispadrotildees de refatoraccedilatildeo de coacutedigo percebeu-se que estas natildeo satildeo utilizadas de forma con-sideraacutevel pelos projetos estudados e para fins de anaacutelises generalizadas natildeo apresentaramtanta influecircncia na utilizaccedilatildeo de expressotildees lambda quanto a quantidade de AICs noprojeto

53 Estudos de Caso

Dentre os projetos analisados verificou-se que os projetos de pequeno e meacutedio porte op-taram por refatorar de uma vez seus coacutedigos para incluir expressotildees lambda em situaccedilotildeesem que se utilizava AICs anteriormente ou em alguns poucos casos de utilizaccedilatildeo deCollection Os projetos de grande porte natildeo apresentaram nenhuma refatoraccedilatildeo de coacute-digo ou uma refatoraccedilatildeo parcial gradativa provavelmente devido agrave grande quantidade dearquivos e coacutedigo que possuem o que pode tornar o trabalho de refatoraccedilatildeo extenso ecansativo

O projeto vertx que pertence ao grupo 2 dos projetos em que a quantidade de ex-pressotildees lambda aumentaram e as de AICs diminuiacuteram com lambda ultrapassando AICsexecutou inicialmente commits em maio de 2014 com adiccedilatildeo de coacutedigo novo utilizandoexpressotildees lambda e apoacutes um mecircs realizou um commit maior com a refatoraccedilatildeo de todasas AICs para expressotildees lambda Apoacutes a refatoraccedilatildeo o projeto se preocupou em mantera utilizaccedilatildeo de expressotildees lambda ao mesmo tempo que o uso de AICs se manteve apenasaos casos de classes com interfaces natildeo funcionais A Figura 58 apresenta uma parte docommit de refatoraccedilatildeo de coacutedigo que mostra em vermelho a parte eliminada do coacutedigo(AIC) e em verde o coacutedigo novo representando a substituiccedilatildeo por uma expressatildeo lambda

41

Figura 58 Commit de refatoraccedilatildeo de coacutedigo do projeto Vertx [3]

Alguns projetos ainda natildeo se preocuparam em refatorar o coacutedigo para o uso de ex-pressotildees lambda ateacute a data deste trabalho que eacute o caso do projeto guava que apresentouum commit em 03112016 com a atualizaccedilatildeo do projeto para Java 8 Mas a partir daatualizaccedilatildeo se preocupou em utilizar as expressotildees lambda apenas na implementaccedilatildeo decoacutedigo novo O cenaacuterio em que a refatoraccedilatildeo natildeo eacute prioridade ainda eacute a realidade de vaacuteriosprojetos de grande porte visto que os dados de projetos sem nenhuma expressatildeo lambdasatildeo o maior nuacutemero neste trabalho Poreacutem projetos que jaacute adotaram a utilizaccedilatildeo do Java8 tendem a mudar isso com o passar do tempo A Figura 59 apresenta em verde umaadiccedilatildeo de coacutedigo novo com expressatildeo lambda sem a eliminaccedilatildeo de algum coacutedigo anteriora esse que estaria em vermelho

42

Figura 59 Exemplo de um arquivo do commit de adiccedilatildeo de coacutedigo novo em Java 8 doprojeto Guava [4]

Na categoria de projetos em que os AICs e expressotildees lambda aumentam proporci-onalmente (grupo 1) o projeto agera realizou um commit em 19052016 com a adiccedilatildeoda biblioteca retrolambda como dependecircncia do projeto Essa biblioteca utilizada prin-cipalmente por projetos Android permite executar coacutedigo Java 8 contendo expressotildeeslambda em Java 5 6 e 7 [48] O commit tambeacutem apresenta refatoraccedilatildeo dos AICs ad-vindos de interfaces funcionais para expressotildees lambda Apesar de o projeto continuar autilizar as expressotildees lambda em seus commits posteriores o nuacutemero de AICs tambeacutemcontinuou a aumentar visualizando os commits posteriores notou-se que esses AICs satildeorelativos a interfaces natildeo funcionais ou seja que possuem mais de um meacutetodo O projetoAndroid-CleanArchitecture eacute similar ao agera pois tambeacutem optou pela instalaccedilatildeo da bi-blioteca retrolambda para uso de expressotildees lambda em seus coacutedigos e como tambeacutem eacuteum projeto de pequeno porte houve uma pequena refatoraccedilatildeo dos AICs A Figura 510mostra a parte do commit de refatoraccedilatildeo de coacutedigo em que o desenvolvedor adiciona abiblioteca retrolambda como dependecircncia

43

Figura 510 Commit de adiccedilatildeo da biblioteca Retrolambda no projeto Agera [5]

Outro caso interessante eacute o do projeto RxJava que em 2015 optou pela refatoraccedilatildeodo coacutedigo para a utilizaccedilatildeo de expressotildees lambda quase eliminando por completo o usode AICs mas que no ano seguinte reverteu os commits de forma que eliminasse comple-tamente o uso de expressotildees lambda para manter a retrocompatibilidade com o Java 6A Figura 511 demonstra uma parte do commit de reversatildeo do coacutedigo para Java 6 emque pode ser visto em vermelho o coacutedigo anterior com expressotildees lambda e o verde como novo coacutedigo utilizando AIC novamente

44

Figura 511 Commit de remoccedilatildeo de Lambdas e volta para o uso de AICs no projetoRXJava [6]

Essa preocupaccedilatildeo com retrocompatibilidade de coacutedigo pode ser um fator crucial nadecisatildeo das equipes de desenvolvimento na hora de decidir como fazer o software co-evoluircom a linguagem sem perder a compatibilidade com versotildees anteriores

45

Capiacutetulo 6

Consideraccedilotildees Finais

Este estudo permitiu entender melhor como projetos estatildeo realizando a migraccedilatildeo para oJava 8 em especial utilizando uma nova caracteriacutestica introduzida expressatildeo lambdaApesar de a maioria dos projetos populares considerados natildeo possuiacuterem nenhuma ocor-recircncia de expressotildees lambda os projetos que tinham expressotildees lambda foram suficientespara realizar um primeiro estudo de caracterizaccedilatildeo no uso desta caracteriacutestica e com osprojetos efetivamente utilizados para estudo foi possiacutevel agrupaacute-los quanto a maneira emque as expressotildees lambda estavam sendo utilizadas quando comparadas com AICs em 5grandes grupos quando AIC e lambda aumentam proporcionalmente quando AIC dimi-nui e lambda aumenta ultrapassando AIC quando AIC diminui mas continua superior aolambda crescente expressotildees lambda que foram introduzidas e retiradas completamentedo coacutedigo e expressotildees lambda que natildeo existem em quantidades expressivas

Foi possiacutevel entatildeo realizar um estudo aprofundado levando em consideraccedilatildeo as di-ferentes maneiras com que as expressotildees lambda foram adotadas nos projetos atraveacutes daescolha de um projeto que representasse cada grupo para anaacutelise Dentre os cinco projetosestudados foi possiacutevel observar alguns padrotildees tipicamente adotados por desenvolvedorespara implementar expressotildees lambda em seus projetos como a utilizaccedilatildeo da bibliotecas(retrolambda) que permitissem uma flexibilizaccedilatildeo na utilizaccedilatildeo de expressotildees lambda oucomo lambda eacute primariamente utilizada para substituir determinados AICs ou operaccedilotildeesem Collection

Aleacutem disso foi possiacutevel observar como a refatoraccedilatildeo de coacutedigo acontece em cada umdesses projetos Observou-se como projetos menores tendem a refatorar coacutedigo maisfacilmente ao passo que projetos maiores e mais complexos fazem menos refatoraccedilatildeo oudemoram mais entre o periacuteodo em que houve a primeira migraccedilatildeo de coacutedigo para a novaversatildeo da linguagem ateacute o periacuteodo em que realmente decidem refatorar coacutedigo Aleacutem dacomplexidade do projeto influenciar na decisatildeo de migrar o projeto para uma versatildeo maisrecente da linguagem a preocupaccedilatildeo com retrocompatibilidade com versotildees anteriores da

46

linguagem tambeacutem podem ser uma barreira para que projetos comecem a evoluir o coacutedigojuntamente com a evoluccedilatildeo da linguagem

Ainda assim foi possiacutevel observar que a preocupaccedilatildeo com a co-evoluccedilatildeo do software-linguagem existe entre os desenvolvedores de projetos mas a realizaccedilatildeo da migraccedilatildeo aindaacontece lentamente devido agrave diversos fatores que precisam ser levados em consideraccedilatildeopara a manutenccedilatildeo do projeto

Para trabalhos e contribuiccedilotildees futuras seria interessante desenvolver uma ferramentaque pudesse analisar diretamente no coacutedigo-fonte as oportunidades de aplicaccedilatildeo de ex-pressotildees lambda dessa forma poderiam ser analisadas as porcentagens de conversatildeo decoacutedigo para Java 8 e obter melhores conclusotildees sobre a importacircncia que os projetos estatildeodando para a evoluccedilatildeo de seus coacutedigos Outro fator interessante seria aplicar mais Visitorsagrave ferramenta static-analysis e fazer este mesmo estudo aplicado agrave outras caracteriacutesticasda linguagem

47

Referecircncias

[1] Kagdi Huzefa Michael L Collard e Jonathan I Maletic A survey and taxonomyof approaches for mining software repositories in the context of software evolution2007 ix 3 8 9 10 11

[2] DBeaver Dbeaver - features httpdbeaverjkissorgdocsfeatures ix 29

[3] Eclipse Vertx commit Java8-ify code httpsgithubcomeclipsevertxcommit93f95e9c77419f442a42fe711b6eeaef88192fd3 ix 42

[4] Google Guava commit Release java 8 changes to guava httpsgithubcomgoogleguavacommit73e382fa877f80994817a136b0adcc4365ccd904 ix 43

[5] Google Agera commit Collapsed testapp with retrolambda httpsgithubcomgoogleageracommit5e518b7b05f9e7a34a314945f68deff7b2c3e334 ix 44

[6] ReactiveX Rxjava commit 2x full jdk 6 compatible backport + includ-ing bugfixes up to today httpsgithubcomReactiveXRxJavacommit000a174d87a901135f9665d3b11f3627fd2dc4ed ix 45

[7] Godfrey M W e D M German The past present and future of software evolutionEm 2008 Frontiers of Maintenance paacuteginas 129ndash138 Sept 2008 1 6

[8] Favre J M Languages evolve too changing the software time scale Em Principles ofSoftware Evolution Eighth International Workshop on paacuteginas 33ndash42 IEEE 20051 5 7

[9] Overbey Jeffrey L e Ralph E Johnson Regrowing a language refactoring tools allowprogramming languages to evolve Em ACM SIGPLAN Notices volume 44 paacuteginas493ndash502 ACM 2009 1 5 7 8 12

[10] Grechanik Mark Collin McMillan Luca DeFerrari Marco Comi Stefano CrespiDenys Poshyvanyk Chen Fu Qing Xie e Carlo Ghezzi An empirical investiga-tion into a large-scale java open source code repository Em Proceedings of the2010 ACM-IEEE International Symposium on Empirical Software Engineering andMeasurement ESEM rsquo10 paacuteginas 111ndash1110 New York NY USA 2010 ACMISBN 978-1-4503-0039-1 httpdoiacmorg10114518527861852801 1

[11] TIOBE Tiobe httpswwwtiobecomtiobe-index 1 14

48

[12] Gyori Alex Lyle Franklin Danny Dig e Jan Lahoda Crossing the gap from im-perative to functional programming through refactoring Em Proceedings of the 20139th Joint Meeting on Foundations of Software Engineering ESECFSE 2013 paacute-ginas 543ndash553 New York NY USA 2013 ACM ISBN 978-1-4503-2237-9 httpdoiacmorg10114524914112491461 2 11 24 39

[13] OpenJDK State of the lambda httpcropenjdkjavanet~briangoetzlambdalambda-state-4html 2

[14] Han Jiawei Micheline Kamber e Jian Pei Data Mining Concepts and TechniquesMorgan Kaufmann Publishers Inc San Francisco CA USA 3rd ediccedilatildeo 2011ISBN 0123814790 9780123814791 3

[15] Fowler Martin e Kent Beck Refactoring improving the design of existing codeAddison-Wesley Professional 1999 5 7

[16] Lehman M M J F Ramil P D Wernick D E Perry e W M Turski Met-rics and laws of software evolution - the nineties view Em Proceedings of the4th International Symposium on Software Metrics METRICS rsquo97 paacuteginas 20ndashWashington DC USA 1997 IEEE Computer Society ISBN 0-8186-8093-8 httpdlacmorgcitationcfmid=823454823901 6

[17] Hassan Ahmed E e Tao Xie Software intelligence The future of mining softwareengineering data Em Proceedings of the FSESDP Workshop on Future of SoftwareEngineering Research FoSER rsquo10 paacuteginas 161ndash166 New York NY USA 2010ACM ISBN 978-1-4503-0427-6 httpdoiacmorg101145188236218823978 9

[18] Hassan Ahmed E The road ahead for mining software repositories Em Frontiers ofSoftware Maintenance 2008 FoSM 2008 paacuteginas 48ndash57 IEEE 2008 8

[19] Berry Michael J e Gordon Linoff Data Mining Techniques For Marketing Salesand Customer Support John Wiley amp Sons Inc New York NY USA 1997ISBN 0471179809 10

[20] Parnin Chris Christian Bird e Emerson Murphy-Hill Java generics adoption hownew features are introduced championed or ignored Em Proceedings of the 8thWorking Conference on Mining Software Repositories paacuteginas 3ndash12 ACM 2011 12

[21] Oracle The java language specification httpsdocsoraclecomjavasespecsjlsse8jls8pdf 13

[22] Oracle The history of java technology httpwwworaclecomtechnetworkjavajavaseoverviewjavahistory-index-198355html 13

[23] Murphy Kieron So why did they decide to call itjava httpwwwjavaworldcomarticle2077265core-javaso-why-did-they-decide-to-call-it-java-html 13

[24] McGraw Tata Object-oriented Programming with Java Essentials and ApplicationsHill Education 13

49

[25] Oracle Differences between java ee and java se httpdocsoraclecomjavaee6firstcupdocgkhoyhtml 13

[26] Lindsey Clark S The History of Java Cambridge 14

[27] Oracle The java language environment httpwwworaclecomtechnetworkjavaintro-141325html 14

[28] Oracle Jdk 8 httpopenjdkjavanetprojectsjdk8 15 24

[29] Oracle Enhancements in java se 8 httpdocsoraclecomjavase8docstechnotesguideslanguageenhancementshtmljavase8 15 16 17

[30] Oracle Lambda expressions httpdocsoraclecomjavasetutorialjavajavaOOlambdaexpressionshtml 16 18 21

[31] Oracle Method references httpdocsoraclecomjavasetutorialjavajavaOOmethodreferenceshtml 16

[32] Oracle Default methods httpdocsoraclecomjavasetutorialjavaIandIdefaultmethodshtml 17

[33] Oracle Repeating annotations httpdocsoraclecomjavasetutorialjavaannotationsrepeatinghtml 17

[34] Oracle Type annotations httpdocsoraclecomjavasetutorialjavaannotationstype_annotationshtml 17

[35] Oracle Anonymous inner classes httpsdocsoraclecomjavasetutorialjavajavaOOanonymousclasseshtml 19

[36] Kothari CR Research Methodology Methods and Techniques New Age Interna-tional (P) Limited 2004 ISBN 9788122415223 httpsbooksgooglecombrbooksid=8c6gkbKi-F4C 22

[37] Nakakoji Kumiyo Yasuhiro Yamamoto Yoshiyuki Nishinaka Kouichi Kishida eYunwen Ye Evolution patterns of open-source software systems and communitiesEm IWPSE rsquo02 Proceedings of the International Workshop on Principles of SoftwareEvolution paacuteginas 76ndash85 New York NY USA 2002 ACM Press ISBN 1581135459httpdxdoiorg101145512035512055 23

[38] Rahman Foyzur Christian Bird e Premkumar Devanbu Clones What is that smellEmpirical Software Engineering 17(4-5)503ndash530 2012 24

[39] Chacon Scott Pro Git Apress Berkely CA USA 1st ediccedilatildeo 2009ISBN 1430218339 9781430218333 25

[40] Cavalcanti Thiago Gomes e Viniacutecius Correa de Almeida Caracterizaccedilatildeo do uso deconstruccedilotildees da linguagem java em projetos open-source Publicaccedilatildeo online 2016httpbdmunbbrhandle1048315733 27

50

[41] Parr Terence Language Implementation Patterns Create Your Own Domain-Specific and General Programming Languages Pragmatic Bookshelf 1st ediccedilatildeo 2009ISBN 193435645X 9781934356456 27

[42] Janssen Thorben 5 reasons to use jpa hibernate Publicaccedilatildeo online httpswwwsitepointcom5-reasons-to-use-jpa-hibernate 27

[43] Franklin Lyle Alex Gyori Jan Lahoda e Danny Dig Lambdaficator From imperativeto functional programming through automated refactoring Em Proceedings of the2013 International Conference on Software Engineering ICSE rsquo13 paacuteginas 1287ndash1290 Piscataway NJ USA 2013 IEEE Press ISBN 978-1-4673-3076-3 httpdlacmorgcitationcfmid=24867882486986 29

[44] Google Agera httpsgithubcomgoogleagerawiki 34

[45] Eclipse Eclipse vertx httpvertxio 35

[46] Cejas Fernando Android cleanarchitecture httpsgithubcomandroid10Android-CleanArchitecture 36

[47] ReactiveX Rxjava httpsgithubcomReactiveXRxJava 37

[48] Luontola Esko Retrolambda httpsgithubcomorfjackalretrolambda 43

51

Anexo I

Projetos utilizados

fastjson

platform_frameworks_base

netty

material-dialogs

kotlin

okhttp

tinker

AndroidUtilCode

RxJava

spring-boot

java-design-patterns

elasticsearch

ExoPlayer

kafka

vertx

realm-java

guava

zipkin

bazel

stetho

Signal-Android

glide

agera

fresco

plaid

presto

libgdx

spark

52

disruptor

lottie-android

flexbox-layout

PocketHub

zxing

spring-framework

deeplearning4j

dropwizard

interviews

BaseRecyclerViewAdapterHelper

uCrop

DanmakuFlameMaster

lottie-react-native

android-UniversalMusicPlayer

AndroidInterview-Q-A

greenDAO

retrofit

MaterialDrawer

BottomBar

druid

MPAndroidChart

Hystrix

guice

recyclerview-animators

dubbo

androidannotations

RxJava-Android-Samples

PhotoView

clojure

CircleImageView

AndroidSwipeLayout

jedis

MaterialViewPager

butterknife

junit4

RxBinding

leakcanary

SimianArmy

picasso

UltimateRecyclerView

53

AndroidViewAnimations

AppIntro

FizzBuzzEnterpriseEdition

ion

cheesesquare

physical-web

RxAndroid

Android-CleanArchitecture

Calligraphy

Android-Bootstrap

iosched

Android_Data

MaterialDesignLibrary

ListViewAnimations

EventBus

java8-tutorial

AndroidSlidingUpPanel

dagger

okhttputils

logger

HomeMirror

Material-Animations

android-Ultra-Pull-To-Refresh

android-async-http

Android-ObservableScrollView

Android-Universal-Image-Loader

ActionBarSherlock

SlidingMenu

storm

PagerSlidingTabStrip

Android-PullToRefresh

54

  • Dedicatoacuteria
  • Agradecimentos
  • Resumo
  • Abstract
  • Introduccedilatildeo
    • Contexto
    • Objetivos
      • Objetivos Gerais
      • Objetivos Especiacuteficos
        • Metodologia
        • Organizaccedilatildeo do Trabalho
          • Evoluccedilatildeo e Mineraccedilatildeo de Repositoacuterios de Software
            • Evoluccedilatildeo de Software
            • MSR Mineraccedilatildeo de dados e a Engenharia de Software
              • Classificaccedilatildeo
                • Trabalhos Relacionados
                  • Java SE 8 e JDK 8
                    • Histoacuterico
                    • Princiacutepios
                    • Evoluccedilatildeo
                    • Expressotildees Lambda
                      • Sintaxe
                      • Principais formas de uso
                          • Estudo e o Processo de Mineraccedilatildeo
                            • Questotildees de Pesquisa
                            • Fonte de Dados e Objetos de Estudo
                            • Processo de Mineraccedilatildeo
                              • static-analysis
                              • BDAnalisador
                                • Classificaccedilatildeo e Anaacutelise
                                  • Meacutedia de Lambda
                                  • Anaacutelise Temporal
                                  • Refatoraccedilatildeo de Coacutedigo
                                  • Casos de Uso
                                      • Resultados Obtidos e Anaacutelise
                                        • Visatildeo Geral
                                          • Projetos Selecionados
                                          • agera
                                          • vertx
                                          • Android-CleanArchitecture
                                          • RxJava
                                          • guava
                                            • Refatoraccedilatildeo de Coacutedigo
                                            • Estudos de Caso
                                              • Consideraccedilotildees Finais
                                              • Referecircncias
                                              • Anexo
                                              • Projetos utilizados

441 Meacutedia de Lambda

O primeiro script retorna a quantidade de expressotildees lambda (ou AICs) por n snapshotsque contenha expressotildees lambda O objetivo eacute ter uma visatildeo geral da meacutedia de expressotildeeslambda e AICs utilizadas por cada projeto e como nem todos os snapshots coletados decada projeto possuem expressotildees lambda e AICs apenas aqueles com alguma expressatildeolambda ou AIC satildeo incluiacutedos no caacutelculo da meacutedia

Mmedia =sumn qtdLambdai

n

442 Anaacutelise Temporal

O segundo script retorna para cada projeto a soma total da quantidade de expressotildeeslambda AIC map() e filter() no projeto inteiro para cada versatildeo Ou seja tem-seo total de cada uma das quatro propriedades selecionadas para cada mecircs do projetoobtendo assim uma visatildeo temporal de evoluccedilatildeo do uso das caracteriacutesticas descritas ATabela 41 ilustra parcialmente o resultado obtido para o projeto agera onde idVersaoeacute o identificador no banco de dados referente ao hash do commit mensal coletado qtd eacutea quantidade de cada uma das caracteriacutesticas escolhidas e a data do commit encontra-seno formato americano

Tabela 41 Informaccedilotildees mensais sobre o projeto ageraidVersao Data do Commit qtd lambda qtd AIC qtd maps qtd filter

823 512016 0 29 4 0755 612016 13 28 4 0686 6152016 13 29 4 0621 812016 13 29 4 0555 8162016 13 30 4 0485 922016 13 30 4 0422 10132016 14 30 4 0356 11282016 14 30 4 0295 12212016 21 30 5 0232 212017 21 30 5 0175 312017 21 30 5 0112 3312017 21 36 5 048 4242017 21 48 5 0

Os resultados obtidos com esta anaacutelise temporal permitiu a identificaccedilatildeo de padrotildees nautilizaccedilatildeo de expressotildees lambda em relaccedilatildeo a utilizaccedilatildeo de AIC por todos os projetos Foi

30

possiacutevel classificar todos os projetos em 6 grupos ilustrado na Figura 45 Primeiramenteseparou-se os projetos entre os que possuem expressotildees lambda e os que natildeo possuemDentre os que possuem identificou-se cinco categorias

1 Grupo 1 Quantidade de AICs e expressotildees lambda aumentam com o tempo pro-porcionalmente

2 Grupo 2 Quantidade de AICs diminui agrave medida que a quantidade de expressotildeeslambda aumentam e a quantidade de expressotildees lambda ultrapassa a quantidade deAIC em um determinado momento

3 Grupo 3 Quantidade de AICs diminui agrave medida que a quantidade de expressotildeeslambda aumentam mas a quantidade de AIC permanece superior agrave quantidade delambda

4 Grupo 4 Expressotildees lambda satildeo introduzidas e existem por um pequeno periacuteodode tempo mas satildeo completamente removidas posteriormente

5 Grupo 5 Quantidade de expressotildees lambda eacute constante e muito inferior compa-rado com a quantidade de AICs no projeto Foi determinado que para pertencera esta classificaccedilatildeo o projeto precisa ter uma razatildeo de meacutedia de expressotildees lamb-dasnapshot por meacutedia de AICsnapshot inferior a 020 Esse paracircmetro foi esta-belecido com o objetivo de definir um padratildeo para o que pode ser considerado umprojeto com poucas expressotildees lambda

Figura 45 Classificaccedilatildeo dos projetos

31

443 Refatoraccedilatildeo de Coacutedigo

O uacuteltimo script teve como objetivo realizar uma tentativa inicial de identificar refatoraccedilatildeode coacutedigo da seguinte maneira para todos os projetos que possuem expressotildees lambdaforam identificados o mecircs imediatamente antes da introduccedilatildeo de expressotildees lambda e omecircs seguinte onde houve a primeira ocorrecircncia de lambda no projeto Assim realizou-se uma anaacutelise do tamanho em quantidade de linhas de coacutedigo de todos os meacutetodosdo projeto que no mecircs seguinte tiveram introduccedilatildeo de lambda Em seguida fez-se umacomparaccedilatildeo com os mesmos meacutetodos em relaccedilatildeo ao mecircs anterior e assim foi possiacuteveldetectar quais meacutetodos tiveram a quantidade de linhas de coacutedigo reduzidas o que seriaum indicativo natildeo necessariamente exclusivo de que uma refatoraccedilatildeo de coacutedigo possa terocorrido

Sabe-se que este meacutetodo de detecccedilatildeo de refatoraccedilatildeo de coacutedigo possui suas limitaccedilotildeesuma vez que as comparaccedilotildees para saber se um meacutetodo existe em ambas versotildees eacute feitopuramente por comparaccedilatildeo de String (nome do meacutetodo) e a classe que este pertence

444 Casos de Uso

Os meacutetodos descritos acima ajudaram a identificar alguns padrotildees e facilitar a anaacutelise dosdados Poreacutem natildeo satildeo suficientes para que se possa responder agraves questotildees de pesquisaDessa forma apoacutes a identificaccedilatildeo dos grupos de classificaccedilatildeo para os projetos foramescolhidos um projeto de cada grupo (com exceccedilatildeo do grupo dos projetos sem expressotildeeslambda) para realizar um breve estudo de caso com o objetivo de identificar e caracterizarmelhor a adoccedilatildeo de expressotildees lambda Os projetos escolhidos foram agera vertxAndroid-CleanArchitecture RxJava e guava

32

Capiacutetulo 5

Resultados Obtidos e Anaacutelise

Neste capiacutetulo seratildeo apresentados os dados obtidos e anaacutelise com o objetivo de responderagraves questotildees de pesquisa propostas Como mencionado anteriormente as perguntas seratildeorespondidas de duas maneiras algumas com informaccedilotildees gerais sobre todos os projetose outras com breve estudos de caso envolvendo cinco projetos

51 Visatildeo Geral

Dentre os repositoacuterios coletados para a anaacutelise 74 (7474) natildeo utilizaram nenhumaexpressatildeo lambda no projeto durante todo o periacuteodo analisado (Janeiro de 2013 a Abrilde 2017) restando apenas 25 repositoacuterios (2525) com expressotildees lambda Eacute interessantedestacar que apesar de a quantidade de repositoacuterios que natildeo possuem expressotildees lambdaser relativamente expressiva muitos destes repositoacuterios satildeo de projetos em Java que umdia foram populares e atualmente natildeo estatildeo sendo mais desenvolvidos (por exemplo umaplicativo que soacute funciona para Android 23 atualmente descontinuado)

Levando em consideraccedilatildeo apenas os projetos que possuem expressotildees lambda exis-tem dois tipos de dados que podem ser analisados para responder agrave primeira questatildeo depesquisa atraveacutes dos dados obtidos pelo meacutetodo anteriormente mencionado como anaacutelisetemporal e a meacutedia de lambda por snapshot mencionados no capiacutetulo anterior

Com relaccedilatildeo ao ano em que a primeira ocorrecircncia foi encontrada 6 projetos introduzi-ram expressotildees lambda jaacute em 2014 8 comeccedilaram a utilizar em 2015 7 em 2016 e apenas4 tiveram a primeira ocorrecircncia de expressotildees lambda em 2017 Dessa forma percebe-seque os projetos estatildeo relativamente bem distribuiacutedos em grupos quanto ao ano em que seintroduziu expressotildees lambda

Pela meacutedia de lambda por snapshot (lambdasnapshot) a maioria (11 projetos) possuiuma quantidade expressiva acima de 100 lambdasnapshot (com 6 projetos entre 20 e 100lambdasnapshot e 8 projetos com menos de 20 lambdasnapshot) como apresentados no

33

graacutefico da Figura 51 Isso mostra que essa nova caracteriacutestica jaacute estaacute sendo bem utilizadanos projetos que comeccedilaram a migrar para a nova versatildeo do Java

Figura 51 Graacuteficos dos projetos separados por ano de introduccedilatildeo de expressotildees lambdae meacutedia de lambda por snapshot

Com isso pode-se observar que apesar de a quantidade de projetos que possuemexpressotildees lambda natildeo ser tatildeo alta eacute possiacutevel obter resultados expressivos uma vez quea quantidade dos projetos com lambda estatildeo bem dispersos quanto ao periacuteodo em quecomeccedilaram a adotar essa caracteriacutestica e a quantidade de expressotildees lambda por snapshot

511 Projetos Selecionados

Atraveacutes dos grupos de classificaccedilatildeo identificados pela anaacutelise temporal descritos na Figura45 cinco projetos foram selecionados para uma anaacutelise detalhada levando em consideraccedilatildeoo grupo em que eles pertencem Estes projetos seratildeo apresentados a seguir

512 agera

Agera eacute uma biblioteca Android que ajuda a introduzir programaccedilatildeo funcional reativa(functional reactive programming) em projetos Android Eacute um projeto recente lanccediladoem 2016 pela Google [44] e encontra-se no grupo dos projetos que introduziram expressotildeeslambda em 2016 no mesmo ano de seu lanccedilamento contendo uma meacutedia de expressotildeeslambda de 16 lambdasnapshot

Na classificaccedilatildeo estabelecida agera pertence ao Grupo 1 onde a quantidade de ex-pressotildees lambda no projeto com o tempo aumentam juntamente com a quantidade deAICs como mostra o graacutefico de anaacutelise temporal na Figura 52

34

Figura 52 Graacuteficos de anaacutelise temporal do projeto agera

513 vertx

Eclipse Vertx eacute um conjunto de ferramentas para criaccedilatildeo de reactive applications namaacutequina virtual Java (JVM) em grande escala [45] Seu primeiro lanccedilamento aconteceuem 2011 e a primeira ocorrecircncia de expressotildees lambda no projeto aconteceu em 2014 Esteprojeto possui uma meacutedia de 2867 lambdasnapshot e dentre os projetos consideradosneste trabalho eacute o que possui a maior quantidade de expressotildees lambda

Este projeto pertence ao Grupo 2 onde a quantidade de expressotildees lambda aumen-tou consideravelmente pelos meses ultrapassando a quantidade de AICs que diminuiudrasticamente como mostra a Figura 53

35

Figura 53 Graacuteficos de anaacutelise temporal do projeto Vertx

514 Android-CleanArchitecture

Apesar de ser uma amostra de projeto Android-CleanArchitecture que tem como objetivoconstruir aplicaccedilotildees Android utilizando clean architecture foi lanccedilado em 2014 mas semanteacutem sempre atualizado [46]

A introduccedilatildeo de expressotildees lambda que aconteceu no ano de 2015 se deu de formatiacutemida com uma meacutedia de 35 lambdasnapshot De qualquer forma este projeto conseguerepresentar com seu graacutefico de anaacutelise temporal o grupo 3 composto por projetos em quea quantidade de expressotildees lambda aumentou mas sem ultrapassar AICs que diminuiacuteramdemonstrado no graacutefico da Figura 54

36

Figura 54 Graacuteficos de anaacutelise temporal do projeto Android-CleanArchitecture

515 RxJava

Dentre os repositoacuterios estudados RxJava eacute considerado o mais popular Como umaimplementaccedilatildeo de Reactive Extensions para a JVM RxJava teve seu lanccedilamento dadoem 2013 [47] Expressotildees lambda apareceram pela primeira vez no ano de 2015 comuma meacutedia de 766 lambdasnapshot

Apesar de uma meacutedia relativamente alta o tempo de vida das expressotildees lambda nesteprojeto foi bem curto caracterizando assim projetos do grupo 4 houve a introduccedilatildeo dasexpressotildees lambda no projeto poreacutem houve a remoccedilatildeo completa de todas as expressotildeeslambda previamente introduzidas desaparecendo completamente do projeto ateacute a datada coleta de dados (Figura 55)

37

Figura 55 Graacuteficos de anaacutelise temporal do projeto RxJava

516 guava

Guava eacute um conjunto de bibliotecas para Java da Google lanccedilado em 2011 A atualizaccedilatildeodo coacutedigo do projeto para Java 8 aconteceu somente em 2016 e apesar do projeto conteruma meacutedia de 281 lambdasnapshot ele foi escolhido como representante dos projetosdo Grupo 5 (Figura 56) que possuem expressotildees lambda mas de forma natildeo expressiva osuficiente quando comparado com a quantidade de AIC pelo fato de sua razatildeo de meacutedia delambdasnapshot por meacutedia de AICsnapshot ser 004 Ou seja embora o projeto tenhaexpressotildees lambda estas satildeo consideradas muito poucas quando inseridas no contextogeral deste projeto que eacute considerado um projeto grande

38

Figura 56 Graacuteficos de anaacutelise temporal do projeto Guava

52 Refatoraccedilatildeo de Coacutedigo

Com o objetivo de caracterizar melhor como as expressotildees lambda estatildeo sendo utilizadaseacute interessante identificar se estas estatildeo sendo introduzidas atraveacutes de refatoraccedilatildeo de coacutedigoou em coacutedigo novo

Os projetos classificados como pertencentes ao Grupo 2 possuem em comum o fatode expressotildees lambda aumentarem a medida que AICs diminuem ultrapassando-as eessa caracteriacutestica em comum pode indicar que nestes projetos possivelmente houve re-fatoraccedilatildeo de coacutedigo visto que AIC sendo substituiacutedo por expressotildees lambda dentro dascondiccedilotildees determinadas eacute a maneira mais comum de se identificar refatoraccedilatildeo de coacute-digo para introduccedilatildeo de expressotildees lambda [12] Os projetos que compotildeem o grupo 2representam 44 de todos os projetos estudados que possuem expressotildees lambda o quepode ser um indicativo caso a hipoacutetese de refatoraccedilatildeo de coacutedigo seja positiva de quemuitos projetos que estatildeo adotando o Java 8 estatildeo se preocupando de alguma formacom refatoraccedilatildeo se coacutedigo Fazem parte desse grupo os seguintes projetos elasticsearchjava-design-patterns PocketHub presto RxJava-Android-Samples spark vertx zipkinjava8-tutorial dropwizard e material-dialogs

39

Outra maneira de verificar possiacuteveis indicadores de refatoraccedilatildeo de coacutedigo foi atraveacutesda anaacutelise dos tamanhos (em quantidade de linhas de coacutedigo) dos meacutetodos com expressotildeeslambda no mecircs em que se introduziu expressotildees lambda e um mecircs imediatamente antesdeste Essa anaacutelise mostra que dos 25 projetos com expressotildees lambda 12 (48) projetostiveram ao menos um meacutetodo em que houve uma diminuiccedilatildeo no tamanho o que podeser considerado um indicativo de refatoraccedilatildeo de coacutedigo A Figura 57 mostra todos osprojetos em relaccedilatildeo agrave quantidade total de meacutetodos que possuem lambda no primeiro mecircsde introduccedilatildeo do mesmo em vermelho comparado com a quantidade desses meacutetodos quetiveram uma diminuiccedilatildeo no tamanho quando comparados com o coacutedigo do mecircs anteriorem azul

Figura 57 Comparaccedilatildeo entre todos os projetos com expressatildeo lambda sobre refatoraccedilatildeode coacutedigo no mecircs de introduccedilatildeo da caracteriacutestica

Ainda observando a figura 57 com relaccedilatildeo aos projetos que natildeo tiveram nenhummeacutetodo com diminuiccedilatildeo de tamanho (barra azul) percebe-se que todos os 13 projetossequer tiveram uma quantidade significativa de meacutetodos que possuem expressotildees lambda(com o maior tendo apenas 5 meacutetodos) no mecircs de introduccedilatildeo da caracteriacutestica no projetoe ao mesmo tempo jaacute existiam no mecircs em que natildeo existia lambda no projeto Essa eacuteuma observaccedilatildeo importante porque projetos como vertx sendo este o que possui a maiormeacutedia de lambdasnapshot de todos os projetos e ao mesmo tempo tendo apenas trecircsmeacutetodos que continham expressotildees lambda no mecircs da introduccedilatildeo e que existiam no mecircs

40

anterior permitem inferir que todas as outras expressotildees lambda existentes no projetopara este determinado mecircs de introduccedilatildeo encontram-se em coacutedigo novo introduzido

Eacute importante ressaltar que somente essa anaacutelise natildeo eacute exclusivamente suficiente paradeterminar se estes projetos estatildeo realmente introduzindo lambda em coacutedigo novo ourealizando refatoraccedilatildeo uma vez que como a comparaccedilatildeo aconteceu apenas no mecircs deintroduccedilatildeo com o mecircs imediatamente anterior natildeo reflete todo o ciclo de vida do pro-jeto Por exemplo algumas equipes podem escolher refatorar o coacutedigo depois de umtempo de adaptaccedilatildeo apoacutes a transiccedilatildeo para a nova versatildeo da linguagem Assim paraobter uma melhor anaacutelise sobre refatoraccedilatildeo de coacutedigo ou natildeo feita nestes projetos aleacutemde outras anaacutelises referentes aos padrotildees tipicamente adotados para implementaccedilatildeo delambda nestes projetos seratildeo apresentados a seguir os estudos de caso dos cinco projetospreviamente selecionados

Outro ponto importante eacute o fato de que apesar das informaccedilotildees quanto agraves quantida-des de filter e map terem sido incluiacutedas inicialmente no trabalho para observar possiacuteveispadrotildees de refatoraccedilatildeo de coacutedigo percebeu-se que estas natildeo satildeo utilizadas de forma con-sideraacutevel pelos projetos estudados e para fins de anaacutelises generalizadas natildeo apresentaramtanta influecircncia na utilizaccedilatildeo de expressotildees lambda quanto a quantidade de AICs noprojeto

53 Estudos de Caso

Dentre os projetos analisados verificou-se que os projetos de pequeno e meacutedio porte op-taram por refatorar de uma vez seus coacutedigos para incluir expressotildees lambda em situaccedilotildeesem que se utilizava AICs anteriormente ou em alguns poucos casos de utilizaccedilatildeo deCollection Os projetos de grande porte natildeo apresentaram nenhuma refatoraccedilatildeo de coacute-digo ou uma refatoraccedilatildeo parcial gradativa provavelmente devido agrave grande quantidade dearquivos e coacutedigo que possuem o que pode tornar o trabalho de refatoraccedilatildeo extenso ecansativo

O projeto vertx que pertence ao grupo 2 dos projetos em que a quantidade de ex-pressotildees lambda aumentaram e as de AICs diminuiacuteram com lambda ultrapassando AICsexecutou inicialmente commits em maio de 2014 com adiccedilatildeo de coacutedigo novo utilizandoexpressotildees lambda e apoacutes um mecircs realizou um commit maior com a refatoraccedilatildeo de todasas AICs para expressotildees lambda Apoacutes a refatoraccedilatildeo o projeto se preocupou em mantera utilizaccedilatildeo de expressotildees lambda ao mesmo tempo que o uso de AICs se manteve apenasaos casos de classes com interfaces natildeo funcionais A Figura 58 apresenta uma parte docommit de refatoraccedilatildeo de coacutedigo que mostra em vermelho a parte eliminada do coacutedigo(AIC) e em verde o coacutedigo novo representando a substituiccedilatildeo por uma expressatildeo lambda

41

Figura 58 Commit de refatoraccedilatildeo de coacutedigo do projeto Vertx [3]

Alguns projetos ainda natildeo se preocuparam em refatorar o coacutedigo para o uso de ex-pressotildees lambda ateacute a data deste trabalho que eacute o caso do projeto guava que apresentouum commit em 03112016 com a atualizaccedilatildeo do projeto para Java 8 Mas a partir daatualizaccedilatildeo se preocupou em utilizar as expressotildees lambda apenas na implementaccedilatildeo decoacutedigo novo O cenaacuterio em que a refatoraccedilatildeo natildeo eacute prioridade ainda eacute a realidade de vaacuteriosprojetos de grande porte visto que os dados de projetos sem nenhuma expressatildeo lambdasatildeo o maior nuacutemero neste trabalho Poreacutem projetos que jaacute adotaram a utilizaccedilatildeo do Java8 tendem a mudar isso com o passar do tempo A Figura 59 apresenta em verde umaadiccedilatildeo de coacutedigo novo com expressatildeo lambda sem a eliminaccedilatildeo de algum coacutedigo anteriora esse que estaria em vermelho

42

Figura 59 Exemplo de um arquivo do commit de adiccedilatildeo de coacutedigo novo em Java 8 doprojeto Guava [4]

Na categoria de projetos em que os AICs e expressotildees lambda aumentam proporci-onalmente (grupo 1) o projeto agera realizou um commit em 19052016 com a adiccedilatildeoda biblioteca retrolambda como dependecircncia do projeto Essa biblioteca utilizada prin-cipalmente por projetos Android permite executar coacutedigo Java 8 contendo expressotildeeslambda em Java 5 6 e 7 [48] O commit tambeacutem apresenta refatoraccedilatildeo dos AICs ad-vindos de interfaces funcionais para expressotildees lambda Apesar de o projeto continuar autilizar as expressotildees lambda em seus commits posteriores o nuacutemero de AICs tambeacutemcontinuou a aumentar visualizando os commits posteriores notou-se que esses AICs satildeorelativos a interfaces natildeo funcionais ou seja que possuem mais de um meacutetodo O projetoAndroid-CleanArchitecture eacute similar ao agera pois tambeacutem optou pela instalaccedilatildeo da bi-blioteca retrolambda para uso de expressotildees lambda em seus coacutedigos e como tambeacutem eacuteum projeto de pequeno porte houve uma pequena refatoraccedilatildeo dos AICs A Figura 510mostra a parte do commit de refatoraccedilatildeo de coacutedigo em que o desenvolvedor adiciona abiblioteca retrolambda como dependecircncia

43

Figura 510 Commit de adiccedilatildeo da biblioteca Retrolambda no projeto Agera [5]

Outro caso interessante eacute o do projeto RxJava que em 2015 optou pela refatoraccedilatildeodo coacutedigo para a utilizaccedilatildeo de expressotildees lambda quase eliminando por completo o usode AICs mas que no ano seguinte reverteu os commits de forma que eliminasse comple-tamente o uso de expressotildees lambda para manter a retrocompatibilidade com o Java 6A Figura 511 demonstra uma parte do commit de reversatildeo do coacutedigo para Java 6 emque pode ser visto em vermelho o coacutedigo anterior com expressotildees lambda e o verde como novo coacutedigo utilizando AIC novamente

44

Figura 511 Commit de remoccedilatildeo de Lambdas e volta para o uso de AICs no projetoRXJava [6]

Essa preocupaccedilatildeo com retrocompatibilidade de coacutedigo pode ser um fator crucial nadecisatildeo das equipes de desenvolvimento na hora de decidir como fazer o software co-evoluircom a linguagem sem perder a compatibilidade com versotildees anteriores

45

Capiacutetulo 6

Consideraccedilotildees Finais

Este estudo permitiu entender melhor como projetos estatildeo realizando a migraccedilatildeo para oJava 8 em especial utilizando uma nova caracteriacutestica introduzida expressatildeo lambdaApesar de a maioria dos projetos populares considerados natildeo possuiacuterem nenhuma ocor-recircncia de expressotildees lambda os projetos que tinham expressotildees lambda foram suficientespara realizar um primeiro estudo de caracterizaccedilatildeo no uso desta caracteriacutestica e com osprojetos efetivamente utilizados para estudo foi possiacutevel agrupaacute-los quanto a maneira emque as expressotildees lambda estavam sendo utilizadas quando comparadas com AICs em 5grandes grupos quando AIC e lambda aumentam proporcionalmente quando AIC dimi-nui e lambda aumenta ultrapassando AIC quando AIC diminui mas continua superior aolambda crescente expressotildees lambda que foram introduzidas e retiradas completamentedo coacutedigo e expressotildees lambda que natildeo existem em quantidades expressivas

Foi possiacutevel entatildeo realizar um estudo aprofundado levando em consideraccedilatildeo as di-ferentes maneiras com que as expressotildees lambda foram adotadas nos projetos atraveacutes daescolha de um projeto que representasse cada grupo para anaacutelise Dentre os cinco projetosestudados foi possiacutevel observar alguns padrotildees tipicamente adotados por desenvolvedorespara implementar expressotildees lambda em seus projetos como a utilizaccedilatildeo da bibliotecas(retrolambda) que permitissem uma flexibilizaccedilatildeo na utilizaccedilatildeo de expressotildees lambda oucomo lambda eacute primariamente utilizada para substituir determinados AICs ou operaccedilotildeesem Collection

Aleacutem disso foi possiacutevel observar como a refatoraccedilatildeo de coacutedigo acontece em cada umdesses projetos Observou-se como projetos menores tendem a refatorar coacutedigo maisfacilmente ao passo que projetos maiores e mais complexos fazem menos refatoraccedilatildeo oudemoram mais entre o periacuteodo em que houve a primeira migraccedilatildeo de coacutedigo para a novaversatildeo da linguagem ateacute o periacuteodo em que realmente decidem refatorar coacutedigo Aleacutem dacomplexidade do projeto influenciar na decisatildeo de migrar o projeto para uma versatildeo maisrecente da linguagem a preocupaccedilatildeo com retrocompatibilidade com versotildees anteriores da

46

linguagem tambeacutem podem ser uma barreira para que projetos comecem a evoluir o coacutedigojuntamente com a evoluccedilatildeo da linguagem

Ainda assim foi possiacutevel observar que a preocupaccedilatildeo com a co-evoluccedilatildeo do software-linguagem existe entre os desenvolvedores de projetos mas a realizaccedilatildeo da migraccedilatildeo aindaacontece lentamente devido agrave diversos fatores que precisam ser levados em consideraccedilatildeopara a manutenccedilatildeo do projeto

Para trabalhos e contribuiccedilotildees futuras seria interessante desenvolver uma ferramentaque pudesse analisar diretamente no coacutedigo-fonte as oportunidades de aplicaccedilatildeo de ex-pressotildees lambda dessa forma poderiam ser analisadas as porcentagens de conversatildeo decoacutedigo para Java 8 e obter melhores conclusotildees sobre a importacircncia que os projetos estatildeodando para a evoluccedilatildeo de seus coacutedigos Outro fator interessante seria aplicar mais Visitorsagrave ferramenta static-analysis e fazer este mesmo estudo aplicado agrave outras caracteriacutesticasda linguagem

47

Referecircncias

[1] Kagdi Huzefa Michael L Collard e Jonathan I Maletic A survey and taxonomyof approaches for mining software repositories in the context of software evolution2007 ix 3 8 9 10 11

[2] DBeaver Dbeaver - features httpdbeaverjkissorgdocsfeatures ix 29

[3] Eclipse Vertx commit Java8-ify code httpsgithubcomeclipsevertxcommit93f95e9c77419f442a42fe711b6eeaef88192fd3 ix 42

[4] Google Guava commit Release java 8 changes to guava httpsgithubcomgoogleguavacommit73e382fa877f80994817a136b0adcc4365ccd904 ix 43

[5] Google Agera commit Collapsed testapp with retrolambda httpsgithubcomgoogleageracommit5e518b7b05f9e7a34a314945f68deff7b2c3e334 ix 44

[6] ReactiveX Rxjava commit 2x full jdk 6 compatible backport + includ-ing bugfixes up to today httpsgithubcomReactiveXRxJavacommit000a174d87a901135f9665d3b11f3627fd2dc4ed ix 45

[7] Godfrey M W e D M German The past present and future of software evolutionEm 2008 Frontiers of Maintenance paacuteginas 129ndash138 Sept 2008 1 6

[8] Favre J M Languages evolve too changing the software time scale Em Principles ofSoftware Evolution Eighth International Workshop on paacuteginas 33ndash42 IEEE 20051 5 7

[9] Overbey Jeffrey L e Ralph E Johnson Regrowing a language refactoring tools allowprogramming languages to evolve Em ACM SIGPLAN Notices volume 44 paacuteginas493ndash502 ACM 2009 1 5 7 8 12

[10] Grechanik Mark Collin McMillan Luca DeFerrari Marco Comi Stefano CrespiDenys Poshyvanyk Chen Fu Qing Xie e Carlo Ghezzi An empirical investiga-tion into a large-scale java open source code repository Em Proceedings of the2010 ACM-IEEE International Symposium on Empirical Software Engineering andMeasurement ESEM rsquo10 paacuteginas 111ndash1110 New York NY USA 2010 ACMISBN 978-1-4503-0039-1 httpdoiacmorg10114518527861852801 1

[11] TIOBE Tiobe httpswwwtiobecomtiobe-index 1 14

48

[12] Gyori Alex Lyle Franklin Danny Dig e Jan Lahoda Crossing the gap from im-perative to functional programming through refactoring Em Proceedings of the 20139th Joint Meeting on Foundations of Software Engineering ESECFSE 2013 paacute-ginas 543ndash553 New York NY USA 2013 ACM ISBN 978-1-4503-2237-9 httpdoiacmorg10114524914112491461 2 11 24 39

[13] OpenJDK State of the lambda httpcropenjdkjavanet~briangoetzlambdalambda-state-4html 2

[14] Han Jiawei Micheline Kamber e Jian Pei Data Mining Concepts and TechniquesMorgan Kaufmann Publishers Inc San Francisco CA USA 3rd ediccedilatildeo 2011ISBN 0123814790 9780123814791 3

[15] Fowler Martin e Kent Beck Refactoring improving the design of existing codeAddison-Wesley Professional 1999 5 7

[16] Lehman M M J F Ramil P D Wernick D E Perry e W M Turski Met-rics and laws of software evolution - the nineties view Em Proceedings of the4th International Symposium on Software Metrics METRICS rsquo97 paacuteginas 20ndashWashington DC USA 1997 IEEE Computer Society ISBN 0-8186-8093-8 httpdlacmorgcitationcfmid=823454823901 6

[17] Hassan Ahmed E e Tao Xie Software intelligence The future of mining softwareengineering data Em Proceedings of the FSESDP Workshop on Future of SoftwareEngineering Research FoSER rsquo10 paacuteginas 161ndash166 New York NY USA 2010ACM ISBN 978-1-4503-0427-6 httpdoiacmorg101145188236218823978 9

[18] Hassan Ahmed E The road ahead for mining software repositories Em Frontiers ofSoftware Maintenance 2008 FoSM 2008 paacuteginas 48ndash57 IEEE 2008 8

[19] Berry Michael J e Gordon Linoff Data Mining Techniques For Marketing Salesand Customer Support John Wiley amp Sons Inc New York NY USA 1997ISBN 0471179809 10

[20] Parnin Chris Christian Bird e Emerson Murphy-Hill Java generics adoption hownew features are introduced championed or ignored Em Proceedings of the 8thWorking Conference on Mining Software Repositories paacuteginas 3ndash12 ACM 2011 12

[21] Oracle The java language specification httpsdocsoraclecomjavasespecsjlsse8jls8pdf 13

[22] Oracle The history of java technology httpwwworaclecomtechnetworkjavajavaseoverviewjavahistory-index-198355html 13

[23] Murphy Kieron So why did they decide to call itjava httpwwwjavaworldcomarticle2077265core-javaso-why-did-they-decide-to-call-it-java-html 13

[24] McGraw Tata Object-oriented Programming with Java Essentials and ApplicationsHill Education 13

49

[25] Oracle Differences between java ee and java se httpdocsoraclecomjavaee6firstcupdocgkhoyhtml 13

[26] Lindsey Clark S The History of Java Cambridge 14

[27] Oracle The java language environment httpwwworaclecomtechnetworkjavaintro-141325html 14

[28] Oracle Jdk 8 httpopenjdkjavanetprojectsjdk8 15 24

[29] Oracle Enhancements in java se 8 httpdocsoraclecomjavase8docstechnotesguideslanguageenhancementshtmljavase8 15 16 17

[30] Oracle Lambda expressions httpdocsoraclecomjavasetutorialjavajavaOOlambdaexpressionshtml 16 18 21

[31] Oracle Method references httpdocsoraclecomjavasetutorialjavajavaOOmethodreferenceshtml 16

[32] Oracle Default methods httpdocsoraclecomjavasetutorialjavaIandIdefaultmethodshtml 17

[33] Oracle Repeating annotations httpdocsoraclecomjavasetutorialjavaannotationsrepeatinghtml 17

[34] Oracle Type annotations httpdocsoraclecomjavasetutorialjavaannotationstype_annotationshtml 17

[35] Oracle Anonymous inner classes httpsdocsoraclecomjavasetutorialjavajavaOOanonymousclasseshtml 19

[36] Kothari CR Research Methodology Methods and Techniques New Age Interna-tional (P) Limited 2004 ISBN 9788122415223 httpsbooksgooglecombrbooksid=8c6gkbKi-F4C 22

[37] Nakakoji Kumiyo Yasuhiro Yamamoto Yoshiyuki Nishinaka Kouichi Kishida eYunwen Ye Evolution patterns of open-source software systems and communitiesEm IWPSE rsquo02 Proceedings of the International Workshop on Principles of SoftwareEvolution paacuteginas 76ndash85 New York NY USA 2002 ACM Press ISBN 1581135459httpdxdoiorg101145512035512055 23

[38] Rahman Foyzur Christian Bird e Premkumar Devanbu Clones What is that smellEmpirical Software Engineering 17(4-5)503ndash530 2012 24

[39] Chacon Scott Pro Git Apress Berkely CA USA 1st ediccedilatildeo 2009ISBN 1430218339 9781430218333 25

[40] Cavalcanti Thiago Gomes e Viniacutecius Correa de Almeida Caracterizaccedilatildeo do uso deconstruccedilotildees da linguagem java em projetos open-source Publicaccedilatildeo online 2016httpbdmunbbrhandle1048315733 27

50

[41] Parr Terence Language Implementation Patterns Create Your Own Domain-Specific and General Programming Languages Pragmatic Bookshelf 1st ediccedilatildeo 2009ISBN 193435645X 9781934356456 27

[42] Janssen Thorben 5 reasons to use jpa hibernate Publicaccedilatildeo online httpswwwsitepointcom5-reasons-to-use-jpa-hibernate 27

[43] Franklin Lyle Alex Gyori Jan Lahoda e Danny Dig Lambdaficator From imperativeto functional programming through automated refactoring Em Proceedings of the2013 International Conference on Software Engineering ICSE rsquo13 paacuteginas 1287ndash1290 Piscataway NJ USA 2013 IEEE Press ISBN 978-1-4673-3076-3 httpdlacmorgcitationcfmid=24867882486986 29

[44] Google Agera httpsgithubcomgoogleagerawiki 34

[45] Eclipse Eclipse vertx httpvertxio 35

[46] Cejas Fernando Android cleanarchitecture httpsgithubcomandroid10Android-CleanArchitecture 36

[47] ReactiveX Rxjava httpsgithubcomReactiveXRxJava 37

[48] Luontola Esko Retrolambda httpsgithubcomorfjackalretrolambda 43

51

Anexo I

Projetos utilizados

fastjson

platform_frameworks_base

netty

material-dialogs

kotlin

okhttp

tinker

AndroidUtilCode

RxJava

spring-boot

java-design-patterns

elasticsearch

ExoPlayer

kafka

vertx

realm-java

guava

zipkin

bazel

stetho

Signal-Android

glide

agera

fresco

plaid

presto

libgdx

spark

52

disruptor

lottie-android

flexbox-layout

PocketHub

zxing

spring-framework

deeplearning4j

dropwizard

interviews

BaseRecyclerViewAdapterHelper

uCrop

DanmakuFlameMaster

lottie-react-native

android-UniversalMusicPlayer

AndroidInterview-Q-A

greenDAO

retrofit

MaterialDrawer

BottomBar

druid

MPAndroidChart

Hystrix

guice

recyclerview-animators

dubbo

androidannotations

RxJava-Android-Samples

PhotoView

clojure

CircleImageView

AndroidSwipeLayout

jedis

MaterialViewPager

butterknife

junit4

RxBinding

leakcanary

SimianArmy

picasso

UltimateRecyclerView

53

AndroidViewAnimations

AppIntro

FizzBuzzEnterpriseEdition

ion

cheesesquare

physical-web

RxAndroid

Android-CleanArchitecture

Calligraphy

Android-Bootstrap

iosched

Android_Data

MaterialDesignLibrary

ListViewAnimations

EventBus

java8-tutorial

AndroidSlidingUpPanel

dagger

okhttputils

logger

HomeMirror

Material-Animations

android-Ultra-Pull-To-Refresh

android-async-http

Android-ObservableScrollView

Android-Universal-Image-Loader

ActionBarSherlock

SlidingMenu

storm

PagerSlidingTabStrip

Android-PullToRefresh

54

  • Dedicatoacuteria
  • Agradecimentos
  • Resumo
  • Abstract
  • Introduccedilatildeo
    • Contexto
    • Objetivos
      • Objetivos Gerais
      • Objetivos Especiacuteficos
        • Metodologia
        • Organizaccedilatildeo do Trabalho
          • Evoluccedilatildeo e Mineraccedilatildeo de Repositoacuterios de Software
            • Evoluccedilatildeo de Software
            • MSR Mineraccedilatildeo de dados e a Engenharia de Software
              • Classificaccedilatildeo
                • Trabalhos Relacionados
                  • Java SE 8 e JDK 8
                    • Histoacuterico
                    • Princiacutepios
                    • Evoluccedilatildeo
                    • Expressotildees Lambda
                      • Sintaxe
                      • Principais formas de uso
                          • Estudo e o Processo de Mineraccedilatildeo
                            • Questotildees de Pesquisa
                            • Fonte de Dados e Objetos de Estudo
                            • Processo de Mineraccedilatildeo
                              • static-analysis
                              • BDAnalisador
                                • Classificaccedilatildeo e Anaacutelise
                                  • Meacutedia de Lambda
                                  • Anaacutelise Temporal
                                  • Refatoraccedilatildeo de Coacutedigo
                                  • Casos de Uso
                                      • Resultados Obtidos e Anaacutelise
                                        • Visatildeo Geral
                                          • Projetos Selecionados
                                          • agera
                                          • vertx
                                          • Android-CleanArchitecture
                                          • RxJava
                                          • guava
                                            • Refatoraccedilatildeo de Coacutedigo
                                            • Estudos de Caso
                                              • Consideraccedilotildees Finais
                                              • Referecircncias
                                              • Anexo
                                              • Projetos utilizados

possiacutevel classificar todos os projetos em 6 grupos ilustrado na Figura 45 Primeiramenteseparou-se os projetos entre os que possuem expressotildees lambda e os que natildeo possuemDentre os que possuem identificou-se cinco categorias

1 Grupo 1 Quantidade de AICs e expressotildees lambda aumentam com o tempo pro-porcionalmente

2 Grupo 2 Quantidade de AICs diminui agrave medida que a quantidade de expressotildeeslambda aumentam e a quantidade de expressotildees lambda ultrapassa a quantidade deAIC em um determinado momento

3 Grupo 3 Quantidade de AICs diminui agrave medida que a quantidade de expressotildeeslambda aumentam mas a quantidade de AIC permanece superior agrave quantidade delambda

4 Grupo 4 Expressotildees lambda satildeo introduzidas e existem por um pequeno periacuteodode tempo mas satildeo completamente removidas posteriormente

5 Grupo 5 Quantidade de expressotildees lambda eacute constante e muito inferior compa-rado com a quantidade de AICs no projeto Foi determinado que para pertencera esta classificaccedilatildeo o projeto precisa ter uma razatildeo de meacutedia de expressotildees lamb-dasnapshot por meacutedia de AICsnapshot inferior a 020 Esse paracircmetro foi esta-belecido com o objetivo de definir um padratildeo para o que pode ser considerado umprojeto com poucas expressotildees lambda

Figura 45 Classificaccedilatildeo dos projetos

31

443 Refatoraccedilatildeo de Coacutedigo

O uacuteltimo script teve como objetivo realizar uma tentativa inicial de identificar refatoraccedilatildeode coacutedigo da seguinte maneira para todos os projetos que possuem expressotildees lambdaforam identificados o mecircs imediatamente antes da introduccedilatildeo de expressotildees lambda e omecircs seguinte onde houve a primeira ocorrecircncia de lambda no projeto Assim realizou-se uma anaacutelise do tamanho em quantidade de linhas de coacutedigo de todos os meacutetodosdo projeto que no mecircs seguinte tiveram introduccedilatildeo de lambda Em seguida fez-se umacomparaccedilatildeo com os mesmos meacutetodos em relaccedilatildeo ao mecircs anterior e assim foi possiacuteveldetectar quais meacutetodos tiveram a quantidade de linhas de coacutedigo reduzidas o que seriaum indicativo natildeo necessariamente exclusivo de que uma refatoraccedilatildeo de coacutedigo possa terocorrido

Sabe-se que este meacutetodo de detecccedilatildeo de refatoraccedilatildeo de coacutedigo possui suas limitaccedilotildeesuma vez que as comparaccedilotildees para saber se um meacutetodo existe em ambas versotildees eacute feitopuramente por comparaccedilatildeo de String (nome do meacutetodo) e a classe que este pertence

444 Casos de Uso

Os meacutetodos descritos acima ajudaram a identificar alguns padrotildees e facilitar a anaacutelise dosdados Poreacutem natildeo satildeo suficientes para que se possa responder agraves questotildees de pesquisaDessa forma apoacutes a identificaccedilatildeo dos grupos de classificaccedilatildeo para os projetos foramescolhidos um projeto de cada grupo (com exceccedilatildeo do grupo dos projetos sem expressotildeeslambda) para realizar um breve estudo de caso com o objetivo de identificar e caracterizarmelhor a adoccedilatildeo de expressotildees lambda Os projetos escolhidos foram agera vertxAndroid-CleanArchitecture RxJava e guava

32

Capiacutetulo 5

Resultados Obtidos e Anaacutelise

Neste capiacutetulo seratildeo apresentados os dados obtidos e anaacutelise com o objetivo de responderagraves questotildees de pesquisa propostas Como mencionado anteriormente as perguntas seratildeorespondidas de duas maneiras algumas com informaccedilotildees gerais sobre todos os projetose outras com breve estudos de caso envolvendo cinco projetos

51 Visatildeo Geral

Dentre os repositoacuterios coletados para a anaacutelise 74 (7474) natildeo utilizaram nenhumaexpressatildeo lambda no projeto durante todo o periacuteodo analisado (Janeiro de 2013 a Abrilde 2017) restando apenas 25 repositoacuterios (2525) com expressotildees lambda Eacute interessantedestacar que apesar de a quantidade de repositoacuterios que natildeo possuem expressotildees lambdaser relativamente expressiva muitos destes repositoacuterios satildeo de projetos em Java que umdia foram populares e atualmente natildeo estatildeo sendo mais desenvolvidos (por exemplo umaplicativo que soacute funciona para Android 23 atualmente descontinuado)

Levando em consideraccedilatildeo apenas os projetos que possuem expressotildees lambda exis-tem dois tipos de dados que podem ser analisados para responder agrave primeira questatildeo depesquisa atraveacutes dos dados obtidos pelo meacutetodo anteriormente mencionado como anaacutelisetemporal e a meacutedia de lambda por snapshot mencionados no capiacutetulo anterior

Com relaccedilatildeo ao ano em que a primeira ocorrecircncia foi encontrada 6 projetos introduzi-ram expressotildees lambda jaacute em 2014 8 comeccedilaram a utilizar em 2015 7 em 2016 e apenas4 tiveram a primeira ocorrecircncia de expressotildees lambda em 2017 Dessa forma percebe-seque os projetos estatildeo relativamente bem distribuiacutedos em grupos quanto ao ano em que seintroduziu expressotildees lambda

Pela meacutedia de lambda por snapshot (lambdasnapshot) a maioria (11 projetos) possuiuma quantidade expressiva acima de 100 lambdasnapshot (com 6 projetos entre 20 e 100lambdasnapshot e 8 projetos com menos de 20 lambdasnapshot) como apresentados no

33

graacutefico da Figura 51 Isso mostra que essa nova caracteriacutestica jaacute estaacute sendo bem utilizadanos projetos que comeccedilaram a migrar para a nova versatildeo do Java

Figura 51 Graacuteficos dos projetos separados por ano de introduccedilatildeo de expressotildees lambdae meacutedia de lambda por snapshot

Com isso pode-se observar que apesar de a quantidade de projetos que possuemexpressotildees lambda natildeo ser tatildeo alta eacute possiacutevel obter resultados expressivos uma vez quea quantidade dos projetos com lambda estatildeo bem dispersos quanto ao periacuteodo em quecomeccedilaram a adotar essa caracteriacutestica e a quantidade de expressotildees lambda por snapshot

511 Projetos Selecionados

Atraveacutes dos grupos de classificaccedilatildeo identificados pela anaacutelise temporal descritos na Figura45 cinco projetos foram selecionados para uma anaacutelise detalhada levando em consideraccedilatildeoo grupo em que eles pertencem Estes projetos seratildeo apresentados a seguir

512 agera

Agera eacute uma biblioteca Android que ajuda a introduzir programaccedilatildeo funcional reativa(functional reactive programming) em projetos Android Eacute um projeto recente lanccediladoem 2016 pela Google [44] e encontra-se no grupo dos projetos que introduziram expressotildeeslambda em 2016 no mesmo ano de seu lanccedilamento contendo uma meacutedia de expressotildeeslambda de 16 lambdasnapshot

Na classificaccedilatildeo estabelecida agera pertence ao Grupo 1 onde a quantidade de ex-pressotildees lambda no projeto com o tempo aumentam juntamente com a quantidade deAICs como mostra o graacutefico de anaacutelise temporal na Figura 52

34

Figura 52 Graacuteficos de anaacutelise temporal do projeto agera

513 vertx

Eclipse Vertx eacute um conjunto de ferramentas para criaccedilatildeo de reactive applications namaacutequina virtual Java (JVM) em grande escala [45] Seu primeiro lanccedilamento aconteceuem 2011 e a primeira ocorrecircncia de expressotildees lambda no projeto aconteceu em 2014 Esteprojeto possui uma meacutedia de 2867 lambdasnapshot e dentre os projetos consideradosneste trabalho eacute o que possui a maior quantidade de expressotildees lambda

Este projeto pertence ao Grupo 2 onde a quantidade de expressotildees lambda aumen-tou consideravelmente pelos meses ultrapassando a quantidade de AICs que diminuiudrasticamente como mostra a Figura 53

35

Figura 53 Graacuteficos de anaacutelise temporal do projeto Vertx

514 Android-CleanArchitecture

Apesar de ser uma amostra de projeto Android-CleanArchitecture que tem como objetivoconstruir aplicaccedilotildees Android utilizando clean architecture foi lanccedilado em 2014 mas semanteacutem sempre atualizado [46]

A introduccedilatildeo de expressotildees lambda que aconteceu no ano de 2015 se deu de formatiacutemida com uma meacutedia de 35 lambdasnapshot De qualquer forma este projeto conseguerepresentar com seu graacutefico de anaacutelise temporal o grupo 3 composto por projetos em quea quantidade de expressotildees lambda aumentou mas sem ultrapassar AICs que diminuiacuteramdemonstrado no graacutefico da Figura 54

36

Figura 54 Graacuteficos de anaacutelise temporal do projeto Android-CleanArchitecture

515 RxJava

Dentre os repositoacuterios estudados RxJava eacute considerado o mais popular Como umaimplementaccedilatildeo de Reactive Extensions para a JVM RxJava teve seu lanccedilamento dadoem 2013 [47] Expressotildees lambda apareceram pela primeira vez no ano de 2015 comuma meacutedia de 766 lambdasnapshot

Apesar de uma meacutedia relativamente alta o tempo de vida das expressotildees lambda nesteprojeto foi bem curto caracterizando assim projetos do grupo 4 houve a introduccedilatildeo dasexpressotildees lambda no projeto poreacutem houve a remoccedilatildeo completa de todas as expressotildeeslambda previamente introduzidas desaparecendo completamente do projeto ateacute a datada coleta de dados (Figura 55)

37

Figura 55 Graacuteficos de anaacutelise temporal do projeto RxJava

516 guava

Guava eacute um conjunto de bibliotecas para Java da Google lanccedilado em 2011 A atualizaccedilatildeodo coacutedigo do projeto para Java 8 aconteceu somente em 2016 e apesar do projeto conteruma meacutedia de 281 lambdasnapshot ele foi escolhido como representante dos projetosdo Grupo 5 (Figura 56) que possuem expressotildees lambda mas de forma natildeo expressiva osuficiente quando comparado com a quantidade de AIC pelo fato de sua razatildeo de meacutedia delambdasnapshot por meacutedia de AICsnapshot ser 004 Ou seja embora o projeto tenhaexpressotildees lambda estas satildeo consideradas muito poucas quando inseridas no contextogeral deste projeto que eacute considerado um projeto grande

38

Figura 56 Graacuteficos de anaacutelise temporal do projeto Guava

52 Refatoraccedilatildeo de Coacutedigo

Com o objetivo de caracterizar melhor como as expressotildees lambda estatildeo sendo utilizadaseacute interessante identificar se estas estatildeo sendo introduzidas atraveacutes de refatoraccedilatildeo de coacutedigoou em coacutedigo novo

Os projetos classificados como pertencentes ao Grupo 2 possuem em comum o fatode expressotildees lambda aumentarem a medida que AICs diminuem ultrapassando-as eessa caracteriacutestica em comum pode indicar que nestes projetos possivelmente houve re-fatoraccedilatildeo de coacutedigo visto que AIC sendo substituiacutedo por expressotildees lambda dentro dascondiccedilotildees determinadas eacute a maneira mais comum de se identificar refatoraccedilatildeo de coacute-digo para introduccedilatildeo de expressotildees lambda [12] Os projetos que compotildeem o grupo 2representam 44 de todos os projetos estudados que possuem expressotildees lambda o quepode ser um indicativo caso a hipoacutetese de refatoraccedilatildeo de coacutedigo seja positiva de quemuitos projetos que estatildeo adotando o Java 8 estatildeo se preocupando de alguma formacom refatoraccedilatildeo se coacutedigo Fazem parte desse grupo os seguintes projetos elasticsearchjava-design-patterns PocketHub presto RxJava-Android-Samples spark vertx zipkinjava8-tutorial dropwizard e material-dialogs

39

Outra maneira de verificar possiacuteveis indicadores de refatoraccedilatildeo de coacutedigo foi atraveacutesda anaacutelise dos tamanhos (em quantidade de linhas de coacutedigo) dos meacutetodos com expressotildeeslambda no mecircs em que se introduziu expressotildees lambda e um mecircs imediatamente antesdeste Essa anaacutelise mostra que dos 25 projetos com expressotildees lambda 12 (48) projetostiveram ao menos um meacutetodo em que houve uma diminuiccedilatildeo no tamanho o que podeser considerado um indicativo de refatoraccedilatildeo de coacutedigo A Figura 57 mostra todos osprojetos em relaccedilatildeo agrave quantidade total de meacutetodos que possuem lambda no primeiro mecircsde introduccedilatildeo do mesmo em vermelho comparado com a quantidade desses meacutetodos quetiveram uma diminuiccedilatildeo no tamanho quando comparados com o coacutedigo do mecircs anteriorem azul

Figura 57 Comparaccedilatildeo entre todos os projetos com expressatildeo lambda sobre refatoraccedilatildeode coacutedigo no mecircs de introduccedilatildeo da caracteriacutestica

Ainda observando a figura 57 com relaccedilatildeo aos projetos que natildeo tiveram nenhummeacutetodo com diminuiccedilatildeo de tamanho (barra azul) percebe-se que todos os 13 projetossequer tiveram uma quantidade significativa de meacutetodos que possuem expressotildees lambda(com o maior tendo apenas 5 meacutetodos) no mecircs de introduccedilatildeo da caracteriacutestica no projetoe ao mesmo tempo jaacute existiam no mecircs em que natildeo existia lambda no projeto Essa eacuteuma observaccedilatildeo importante porque projetos como vertx sendo este o que possui a maiormeacutedia de lambdasnapshot de todos os projetos e ao mesmo tempo tendo apenas trecircsmeacutetodos que continham expressotildees lambda no mecircs da introduccedilatildeo e que existiam no mecircs

40

anterior permitem inferir que todas as outras expressotildees lambda existentes no projetopara este determinado mecircs de introduccedilatildeo encontram-se em coacutedigo novo introduzido

Eacute importante ressaltar que somente essa anaacutelise natildeo eacute exclusivamente suficiente paradeterminar se estes projetos estatildeo realmente introduzindo lambda em coacutedigo novo ourealizando refatoraccedilatildeo uma vez que como a comparaccedilatildeo aconteceu apenas no mecircs deintroduccedilatildeo com o mecircs imediatamente anterior natildeo reflete todo o ciclo de vida do pro-jeto Por exemplo algumas equipes podem escolher refatorar o coacutedigo depois de umtempo de adaptaccedilatildeo apoacutes a transiccedilatildeo para a nova versatildeo da linguagem Assim paraobter uma melhor anaacutelise sobre refatoraccedilatildeo de coacutedigo ou natildeo feita nestes projetos aleacutemde outras anaacutelises referentes aos padrotildees tipicamente adotados para implementaccedilatildeo delambda nestes projetos seratildeo apresentados a seguir os estudos de caso dos cinco projetospreviamente selecionados

Outro ponto importante eacute o fato de que apesar das informaccedilotildees quanto agraves quantida-des de filter e map terem sido incluiacutedas inicialmente no trabalho para observar possiacuteveispadrotildees de refatoraccedilatildeo de coacutedigo percebeu-se que estas natildeo satildeo utilizadas de forma con-sideraacutevel pelos projetos estudados e para fins de anaacutelises generalizadas natildeo apresentaramtanta influecircncia na utilizaccedilatildeo de expressotildees lambda quanto a quantidade de AICs noprojeto

53 Estudos de Caso

Dentre os projetos analisados verificou-se que os projetos de pequeno e meacutedio porte op-taram por refatorar de uma vez seus coacutedigos para incluir expressotildees lambda em situaccedilotildeesem que se utilizava AICs anteriormente ou em alguns poucos casos de utilizaccedilatildeo deCollection Os projetos de grande porte natildeo apresentaram nenhuma refatoraccedilatildeo de coacute-digo ou uma refatoraccedilatildeo parcial gradativa provavelmente devido agrave grande quantidade dearquivos e coacutedigo que possuem o que pode tornar o trabalho de refatoraccedilatildeo extenso ecansativo

O projeto vertx que pertence ao grupo 2 dos projetos em que a quantidade de ex-pressotildees lambda aumentaram e as de AICs diminuiacuteram com lambda ultrapassando AICsexecutou inicialmente commits em maio de 2014 com adiccedilatildeo de coacutedigo novo utilizandoexpressotildees lambda e apoacutes um mecircs realizou um commit maior com a refatoraccedilatildeo de todasas AICs para expressotildees lambda Apoacutes a refatoraccedilatildeo o projeto se preocupou em mantera utilizaccedilatildeo de expressotildees lambda ao mesmo tempo que o uso de AICs se manteve apenasaos casos de classes com interfaces natildeo funcionais A Figura 58 apresenta uma parte docommit de refatoraccedilatildeo de coacutedigo que mostra em vermelho a parte eliminada do coacutedigo(AIC) e em verde o coacutedigo novo representando a substituiccedilatildeo por uma expressatildeo lambda

41

Figura 58 Commit de refatoraccedilatildeo de coacutedigo do projeto Vertx [3]

Alguns projetos ainda natildeo se preocuparam em refatorar o coacutedigo para o uso de ex-pressotildees lambda ateacute a data deste trabalho que eacute o caso do projeto guava que apresentouum commit em 03112016 com a atualizaccedilatildeo do projeto para Java 8 Mas a partir daatualizaccedilatildeo se preocupou em utilizar as expressotildees lambda apenas na implementaccedilatildeo decoacutedigo novo O cenaacuterio em que a refatoraccedilatildeo natildeo eacute prioridade ainda eacute a realidade de vaacuteriosprojetos de grande porte visto que os dados de projetos sem nenhuma expressatildeo lambdasatildeo o maior nuacutemero neste trabalho Poreacutem projetos que jaacute adotaram a utilizaccedilatildeo do Java8 tendem a mudar isso com o passar do tempo A Figura 59 apresenta em verde umaadiccedilatildeo de coacutedigo novo com expressatildeo lambda sem a eliminaccedilatildeo de algum coacutedigo anteriora esse que estaria em vermelho

42

Figura 59 Exemplo de um arquivo do commit de adiccedilatildeo de coacutedigo novo em Java 8 doprojeto Guava [4]

Na categoria de projetos em que os AICs e expressotildees lambda aumentam proporci-onalmente (grupo 1) o projeto agera realizou um commit em 19052016 com a adiccedilatildeoda biblioteca retrolambda como dependecircncia do projeto Essa biblioteca utilizada prin-cipalmente por projetos Android permite executar coacutedigo Java 8 contendo expressotildeeslambda em Java 5 6 e 7 [48] O commit tambeacutem apresenta refatoraccedilatildeo dos AICs ad-vindos de interfaces funcionais para expressotildees lambda Apesar de o projeto continuar autilizar as expressotildees lambda em seus commits posteriores o nuacutemero de AICs tambeacutemcontinuou a aumentar visualizando os commits posteriores notou-se que esses AICs satildeorelativos a interfaces natildeo funcionais ou seja que possuem mais de um meacutetodo O projetoAndroid-CleanArchitecture eacute similar ao agera pois tambeacutem optou pela instalaccedilatildeo da bi-blioteca retrolambda para uso de expressotildees lambda em seus coacutedigos e como tambeacutem eacuteum projeto de pequeno porte houve uma pequena refatoraccedilatildeo dos AICs A Figura 510mostra a parte do commit de refatoraccedilatildeo de coacutedigo em que o desenvolvedor adiciona abiblioteca retrolambda como dependecircncia

43

Figura 510 Commit de adiccedilatildeo da biblioteca Retrolambda no projeto Agera [5]

Outro caso interessante eacute o do projeto RxJava que em 2015 optou pela refatoraccedilatildeodo coacutedigo para a utilizaccedilatildeo de expressotildees lambda quase eliminando por completo o usode AICs mas que no ano seguinte reverteu os commits de forma que eliminasse comple-tamente o uso de expressotildees lambda para manter a retrocompatibilidade com o Java 6A Figura 511 demonstra uma parte do commit de reversatildeo do coacutedigo para Java 6 emque pode ser visto em vermelho o coacutedigo anterior com expressotildees lambda e o verde como novo coacutedigo utilizando AIC novamente

44

Figura 511 Commit de remoccedilatildeo de Lambdas e volta para o uso de AICs no projetoRXJava [6]

Essa preocupaccedilatildeo com retrocompatibilidade de coacutedigo pode ser um fator crucial nadecisatildeo das equipes de desenvolvimento na hora de decidir como fazer o software co-evoluircom a linguagem sem perder a compatibilidade com versotildees anteriores

45

Capiacutetulo 6

Consideraccedilotildees Finais

Este estudo permitiu entender melhor como projetos estatildeo realizando a migraccedilatildeo para oJava 8 em especial utilizando uma nova caracteriacutestica introduzida expressatildeo lambdaApesar de a maioria dos projetos populares considerados natildeo possuiacuterem nenhuma ocor-recircncia de expressotildees lambda os projetos que tinham expressotildees lambda foram suficientespara realizar um primeiro estudo de caracterizaccedilatildeo no uso desta caracteriacutestica e com osprojetos efetivamente utilizados para estudo foi possiacutevel agrupaacute-los quanto a maneira emque as expressotildees lambda estavam sendo utilizadas quando comparadas com AICs em 5grandes grupos quando AIC e lambda aumentam proporcionalmente quando AIC dimi-nui e lambda aumenta ultrapassando AIC quando AIC diminui mas continua superior aolambda crescente expressotildees lambda que foram introduzidas e retiradas completamentedo coacutedigo e expressotildees lambda que natildeo existem em quantidades expressivas

Foi possiacutevel entatildeo realizar um estudo aprofundado levando em consideraccedilatildeo as di-ferentes maneiras com que as expressotildees lambda foram adotadas nos projetos atraveacutes daescolha de um projeto que representasse cada grupo para anaacutelise Dentre os cinco projetosestudados foi possiacutevel observar alguns padrotildees tipicamente adotados por desenvolvedorespara implementar expressotildees lambda em seus projetos como a utilizaccedilatildeo da bibliotecas(retrolambda) que permitissem uma flexibilizaccedilatildeo na utilizaccedilatildeo de expressotildees lambda oucomo lambda eacute primariamente utilizada para substituir determinados AICs ou operaccedilotildeesem Collection

Aleacutem disso foi possiacutevel observar como a refatoraccedilatildeo de coacutedigo acontece em cada umdesses projetos Observou-se como projetos menores tendem a refatorar coacutedigo maisfacilmente ao passo que projetos maiores e mais complexos fazem menos refatoraccedilatildeo oudemoram mais entre o periacuteodo em que houve a primeira migraccedilatildeo de coacutedigo para a novaversatildeo da linguagem ateacute o periacuteodo em que realmente decidem refatorar coacutedigo Aleacutem dacomplexidade do projeto influenciar na decisatildeo de migrar o projeto para uma versatildeo maisrecente da linguagem a preocupaccedilatildeo com retrocompatibilidade com versotildees anteriores da

46

linguagem tambeacutem podem ser uma barreira para que projetos comecem a evoluir o coacutedigojuntamente com a evoluccedilatildeo da linguagem

Ainda assim foi possiacutevel observar que a preocupaccedilatildeo com a co-evoluccedilatildeo do software-linguagem existe entre os desenvolvedores de projetos mas a realizaccedilatildeo da migraccedilatildeo aindaacontece lentamente devido agrave diversos fatores que precisam ser levados em consideraccedilatildeopara a manutenccedilatildeo do projeto

Para trabalhos e contribuiccedilotildees futuras seria interessante desenvolver uma ferramentaque pudesse analisar diretamente no coacutedigo-fonte as oportunidades de aplicaccedilatildeo de ex-pressotildees lambda dessa forma poderiam ser analisadas as porcentagens de conversatildeo decoacutedigo para Java 8 e obter melhores conclusotildees sobre a importacircncia que os projetos estatildeodando para a evoluccedilatildeo de seus coacutedigos Outro fator interessante seria aplicar mais Visitorsagrave ferramenta static-analysis e fazer este mesmo estudo aplicado agrave outras caracteriacutesticasda linguagem

47

Referecircncias

[1] Kagdi Huzefa Michael L Collard e Jonathan I Maletic A survey and taxonomyof approaches for mining software repositories in the context of software evolution2007 ix 3 8 9 10 11

[2] DBeaver Dbeaver - features httpdbeaverjkissorgdocsfeatures ix 29

[3] Eclipse Vertx commit Java8-ify code httpsgithubcomeclipsevertxcommit93f95e9c77419f442a42fe711b6eeaef88192fd3 ix 42

[4] Google Guava commit Release java 8 changes to guava httpsgithubcomgoogleguavacommit73e382fa877f80994817a136b0adcc4365ccd904 ix 43

[5] Google Agera commit Collapsed testapp with retrolambda httpsgithubcomgoogleageracommit5e518b7b05f9e7a34a314945f68deff7b2c3e334 ix 44

[6] ReactiveX Rxjava commit 2x full jdk 6 compatible backport + includ-ing bugfixes up to today httpsgithubcomReactiveXRxJavacommit000a174d87a901135f9665d3b11f3627fd2dc4ed ix 45

[7] Godfrey M W e D M German The past present and future of software evolutionEm 2008 Frontiers of Maintenance paacuteginas 129ndash138 Sept 2008 1 6

[8] Favre J M Languages evolve too changing the software time scale Em Principles ofSoftware Evolution Eighth International Workshop on paacuteginas 33ndash42 IEEE 20051 5 7

[9] Overbey Jeffrey L e Ralph E Johnson Regrowing a language refactoring tools allowprogramming languages to evolve Em ACM SIGPLAN Notices volume 44 paacuteginas493ndash502 ACM 2009 1 5 7 8 12

[10] Grechanik Mark Collin McMillan Luca DeFerrari Marco Comi Stefano CrespiDenys Poshyvanyk Chen Fu Qing Xie e Carlo Ghezzi An empirical investiga-tion into a large-scale java open source code repository Em Proceedings of the2010 ACM-IEEE International Symposium on Empirical Software Engineering andMeasurement ESEM rsquo10 paacuteginas 111ndash1110 New York NY USA 2010 ACMISBN 978-1-4503-0039-1 httpdoiacmorg10114518527861852801 1

[11] TIOBE Tiobe httpswwwtiobecomtiobe-index 1 14

48

[12] Gyori Alex Lyle Franklin Danny Dig e Jan Lahoda Crossing the gap from im-perative to functional programming through refactoring Em Proceedings of the 20139th Joint Meeting on Foundations of Software Engineering ESECFSE 2013 paacute-ginas 543ndash553 New York NY USA 2013 ACM ISBN 978-1-4503-2237-9 httpdoiacmorg10114524914112491461 2 11 24 39

[13] OpenJDK State of the lambda httpcropenjdkjavanet~briangoetzlambdalambda-state-4html 2

[14] Han Jiawei Micheline Kamber e Jian Pei Data Mining Concepts and TechniquesMorgan Kaufmann Publishers Inc San Francisco CA USA 3rd ediccedilatildeo 2011ISBN 0123814790 9780123814791 3

[15] Fowler Martin e Kent Beck Refactoring improving the design of existing codeAddison-Wesley Professional 1999 5 7

[16] Lehman M M J F Ramil P D Wernick D E Perry e W M Turski Met-rics and laws of software evolution - the nineties view Em Proceedings of the4th International Symposium on Software Metrics METRICS rsquo97 paacuteginas 20ndashWashington DC USA 1997 IEEE Computer Society ISBN 0-8186-8093-8 httpdlacmorgcitationcfmid=823454823901 6

[17] Hassan Ahmed E e Tao Xie Software intelligence The future of mining softwareengineering data Em Proceedings of the FSESDP Workshop on Future of SoftwareEngineering Research FoSER rsquo10 paacuteginas 161ndash166 New York NY USA 2010ACM ISBN 978-1-4503-0427-6 httpdoiacmorg101145188236218823978 9

[18] Hassan Ahmed E The road ahead for mining software repositories Em Frontiers ofSoftware Maintenance 2008 FoSM 2008 paacuteginas 48ndash57 IEEE 2008 8

[19] Berry Michael J e Gordon Linoff Data Mining Techniques For Marketing Salesand Customer Support John Wiley amp Sons Inc New York NY USA 1997ISBN 0471179809 10

[20] Parnin Chris Christian Bird e Emerson Murphy-Hill Java generics adoption hownew features are introduced championed or ignored Em Proceedings of the 8thWorking Conference on Mining Software Repositories paacuteginas 3ndash12 ACM 2011 12

[21] Oracle The java language specification httpsdocsoraclecomjavasespecsjlsse8jls8pdf 13

[22] Oracle The history of java technology httpwwworaclecomtechnetworkjavajavaseoverviewjavahistory-index-198355html 13

[23] Murphy Kieron So why did they decide to call itjava httpwwwjavaworldcomarticle2077265core-javaso-why-did-they-decide-to-call-it-java-html 13

[24] McGraw Tata Object-oriented Programming with Java Essentials and ApplicationsHill Education 13

49

[25] Oracle Differences between java ee and java se httpdocsoraclecomjavaee6firstcupdocgkhoyhtml 13

[26] Lindsey Clark S The History of Java Cambridge 14

[27] Oracle The java language environment httpwwworaclecomtechnetworkjavaintro-141325html 14

[28] Oracle Jdk 8 httpopenjdkjavanetprojectsjdk8 15 24

[29] Oracle Enhancements in java se 8 httpdocsoraclecomjavase8docstechnotesguideslanguageenhancementshtmljavase8 15 16 17

[30] Oracle Lambda expressions httpdocsoraclecomjavasetutorialjavajavaOOlambdaexpressionshtml 16 18 21

[31] Oracle Method references httpdocsoraclecomjavasetutorialjavajavaOOmethodreferenceshtml 16

[32] Oracle Default methods httpdocsoraclecomjavasetutorialjavaIandIdefaultmethodshtml 17

[33] Oracle Repeating annotations httpdocsoraclecomjavasetutorialjavaannotationsrepeatinghtml 17

[34] Oracle Type annotations httpdocsoraclecomjavasetutorialjavaannotationstype_annotationshtml 17

[35] Oracle Anonymous inner classes httpsdocsoraclecomjavasetutorialjavajavaOOanonymousclasseshtml 19

[36] Kothari CR Research Methodology Methods and Techniques New Age Interna-tional (P) Limited 2004 ISBN 9788122415223 httpsbooksgooglecombrbooksid=8c6gkbKi-F4C 22

[37] Nakakoji Kumiyo Yasuhiro Yamamoto Yoshiyuki Nishinaka Kouichi Kishida eYunwen Ye Evolution patterns of open-source software systems and communitiesEm IWPSE rsquo02 Proceedings of the International Workshop on Principles of SoftwareEvolution paacuteginas 76ndash85 New York NY USA 2002 ACM Press ISBN 1581135459httpdxdoiorg101145512035512055 23

[38] Rahman Foyzur Christian Bird e Premkumar Devanbu Clones What is that smellEmpirical Software Engineering 17(4-5)503ndash530 2012 24

[39] Chacon Scott Pro Git Apress Berkely CA USA 1st ediccedilatildeo 2009ISBN 1430218339 9781430218333 25

[40] Cavalcanti Thiago Gomes e Viniacutecius Correa de Almeida Caracterizaccedilatildeo do uso deconstruccedilotildees da linguagem java em projetos open-source Publicaccedilatildeo online 2016httpbdmunbbrhandle1048315733 27

50

[41] Parr Terence Language Implementation Patterns Create Your Own Domain-Specific and General Programming Languages Pragmatic Bookshelf 1st ediccedilatildeo 2009ISBN 193435645X 9781934356456 27

[42] Janssen Thorben 5 reasons to use jpa hibernate Publicaccedilatildeo online httpswwwsitepointcom5-reasons-to-use-jpa-hibernate 27

[43] Franklin Lyle Alex Gyori Jan Lahoda e Danny Dig Lambdaficator From imperativeto functional programming through automated refactoring Em Proceedings of the2013 International Conference on Software Engineering ICSE rsquo13 paacuteginas 1287ndash1290 Piscataway NJ USA 2013 IEEE Press ISBN 978-1-4673-3076-3 httpdlacmorgcitationcfmid=24867882486986 29

[44] Google Agera httpsgithubcomgoogleagerawiki 34

[45] Eclipse Eclipse vertx httpvertxio 35

[46] Cejas Fernando Android cleanarchitecture httpsgithubcomandroid10Android-CleanArchitecture 36

[47] ReactiveX Rxjava httpsgithubcomReactiveXRxJava 37

[48] Luontola Esko Retrolambda httpsgithubcomorfjackalretrolambda 43

51

Anexo I

Projetos utilizados

fastjson

platform_frameworks_base

netty

material-dialogs

kotlin

okhttp

tinker

AndroidUtilCode

RxJava

spring-boot

java-design-patterns

elasticsearch

ExoPlayer

kafka

vertx

realm-java

guava

zipkin

bazel

stetho

Signal-Android

glide

agera

fresco

plaid

presto

libgdx

spark

52

disruptor

lottie-android

flexbox-layout

PocketHub

zxing

spring-framework

deeplearning4j

dropwizard

interviews

BaseRecyclerViewAdapterHelper

uCrop

DanmakuFlameMaster

lottie-react-native

android-UniversalMusicPlayer

AndroidInterview-Q-A

greenDAO

retrofit

MaterialDrawer

BottomBar

druid

MPAndroidChart

Hystrix

guice

recyclerview-animators

dubbo

androidannotations

RxJava-Android-Samples

PhotoView

clojure

CircleImageView

AndroidSwipeLayout

jedis

MaterialViewPager

butterknife

junit4

RxBinding

leakcanary

SimianArmy

picasso

UltimateRecyclerView

53

AndroidViewAnimations

AppIntro

FizzBuzzEnterpriseEdition

ion

cheesesquare

physical-web

RxAndroid

Android-CleanArchitecture

Calligraphy

Android-Bootstrap

iosched

Android_Data

MaterialDesignLibrary

ListViewAnimations

EventBus

java8-tutorial

AndroidSlidingUpPanel

dagger

okhttputils

logger

HomeMirror

Material-Animations

android-Ultra-Pull-To-Refresh

android-async-http

Android-ObservableScrollView

Android-Universal-Image-Loader

ActionBarSherlock

SlidingMenu

storm

PagerSlidingTabStrip

Android-PullToRefresh

54

  • Dedicatoacuteria
  • Agradecimentos
  • Resumo
  • Abstract
  • Introduccedilatildeo
    • Contexto
    • Objetivos
      • Objetivos Gerais
      • Objetivos Especiacuteficos
        • Metodologia
        • Organizaccedilatildeo do Trabalho
          • Evoluccedilatildeo e Mineraccedilatildeo de Repositoacuterios de Software
            • Evoluccedilatildeo de Software
            • MSR Mineraccedilatildeo de dados e a Engenharia de Software
              • Classificaccedilatildeo
                • Trabalhos Relacionados
                  • Java SE 8 e JDK 8
                    • Histoacuterico
                    • Princiacutepios
                    • Evoluccedilatildeo
                    • Expressotildees Lambda
                      • Sintaxe
                      • Principais formas de uso
                          • Estudo e o Processo de Mineraccedilatildeo
                            • Questotildees de Pesquisa
                            • Fonte de Dados e Objetos de Estudo
                            • Processo de Mineraccedilatildeo
                              • static-analysis
                              • BDAnalisador
                                • Classificaccedilatildeo e Anaacutelise
                                  • Meacutedia de Lambda
                                  • Anaacutelise Temporal
                                  • Refatoraccedilatildeo de Coacutedigo
                                  • Casos de Uso
                                      • Resultados Obtidos e Anaacutelise
                                        • Visatildeo Geral
                                          • Projetos Selecionados
                                          • agera
                                          • vertx
                                          • Android-CleanArchitecture
                                          • RxJava
                                          • guava
                                            • Refatoraccedilatildeo de Coacutedigo
                                            • Estudos de Caso
                                              • Consideraccedilotildees Finais
                                              • Referecircncias
                                              • Anexo
                                              • Projetos utilizados

443 Refatoraccedilatildeo de Coacutedigo

O uacuteltimo script teve como objetivo realizar uma tentativa inicial de identificar refatoraccedilatildeode coacutedigo da seguinte maneira para todos os projetos que possuem expressotildees lambdaforam identificados o mecircs imediatamente antes da introduccedilatildeo de expressotildees lambda e omecircs seguinte onde houve a primeira ocorrecircncia de lambda no projeto Assim realizou-se uma anaacutelise do tamanho em quantidade de linhas de coacutedigo de todos os meacutetodosdo projeto que no mecircs seguinte tiveram introduccedilatildeo de lambda Em seguida fez-se umacomparaccedilatildeo com os mesmos meacutetodos em relaccedilatildeo ao mecircs anterior e assim foi possiacuteveldetectar quais meacutetodos tiveram a quantidade de linhas de coacutedigo reduzidas o que seriaum indicativo natildeo necessariamente exclusivo de que uma refatoraccedilatildeo de coacutedigo possa terocorrido

Sabe-se que este meacutetodo de detecccedilatildeo de refatoraccedilatildeo de coacutedigo possui suas limitaccedilotildeesuma vez que as comparaccedilotildees para saber se um meacutetodo existe em ambas versotildees eacute feitopuramente por comparaccedilatildeo de String (nome do meacutetodo) e a classe que este pertence

444 Casos de Uso

Os meacutetodos descritos acima ajudaram a identificar alguns padrotildees e facilitar a anaacutelise dosdados Poreacutem natildeo satildeo suficientes para que se possa responder agraves questotildees de pesquisaDessa forma apoacutes a identificaccedilatildeo dos grupos de classificaccedilatildeo para os projetos foramescolhidos um projeto de cada grupo (com exceccedilatildeo do grupo dos projetos sem expressotildeeslambda) para realizar um breve estudo de caso com o objetivo de identificar e caracterizarmelhor a adoccedilatildeo de expressotildees lambda Os projetos escolhidos foram agera vertxAndroid-CleanArchitecture RxJava e guava

32

Capiacutetulo 5

Resultados Obtidos e Anaacutelise

Neste capiacutetulo seratildeo apresentados os dados obtidos e anaacutelise com o objetivo de responderagraves questotildees de pesquisa propostas Como mencionado anteriormente as perguntas seratildeorespondidas de duas maneiras algumas com informaccedilotildees gerais sobre todos os projetose outras com breve estudos de caso envolvendo cinco projetos

51 Visatildeo Geral

Dentre os repositoacuterios coletados para a anaacutelise 74 (7474) natildeo utilizaram nenhumaexpressatildeo lambda no projeto durante todo o periacuteodo analisado (Janeiro de 2013 a Abrilde 2017) restando apenas 25 repositoacuterios (2525) com expressotildees lambda Eacute interessantedestacar que apesar de a quantidade de repositoacuterios que natildeo possuem expressotildees lambdaser relativamente expressiva muitos destes repositoacuterios satildeo de projetos em Java que umdia foram populares e atualmente natildeo estatildeo sendo mais desenvolvidos (por exemplo umaplicativo que soacute funciona para Android 23 atualmente descontinuado)

Levando em consideraccedilatildeo apenas os projetos que possuem expressotildees lambda exis-tem dois tipos de dados que podem ser analisados para responder agrave primeira questatildeo depesquisa atraveacutes dos dados obtidos pelo meacutetodo anteriormente mencionado como anaacutelisetemporal e a meacutedia de lambda por snapshot mencionados no capiacutetulo anterior

Com relaccedilatildeo ao ano em que a primeira ocorrecircncia foi encontrada 6 projetos introduzi-ram expressotildees lambda jaacute em 2014 8 comeccedilaram a utilizar em 2015 7 em 2016 e apenas4 tiveram a primeira ocorrecircncia de expressotildees lambda em 2017 Dessa forma percebe-seque os projetos estatildeo relativamente bem distribuiacutedos em grupos quanto ao ano em que seintroduziu expressotildees lambda

Pela meacutedia de lambda por snapshot (lambdasnapshot) a maioria (11 projetos) possuiuma quantidade expressiva acima de 100 lambdasnapshot (com 6 projetos entre 20 e 100lambdasnapshot e 8 projetos com menos de 20 lambdasnapshot) como apresentados no

33

graacutefico da Figura 51 Isso mostra que essa nova caracteriacutestica jaacute estaacute sendo bem utilizadanos projetos que comeccedilaram a migrar para a nova versatildeo do Java

Figura 51 Graacuteficos dos projetos separados por ano de introduccedilatildeo de expressotildees lambdae meacutedia de lambda por snapshot

Com isso pode-se observar que apesar de a quantidade de projetos que possuemexpressotildees lambda natildeo ser tatildeo alta eacute possiacutevel obter resultados expressivos uma vez quea quantidade dos projetos com lambda estatildeo bem dispersos quanto ao periacuteodo em quecomeccedilaram a adotar essa caracteriacutestica e a quantidade de expressotildees lambda por snapshot

511 Projetos Selecionados

Atraveacutes dos grupos de classificaccedilatildeo identificados pela anaacutelise temporal descritos na Figura45 cinco projetos foram selecionados para uma anaacutelise detalhada levando em consideraccedilatildeoo grupo em que eles pertencem Estes projetos seratildeo apresentados a seguir

512 agera

Agera eacute uma biblioteca Android que ajuda a introduzir programaccedilatildeo funcional reativa(functional reactive programming) em projetos Android Eacute um projeto recente lanccediladoem 2016 pela Google [44] e encontra-se no grupo dos projetos que introduziram expressotildeeslambda em 2016 no mesmo ano de seu lanccedilamento contendo uma meacutedia de expressotildeeslambda de 16 lambdasnapshot

Na classificaccedilatildeo estabelecida agera pertence ao Grupo 1 onde a quantidade de ex-pressotildees lambda no projeto com o tempo aumentam juntamente com a quantidade deAICs como mostra o graacutefico de anaacutelise temporal na Figura 52

34

Figura 52 Graacuteficos de anaacutelise temporal do projeto agera

513 vertx

Eclipse Vertx eacute um conjunto de ferramentas para criaccedilatildeo de reactive applications namaacutequina virtual Java (JVM) em grande escala [45] Seu primeiro lanccedilamento aconteceuem 2011 e a primeira ocorrecircncia de expressotildees lambda no projeto aconteceu em 2014 Esteprojeto possui uma meacutedia de 2867 lambdasnapshot e dentre os projetos consideradosneste trabalho eacute o que possui a maior quantidade de expressotildees lambda

Este projeto pertence ao Grupo 2 onde a quantidade de expressotildees lambda aumen-tou consideravelmente pelos meses ultrapassando a quantidade de AICs que diminuiudrasticamente como mostra a Figura 53

35

Figura 53 Graacuteficos de anaacutelise temporal do projeto Vertx

514 Android-CleanArchitecture

Apesar de ser uma amostra de projeto Android-CleanArchitecture que tem como objetivoconstruir aplicaccedilotildees Android utilizando clean architecture foi lanccedilado em 2014 mas semanteacutem sempre atualizado [46]

A introduccedilatildeo de expressotildees lambda que aconteceu no ano de 2015 se deu de formatiacutemida com uma meacutedia de 35 lambdasnapshot De qualquer forma este projeto conseguerepresentar com seu graacutefico de anaacutelise temporal o grupo 3 composto por projetos em quea quantidade de expressotildees lambda aumentou mas sem ultrapassar AICs que diminuiacuteramdemonstrado no graacutefico da Figura 54

36

Figura 54 Graacuteficos de anaacutelise temporal do projeto Android-CleanArchitecture

515 RxJava

Dentre os repositoacuterios estudados RxJava eacute considerado o mais popular Como umaimplementaccedilatildeo de Reactive Extensions para a JVM RxJava teve seu lanccedilamento dadoem 2013 [47] Expressotildees lambda apareceram pela primeira vez no ano de 2015 comuma meacutedia de 766 lambdasnapshot

Apesar de uma meacutedia relativamente alta o tempo de vida das expressotildees lambda nesteprojeto foi bem curto caracterizando assim projetos do grupo 4 houve a introduccedilatildeo dasexpressotildees lambda no projeto poreacutem houve a remoccedilatildeo completa de todas as expressotildeeslambda previamente introduzidas desaparecendo completamente do projeto ateacute a datada coleta de dados (Figura 55)

37

Figura 55 Graacuteficos de anaacutelise temporal do projeto RxJava

516 guava

Guava eacute um conjunto de bibliotecas para Java da Google lanccedilado em 2011 A atualizaccedilatildeodo coacutedigo do projeto para Java 8 aconteceu somente em 2016 e apesar do projeto conteruma meacutedia de 281 lambdasnapshot ele foi escolhido como representante dos projetosdo Grupo 5 (Figura 56) que possuem expressotildees lambda mas de forma natildeo expressiva osuficiente quando comparado com a quantidade de AIC pelo fato de sua razatildeo de meacutedia delambdasnapshot por meacutedia de AICsnapshot ser 004 Ou seja embora o projeto tenhaexpressotildees lambda estas satildeo consideradas muito poucas quando inseridas no contextogeral deste projeto que eacute considerado um projeto grande

38

Figura 56 Graacuteficos de anaacutelise temporal do projeto Guava

52 Refatoraccedilatildeo de Coacutedigo

Com o objetivo de caracterizar melhor como as expressotildees lambda estatildeo sendo utilizadaseacute interessante identificar se estas estatildeo sendo introduzidas atraveacutes de refatoraccedilatildeo de coacutedigoou em coacutedigo novo

Os projetos classificados como pertencentes ao Grupo 2 possuem em comum o fatode expressotildees lambda aumentarem a medida que AICs diminuem ultrapassando-as eessa caracteriacutestica em comum pode indicar que nestes projetos possivelmente houve re-fatoraccedilatildeo de coacutedigo visto que AIC sendo substituiacutedo por expressotildees lambda dentro dascondiccedilotildees determinadas eacute a maneira mais comum de se identificar refatoraccedilatildeo de coacute-digo para introduccedilatildeo de expressotildees lambda [12] Os projetos que compotildeem o grupo 2representam 44 de todos os projetos estudados que possuem expressotildees lambda o quepode ser um indicativo caso a hipoacutetese de refatoraccedilatildeo de coacutedigo seja positiva de quemuitos projetos que estatildeo adotando o Java 8 estatildeo se preocupando de alguma formacom refatoraccedilatildeo se coacutedigo Fazem parte desse grupo os seguintes projetos elasticsearchjava-design-patterns PocketHub presto RxJava-Android-Samples spark vertx zipkinjava8-tutorial dropwizard e material-dialogs

39

Outra maneira de verificar possiacuteveis indicadores de refatoraccedilatildeo de coacutedigo foi atraveacutesda anaacutelise dos tamanhos (em quantidade de linhas de coacutedigo) dos meacutetodos com expressotildeeslambda no mecircs em que se introduziu expressotildees lambda e um mecircs imediatamente antesdeste Essa anaacutelise mostra que dos 25 projetos com expressotildees lambda 12 (48) projetostiveram ao menos um meacutetodo em que houve uma diminuiccedilatildeo no tamanho o que podeser considerado um indicativo de refatoraccedilatildeo de coacutedigo A Figura 57 mostra todos osprojetos em relaccedilatildeo agrave quantidade total de meacutetodos que possuem lambda no primeiro mecircsde introduccedilatildeo do mesmo em vermelho comparado com a quantidade desses meacutetodos quetiveram uma diminuiccedilatildeo no tamanho quando comparados com o coacutedigo do mecircs anteriorem azul

Figura 57 Comparaccedilatildeo entre todos os projetos com expressatildeo lambda sobre refatoraccedilatildeode coacutedigo no mecircs de introduccedilatildeo da caracteriacutestica

Ainda observando a figura 57 com relaccedilatildeo aos projetos que natildeo tiveram nenhummeacutetodo com diminuiccedilatildeo de tamanho (barra azul) percebe-se que todos os 13 projetossequer tiveram uma quantidade significativa de meacutetodos que possuem expressotildees lambda(com o maior tendo apenas 5 meacutetodos) no mecircs de introduccedilatildeo da caracteriacutestica no projetoe ao mesmo tempo jaacute existiam no mecircs em que natildeo existia lambda no projeto Essa eacuteuma observaccedilatildeo importante porque projetos como vertx sendo este o que possui a maiormeacutedia de lambdasnapshot de todos os projetos e ao mesmo tempo tendo apenas trecircsmeacutetodos que continham expressotildees lambda no mecircs da introduccedilatildeo e que existiam no mecircs

40

anterior permitem inferir que todas as outras expressotildees lambda existentes no projetopara este determinado mecircs de introduccedilatildeo encontram-se em coacutedigo novo introduzido

Eacute importante ressaltar que somente essa anaacutelise natildeo eacute exclusivamente suficiente paradeterminar se estes projetos estatildeo realmente introduzindo lambda em coacutedigo novo ourealizando refatoraccedilatildeo uma vez que como a comparaccedilatildeo aconteceu apenas no mecircs deintroduccedilatildeo com o mecircs imediatamente anterior natildeo reflete todo o ciclo de vida do pro-jeto Por exemplo algumas equipes podem escolher refatorar o coacutedigo depois de umtempo de adaptaccedilatildeo apoacutes a transiccedilatildeo para a nova versatildeo da linguagem Assim paraobter uma melhor anaacutelise sobre refatoraccedilatildeo de coacutedigo ou natildeo feita nestes projetos aleacutemde outras anaacutelises referentes aos padrotildees tipicamente adotados para implementaccedilatildeo delambda nestes projetos seratildeo apresentados a seguir os estudos de caso dos cinco projetospreviamente selecionados

Outro ponto importante eacute o fato de que apesar das informaccedilotildees quanto agraves quantida-des de filter e map terem sido incluiacutedas inicialmente no trabalho para observar possiacuteveispadrotildees de refatoraccedilatildeo de coacutedigo percebeu-se que estas natildeo satildeo utilizadas de forma con-sideraacutevel pelos projetos estudados e para fins de anaacutelises generalizadas natildeo apresentaramtanta influecircncia na utilizaccedilatildeo de expressotildees lambda quanto a quantidade de AICs noprojeto

53 Estudos de Caso

Dentre os projetos analisados verificou-se que os projetos de pequeno e meacutedio porte op-taram por refatorar de uma vez seus coacutedigos para incluir expressotildees lambda em situaccedilotildeesem que se utilizava AICs anteriormente ou em alguns poucos casos de utilizaccedilatildeo deCollection Os projetos de grande porte natildeo apresentaram nenhuma refatoraccedilatildeo de coacute-digo ou uma refatoraccedilatildeo parcial gradativa provavelmente devido agrave grande quantidade dearquivos e coacutedigo que possuem o que pode tornar o trabalho de refatoraccedilatildeo extenso ecansativo

O projeto vertx que pertence ao grupo 2 dos projetos em que a quantidade de ex-pressotildees lambda aumentaram e as de AICs diminuiacuteram com lambda ultrapassando AICsexecutou inicialmente commits em maio de 2014 com adiccedilatildeo de coacutedigo novo utilizandoexpressotildees lambda e apoacutes um mecircs realizou um commit maior com a refatoraccedilatildeo de todasas AICs para expressotildees lambda Apoacutes a refatoraccedilatildeo o projeto se preocupou em mantera utilizaccedilatildeo de expressotildees lambda ao mesmo tempo que o uso de AICs se manteve apenasaos casos de classes com interfaces natildeo funcionais A Figura 58 apresenta uma parte docommit de refatoraccedilatildeo de coacutedigo que mostra em vermelho a parte eliminada do coacutedigo(AIC) e em verde o coacutedigo novo representando a substituiccedilatildeo por uma expressatildeo lambda

41

Figura 58 Commit de refatoraccedilatildeo de coacutedigo do projeto Vertx [3]

Alguns projetos ainda natildeo se preocuparam em refatorar o coacutedigo para o uso de ex-pressotildees lambda ateacute a data deste trabalho que eacute o caso do projeto guava que apresentouum commit em 03112016 com a atualizaccedilatildeo do projeto para Java 8 Mas a partir daatualizaccedilatildeo se preocupou em utilizar as expressotildees lambda apenas na implementaccedilatildeo decoacutedigo novo O cenaacuterio em que a refatoraccedilatildeo natildeo eacute prioridade ainda eacute a realidade de vaacuteriosprojetos de grande porte visto que os dados de projetos sem nenhuma expressatildeo lambdasatildeo o maior nuacutemero neste trabalho Poreacutem projetos que jaacute adotaram a utilizaccedilatildeo do Java8 tendem a mudar isso com o passar do tempo A Figura 59 apresenta em verde umaadiccedilatildeo de coacutedigo novo com expressatildeo lambda sem a eliminaccedilatildeo de algum coacutedigo anteriora esse que estaria em vermelho

42

Figura 59 Exemplo de um arquivo do commit de adiccedilatildeo de coacutedigo novo em Java 8 doprojeto Guava [4]

Na categoria de projetos em que os AICs e expressotildees lambda aumentam proporci-onalmente (grupo 1) o projeto agera realizou um commit em 19052016 com a adiccedilatildeoda biblioteca retrolambda como dependecircncia do projeto Essa biblioteca utilizada prin-cipalmente por projetos Android permite executar coacutedigo Java 8 contendo expressotildeeslambda em Java 5 6 e 7 [48] O commit tambeacutem apresenta refatoraccedilatildeo dos AICs ad-vindos de interfaces funcionais para expressotildees lambda Apesar de o projeto continuar autilizar as expressotildees lambda em seus commits posteriores o nuacutemero de AICs tambeacutemcontinuou a aumentar visualizando os commits posteriores notou-se que esses AICs satildeorelativos a interfaces natildeo funcionais ou seja que possuem mais de um meacutetodo O projetoAndroid-CleanArchitecture eacute similar ao agera pois tambeacutem optou pela instalaccedilatildeo da bi-blioteca retrolambda para uso de expressotildees lambda em seus coacutedigos e como tambeacutem eacuteum projeto de pequeno porte houve uma pequena refatoraccedilatildeo dos AICs A Figura 510mostra a parte do commit de refatoraccedilatildeo de coacutedigo em que o desenvolvedor adiciona abiblioteca retrolambda como dependecircncia

43

Figura 510 Commit de adiccedilatildeo da biblioteca Retrolambda no projeto Agera [5]

Outro caso interessante eacute o do projeto RxJava que em 2015 optou pela refatoraccedilatildeodo coacutedigo para a utilizaccedilatildeo de expressotildees lambda quase eliminando por completo o usode AICs mas que no ano seguinte reverteu os commits de forma que eliminasse comple-tamente o uso de expressotildees lambda para manter a retrocompatibilidade com o Java 6A Figura 511 demonstra uma parte do commit de reversatildeo do coacutedigo para Java 6 emque pode ser visto em vermelho o coacutedigo anterior com expressotildees lambda e o verde como novo coacutedigo utilizando AIC novamente

44

Figura 511 Commit de remoccedilatildeo de Lambdas e volta para o uso de AICs no projetoRXJava [6]

Essa preocupaccedilatildeo com retrocompatibilidade de coacutedigo pode ser um fator crucial nadecisatildeo das equipes de desenvolvimento na hora de decidir como fazer o software co-evoluircom a linguagem sem perder a compatibilidade com versotildees anteriores

45

Capiacutetulo 6

Consideraccedilotildees Finais

Este estudo permitiu entender melhor como projetos estatildeo realizando a migraccedilatildeo para oJava 8 em especial utilizando uma nova caracteriacutestica introduzida expressatildeo lambdaApesar de a maioria dos projetos populares considerados natildeo possuiacuterem nenhuma ocor-recircncia de expressotildees lambda os projetos que tinham expressotildees lambda foram suficientespara realizar um primeiro estudo de caracterizaccedilatildeo no uso desta caracteriacutestica e com osprojetos efetivamente utilizados para estudo foi possiacutevel agrupaacute-los quanto a maneira emque as expressotildees lambda estavam sendo utilizadas quando comparadas com AICs em 5grandes grupos quando AIC e lambda aumentam proporcionalmente quando AIC dimi-nui e lambda aumenta ultrapassando AIC quando AIC diminui mas continua superior aolambda crescente expressotildees lambda que foram introduzidas e retiradas completamentedo coacutedigo e expressotildees lambda que natildeo existem em quantidades expressivas

Foi possiacutevel entatildeo realizar um estudo aprofundado levando em consideraccedilatildeo as di-ferentes maneiras com que as expressotildees lambda foram adotadas nos projetos atraveacutes daescolha de um projeto que representasse cada grupo para anaacutelise Dentre os cinco projetosestudados foi possiacutevel observar alguns padrotildees tipicamente adotados por desenvolvedorespara implementar expressotildees lambda em seus projetos como a utilizaccedilatildeo da bibliotecas(retrolambda) que permitissem uma flexibilizaccedilatildeo na utilizaccedilatildeo de expressotildees lambda oucomo lambda eacute primariamente utilizada para substituir determinados AICs ou operaccedilotildeesem Collection

Aleacutem disso foi possiacutevel observar como a refatoraccedilatildeo de coacutedigo acontece em cada umdesses projetos Observou-se como projetos menores tendem a refatorar coacutedigo maisfacilmente ao passo que projetos maiores e mais complexos fazem menos refatoraccedilatildeo oudemoram mais entre o periacuteodo em que houve a primeira migraccedilatildeo de coacutedigo para a novaversatildeo da linguagem ateacute o periacuteodo em que realmente decidem refatorar coacutedigo Aleacutem dacomplexidade do projeto influenciar na decisatildeo de migrar o projeto para uma versatildeo maisrecente da linguagem a preocupaccedilatildeo com retrocompatibilidade com versotildees anteriores da

46

linguagem tambeacutem podem ser uma barreira para que projetos comecem a evoluir o coacutedigojuntamente com a evoluccedilatildeo da linguagem

Ainda assim foi possiacutevel observar que a preocupaccedilatildeo com a co-evoluccedilatildeo do software-linguagem existe entre os desenvolvedores de projetos mas a realizaccedilatildeo da migraccedilatildeo aindaacontece lentamente devido agrave diversos fatores que precisam ser levados em consideraccedilatildeopara a manutenccedilatildeo do projeto

Para trabalhos e contribuiccedilotildees futuras seria interessante desenvolver uma ferramentaque pudesse analisar diretamente no coacutedigo-fonte as oportunidades de aplicaccedilatildeo de ex-pressotildees lambda dessa forma poderiam ser analisadas as porcentagens de conversatildeo decoacutedigo para Java 8 e obter melhores conclusotildees sobre a importacircncia que os projetos estatildeodando para a evoluccedilatildeo de seus coacutedigos Outro fator interessante seria aplicar mais Visitorsagrave ferramenta static-analysis e fazer este mesmo estudo aplicado agrave outras caracteriacutesticasda linguagem

47

Referecircncias

[1] Kagdi Huzefa Michael L Collard e Jonathan I Maletic A survey and taxonomyof approaches for mining software repositories in the context of software evolution2007 ix 3 8 9 10 11

[2] DBeaver Dbeaver - features httpdbeaverjkissorgdocsfeatures ix 29

[3] Eclipse Vertx commit Java8-ify code httpsgithubcomeclipsevertxcommit93f95e9c77419f442a42fe711b6eeaef88192fd3 ix 42

[4] Google Guava commit Release java 8 changes to guava httpsgithubcomgoogleguavacommit73e382fa877f80994817a136b0adcc4365ccd904 ix 43

[5] Google Agera commit Collapsed testapp with retrolambda httpsgithubcomgoogleageracommit5e518b7b05f9e7a34a314945f68deff7b2c3e334 ix 44

[6] ReactiveX Rxjava commit 2x full jdk 6 compatible backport + includ-ing bugfixes up to today httpsgithubcomReactiveXRxJavacommit000a174d87a901135f9665d3b11f3627fd2dc4ed ix 45

[7] Godfrey M W e D M German The past present and future of software evolutionEm 2008 Frontiers of Maintenance paacuteginas 129ndash138 Sept 2008 1 6

[8] Favre J M Languages evolve too changing the software time scale Em Principles ofSoftware Evolution Eighth International Workshop on paacuteginas 33ndash42 IEEE 20051 5 7

[9] Overbey Jeffrey L e Ralph E Johnson Regrowing a language refactoring tools allowprogramming languages to evolve Em ACM SIGPLAN Notices volume 44 paacuteginas493ndash502 ACM 2009 1 5 7 8 12

[10] Grechanik Mark Collin McMillan Luca DeFerrari Marco Comi Stefano CrespiDenys Poshyvanyk Chen Fu Qing Xie e Carlo Ghezzi An empirical investiga-tion into a large-scale java open source code repository Em Proceedings of the2010 ACM-IEEE International Symposium on Empirical Software Engineering andMeasurement ESEM rsquo10 paacuteginas 111ndash1110 New York NY USA 2010 ACMISBN 978-1-4503-0039-1 httpdoiacmorg10114518527861852801 1

[11] TIOBE Tiobe httpswwwtiobecomtiobe-index 1 14

48

[12] Gyori Alex Lyle Franklin Danny Dig e Jan Lahoda Crossing the gap from im-perative to functional programming through refactoring Em Proceedings of the 20139th Joint Meeting on Foundations of Software Engineering ESECFSE 2013 paacute-ginas 543ndash553 New York NY USA 2013 ACM ISBN 978-1-4503-2237-9 httpdoiacmorg10114524914112491461 2 11 24 39

[13] OpenJDK State of the lambda httpcropenjdkjavanet~briangoetzlambdalambda-state-4html 2

[14] Han Jiawei Micheline Kamber e Jian Pei Data Mining Concepts and TechniquesMorgan Kaufmann Publishers Inc San Francisco CA USA 3rd ediccedilatildeo 2011ISBN 0123814790 9780123814791 3

[15] Fowler Martin e Kent Beck Refactoring improving the design of existing codeAddison-Wesley Professional 1999 5 7

[16] Lehman M M J F Ramil P D Wernick D E Perry e W M Turski Met-rics and laws of software evolution - the nineties view Em Proceedings of the4th International Symposium on Software Metrics METRICS rsquo97 paacuteginas 20ndashWashington DC USA 1997 IEEE Computer Society ISBN 0-8186-8093-8 httpdlacmorgcitationcfmid=823454823901 6

[17] Hassan Ahmed E e Tao Xie Software intelligence The future of mining softwareengineering data Em Proceedings of the FSESDP Workshop on Future of SoftwareEngineering Research FoSER rsquo10 paacuteginas 161ndash166 New York NY USA 2010ACM ISBN 978-1-4503-0427-6 httpdoiacmorg101145188236218823978 9

[18] Hassan Ahmed E The road ahead for mining software repositories Em Frontiers ofSoftware Maintenance 2008 FoSM 2008 paacuteginas 48ndash57 IEEE 2008 8

[19] Berry Michael J e Gordon Linoff Data Mining Techniques For Marketing Salesand Customer Support John Wiley amp Sons Inc New York NY USA 1997ISBN 0471179809 10

[20] Parnin Chris Christian Bird e Emerson Murphy-Hill Java generics adoption hownew features are introduced championed or ignored Em Proceedings of the 8thWorking Conference on Mining Software Repositories paacuteginas 3ndash12 ACM 2011 12

[21] Oracle The java language specification httpsdocsoraclecomjavasespecsjlsse8jls8pdf 13

[22] Oracle The history of java technology httpwwworaclecomtechnetworkjavajavaseoverviewjavahistory-index-198355html 13

[23] Murphy Kieron So why did they decide to call itjava httpwwwjavaworldcomarticle2077265core-javaso-why-did-they-decide-to-call-it-java-html 13

[24] McGraw Tata Object-oriented Programming with Java Essentials and ApplicationsHill Education 13

49

[25] Oracle Differences between java ee and java se httpdocsoraclecomjavaee6firstcupdocgkhoyhtml 13

[26] Lindsey Clark S The History of Java Cambridge 14

[27] Oracle The java language environment httpwwworaclecomtechnetworkjavaintro-141325html 14

[28] Oracle Jdk 8 httpopenjdkjavanetprojectsjdk8 15 24

[29] Oracle Enhancements in java se 8 httpdocsoraclecomjavase8docstechnotesguideslanguageenhancementshtmljavase8 15 16 17

[30] Oracle Lambda expressions httpdocsoraclecomjavasetutorialjavajavaOOlambdaexpressionshtml 16 18 21

[31] Oracle Method references httpdocsoraclecomjavasetutorialjavajavaOOmethodreferenceshtml 16

[32] Oracle Default methods httpdocsoraclecomjavasetutorialjavaIandIdefaultmethodshtml 17

[33] Oracle Repeating annotations httpdocsoraclecomjavasetutorialjavaannotationsrepeatinghtml 17

[34] Oracle Type annotations httpdocsoraclecomjavasetutorialjavaannotationstype_annotationshtml 17

[35] Oracle Anonymous inner classes httpsdocsoraclecomjavasetutorialjavajavaOOanonymousclasseshtml 19

[36] Kothari CR Research Methodology Methods and Techniques New Age Interna-tional (P) Limited 2004 ISBN 9788122415223 httpsbooksgooglecombrbooksid=8c6gkbKi-F4C 22

[37] Nakakoji Kumiyo Yasuhiro Yamamoto Yoshiyuki Nishinaka Kouichi Kishida eYunwen Ye Evolution patterns of open-source software systems and communitiesEm IWPSE rsquo02 Proceedings of the International Workshop on Principles of SoftwareEvolution paacuteginas 76ndash85 New York NY USA 2002 ACM Press ISBN 1581135459httpdxdoiorg101145512035512055 23

[38] Rahman Foyzur Christian Bird e Premkumar Devanbu Clones What is that smellEmpirical Software Engineering 17(4-5)503ndash530 2012 24

[39] Chacon Scott Pro Git Apress Berkely CA USA 1st ediccedilatildeo 2009ISBN 1430218339 9781430218333 25

[40] Cavalcanti Thiago Gomes e Viniacutecius Correa de Almeida Caracterizaccedilatildeo do uso deconstruccedilotildees da linguagem java em projetos open-source Publicaccedilatildeo online 2016httpbdmunbbrhandle1048315733 27

50

[41] Parr Terence Language Implementation Patterns Create Your Own Domain-Specific and General Programming Languages Pragmatic Bookshelf 1st ediccedilatildeo 2009ISBN 193435645X 9781934356456 27

[42] Janssen Thorben 5 reasons to use jpa hibernate Publicaccedilatildeo online httpswwwsitepointcom5-reasons-to-use-jpa-hibernate 27

[43] Franklin Lyle Alex Gyori Jan Lahoda e Danny Dig Lambdaficator From imperativeto functional programming through automated refactoring Em Proceedings of the2013 International Conference on Software Engineering ICSE rsquo13 paacuteginas 1287ndash1290 Piscataway NJ USA 2013 IEEE Press ISBN 978-1-4673-3076-3 httpdlacmorgcitationcfmid=24867882486986 29

[44] Google Agera httpsgithubcomgoogleagerawiki 34

[45] Eclipse Eclipse vertx httpvertxio 35

[46] Cejas Fernando Android cleanarchitecture httpsgithubcomandroid10Android-CleanArchitecture 36

[47] ReactiveX Rxjava httpsgithubcomReactiveXRxJava 37

[48] Luontola Esko Retrolambda httpsgithubcomorfjackalretrolambda 43

51

Anexo I

Projetos utilizados

fastjson

platform_frameworks_base

netty

material-dialogs

kotlin

okhttp

tinker

AndroidUtilCode

RxJava

spring-boot

java-design-patterns

elasticsearch

ExoPlayer

kafka

vertx

realm-java

guava

zipkin

bazel

stetho

Signal-Android

glide

agera

fresco

plaid

presto

libgdx

spark

52

disruptor

lottie-android

flexbox-layout

PocketHub

zxing

spring-framework

deeplearning4j

dropwizard

interviews

BaseRecyclerViewAdapterHelper

uCrop

DanmakuFlameMaster

lottie-react-native

android-UniversalMusicPlayer

AndroidInterview-Q-A

greenDAO

retrofit

MaterialDrawer

BottomBar

druid

MPAndroidChart

Hystrix

guice

recyclerview-animators

dubbo

androidannotations

RxJava-Android-Samples

PhotoView

clojure

CircleImageView

AndroidSwipeLayout

jedis

MaterialViewPager

butterknife

junit4

RxBinding

leakcanary

SimianArmy

picasso

UltimateRecyclerView

53

AndroidViewAnimations

AppIntro

FizzBuzzEnterpriseEdition

ion

cheesesquare

physical-web

RxAndroid

Android-CleanArchitecture

Calligraphy

Android-Bootstrap

iosched

Android_Data

MaterialDesignLibrary

ListViewAnimations

EventBus

java8-tutorial

AndroidSlidingUpPanel

dagger

okhttputils

logger

HomeMirror

Material-Animations

android-Ultra-Pull-To-Refresh

android-async-http

Android-ObservableScrollView

Android-Universal-Image-Loader

ActionBarSherlock

SlidingMenu

storm

PagerSlidingTabStrip

Android-PullToRefresh

54

  • Dedicatoacuteria
  • Agradecimentos
  • Resumo
  • Abstract
  • Introduccedilatildeo
    • Contexto
    • Objetivos
      • Objetivos Gerais
      • Objetivos Especiacuteficos
        • Metodologia
        • Organizaccedilatildeo do Trabalho
          • Evoluccedilatildeo e Mineraccedilatildeo de Repositoacuterios de Software
            • Evoluccedilatildeo de Software
            • MSR Mineraccedilatildeo de dados e a Engenharia de Software
              • Classificaccedilatildeo
                • Trabalhos Relacionados
                  • Java SE 8 e JDK 8
                    • Histoacuterico
                    • Princiacutepios
                    • Evoluccedilatildeo
                    • Expressotildees Lambda
                      • Sintaxe
                      • Principais formas de uso
                          • Estudo e o Processo de Mineraccedilatildeo
                            • Questotildees de Pesquisa
                            • Fonte de Dados e Objetos de Estudo
                            • Processo de Mineraccedilatildeo
                              • static-analysis
                              • BDAnalisador
                                • Classificaccedilatildeo e Anaacutelise
                                  • Meacutedia de Lambda
                                  • Anaacutelise Temporal
                                  • Refatoraccedilatildeo de Coacutedigo
                                  • Casos de Uso
                                      • Resultados Obtidos e Anaacutelise
                                        • Visatildeo Geral
                                          • Projetos Selecionados
                                          • agera
                                          • vertx
                                          • Android-CleanArchitecture
                                          • RxJava
                                          • guava
                                            • Refatoraccedilatildeo de Coacutedigo
                                            • Estudos de Caso
                                              • Consideraccedilotildees Finais
                                              • Referecircncias
                                              • Anexo
                                              • Projetos utilizados

Capiacutetulo 5

Resultados Obtidos e Anaacutelise

Neste capiacutetulo seratildeo apresentados os dados obtidos e anaacutelise com o objetivo de responderagraves questotildees de pesquisa propostas Como mencionado anteriormente as perguntas seratildeorespondidas de duas maneiras algumas com informaccedilotildees gerais sobre todos os projetose outras com breve estudos de caso envolvendo cinco projetos

51 Visatildeo Geral

Dentre os repositoacuterios coletados para a anaacutelise 74 (7474) natildeo utilizaram nenhumaexpressatildeo lambda no projeto durante todo o periacuteodo analisado (Janeiro de 2013 a Abrilde 2017) restando apenas 25 repositoacuterios (2525) com expressotildees lambda Eacute interessantedestacar que apesar de a quantidade de repositoacuterios que natildeo possuem expressotildees lambdaser relativamente expressiva muitos destes repositoacuterios satildeo de projetos em Java que umdia foram populares e atualmente natildeo estatildeo sendo mais desenvolvidos (por exemplo umaplicativo que soacute funciona para Android 23 atualmente descontinuado)

Levando em consideraccedilatildeo apenas os projetos que possuem expressotildees lambda exis-tem dois tipos de dados que podem ser analisados para responder agrave primeira questatildeo depesquisa atraveacutes dos dados obtidos pelo meacutetodo anteriormente mencionado como anaacutelisetemporal e a meacutedia de lambda por snapshot mencionados no capiacutetulo anterior

Com relaccedilatildeo ao ano em que a primeira ocorrecircncia foi encontrada 6 projetos introduzi-ram expressotildees lambda jaacute em 2014 8 comeccedilaram a utilizar em 2015 7 em 2016 e apenas4 tiveram a primeira ocorrecircncia de expressotildees lambda em 2017 Dessa forma percebe-seque os projetos estatildeo relativamente bem distribuiacutedos em grupos quanto ao ano em que seintroduziu expressotildees lambda

Pela meacutedia de lambda por snapshot (lambdasnapshot) a maioria (11 projetos) possuiuma quantidade expressiva acima de 100 lambdasnapshot (com 6 projetos entre 20 e 100lambdasnapshot e 8 projetos com menos de 20 lambdasnapshot) como apresentados no

33

graacutefico da Figura 51 Isso mostra que essa nova caracteriacutestica jaacute estaacute sendo bem utilizadanos projetos que comeccedilaram a migrar para a nova versatildeo do Java

Figura 51 Graacuteficos dos projetos separados por ano de introduccedilatildeo de expressotildees lambdae meacutedia de lambda por snapshot

Com isso pode-se observar que apesar de a quantidade de projetos que possuemexpressotildees lambda natildeo ser tatildeo alta eacute possiacutevel obter resultados expressivos uma vez quea quantidade dos projetos com lambda estatildeo bem dispersos quanto ao periacuteodo em quecomeccedilaram a adotar essa caracteriacutestica e a quantidade de expressotildees lambda por snapshot

511 Projetos Selecionados

Atraveacutes dos grupos de classificaccedilatildeo identificados pela anaacutelise temporal descritos na Figura45 cinco projetos foram selecionados para uma anaacutelise detalhada levando em consideraccedilatildeoo grupo em que eles pertencem Estes projetos seratildeo apresentados a seguir

512 agera

Agera eacute uma biblioteca Android que ajuda a introduzir programaccedilatildeo funcional reativa(functional reactive programming) em projetos Android Eacute um projeto recente lanccediladoem 2016 pela Google [44] e encontra-se no grupo dos projetos que introduziram expressotildeeslambda em 2016 no mesmo ano de seu lanccedilamento contendo uma meacutedia de expressotildeeslambda de 16 lambdasnapshot

Na classificaccedilatildeo estabelecida agera pertence ao Grupo 1 onde a quantidade de ex-pressotildees lambda no projeto com o tempo aumentam juntamente com a quantidade deAICs como mostra o graacutefico de anaacutelise temporal na Figura 52

34

Figura 52 Graacuteficos de anaacutelise temporal do projeto agera

513 vertx

Eclipse Vertx eacute um conjunto de ferramentas para criaccedilatildeo de reactive applications namaacutequina virtual Java (JVM) em grande escala [45] Seu primeiro lanccedilamento aconteceuem 2011 e a primeira ocorrecircncia de expressotildees lambda no projeto aconteceu em 2014 Esteprojeto possui uma meacutedia de 2867 lambdasnapshot e dentre os projetos consideradosneste trabalho eacute o que possui a maior quantidade de expressotildees lambda

Este projeto pertence ao Grupo 2 onde a quantidade de expressotildees lambda aumen-tou consideravelmente pelos meses ultrapassando a quantidade de AICs que diminuiudrasticamente como mostra a Figura 53

35

Figura 53 Graacuteficos de anaacutelise temporal do projeto Vertx

514 Android-CleanArchitecture

Apesar de ser uma amostra de projeto Android-CleanArchitecture que tem como objetivoconstruir aplicaccedilotildees Android utilizando clean architecture foi lanccedilado em 2014 mas semanteacutem sempre atualizado [46]

A introduccedilatildeo de expressotildees lambda que aconteceu no ano de 2015 se deu de formatiacutemida com uma meacutedia de 35 lambdasnapshot De qualquer forma este projeto conseguerepresentar com seu graacutefico de anaacutelise temporal o grupo 3 composto por projetos em quea quantidade de expressotildees lambda aumentou mas sem ultrapassar AICs que diminuiacuteramdemonstrado no graacutefico da Figura 54

36

Figura 54 Graacuteficos de anaacutelise temporal do projeto Android-CleanArchitecture

515 RxJava

Dentre os repositoacuterios estudados RxJava eacute considerado o mais popular Como umaimplementaccedilatildeo de Reactive Extensions para a JVM RxJava teve seu lanccedilamento dadoem 2013 [47] Expressotildees lambda apareceram pela primeira vez no ano de 2015 comuma meacutedia de 766 lambdasnapshot

Apesar de uma meacutedia relativamente alta o tempo de vida das expressotildees lambda nesteprojeto foi bem curto caracterizando assim projetos do grupo 4 houve a introduccedilatildeo dasexpressotildees lambda no projeto poreacutem houve a remoccedilatildeo completa de todas as expressotildeeslambda previamente introduzidas desaparecendo completamente do projeto ateacute a datada coleta de dados (Figura 55)

37

Figura 55 Graacuteficos de anaacutelise temporal do projeto RxJava

516 guava

Guava eacute um conjunto de bibliotecas para Java da Google lanccedilado em 2011 A atualizaccedilatildeodo coacutedigo do projeto para Java 8 aconteceu somente em 2016 e apesar do projeto conteruma meacutedia de 281 lambdasnapshot ele foi escolhido como representante dos projetosdo Grupo 5 (Figura 56) que possuem expressotildees lambda mas de forma natildeo expressiva osuficiente quando comparado com a quantidade de AIC pelo fato de sua razatildeo de meacutedia delambdasnapshot por meacutedia de AICsnapshot ser 004 Ou seja embora o projeto tenhaexpressotildees lambda estas satildeo consideradas muito poucas quando inseridas no contextogeral deste projeto que eacute considerado um projeto grande

38

Figura 56 Graacuteficos de anaacutelise temporal do projeto Guava

52 Refatoraccedilatildeo de Coacutedigo

Com o objetivo de caracterizar melhor como as expressotildees lambda estatildeo sendo utilizadaseacute interessante identificar se estas estatildeo sendo introduzidas atraveacutes de refatoraccedilatildeo de coacutedigoou em coacutedigo novo

Os projetos classificados como pertencentes ao Grupo 2 possuem em comum o fatode expressotildees lambda aumentarem a medida que AICs diminuem ultrapassando-as eessa caracteriacutestica em comum pode indicar que nestes projetos possivelmente houve re-fatoraccedilatildeo de coacutedigo visto que AIC sendo substituiacutedo por expressotildees lambda dentro dascondiccedilotildees determinadas eacute a maneira mais comum de se identificar refatoraccedilatildeo de coacute-digo para introduccedilatildeo de expressotildees lambda [12] Os projetos que compotildeem o grupo 2representam 44 de todos os projetos estudados que possuem expressotildees lambda o quepode ser um indicativo caso a hipoacutetese de refatoraccedilatildeo de coacutedigo seja positiva de quemuitos projetos que estatildeo adotando o Java 8 estatildeo se preocupando de alguma formacom refatoraccedilatildeo se coacutedigo Fazem parte desse grupo os seguintes projetos elasticsearchjava-design-patterns PocketHub presto RxJava-Android-Samples spark vertx zipkinjava8-tutorial dropwizard e material-dialogs

39

Outra maneira de verificar possiacuteveis indicadores de refatoraccedilatildeo de coacutedigo foi atraveacutesda anaacutelise dos tamanhos (em quantidade de linhas de coacutedigo) dos meacutetodos com expressotildeeslambda no mecircs em que se introduziu expressotildees lambda e um mecircs imediatamente antesdeste Essa anaacutelise mostra que dos 25 projetos com expressotildees lambda 12 (48) projetostiveram ao menos um meacutetodo em que houve uma diminuiccedilatildeo no tamanho o que podeser considerado um indicativo de refatoraccedilatildeo de coacutedigo A Figura 57 mostra todos osprojetos em relaccedilatildeo agrave quantidade total de meacutetodos que possuem lambda no primeiro mecircsde introduccedilatildeo do mesmo em vermelho comparado com a quantidade desses meacutetodos quetiveram uma diminuiccedilatildeo no tamanho quando comparados com o coacutedigo do mecircs anteriorem azul

Figura 57 Comparaccedilatildeo entre todos os projetos com expressatildeo lambda sobre refatoraccedilatildeode coacutedigo no mecircs de introduccedilatildeo da caracteriacutestica

Ainda observando a figura 57 com relaccedilatildeo aos projetos que natildeo tiveram nenhummeacutetodo com diminuiccedilatildeo de tamanho (barra azul) percebe-se que todos os 13 projetossequer tiveram uma quantidade significativa de meacutetodos que possuem expressotildees lambda(com o maior tendo apenas 5 meacutetodos) no mecircs de introduccedilatildeo da caracteriacutestica no projetoe ao mesmo tempo jaacute existiam no mecircs em que natildeo existia lambda no projeto Essa eacuteuma observaccedilatildeo importante porque projetos como vertx sendo este o que possui a maiormeacutedia de lambdasnapshot de todos os projetos e ao mesmo tempo tendo apenas trecircsmeacutetodos que continham expressotildees lambda no mecircs da introduccedilatildeo e que existiam no mecircs

40

anterior permitem inferir que todas as outras expressotildees lambda existentes no projetopara este determinado mecircs de introduccedilatildeo encontram-se em coacutedigo novo introduzido

Eacute importante ressaltar que somente essa anaacutelise natildeo eacute exclusivamente suficiente paradeterminar se estes projetos estatildeo realmente introduzindo lambda em coacutedigo novo ourealizando refatoraccedilatildeo uma vez que como a comparaccedilatildeo aconteceu apenas no mecircs deintroduccedilatildeo com o mecircs imediatamente anterior natildeo reflete todo o ciclo de vida do pro-jeto Por exemplo algumas equipes podem escolher refatorar o coacutedigo depois de umtempo de adaptaccedilatildeo apoacutes a transiccedilatildeo para a nova versatildeo da linguagem Assim paraobter uma melhor anaacutelise sobre refatoraccedilatildeo de coacutedigo ou natildeo feita nestes projetos aleacutemde outras anaacutelises referentes aos padrotildees tipicamente adotados para implementaccedilatildeo delambda nestes projetos seratildeo apresentados a seguir os estudos de caso dos cinco projetospreviamente selecionados

Outro ponto importante eacute o fato de que apesar das informaccedilotildees quanto agraves quantida-des de filter e map terem sido incluiacutedas inicialmente no trabalho para observar possiacuteveispadrotildees de refatoraccedilatildeo de coacutedigo percebeu-se que estas natildeo satildeo utilizadas de forma con-sideraacutevel pelos projetos estudados e para fins de anaacutelises generalizadas natildeo apresentaramtanta influecircncia na utilizaccedilatildeo de expressotildees lambda quanto a quantidade de AICs noprojeto

53 Estudos de Caso

Dentre os projetos analisados verificou-se que os projetos de pequeno e meacutedio porte op-taram por refatorar de uma vez seus coacutedigos para incluir expressotildees lambda em situaccedilotildeesem que se utilizava AICs anteriormente ou em alguns poucos casos de utilizaccedilatildeo deCollection Os projetos de grande porte natildeo apresentaram nenhuma refatoraccedilatildeo de coacute-digo ou uma refatoraccedilatildeo parcial gradativa provavelmente devido agrave grande quantidade dearquivos e coacutedigo que possuem o que pode tornar o trabalho de refatoraccedilatildeo extenso ecansativo

O projeto vertx que pertence ao grupo 2 dos projetos em que a quantidade de ex-pressotildees lambda aumentaram e as de AICs diminuiacuteram com lambda ultrapassando AICsexecutou inicialmente commits em maio de 2014 com adiccedilatildeo de coacutedigo novo utilizandoexpressotildees lambda e apoacutes um mecircs realizou um commit maior com a refatoraccedilatildeo de todasas AICs para expressotildees lambda Apoacutes a refatoraccedilatildeo o projeto se preocupou em mantera utilizaccedilatildeo de expressotildees lambda ao mesmo tempo que o uso de AICs se manteve apenasaos casos de classes com interfaces natildeo funcionais A Figura 58 apresenta uma parte docommit de refatoraccedilatildeo de coacutedigo que mostra em vermelho a parte eliminada do coacutedigo(AIC) e em verde o coacutedigo novo representando a substituiccedilatildeo por uma expressatildeo lambda

41

Figura 58 Commit de refatoraccedilatildeo de coacutedigo do projeto Vertx [3]

Alguns projetos ainda natildeo se preocuparam em refatorar o coacutedigo para o uso de ex-pressotildees lambda ateacute a data deste trabalho que eacute o caso do projeto guava que apresentouum commit em 03112016 com a atualizaccedilatildeo do projeto para Java 8 Mas a partir daatualizaccedilatildeo se preocupou em utilizar as expressotildees lambda apenas na implementaccedilatildeo decoacutedigo novo O cenaacuterio em que a refatoraccedilatildeo natildeo eacute prioridade ainda eacute a realidade de vaacuteriosprojetos de grande porte visto que os dados de projetos sem nenhuma expressatildeo lambdasatildeo o maior nuacutemero neste trabalho Poreacutem projetos que jaacute adotaram a utilizaccedilatildeo do Java8 tendem a mudar isso com o passar do tempo A Figura 59 apresenta em verde umaadiccedilatildeo de coacutedigo novo com expressatildeo lambda sem a eliminaccedilatildeo de algum coacutedigo anteriora esse que estaria em vermelho

42

Figura 59 Exemplo de um arquivo do commit de adiccedilatildeo de coacutedigo novo em Java 8 doprojeto Guava [4]

Na categoria de projetos em que os AICs e expressotildees lambda aumentam proporci-onalmente (grupo 1) o projeto agera realizou um commit em 19052016 com a adiccedilatildeoda biblioteca retrolambda como dependecircncia do projeto Essa biblioteca utilizada prin-cipalmente por projetos Android permite executar coacutedigo Java 8 contendo expressotildeeslambda em Java 5 6 e 7 [48] O commit tambeacutem apresenta refatoraccedilatildeo dos AICs ad-vindos de interfaces funcionais para expressotildees lambda Apesar de o projeto continuar autilizar as expressotildees lambda em seus commits posteriores o nuacutemero de AICs tambeacutemcontinuou a aumentar visualizando os commits posteriores notou-se que esses AICs satildeorelativos a interfaces natildeo funcionais ou seja que possuem mais de um meacutetodo O projetoAndroid-CleanArchitecture eacute similar ao agera pois tambeacutem optou pela instalaccedilatildeo da bi-blioteca retrolambda para uso de expressotildees lambda em seus coacutedigos e como tambeacutem eacuteum projeto de pequeno porte houve uma pequena refatoraccedilatildeo dos AICs A Figura 510mostra a parte do commit de refatoraccedilatildeo de coacutedigo em que o desenvolvedor adiciona abiblioteca retrolambda como dependecircncia

43

Figura 510 Commit de adiccedilatildeo da biblioteca Retrolambda no projeto Agera [5]

Outro caso interessante eacute o do projeto RxJava que em 2015 optou pela refatoraccedilatildeodo coacutedigo para a utilizaccedilatildeo de expressotildees lambda quase eliminando por completo o usode AICs mas que no ano seguinte reverteu os commits de forma que eliminasse comple-tamente o uso de expressotildees lambda para manter a retrocompatibilidade com o Java 6A Figura 511 demonstra uma parte do commit de reversatildeo do coacutedigo para Java 6 emque pode ser visto em vermelho o coacutedigo anterior com expressotildees lambda e o verde como novo coacutedigo utilizando AIC novamente

44

Figura 511 Commit de remoccedilatildeo de Lambdas e volta para o uso de AICs no projetoRXJava [6]

Essa preocupaccedilatildeo com retrocompatibilidade de coacutedigo pode ser um fator crucial nadecisatildeo das equipes de desenvolvimento na hora de decidir como fazer o software co-evoluircom a linguagem sem perder a compatibilidade com versotildees anteriores

45

Capiacutetulo 6

Consideraccedilotildees Finais

Este estudo permitiu entender melhor como projetos estatildeo realizando a migraccedilatildeo para oJava 8 em especial utilizando uma nova caracteriacutestica introduzida expressatildeo lambdaApesar de a maioria dos projetos populares considerados natildeo possuiacuterem nenhuma ocor-recircncia de expressotildees lambda os projetos que tinham expressotildees lambda foram suficientespara realizar um primeiro estudo de caracterizaccedilatildeo no uso desta caracteriacutestica e com osprojetos efetivamente utilizados para estudo foi possiacutevel agrupaacute-los quanto a maneira emque as expressotildees lambda estavam sendo utilizadas quando comparadas com AICs em 5grandes grupos quando AIC e lambda aumentam proporcionalmente quando AIC dimi-nui e lambda aumenta ultrapassando AIC quando AIC diminui mas continua superior aolambda crescente expressotildees lambda que foram introduzidas e retiradas completamentedo coacutedigo e expressotildees lambda que natildeo existem em quantidades expressivas

Foi possiacutevel entatildeo realizar um estudo aprofundado levando em consideraccedilatildeo as di-ferentes maneiras com que as expressotildees lambda foram adotadas nos projetos atraveacutes daescolha de um projeto que representasse cada grupo para anaacutelise Dentre os cinco projetosestudados foi possiacutevel observar alguns padrotildees tipicamente adotados por desenvolvedorespara implementar expressotildees lambda em seus projetos como a utilizaccedilatildeo da bibliotecas(retrolambda) que permitissem uma flexibilizaccedilatildeo na utilizaccedilatildeo de expressotildees lambda oucomo lambda eacute primariamente utilizada para substituir determinados AICs ou operaccedilotildeesem Collection

Aleacutem disso foi possiacutevel observar como a refatoraccedilatildeo de coacutedigo acontece em cada umdesses projetos Observou-se como projetos menores tendem a refatorar coacutedigo maisfacilmente ao passo que projetos maiores e mais complexos fazem menos refatoraccedilatildeo oudemoram mais entre o periacuteodo em que houve a primeira migraccedilatildeo de coacutedigo para a novaversatildeo da linguagem ateacute o periacuteodo em que realmente decidem refatorar coacutedigo Aleacutem dacomplexidade do projeto influenciar na decisatildeo de migrar o projeto para uma versatildeo maisrecente da linguagem a preocupaccedilatildeo com retrocompatibilidade com versotildees anteriores da

46

linguagem tambeacutem podem ser uma barreira para que projetos comecem a evoluir o coacutedigojuntamente com a evoluccedilatildeo da linguagem

Ainda assim foi possiacutevel observar que a preocupaccedilatildeo com a co-evoluccedilatildeo do software-linguagem existe entre os desenvolvedores de projetos mas a realizaccedilatildeo da migraccedilatildeo aindaacontece lentamente devido agrave diversos fatores que precisam ser levados em consideraccedilatildeopara a manutenccedilatildeo do projeto

Para trabalhos e contribuiccedilotildees futuras seria interessante desenvolver uma ferramentaque pudesse analisar diretamente no coacutedigo-fonte as oportunidades de aplicaccedilatildeo de ex-pressotildees lambda dessa forma poderiam ser analisadas as porcentagens de conversatildeo decoacutedigo para Java 8 e obter melhores conclusotildees sobre a importacircncia que os projetos estatildeodando para a evoluccedilatildeo de seus coacutedigos Outro fator interessante seria aplicar mais Visitorsagrave ferramenta static-analysis e fazer este mesmo estudo aplicado agrave outras caracteriacutesticasda linguagem

47

Referecircncias

[1] Kagdi Huzefa Michael L Collard e Jonathan I Maletic A survey and taxonomyof approaches for mining software repositories in the context of software evolution2007 ix 3 8 9 10 11

[2] DBeaver Dbeaver - features httpdbeaverjkissorgdocsfeatures ix 29

[3] Eclipse Vertx commit Java8-ify code httpsgithubcomeclipsevertxcommit93f95e9c77419f442a42fe711b6eeaef88192fd3 ix 42

[4] Google Guava commit Release java 8 changes to guava httpsgithubcomgoogleguavacommit73e382fa877f80994817a136b0adcc4365ccd904 ix 43

[5] Google Agera commit Collapsed testapp with retrolambda httpsgithubcomgoogleageracommit5e518b7b05f9e7a34a314945f68deff7b2c3e334 ix 44

[6] ReactiveX Rxjava commit 2x full jdk 6 compatible backport + includ-ing bugfixes up to today httpsgithubcomReactiveXRxJavacommit000a174d87a901135f9665d3b11f3627fd2dc4ed ix 45

[7] Godfrey M W e D M German The past present and future of software evolutionEm 2008 Frontiers of Maintenance paacuteginas 129ndash138 Sept 2008 1 6

[8] Favre J M Languages evolve too changing the software time scale Em Principles ofSoftware Evolution Eighth International Workshop on paacuteginas 33ndash42 IEEE 20051 5 7

[9] Overbey Jeffrey L e Ralph E Johnson Regrowing a language refactoring tools allowprogramming languages to evolve Em ACM SIGPLAN Notices volume 44 paacuteginas493ndash502 ACM 2009 1 5 7 8 12

[10] Grechanik Mark Collin McMillan Luca DeFerrari Marco Comi Stefano CrespiDenys Poshyvanyk Chen Fu Qing Xie e Carlo Ghezzi An empirical investiga-tion into a large-scale java open source code repository Em Proceedings of the2010 ACM-IEEE International Symposium on Empirical Software Engineering andMeasurement ESEM rsquo10 paacuteginas 111ndash1110 New York NY USA 2010 ACMISBN 978-1-4503-0039-1 httpdoiacmorg10114518527861852801 1

[11] TIOBE Tiobe httpswwwtiobecomtiobe-index 1 14

48

[12] Gyori Alex Lyle Franklin Danny Dig e Jan Lahoda Crossing the gap from im-perative to functional programming through refactoring Em Proceedings of the 20139th Joint Meeting on Foundations of Software Engineering ESECFSE 2013 paacute-ginas 543ndash553 New York NY USA 2013 ACM ISBN 978-1-4503-2237-9 httpdoiacmorg10114524914112491461 2 11 24 39

[13] OpenJDK State of the lambda httpcropenjdkjavanet~briangoetzlambdalambda-state-4html 2

[14] Han Jiawei Micheline Kamber e Jian Pei Data Mining Concepts and TechniquesMorgan Kaufmann Publishers Inc San Francisco CA USA 3rd ediccedilatildeo 2011ISBN 0123814790 9780123814791 3

[15] Fowler Martin e Kent Beck Refactoring improving the design of existing codeAddison-Wesley Professional 1999 5 7

[16] Lehman M M J F Ramil P D Wernick D E Perry e W M Turski Met-rics and laws of software evolution - the nineties view Em Proceedings of the4th International Symposium on Software Metrics METRICS rsquo97 paacuteginas 20ndashWashington DC USA 1997 IEEE Computer Society ISBN 0-8186-8093-8 httpdlacmorgcitationcfmid=823454823901 6

[17] Hassan Ahmed E e Tao Xie Software intelligence The future of mining softwareengineering data Em Proceedings of the FSESDP Workshop on Future of SoftwareEngineering Research FoSER rsquo10 paacuteginas 161ndash166 New York NY USA 2010ACM ISBN 978-1-4503-0427-6 httpdoiacmorg101145188236218823978 9

[18] Hassan Ahmed E The road ahead for mining software repositories Em Frontiers ofSoftware Maintenance 2008 FoSM 2008 paacuteginas 48ndash57 IEEE 2008 8

[19] Berry Michael J e Gordon Linoff Data Mining Techniques For Marketing Salesand Customer Support John Wiley amp Sons Inc New York NY USA 1997ISBN 0471179809 10

[20] Parnin Chris Christian Bird e Emerson Murphy-Hill Java generics adoption hownew features are introduced championed or ignored Em Proceedings of the 8thWorking Conference on Mining Software Repositories paacuteginas 3ndash12 ACM 2011 12

[21] Oracle The java language specification httpsdocsoraclecomjavasespecsjlsse8jls8pdf 13

[22] Oracle The history of java technology httpwwworaclecomtechnetworkjavajavaseoverviewjavahistory-index-198355html 13

[23] Murphy Kieron So why did they decide to call itjava httpwwwjavaworldcomarticle2077265core-javaso-why-did-they-decide-to-call-it-java-html 13

[24] McGraw Tata Object-oriented Programming with Java Essentials and ApplicationsHill Education 13

49

[25] Oracle Differences between java ee and java se httpdocsoraclecomjavaee6firstcupdocgkhoyhtml 13

[26] Lindsey Clark S The History of Java Cambridge 14

[27] Oracle The java language environment httpwwworaclecomtechnetworkjavaintro-141325html 14

[28] Oracle Jdk 8 httpopenjdkjavanetprojectsjdk8 15 24

[29] Oracle Enhancements in java se 8 httpdocsoraclecomjavase8docstechnotesguideslanguageenhancementshtmljavase8 15 16 17

[30] Oracle Lambda expressions httpdocsoraclecomjavasetutorialjavajavaOOlambdaexpressionshtml 16 18 21

[31] Oracle Method references httpdocsoraclecomjavasetutorialjavajavaOOmethodreferenceshtml 16

[32] Oracle Default methods httpdocsoraclecomjavasetutorialjavaIandIdefaultmethodshtml 17

[33] Oracle Repeating annotations httpdocsoraclecomjavasetutorialjavaannotationsrepeatinghtml 17

[34] Oracle Type annotations httpdocsoraclecomjavasetutorialjavaannotationstype_annotationshtml 17

[35] Oracle Anonymous inner classes httpsdocsoraclecomjavasetutorialjavajavaOOanonymousclasseshtml 19

[36] Kothari CR Research Methodology Methods and Techniques New Age Interna-tional (P) Limited 2004 ISBN 9788122415223 httpsbooksgooglecombrbooksid=8c6gkbKi-F4C 22

[37] Nakakoji Kumiyo Yasuhiro Yamamoto Yoshiyuki Nishinaka Kouichi Kishida eYunwen Ye Evolution patterns of open-source software systems and communitiesEm IWPSE rsquo02 Proceedings of the International Workshop on Principles of SoftwareEvolution paacuteginas 76ndash85 New York NY USA 2002 ACM Press ISBN 1581135459httpdxdoiorg101145512035512055 23

[38] Rahman Foyzur Christian Bird e Premkumar Devanbu Clones What is that smellEmpirical Software Engineering 17(4-5)503ndash530 2012 24

[39] Chacon Scott Pro Git Apress Berkely CA USA 1st ediccedilatildeo 2009ISBN 1430218339 9781430218333 25

[40] Cavalcanti Thiago Gomes e Viniacutecius Correa de Almeida Caracterizaccedilatildeo do uso deconstruccedilotildees da linguagem java em projetos open-source Publicaccedilatildeo online 2016httpbdmunbbrhandle1048315733 27

50

[41] Parr Terence Language Implementation Patterns Create Your Own Domain-Specific and General Programming Languages Pragmatic Bookshelf 1st ediccedilatildeo 2009ISBN 193435645X 9781934356456 27

[42] Janssen Thorben 5 reasons to use jpa hibernate Publicaccedilatildeo online httpswwwsitepointcom5-reasons-to-use-jpa-hibernate 27

[43] Franklin Lyle Alex Gyori Jan Lahoda e Danny Dig Lambdaficator From imperativeto functional programming through automated refactoring Em Proceedings of the2013 International Conference on Software Engineering ICSE rsquo13 paacuteginas 1287ndash1290 Piscataway NJ USA 2013 IEEE Press ISBN 978-1-4673-3076-3 httpdlacmorgcitationcfmid=24867882486986 29

[44] Google Agera httpsgithubcomgoogleagerawiki 34

[45] Eclipse Eclipse vertx httpvertxio 35

[46] Cejas Fernando Android cleanarchitecture httpsgithubcomandroid10Android-CleanArchitecture 36

[47] ReactiveX Rxjava httpsgithubcomReactiveXRxJava 37

[48] Luontola Esko Retrolambda httpsgithubcomorfjackalretrolambda 43

51

Anexo I

Projetos utilizados

fastjson

platform_frameworks_base

netty

material-dialogs

kotlin

okhttp

tinker

AndroidUtilCode

RxJava

spring-boot

java-design-patterns

elasticsearch

ExoPlayer

kafka

vertx

realm-java

guava

zipkin

bazel

stetho

Signal-Android

glide

agera

fresco

plaid

presto

libgdx

spark

52

disruptor

lottie-android

flexbox-layout

PocketHub

zxing

spring-framework

deeplearning4j

dropwizard

interviews

BaseRecyclerViewAdapterHelper

uCrop

DanmakuFlameMaster

lottie-react-native

android-UniversalMusicPlayer

AndroidInterview-Q-A

greenDAO

retrofit

MaterialDrawer

BottomBar

druid

MPAndroidChart

Hystrix

guice

recyclerview-animators

dubbo

androidannotations

RxJava-Android-Samples

PhotoView

clojure

CircleImageView

AndroidSwipeLayout

jedis

MaterialViewPager

butterknife

junit4

RxBinding

leakcanary

SimianArmy

picasso

UltimateRecyclerView

53

AndroidViewAnimations

AppIntro

FizzBuzzEnterpriseEdition

ion

cheesesquare

physical-web

RxAndroid

Android-CleanArchitecture

Calligraphy

Android-Bootstrap

iosched

Android_Data

MaterialDesignLibrary

ListViewAnimations

EventBus

java8-tutorial

AndroidSlidingUpPanel

dagger

okhttputils

logger

HomeMirror

Material-Animations

android-Ultra-Pull-To-Refresh

android-async-http

Android-ObservableScrollView

Android-Universal-Image-Loader

ActionBarSherlock

SlidingMenu

storm

PagerSlidingTabStrip

Android-PullToRefresh

54

  • Dedicatoacuteria
  • Agradecimentos
  • Resumo
  • Abstract
  • Introduccedilatildeo
    • Contexto
    • Objetivos
      • Objetivos Gerais
      • Objetivos Especiacuteficos
        • Metodologia
        • Organizaccedilatildeo do Trabalho
          • Evoluccedilatildeo e Mineraccedilatildeo de Repositoacuterios de Software
            • Evoluccedilatildeo de Software
            • MSR Mineraccedilatildeo de dados e a Engenharia de Software
              • Classificaccedilatildeo
                • Trabalhos Relacionados
                  • Java SE 8 e JDK 8
                    • Histoacuterico
                    • Princiacutepios
                    • Evoluccedilatildeo
                    • Expressotildees Lambda
                      • Sintaxe
                      • Principais formas de uso
                          • Estudo e o Processo de Mineraccedilatildeo
                            • Questotildees de Pesquisa
                            • Fonte de Dados e Objetos de Estudo
                            • Processo de Mineraccedilatildeo
                              • static-analysis
                              • BDAnalisador
                                • Classificaccedilatildeo e Anaacutelise
                                  • Meacutedia de Lambda
                                  • Anaacutelise Temporal
                                  • Refatoraccedilatildeo de Coacutedigo
                                  • Casos de Uso
                                      • Resultados Obtidos e Anaacutelise
                                        • Visatildeo Geral
                                          • Projetos Selecionados
                                          • agera
                                          • vertx
                                          • Android-CleanArchitecture
                                          • RxJava
                                          • guava
                                            • Refatoraccedilatildeo de Coacutedigo
                                            • Estudos de Caso
                                              • Consideraccedilotildees Finais
                                              • Referecircncias
                                              • Anexo
                                              • Projetos utilizados

graacutefico da Figura 51 Isso mostra que essa nova caracteriacutestica jaacute estaacute sendo bem utilizadanos projetos que comeccedilaram a migrar para a nova versatildeo do Java

Figura 51 Graacuteficos dos projetos separados por ano de introduccedilatildeo de expressotildees lambdae meacutedia de lambda por snapshot

Com isso pode-se observar que apesar de a quantidade de projetos que possuemexpressotildees lambda natildeo ser tatildeo alta eacute possiacutevel obter resultados expressivos uma vez quea quantidade dos projetos com lambda estatildeo bem dispersos quanto ao periacuteodo em quecomeccedilaram a adotar essa caracteriacutestica e a quantidade de expressotildees lambda por snapshot

511 Projetos Selecionados

Atraveacutes dos grupos de classificaccedilatildeo identificados pela anaacutelise temporal descritos na Figura45 cinco projetos foram selecionados para uma anaacutelise detalhada levando em consideraccedilatildeoo grupo em que eles pertencem Estes projetos seratildeo apresentados a seguir

512 agera

Agera eacute uma biblioteca Android que ajuda a introduzir programaccedilatildeo funcional reativa(functional reactive programming) em projetos Android Eacute um projeto recente lanccediladoem 2016 pela Google [44] e encontra-se no grupo dos projetos que introduziram expressotildeeslambda em 2016 no mesmo ano de seu lanccedilamento contendo uma meacutedia de expressotildeeslambda de 16 lambdasnapshot

Na classificaccedilatildeo estabelecida agera pertence ao Grupo 1 onde a quantidade de ex-pressotildees lambda no projeto com o tempo aumentam juntamente com a quantidade deAICs como mostra o graacutefico de anaacutelise temporal na Figura 52

34

Figura 52 Graacuteficos de anaacutelise temporal do projeto agera

513 vertx

Eclipse Vertx eacute um conjunto de ferramentas para criaccedilatildeo de reactive applications namaacutequina virtual Java (JVM) em grande escala [45] Seu primeiro lanccedilamento aconteceuem 2011 e a primeira ocorrecircncia de expressotildees lambda no projeto aconteceu em 2014 Esteprojeto possui uma meacutedia de 2867 lambdasnapshot e dentre os projetos consideradosneste trabalho eacute o que possui a maior quantidade de expressotildees lambda

Este projeto pertence ao Grupo 2 onde a quantidade de expressotildees lambda aumen-tou consideravelmente pelos meses ultrapassando a quantidade de AICs que diminuiudrasticamente como mostra a Figura 53

35

Figura 53 Graacuteficos de anaacutelise temporal do projeto Vertx

514 Android-CleanArchitecture

Apesar de ser uma amostra de projeto Android-CleanArchitecture que tem como objetivoconstruir aplicaccedilotildees Android utilizando clean architecture foi lanccedilado em 2014 mas semanteacutem sempre atualizado [46]

A introduccedilatildeo de expressotildees lambda que aconteceu no ano de 2015 se deu de formatiacutemida com uma meacutedia de 35 lambdasnapshot De qualquer forma este projeto conseguerepresentar com seu graacutefico de anaacutelise temporal o grupo 3 composto por projetos em quea quantidade de expressotildees lambda aumentou mas sem ultrapassar AICs que diminuiacuteramdemonstrado no graacutefico da Figura 54

36

Figura 54 Graacuteficos de anaacutelise temporal do projeto Android-CleanArchitecture

515 RxJava

Dentre os repositoacuterios estudados RxJava eacute considerado o mais popular Como umaimplementaccedilatildeo de Reactive Extensions para a JVM RxJava teve seu lanccedilamento dadoem 2013 [47] Expressotildees lambda apareceram pela primeira vez no ano de 2015 comuma meacutedia de 766 lambdasnapshot

Apesar de uma meacutedia relativamente alta o tempo de vida das expressotildees lambda nesteprojeto foi bem curto caracterizando assim projetos do grupo 4 houve a introduccedilatildeo dasexpressotildees lambda no projeto poreacutem houve a remoccedilatildeo completa de todas as expressotildeeslambda previamente introduzidas desaparecendo completamente do projeto ateacute a datada coleta de dados (Figura 55)

37

Figura 55 Graacuteficos de anaacutelise temporal do projeto RxJava

516 guava

Guava eacute um conjunto de bibliotecas para Java da Google lanccedilado em 2011 A atualizaccedilatildeodo coacutedigo do projeto para Java 8 aconteceu somente em 2016 e apesar do projeto conteruma meacutedia de 281 lambdasnapshot ele foi escolhido como representante dos projetosdo Grupo 5 (Figura 56) que possuem expressotildees lambda mas de forma natildeo expressiva osuficiente quando comparado com a quantidade de AIC pelo fato de sua razatildeo de meacutedia delambdasnapshot por meacutedia de AICsnapshot ser 004 Ou seja embora o projeto tenhaexpressotildees lambda estas satildeo consideradas muito poucas quando inseridas no contextogeral deste projeto que eacute considerado um projeto grande

38

Figura 56 Graacuteficos de anaacutelise temporal do projeto Guava

52 Refatoraccedilatildeo de Coacutedigo

Com o objetivo de caracterizar melhor como as expressotildees lambda estatildeo sendo utilizadaseacute interessante identificar se estas estatildeo sendo introduzidas atraveacutes de refatoraccedilatildeo de coacutedigoou em coacutedigo novo

Os projetos classificados como pertencentes ao Grupo 2 possuem em comum o fatode expressotildees lambda aumentarem a medida que AICs diminuem ultrapassando-as eessa caracteriacutestica em comum pode indicar que nestes projetos possivelmente houve re-fatoraccedilatildeo de coacutedigo visto que AIC sendo substituiacutedo por expressotildees lambda dentro dascondiccedilotildees determinadas eacute a maneira mais comum de se identificar refatoraccedilatildeo de coacute-digo para introduccedilatildeo de expressotildees lambda [12] Os projetos que compotildeem o grupo 2representam 44 de todos os projetos estudados que possuem expressotildees lambda o quepode ser um indicativo caso a hipoacutetese de refatoraccedilatildeo de coacutedigo seja positiva de quemuitos projetos que estatildeo adotando o Java 8 estatildeo se preocupando de alguma formacom refatoraccedilatildeo se coacutedigo Fazem parte desse grupo os seguintes projetos elasticsearchjava-design-patterns PocketHub presto RxJava-Android-Samples spark vertx zipkinjava8-tutorial dropwizard e material-dialogs

39

Outra maneira de verificar possiacuteveis indicadores de refatoraccedilatildeo de coacutedigo foi atraveacutesda anaacutelise dos tamanhos (em quantidade de linhas de coacutedigo) dos meacutetodos com expressotildeeslambda no mecircs em que se introduziu expressotildees lambda e um mecircs imediatamente antesdeste Essa anaacutelise mostra que dos 25 projetos com expressotildees lambda 12 (48) projetostiveram ao menos um meacutetodo em que houve uma diminuiccedilatildeo no tamanho o que podeser considerado um indicativo de refatoraccedilatildeo de coacutedigo A Figura 57 mostra todos osprojetos em relaccedilatildeo agrave quantidade total de meacutetodos que possuem lambda no primeiro mecircsde introduccedilatildeo do mesmo em vermelho comparado com a quantidade desses meacutetodos quetiveram uma diminuiccedilatildeo no tamanho quando comparados com o coacutedigo do mecircs anteriorem azul

Figura 57 Comparaccedilatildeo entre todos os projetos com expressatildeo lambda sobre refatoraccedilatildeode coacutedigo no mecircs de introduccedilatildeo da caracteriacutestica

Ainda observando a figura 57 com relaccedilatildeo aos projetos que natildeo tiveram nenhummeacutetodo com diminuiccedilatildeo de tamanho (barra azul) percebe-se que todos os 13 projetossequer tiveram uma quantidade significativa de meacutetodos que possuem expressotildees lambda(com o maior tendo apenas 5 meacutetodos) no mecircs de introduccedilatildeo da caracteriacutestica no projetoe ao mesmo tempo jaacute existiam no mecircs em que natildeo existia lambda no projeto Essa eacuteuma observaccedilatildeo importante porque projetos como vertx sendo este o que possui a maiormeacutedia de lambdasnapshot de todos os projetos e ao mesmo tempo tendo apenas trecircsmeacutetodos que continham expressotildees lambda no mecircs da introduccedilatildeo e que existiam no mecircs

40

anterior permitem inferir que todas as outras expressotildees lambda existentes no projetopara este determinado mecircs de introduccedilatildeo encontram-se em coacutedigo novo introduzido

Eacute importante ressaltar que somente essa anaacutelise natildeo eacute exclusivamente suficiente paradeterminar se estes projetos estatildeo realmente introduzindo lambda em coacutedigo novo ourealizando refatoraccedilatildeo uma vez que como a comparaccedilatildeo aconteceu apenas no mecircs deintroduccedilatildeo com o mecircs imediatamente anterior natildeo reflete todo o ciclo de vida do pro-jeto Por exemplo algumas equipes podem escolher refatorar o coacutedigo depois de umtempo de adaptaccedilatildeo apoacutes a transiccedilatildeo para a nova versatildeo da linguagem Assim paraobter uma melhor anaacutelise sobre refatoraccedilatildeo de coacutedigo ou natildeo feita nestes projetos aleacutemde outras anaacutelises referentes aos padrotildees tipicamente adotados para implementaccedilatildeo delambda nestes projetos seratildeo apresentados a seguir os estudos de caso dos cinco projetospreviamente selecionados

Outro ponto importante eacute o fato de que apesar das informaccedilotildees quanto agraves quantida-des de filter e map terem sido incluiacutedas inicialmente no trabalho para observar possiacuteveispadrotildees de refatoraccedilatildeo de coacutedigo percebeu-se que estas natildeo satildeo utilizadas de forma con-sideraacutevel pelos projetos estudados e para fins de anaacutelises generalizadas natildeo apresentaramtanta influecircncia na utilizaccedilatildeo de expressotildees lambda quanto a quantidade de AICs noprojeto

53 Estudos de Caso

Dentre os projetos analisados verificou-se que os projetos de pequeno e meacutedio porte op-taram por refatorar de uma vez seus coacutedigos para incluir expressotildees lambda em situaccedilotildeesem que se utilizava AICs anteriormente ou em alguns poucos casos de utilizaccedilatildeo deCollection Os projetos de grande porte natildeo apresentaram nenhuma refatoraccedilatildeo de coacute-digo ou uma refatoraccedilatildeo parcial gradativa provavelmente devido agrave grande quantidade dearquivos e coacutedigo que possuem o que pode tornar o trabalho de refatoraccedilatildeo extenso ecansativo

O projeto vertx que pertence ao grupo 2 dos projetos em que a quantidade de ex-pressotildees lambda aumentaram e as de AICs diminuiacuteram com lambda ultrapassando AICsexecutou inicialmente commits em maio de 2014 com adiccedilatildeo de coacutedigo novo utilizandoexpressotildees lambda e apoacutes um mecircs realizou um commit maior com a refatoraccedilatildeo de todasas AICs para expressotildees lambda Apoacutes a refatoraccedilatildeo o projeto se preocupou em mantera utilizaccedilatildeo de expressotildees lambda ao mesmo tempo que o uso de AICs se manteve apenasaos casos de classes com interfaces natildeo funcionais A Figura 58 apresenta uma parte docommit de refatoraccedilatildeo de coacutedigo que mostra em vermelho a parte eliminada do coacutedigo(AIC) e em verde o coacutedigo novo representando a substituiccedilatildeo por uma expressatildeo lambda

41

Figura 58 Commit de refatoraccedilatildeo de coacutedigo do projeto Vertx [3]

Alguns projetos ainda natildeo se preocuparam em refatorar o coacutedigo para o uso de ex-pressotildees lambda ateacute a data deste trabalho que eacute o caso do projeto guava que apresentouum commit em 03112016 com a atualizaccedilatildeo do projeto para Java 8 Mas a partir daatualizaccedilatildeo se preocupou em utilizar as expressotildees lambda apenas na implementaccedilatildeo decoacutedigo novo O cenaacuterio em que a refatoraccedilatildeo natildeo eacute prioridade ainda eacute a realidade de vaacuteriosprojetos de grande porte visto que os dados de projetos sem nenhuma expressatildeo lambdasatildeo o maior nuacutemero neste trabalho Poreacutem projetos que jaacute adotaram a utilizaccedilatildeo do Java8 tendem a mudar isso com o passar do tempo A Figura 59 apresenta em verde umaadiccedilatildeo de coacutedigo novo com expressatildeo lambda sem a eliminaccedilatildeo de algum coacutedigo anteriora esse que estaria em vermelho

42

Figura 59 Exemplo de um arquivo do commit de adiccedilatildeo de coacutedigo novo em Java 8 doprojeto Guava [4]

Na categoria de projetos em que os AICs e expressotildees lambda aumentam proporci-onalmente (grupo 1) o projeto agera realizou um commit em 19052016 com a adiccedilatildeoda biblioteca retrolambda como dependecircncia do projeto Essa biblioteca utilizada prin-cipalmente por projetos Android permite executar coacutedigo Java 8 contendo expressotildeeslambda em Java 5 6 e 7 [48] O commit tambeacutem apresenta refatoraccedilatildeo dos AICs ad-vindos de interfaces funcionais para expressotildees lambda Apesar de o projeto continuar autilizar as expressotildees lambda em seus commits posteriores o nuacutemero de AICs tambeacutemcontinuou a aumentar visualizando os commits posteriores notou-se que esses AICs satildeorelativos a interfaces natildeo funcionais ou seja que possuem mais de um meacutetodo O projetoAndroid-CleanArchitecture eacute similar ao agera pois tambeacutem optou pela instalaccedilatildeo da bi-blioteca retrolambda para uso de expressotildees lambda em seus coacutedigos e como tambeacutem eacuteum projeto de pequeno porte houve uma pequena refatoraccedilatildeo dos AICs A Figura 510mostra a parte do commit de refatoraccedilatildeo de coacutedigo em que o desenvolvedor adiciona abiblioteca retrolambda como dependecircncia

43

Figura 510 Commit de adiccedilatildeo da biblioteca Retrolambda no projeto Agera [5]

Outro caso interessante eacute o do projeto RxJava que em 2015 optou pela refatoraccedilatildeodo coacutedigo para a utilizaccedilatildeo de expressotildees lambda quase eliminando por completo o usode AICs mas que no ano seguinte reverteu os commits de forma que eliminasse comple-tamente o uso de expressotildees lambda para manter a retrocompatibilidade com o Java 6A Figura 511 demonstra uma parte do commit de reversatildeo do coacutedigo para Java 6 emque pode ser visto em vermelho o coacutedigo anterior com expressotildees lambda e o verde como novo coacutedigo utilizando AIC novamente

44

Figura 511 Commit de remoccedilatildeo de Lambdas e volta para o uso de AICs no projetoRXJava [6]

Essa preocupaccedilatildeo com retrocompatibilidade de coacutedigo pode ser um fator crucial nadecisatildeo das equipes de desenvolvimento na hora de decidir como fazer o software co-evoluircom a linguagem sem perder a compatibilidade com versotildees anteriores

45

Capiacutetulo 6

Consideraccedilotildees Finais

Este estudo permitiu entender melhor como projetos estatildeo realizando a migraccedilatildeo para oJava 8 em especial utilizando uma nova caracteriacutestica introduzida expressatildeo lambdaApesar de a maioria dos projetos populares considerados natildeo possuiacuterem nenhuma ocor-recircncia de expressotildees lambda os projetos que tinham expressotildees lambda foram suficientespara realizar um primeiro estudo de caracterizaccedilatildeo no uso desta caracteriacutestica e com osprojetos efetivamente utilizados para estudo foi possiacutevel agrupaacute-los quanto a maneira emque as expressotildees lambda estavam sendo utilizadas quando comparadas com AICs em 5grandes grupos quando AIC e lambda aumentam proporcionalmente quando AIC dimi-nui e lambda aumenta ultrapassando AIC quando AIC diminui mas continua superior aolambda crescente expressotildees lambda que foram introduzidas e retiradas completamentedo coacutedigo e expressotildees lambda que natildeo existem em quantidades expressivas

Foi possiacutevel entatildeo realizar um estudo aprofundado levando em consideraccedilatildeo as di-ferentes maneiras com que as expressotildees lambda foram adotadas nos projetos atraveacutes daescolha de um projeto que representasse cada grupo para anaacutelise Dentre os cinco projetosestudados foi possiacutevel observar alguns padrotildees tipicamente adotados por desenvolvedorespara implementar expressotildees lambda em seus projetos como a utilizaccedilatildeo da bibliotecas(retrolambda) que permitissem uma flexibilizaccedilatildeo na utilizaccedilatildeo de expressotildees lambda oucomo lambda eacute primariamente utilizada para substituir determinados AICs ou operaccedilotildeesem Collection

Aleacutem disso foi possiacutevel observar como a refatoraccedilatildeo de coacutedigo acontece em cada umdesses projetos Observou-se como projetos menores tendem a refatorar coacutedigo maisfacilmente ao passo que projetos maiores e mais complexos fazem menos refatoraccedilatildeo oudemoram mais entre o periacuteodo em que houve a primeira migraccedilatildeo de coacutedigo para a novaversatildeo da linguagem ateacute o periacuteodo em que realmente decidem refatorar coacutedigo Aleacutem dacomplexidade do projeto influenciar na decisatildeo de migrar o projeto para uma versatildeo maisrecente da linguagem a preocupaccedilatildeo com retrocompatibilidade com versotildees anteriores da

46

linguagem tambeacutem podem ser uma barreira para que projetos comecem a evoluir o coacutedigojuntamente com a evoluccedilatildeo da linguagem

Ainda assim foi possiacutevel observar que a preocupaccedilatildeo com a co-evoluccedilatildeo do software-linguagem existe entre os desenvolvedores de projetos mas a realizaccedilatildeo da migraccedilatildeo aindaacontece lentamente devido agrave diversos fatores que precisam ser levados em consideraccedilatildeopara a manutenccedilatildeo do projeto

Para trabalhos e contribuiccedilotildees futuras seria interessante desenvolver uma ferramentaque pudesse analisar diretamente no coacutedigo-fonte as oportunidades de aplicaccedilatildeo de ex-pressotildees lambda dessa forma poderiam ser analisadas as porcentagens de conversatildeo decoacutedigo para Java 8 e obter melhores conclusotildees sobre a importacircncia que os projetos estatildeodando para a evoluccedilatildeo de seus coacutedigos Outro fator interessante seria aplicar mais Visitorsagrave ferramenta static-analysis e fazer este mesmo estudo aplicado agrave outras caracteriacutesticasda linguagem

47

Referecircncias

[1] Kagdi Huzefa Michael L Collard e Jonathan I Maletic A survey and taxonomyof approaches for mining software repositories in the context of software evolution2007 ix 3 8 9 10 11

[2] DBeaver Dbeaver - features httpdbeaverjkissorgdocsfeatures ix 29

[3] Eclipse Vertx commit Java8-ify code httpsgithubcomeclipsevertxcommit93f95e9c77419f442a42fe711b6eeaef88192fd3 ix 42

[4] Google Guava commit Release java 8 changes to guava httpsgithubcomgoogleguavacommit73e382fa877f80994817a136b0adcc4365ccd904 ix 43

[5] Google Agera commit Collapsed testapp with retrolambda httpsgithubcomgoogleageracommit5e518b7b05f9e7a34a314945f68deff7b2c3e334 ix 44

[6] ReactiveX Rxjava commit 2x full jdk 6 compatible backport + includ-ing bugfixes up to today httpsgithubcomReactiveXRxJavacommit000a174d87a901135f9665d3b11f3627fd2dc4ed ix 45

[7] Godfrey M W e D M German The past present and future of software evolutionEm 2008 Frontiers of Maintenance paacuteginas 129ndash138 Sept 2008 1 6

[8] Favre J M Languages evolve too changing the software time scale Em Principles ofSoftware Evolution Eighth International Workshop on paacuteginas 33ndash42 IEEE 20051 5 7

[9] Overbey Jeffrey L e Ralph E Johnson Regrowing a language refactoring tools allowprogramming languages to evolve Em ACM SIGPLAN Notices volume 44 paacuteginas493ndash502 ACM 2009 1 5 7 8 12

[10] Grechanik Mark Collin McMillan Luca DeFerrari Marco Comi Stefano CrespiDenys Poshyvanyk Chen Fu Qing Xie e Carlo Ghezzi An empirical investiga-tion into a large-scale java open source code repository Em Proceedings of the2010 ACM-IEEE International Symposium on Empirical Software Engineering andMeasurement ESEM rsquo10 paacuteginas 111ndash1110 New York NY USA 2010 ACMISBN 978-1-4503-0039-1 httpdoiacmorg10114518527861852801 1

[11] TIOBE Tiobe httpswwwtiobecomtiobe-index 1 14

48

[12] Gyori Alex Lyle Franklin Danny Dig e Jan Lahoda Crossing the gap from im-perative to functional programming through refactoring Em Proceedings of the 20139th Joint Meeting on Foundations of Software Engineering ESECFSE 2013 paacute-ginas 543ndash553 New York NY USA 2013 ACM ISBN 978-1-4503-2237-9 httpdoiacmorg10114524914112491461 2 11 24 39

[13] OpenJDK State of the lambda httpcropenjdkjavanet~briangoetzlambdalambda-state-4html 2

[14] Han Jiawei Micheline Kamber e Jian Pei Data Mining Concepts and TechniquesMorgan Kaufmann Publishers Inc San Francisco CA USA 3rd ediccedilatildeo 2011ISBN 0123814790 9780123814791 3

[15] Fowler Martin e Kent Beck Refactoring improving the design of existing codeAddison-Wesley Professional 1999 5 7

[16] Lehman M M J F Ramil P D Wernick D E Perry e W M Turski Met-rics and laws of software evolution - the nineties view Em Proceedings of the4th International Symposium on Software Metrics METRICS rsquo97 paacuteginas 20ndashWashington DC USA 1997 IEEE Computer Society ISBN 0-8186-8093-8 httpdlacmorgcitationcfmid=823454823901 6

[17] Hassan Ahmed E e Tao Xie Software intelligence The future of mining softwareengineering data Em Proceedings of the FSESDP Workshop on Future of SoftwareEngineering Research FoSER rsquo10 paacuteginas 161ndash166 New York NY USA 2010ACM ISBN 978-1-4503-0427-6 httpdoiacmorg101145188236218823978 9

[18] Hassan Ahmed E The road ahead for mining software repositories Em Frontiers ofSoftware Maintenance 2008 FoSM 2008 paacuteginas 48ndash57 IEEE 2008 8

[19] Berry Michael J e Gordon Linoff Data Mining Techniques For Marketing Salesand Customer Support John Wiley amp Sons Inc New York NY USA 1997ISBN 0471179809 10

[20] Parnin Chris Christian Bird e Emerson Murphy-Hill Java generics adoption hownew features are introduced championed or ignored Em Proceedings of the 8thWorking Conference on Mining Software Repositories paacuteginas 3ndash12 ACM 2011 12

[21] Oracle The java language specification httpsdocsoraclecomjavasespecsjlsse8jls8pdf 13

[22] Oracle The history of java technology httpwwworaclecomtechnetworkjavajavaseoverviewjavahistory-index-198355html 13

[23] Murphy Kieron So why did they decide to call itjava httpwwwjavaworldcomarticle2077265core-javaso-why-did-they-decide-to-call-it-java-html 13

[24] McGraw Tata Object-oriented Programming with Java Essentials and ApplicationsHill Education 13

49

[25] Oracle Differences between java ee and java se httpdocsoraclecomjavaee6firstcupdocgkhoyhtml 13

[26] Lindsey Clark S The History of Java Cambridge 14

[27] Oracle The java language environment httpwwworaclecomtechnetworkjavaintro-141325html 14

[28] Oracle Jdk 8 httpopenjdkjavanetprojectsjdk8 15 24

[29] Oracle Enhancements in java se 8 httpdocsoraclecomjavase8docstechnotesguideslanguageenhancementshtmljavase8 15 16 17

[30] Oracle Lambda expressions httpdocsoraclecomjavasetutorialjavajavaOOlambdaexpressionshtml 16 18 21

[31] Oracle Method references httpdocsoraclecomjavasetutorialjavajavaOOmethodreferenceshtml 16

[32] Oracle Default methods httpdocsoraclecomjavasetutorialjavaIandIdefaultmethodshtml 17

[33] Oracle Repeating annotations httpdocsoraclecomjavasetutorialjavaannotationsrepeatinghtml 17

[34] Oracle Type annotations httpdocsoraclecomjavasetutorialjavaannotationstype_annotationshtml 17

[35] Oracle Anonymous inner classes httpsdocsoraclecomjavasetutorialjavajavaOOanonymousclasseshtml 19

[36] Kothari CR Research Methodology Methods and Techniques New Age Interna-tional (P) Limited 2004 ISBN 9788122415223 httpsbooksgooglecombrbooksid=8c6gkbKi-F4C 22

[37] Nakakoji Kumiyo Yasuhiro Yamamoto Yoshiyuki Nishinaka Kouichi Kishida eYunwen Ye Evolution patterns of open-source software systems and communitiesEm IWPSE rsquo02 Proceedings of the International Workshop on Principles of SoftwareEvolution paacuteginas 76ndash85 New York NY USA 2002 ACM Press ISBN 1581135459httpdxdoiorg101145512035512055 23

[38] Rahman Foyzur Christian Bird e Premkumar Devanbu Clones What is that smellEmpirical Software Engineering 17(4-5)503ndash530 2012 24

[39] Chacon Scott Pro Git Apress Berkely CA USA 1st ediccedilatildeo 2009ISBN 1430218339 9781430218333 25

[40] Cavalcanti Thiago Gomes e Viniacutecius Correa de Almeida Caracterizaccedilatildeo do uso deconstruccedilotildees da linguagem java em projetos open-source Publicaccedilatildeo online 2016httpbdmunbbrhandle1048315733 27

50

[41] Parr Terence Language Implementation Patterns Create Your Own Domain-Specific and General Programming Languages Pragmatic Bookshelf 1st ediccedilatildeo 2009ISBN 193435645X 9781934356456 27

[42] Janssen Thorben 5 reasons to use jpa hibernate Publicaccedilatildeo online httpswwwsitepointcom5-reasons-to-use-jpa-hibernate 27

[43] Franklin Lyle Alex Gyori Jan Lahoda e Danny Dig Lambdaficator From imperativeto functional programming through automated refactoring Em Proceedings of the2013 International Conference on Software Engineering ICSE rsquo13 paacuteginas 1287ndash1290 Piscataway NJ USA 2013 IEEE Press ISBN 978-1-4673-3076-3 httpdlacmorgcitationcfmid=24867882486986 29

[44] Google Agera httpsgithubcomgoogleagerawiki 34

[45] Eclipse Eclipse vertx httpvertxio 35

[46] Cejas Fernando Android cleanarchitecture httpsgithubcomandroid10Android-CleanArchitecture 36

[47] ReactiveX Rxjava httpsgithubcomReactiveXRxJava 37

[48] Luontola Esko Retrolambda httpsgithubcomorfjackalretrolambda 43

51

Anexo I

Projetos utilizados

fastjson

platform_frameworks_base

netty

material-dialogs

kotlin

okhttp

tinker

AndroidUtilCode

RxJava

spring-boot

java-design-patterns

elasticsearch

ExoPlayer

kafka

vertx

realm-java

guava

zipkin

bazel

stetho

Signal-Android

glide

agera

fresco

plaid

presto

libgdx

spark

52

disruptor

lottie-android

flexbox-layout

PocketHub

zxing

spring-framework

deeplearning4j

dropwizard

interviews

BaseRecyclerViewAdapterHelper

uCrop

DanmakuFlameMaster

lottie-react-native

android-UniversalMusicPlayer

AndroidInterview-Q-A

greenDAO

retrofit

MaterialDrawer

BottomBar

druid

MPAndroidChart

Hystrix

guice

recyclerview-animators

dubbo

androidannotations

RxJava-Android-Samples

PhotoView

clojure

CircleImageView

AndroidSwipeLayout

jedis

MaterialViewPager

butterknife

junit4

RxBinding

leakcanary

SimianArmy

picasso

UltimateRecyclerView

53

AndroidViewAnimations

AppIntro

FizzBuzzEnterpriseEdition

ion

cheesesquare

physical-web

RxAndroid

Android-CleanArchitecture

Calligraphy

Android-Bootstrap

iosched

Android_Data

MaterialDesignLibrary

ListViewAnimations

EventBus

java8-tutorial

AndroidSlidingUpPanel

dagger

okhttputils

logger

HomeMirror

Material-Animations

android-Ultra-Pull-To-Refresh

android-async-http

Android-ObservableScrollView

Android-Universal-Image-Loader

ActionBarSherlock

SlidingMenu

storm

PagerSlidingTabStrip

Android-PullToRefresh

54

  • Dedicatoacuteria
  • Agradecimentos
  • Resumo
  • Abstract
  • Introduccedilatildeo
    • Contexto
    • Objetivos
      • Objetivos Gerais
      • Objetivos Especiacuteficos
        • Metodologia
        • Organizaccedilatildeo do Trabalho
          • Evoluccedilatildeo e Mineraccedilatildeo de Repositoacuterios de Software
            • Evoluccedilatildeo de Software
            • MSR Mineraccedilatildeo de dados e a Engenharia de Software
              • Classificaccedilatildeo
                • Trabalhos Relacionados
                  • Java SE 8 e JDK 8
                    • Histoacuterico
                    • Princiacutepios
                    • Evoluccedilatildeo
                    • Expressotildees Lambda
                      • Sintaxe
                      • Principais formas de uso
                          • Estudo e o Processo de Mineraccedilatildeo
                            • Questotildees de Pesquisa
                            • Fonte de Dados e Objetos de Estudo
                            • Processo de Mineraccedilatildeo
                              • static-analysis
                              • BDAnalisador
                                • Classificaccedilatildeo e Anaacutelise
                                  • Meacutedia de Lambda
                                  • Anaacutelise Temporal
                                  • Refatoraccedilatildeo de Coacutedigo
                                  • Casos de Uso
                                      • Resultados Obtidos e Anaacutelise
                                        • Visatildeo Geral
                                          • Projetos Selecionados
                                          • agera
                                          • vertx
                                          • Android-CleanArchitecture
                                          • RxJava
                                          • guava
                                            • Refatoraccedilatildeo de Coacutedigo
                                            • Estudos de Caso
                                              • Consideraccedilotildees Finais
                                              • Referecircncias
                                              • Anexo
                                              • Projetos utilizados

Figura 52 Graacuteficos de anaacutelise temporal do projeto agera

513 vertx

Eclipse Vertx eacute um conjunto de ferramentas para criaccedilatildeo de reactive applications namaacutequina virtual Java (JVM) em grande escala [45] Seu primeiro lanccedilamento aconteceuem 2011 e a primeira ocorrecircncia de expressotildees lambda no projeto aconteceu em 2014 Esteprojeto possui uma meacutedia de 2867 lambdasnapshot e dentre os projetos consideradosneste trabalho eacute o que possui a maior quantidade de expressotildees lambda

Este projeto pertence ao Grupo 2 onde a quantidade de expressotildees lambda aumen-tou consideravelmente pelos meses ultrapassando a quantidade de AICs que diminuiudrasticamente como mostra a Figura 53

35

Figura 53 Graacuteficos de anaacutelise temporal do projeto Vertx

514 Android-CleanArchitecture

Apesar de ser uma amostra de projeto Android-CleanArchitecture que tem como objetivoconstruir aplicaccedilotildees Android utilizando clean architecture foi lanccedilado em 2014 mas semanteacutem sempre atualizado [46]

A introduccedilatildeo de expressotildees lambda que aconteceu no ano de 2015 se deu de formatiacutemida com uma meacutedia de 35 lambdasnapshot De qualquer forma este projeto conseguerepresentar com seu graacutefico de anaacutelise temporal o grupo 3 composto por projetos em quea quantidade de expressotildees lambda aumentou mas sem ultrapassar AICs que diminuiacuteramdemonstrado no graacutefico da Figura 54

36

Figura 54 Graacuteficos de anaacutelise temporal do projeto Android-CleanArchitecture

515 RxJava

Dentre os repositoacuterios estudados RxJava eacute considerado o mais popular Como umaimplementaccedilatildeo de Reactive Extensions para a JVM RxJava teve seu lanccedilamento dadoem 2013 [47] Expressotildees lambda apareceram pela primeira vez no ano de 2015 comuma meacutedia de 766 lambdasnapshot

Apesar de uma meacutedia relativamente alta o tempo de vida das expressotildees lambda nesteprojeto foi bem curto caracterizando assim projetos do grupo 4 houve a introduccedilatildeo dasexpressotildees lambda no projeto poreacutem houve a remoccedilatildeo completa de todas as expressotildeeslambda previamente introduzidas desaparecendo completamente do projeto ateacute a datada coleta de dados (Figura 55)

37

Figura 55 Graacuteficos de anaacutelise temporal do projeto RxJava

516 guava

Guava eacute um conjunto de bibliotecas para Java da Google lanccedilado em 2011 A atualizaccedilatildeodo coacutedigo do projeto para Java 8 aconteceu somente em 2016 e apesar do projeto conteruma meacutedia de 281 lambdasnapshot ele foi escolhido como representante dos projetosdo Grupo 5 (Figura 56) que possuem expressotildees lambda mas de forma natildeo expressiva osuficiente quando comparado com a quantidade de AIC pelo fato de sua razatildeo de meacutedia delambdasnapshot por meacutedia de AICsnapshot ser 004 Ou seja embora o projeto tenhaexpressotildees lambda estas satildeo consideradas muito poucas quando inseridas no contextogeral deste projeto que eacute considerado um projeto grande

38

Figura 56 Graacuteficos de anaacutelise temporal do projeto Guava

52 Refatoraccedilatildeo de Coacutedigo

Com o objetivo de caracterizar melhor como as expressotildees lambda estatildeo sendo utilizadaseacute interessante identificar se estas estatildeo sendo introduzidas atraveacutes de refatoraccedilatildeo de coacutedigoou em coacutedigo novo

Os projetos classificados como pertencentes ao Grupo 2 possuem em comum o fatode expressotildees lambda aumentarem a medida que AICs diminuem ultrapassando-as eessa caracteriacutestica em comum pode indicar que nestes projetos possivelmente houve re-fatoraccedilatildeo de coacutedigo visto que AIC sendo substituiacutedo por expressotildees lambda dentro dascondiccedilotildees determinadas eacute a maneira mais comum de se identificar refatoraccedilatildeo de coacute-digo para introduccedilatildeo de expressotildees lambda [12] Os projetos que compotildeem o grupo 2representam 44 de todos os projetos estudados que possuem expressotildees lambda o quepode ser um indicativo caso a hipoacutetese de refatoraccedilatildeo de coacutedigo seja positiva de quemuitos projetos que estatildeo adotando o Java 8 estatildeo se preocupando de alguma formacom refatoraccedilatildeo se coacutedigo Fazem parte desse grupo os seguintes projetos elasticsearchjava-design-patterns PocketHub presto RxJava-Android-Samples spark vertx zipkinjava8-tutorial dropwizard e material-dialogs

39

Outra maneira de verificar possiacuteveis indicadores de refatoraccedilatildeo de coacutedigo foi atraveacutesda anaacutelise dos tamanhos (em quantidade de linhas de coacutedigo) dos meacutetodos com expressotildeeslambda no mecircs em que se introduziu expressotildees lambda e um mecircs imediatamente antesdeste Essa anaacutelise mostra que dos 25 projetos com expressotildees lambda 12 (48) projetostiveram ao menos um meacutetodo em que houve uma diminuiccedilatildeo no tamanho o que podeser considerado um indicativo de refatoraccedilatildeo de coacutedigo A Figura 57 mostra todos osprojetos em relaccedilatildeo agrave quantidade total de meacutetodos que possuem lambda no primeiro mecircsde introduccedilatildeo do mesmo em vermelho comparado com a quantidade desses meacutetodos quetiveram uma diminuiccedilatildeo no tamanho quando comparados com o coacutedigo do mecircs anteriorem azul

Figura 57 Comparaccedilatildeo entre todos os projetos com expressatildeo lambda sobre refatoraccedilatildeode coacutedigo no mecircs de introduccedilatildeo da caracteriacutestica

Ainda observando a figura 57 com relaccedilatildeo aos projetos que natildeo tiveram nenhummeacutetodo com diminuiccedilatildeo de tamanho (barra azul) percebe-se que todos os 13 projetossequer tiveram uma quantidade significativa de meacutetodos que possuem expressotildees lambda(com o maior tendo apenas 5 meacutetodos) no mecircs de introduccedilatildeo da caracteriacutestica no projetoe ao mesmo tempo jaacute existiam no mecircs em que natildeo existia lambda no projeto Essa eacuteuma observaccedilatildeo importante porque projetos como vertx sendo este o que possui a maiormeacutedia de lambdasnapshot de todos os projetos e ao mesmo tempo tendo apenas trecircsmeacutetodos que continham expressotildees lambda no mecircs da introduccedilatildeo e que existiam no mecircs

40

anterior permitem inferir que todas as outras expressotildees lambda existentes no projetopara este determinado mecircs de introduccedilatildeo encontram-se em coacutedigo novo introduzido

Eacute importante ressaltar que somente essa anaacutelise natildeo eacute exclusivamente suficiente paradeterminar se estes projetos estatildeo realmente introduzindo lambda em coacutedigo novo ourealizando refatoraccedilatildeo uma vez que como a comparaccedilatildeo aconteceu apenas no mecircs deintroduccedilatildeo com o mecircs imediatamente anterior natildeo reflete todo o ciclo de vida do pro-jeto Por exemplo algumas equipes podem escolher refatorar o coacutedigo depois de umtempo de adaptaccedilatildeo apoacutes a transiccedilatildeo para a nova versatildeo da linguagem Assim paraobter uma melhor anaacutelise sobre refatoraccedilatildeo de coacutedigo ou natildeo feita nestes projetos aleacutemde outras anaacutelises referentes aos padrotildees tipicamente adotados para implementaccedilatildeo delambda nestes projetos seratildeo apresentados a seguir os estudos de caso dos cinco projetospreviamente selecionados

Outro ponto importante eacute o fato de que apesar das informaccedilotildees quanto agraves quantida-des de filter e map terem sido incluiacutedas inicialmente no trabalho para observar possiacuteveispadrotildees de refatoraccedilatildeo de coacutedigo percebeu-se que estas natildeo satildeo utilizadas de forma con-sideraacutevel pelos projetos estudados e para fins de anaacutelises generalizadas natildeo apresentaramtanta influecircncia na utilizaccedilatildeo de expressotildees lambda quanto a quantidade de AICs noprojeto

53 Estudos de Caso

Dentre os projetos analisados verificou-se que os projetos de pequeno e meacutedio porte op-taram por refatorar de uma vez seus coacutedigos para incluir expressotildees lambda em situaccedilotildeesem que se utilizava AICs anteriormente ou em alguns poucos casos de utilizaccedilatildeo deCollection Os projetos de grande porte natildeo apresentaram nenhuma refatoraccedilatildeo de coacute-digo ou uma refatoraccedilatildeo parcial gradativa provavelmente devido agrave grande quantidade dearquivos e coacutedigo que possuem o que pode tornar o trabalho de refatoraccedilatildeo extenso ecansativo

O projeto vertx que pertence ao grupo 2 dos projetos em que a quantidade de ex-pressotildees lambda aumentaram e as de AICs diminuiacuteram com lambda ultrapassando AICsexecutou inicialmente commits em maio de 2014 com adiccedilatildeo de coacutedigo novo utilizandoexpressotildees lambda e apoacutes um mecircs realizou um commit maior com a refatoraccedilatildeo de todasas AICs para expressotildees lambda Apoacutes a refatoraccedilatildeo o projeto se preocupou em mantera utilizaccedilatildeo de expressotildees lambda ao mesmo tempo que o uso de AICs se manteve apenasaos casos de classes com interfaces natildeo funcionais A Figura 58 apresenta uma parte docommit de refatoraccedilatildeo de coacutedigo que mostra em vermelho a parte eliminada do coacutedigo(AIC) e em verde o coacutedigo novo representando a substituiccedilatildeo por uma expressatildeo lambda

41

Figura 58 Commit de refatoraccedilatildeo de coacutedigo do projeto Vertx [3]

Alguns projetos ainda natildeo se preocuparam em refatorar o coacutedigo para o uso de ex-pressotildees lambda ateacute a data deste trabalho que eacute o caso do projeto guava que apresentouum commit em 03112016 com a atualizaccedilatildeo do projeto para Java 8 Mas a partir daatualizaccedilatildeo se preocupou em utilizar as expressotildees lambda apenas na implementaccedilatildeo decoacutedigo novo O cenaacuterio em que a refatoraccedilatildeo natildeo eacute prioridade ainda eacute a realidade de vaacuteriosprojetos de grande porte visto que os dados de projetos sem nenhuma expressatildeo lambdasatildeo o maior nuacutemero neste trabalho Poreacutem projetos que jaacute adotaram a utilizaccedilatildeo do Java8 tendem a mudar isso com o passar do tempo A Figura 59 apresenta em verde umaadiccedilatildeo de coacutedigo novo com expressatildeo lambda sem a eliminaccedilatildeo de algum coacutedigo anteriora esse que estaria em vermelho

42

Figura 59 Exemplo de um arquivo do commit de adiccedilatildeo de coacutedigo novo em Java 8 doprojeto Guava [4]

Na categoria de projetos em que os AICs e expressotildees lambda aumentam proporci-onalmente (grupo 1) o projeto agera realizou um commit em 19052016 com a adiccedilatildeoda biblioteca retrolambda como dependecircncia do projeto Essa biblioteca utilizada prin-cipalmente por projetos Android permite executar coacutedigo Java 8 contendo expressotildeeslambda em Java 5 6 e 7 [48] O commit tambeacutem apresenta refatoraccedilatildeo dos AICs ad-vindos de interfaces funcionais para expressotildees lambda Apesar de o projeto continuar autilizar as expressotildees lambda em seus commits posteriores o nuacutemero de AICs tambeacutemcontinuou a aumentar visualizando os commits posteriores notou-se que esses AICs satildeorelativos a interfaces natildeo funcionais ou seja que possuem mais de um meacutetodo O projetoAndroid-CleanArchitecture eacute similar ao agera pois tambeacutem optou pela instalaccedilatildeo da bi-blioteca retrolambda para uso de expressotildees lambda em seus coacutedigos e como tambeacutem eacuteum projeto de pequeno porte houve uma pequena refatoraccedilatildeo dos AICs A Figura 510mostra a parte do commit de refatoraccedilatildeo de coacutedigo em que o desenvolvedor adiciona abiblioteca retrolambda como dependecircncia

43

Figura 510 Commit de adiccedilatildeo da biblioteca Retrolambda no projeto Agera [5]

Outro caso interessante eacute o do projeto RxJava que em 2015 optou pela refatoraccedilatildeodo coacutedigo para a utilizaccedilatildeo de expressotildees lambda quase eliminando por completo o usode AICs mas que no ano seguinte reverteu os commits de forma que eliminasse comple-tamente o uso de expressotildees lambda para manter a retrocompatibilidade com o Java 6A Figura 511 demonstra uma parte do commit de reversatildeo do coacutedigo para Java 6 emque pode ser visto em vermelho o coacutedigo anterior com expressotildees lambda e o verde como novo coacutedigo utilizando AIC novamente

44

Figura 511 Commit de remoccedilatildeo de Lambdas e volta para o uso de AICs no projetoRXJava [6]

Essa preocupaccedilatildeo com retrocompatibilidade de coacutedigo pode ser um fator crucial nadecisatildeo das equipes de desenvolvimento na hora de decidir como fazer o software co-evoluircom a linguagem sem perder a compatibilidade com versotildees anteriores

45

Capiacutetulo 6

Consideraccedilotildees Finais

Este estudo permitiu entender melhor como projetos estatildeo realizando a migraccedilatildeo para oJava 8 em especial utilizando uma nova caracteriacutestica introduzida expressatildeo lambdaApesar de a maioria dos projetos populares considerados natildeo possuiacuterem nenhuma ocor-recircncia de expressotildees lambda os projetos que tinham expressotildees lambda foram suficientespara realizar um primeiro estudo de caracterizaccedilatildeo no uso desta caracteriacutestica e com osprojetos efetivamente utilizados para estudo foi possiacutevel agrupaacute-los quanto a maneira emque as expressotildees lambda estavam sendo utilizadas quando comparadas com AICs em 5grandes grupos quando AIC e lambda aumentam proporcionalmente quando AIC dimi-nui e lambda aumenta ultrapassando AIC quando AIC diminui mas continua superior aolambda crescente expressotildees lambda que foram introduzidas e retiradas completamentedo coacutedigo e expressotildees lambda que natildeo existem em quantidades expressivas

Foi possiacutevel entatildeo realizar um estudo aprofundado levando em consideraccedilatildeo as di-ferentes maneiras com que as expressotildees lambda foram adotadas nos projetos atraveacutes daescolha de um projeto que representasse cada grupo para anaacutelise Dentre os cinco projetosestudados foi possiacutevel observar alguns padrotildees tipicamente adotados por desenvolvedorespara implementar expressotildees lambda em seus projetos como a utilizaccedilatildeo da bibliotecas(retrolambda) que permitissem uma flexibilizaccedilatildeo na utilizaccedilatildeo de expressotildees lambda oucomo lambda eacute primariamente utilizada para substituir determinados AICs ou operaccedilotildeesem Collection

Aleacutem disso foi possiacutevel observar como a refatoraccedilatildeo de coacutedigo acontece em cada umdesses projetos Observou-se como projetos menores tendem a refatorar coacutedigo maisfacilmente ao passo que projetos maiores e mais complexos fazem menos refatoraccedilatildeo oudemoram mais entre o periacuteodo em que houve a primeira migraccedilatildeo de coacutedigo para a novaversatildeo da linguagem ateacute o periacuteodo em que realmente decidem refatorar coacutedigo Aleacutem dacomplexidade do projeto influenciar na decisatildeo de migrar o projeto para uma versatildeo maisrecente da linguagem a preocupaccedilatildeo com retrocompatibilidade com versotildees anteriores da

46

linguagem tambeacutem podem ser uma barreira para que projetos comecem a evoluir o coacutedigojuntamente com a evoluccedilatildeo da linguagem

Ainda assim foi possiacutevel observar que a preocupaccedilatildeo com a co-evoluccedilatildeo do software-linguagem existe entre os desenvolvedores de projetos mas a realizaccedilatildeo da migraccedilatildeo aindaacontece lentamente devido agrave diversos fatores que precisam ser levados em consideraccedilatildeopara a manutenccedilatildeo do projeto

Para trabalhos e contribuiccedilotildees futuras seria interessante desenvolver uma ferramentaque pudesse analisar diretamente no coacutedigo-fonte as oportunidades de aplicaccedilatildeo de ex-pressotildees lambda dessa forma poderiam ser analisadas as porcentagens de conversatildeo decoacutedigo para Java 8 e obter melhores conclusotildees sobre a importacircncia que os projetos estatildeodando para a evoluccedilatildeo de seus coacutedigos Outro fator interessante seria aplicar mais Visitorsagrave ferramenta static-analysis e fazer este mesmo estudo aplicado agrave outras caracteriacutesticasda linguagem

47

Referecircncias

[1] Kagdi Huzefa Michael L Collard e Jonathan I Maletic A survey and taxonomyof approaches for mining software repositories in the context of software evolution2007 ix 3 8 9 10 11

[2] DBeaver Dbeaver - features httpdbeaverjkissorgdocsfeatures ix 29

[3] Eclipse Vertx commit Java8-ify code httpsgithubcomeclipsevertxcommit93f95e9c77419f442a42fe711b6eeaef88192fd3 ix 42

[4] Google Guava commit Release java 8 changes to guava httpsgithubcomgoogleguavacommit73e382fa877f80994817a136b0adcc4365ccd904 ix 43

[5] Google Agera commit Collapsed testapp with retrolambda httpsgithubcomgoogleageracommit5e518b7b05f9e7a34a314945f68deff7b2c3e334 ix 44

[6] ReactiveX Rxjava commit 2x full jdk 6 compatible backport + includ-ing bugfixes up to today httpsgithubcomReactiveXRxJavacommit000a174d87a901135f9665d3b11f3627fd2dc4ed ix 45

[7] Godfrey M W e D M German The past present and future of software evolutionEm 2008 Frontiers of Maintenance paacuteginas 129ndash138 Sept 2008 1 6

[8] Favre J M Languages evolve too changing the software time scale Em Principles ofSoftware Evolution Eighth International Workshop on paacuteginas 33ndash42 IEEE 20051 5 7

[9] Overbey Jeffrey L e Ralph E Johnson Regrowing a language refactoring tools allowprogramming languages to evolve Em ACM SIGPLAN Notices volume 44 paacuteginas493ndash502 ACM 2009 1 5 7 8 12

[10] Grechanik Mark Collin McMillan Luca DeFerrari Marco Comi Stefano CrespiDenys Poshyvanyk Chen Fu Qing Xie e Carlo Ghezzi An empirical investiga-tion into a large-scale java open source code repository Em Proceedings of the2010 ACM-IEEE International Symposium on Empirical Software Engineering andMeasurement ESEM rsquo10 paacuteginas 111ndash1110 New York NY USA 2010 ACMISBN 978-1-4503-0039-1 httpdoiacmorg10114518527861852801 1

[11] TIOBE Tiobe httpswwwtiobecomtiobe-index 1 14

48

[12] Gyori Alex Lyle Franklin Danny Dig e Jan Lahoda Crossing the gap from im-perative to functional programming through refactoring Em Proceedings of the 20139th Joint Meeting on Foundations of Software Engineering ESECFSE 2013 paacute-ginas 543ndash553 New York NY USA 2013 ACM ISBN 978-1-4503-2237-9 httpdoiacmorg10114524914112491461 2 11 24 39

[13] OpenJDK State of the lambda httpcropenjdkjavanet~briangoetzlambdalambda-state-4html 2

[14] Han Jiawei Micheline Kamber e Jian Pei Data Mining Concepts and TechniquesMorgan Kaufmann Publishers Inc San Francisco CA USA 3rd ediccedilatildeo 2011ISBN 0123814790 9780123814791 3

[15] Fowler Martin e Kent Beck Refactoring improving the design of existing codeAddison-Wesley Professional 1999 5 7

[16] Lehman M M J F Ramil P D Wernick D E Perry e W M Turski Met-rics and laws of software evolution - the nineties view Em Proceedings of the4th International Symposium on Software Metrics METRICS rsquo97 paacuteginas 20ndashWashington DC USA 1997 IEEE Computer Society ISBN 0-8186-8093-8 httpdlacmorgcitationcfmid=823454823901 6

[17] Hassan Ahmed E e Tao Xie Software intelligence The future of mining softwareengineering data Em Proceedings of the FSESDP Workshop on Future of SoftwareEngineering Research FoSER rsquo10 paacuteginas 161ndash166 New York NY USA 2010ACM ISBN 978-1-4503-0427-6 httpdoiacmorg101145188236218823978 9

[18] Hassan Ahmed E The road ahead for mining software repositories Em Frontiers ofSoftware Maintenance 2008 FoSM 2008 paacuteginas 48ndash57 IEEE 2008 8

[19] Berry Michael J e Gordon Linoff Data Mining Techniques For Marketing Salesand Customer Support John Wiley amp Sons Inc New York NY USA 1997ISBN 0471179809 10

[20] Parnin Chris Christian Bird e Emerson Murphy-Hill Java generics adoption hownew features are introduced championed or ignored Em Proceedings of the 8thWorking Conference on Mining Software Repositories paacuteginas 3ndash12 ACM 2011 12

[21] Oracle The java language specification httpsdocsoraclecomjavasespecsjlsse8jls8pdf 13

[22] Oracle The history of java technology httpwwworaclecomtechnetworkjavajavaseoverviewjavahistory-index-198355html 13

[23] Murphy Kieron So why did they decide to call itjava httpwwwjavaworldcomarticle2077265core-javaso-why-did-they-decide-to-call-it-java-html 13

[24] McGraw Tata Object-oriented Programming with Java Essentials and ApplicationsHill Education 13

49

[25] Oracle Differences between java ee and java se httpdocsoraclecomjavaee6firstcupdocgkhoyhtml 13

[26] Lindsey Clark S The History of Java Cambridge 14

[27] Oracle The java language environment httpwwworaclecomtechnetworkjavaintro-141325html 14

[28] Oracle Jdk 8 httpopenjdkjavanetprojectsjdk8 15 24

[29] Oracle Enhancements in java se 8 httpdocsoraclecomjavase8docstechnotesguideslanguageenhancementshtmljavase8 15 16 17

[30] Oracle Lambda expressions httpdocsoraclecomjavasetutorialjavajavaOOlambdaexpressionshtml 16 18 21

[31] Oracle Method references httpdocsoraclecomjavasetutorialjavajavaOOmethodreferenceshtml 16

[32] Oracle Default methods httpdocsoraclecomjavasetutorialjavaIandIdefaultmethodshtml 17

[33] Oracle Repeating annotations httpdocsoraclecomjavasetutorialjavaannotationsrepeatinghtml 17

[34] Oracle Type annotations httpdocsoraclecomjavasetutorialjavaannotationstype_annotationshtml 17

[35] Oracle Anonymous inner classes httpsdocsoraclecomjavasetutorialjavajavaOOanonymousclasseshtml 19

[36] Kothari CR Research Methodology Methods and Techniques New Age Interna-tional (P) Limited 2004 ISBN 9788122415223 httpsbooksgooglecombrbooksid=8c6gkbKi-F4C 22

[37] Nakakoji Kumiyo Yasuhiro Yamamoto Yoshiyuki Nishinaka Kouichi Kishida eYunwen Ye Evolution patterns of open-source software systems and communitiesEm IWPSE rsquo02 Proceedings of the International Workshop on Principles of SoftwareEvolution paacuteginas 76ndash85 New York NY USA 2002 ACM Press ISBN 1581135459httpdxdoiorg101145512035512055 23

[38] Rahman Foyzur Christian Bird e Premkumar Devanbu Clones What is that smellEmpirical Software Engineering 17(4-5)503ndash530 2012 24

[39] Chacon Scott Pro Git Apress Berkely CA USA 1st ediccedilatildeo 2009ISBN 1430218339 9781430218333 25

[40] Cavalcanti Thiago Gomes e Viniacutecius Correa de Almeida Caracterizaccedilatildeo do uso deconstruccedilotildees da linguagem java em projetos open-source Publicaccedilatildeo online 2016httpbdmunbbrhandle1048315733 27

50

[41] Parr Terence Language Implementation Patterns Create Your Own Domain-Specific and General Programming Languages Pragmatic Bookshelf 1st ediccedilatildeo 2009ISBN 193435645X 9781934356456 27

[42] Janssen Thorben 5 reasons to use jpa hibernate Publicaccedilatildeo online httpswwwsitepointcom5-reasons-to-use-jpa-hibernate 27

[43] Franklin Lyle Alex Gyori Jan Lahoda e Danny Dig Lambdaficator From imperativeto functional programming through automated refactoring Em Proceedings of the2013 International Conference on Software Engineering ICSE rsquo13 paacuteginas 1287ndash1290 Piscataway NJ USA 2013 IEEE Press ISBN 978-1-4673-3076-3 httpdlacmorgcitationcfmid=24867882486986 29

[44] Google Agera httpsgithubcomgoogleagerawiki 34

[45] Eclipse Eclipse vertx httpvertxio 35

[46] Cejas Fernando Android cleanarchitecture httpsgithubcomandroid10Android-CleanArchitecture 36

[47] ReactiveX Rxjava httpsgithubcomReactiveXRxJava 37

[48] Luontola Esko Retrolambda httpsgithubcomorfjackalretrolambda 43

51

Anexo I

Projetos utilizados

fastjson

platform_frameworks_base

netty

material-dialogs

kotlin

okhttp

tinker

AndroidUtilCode

RxJava

spring-boot

java-design-patterns

elasticsearch

ExoPlayer

kafka

vertx

realm-java

guava

zipkin

bazel

stetho

Signal-Android

glide

agera

fresco

plaid

presto

libgdx

spark

52

disruptor

lottie-android

flexbox-layout

PocketHub

zxing

spring-framework

deeplearning4j

dropwizard

interviews

BaseRecyclerViewAdapterHelper

uCrop

DanmakuFlameMaster

lottie-react-native

android-UniversalMusicPlayer

AndroidInterview-Q-A

greenDAO

retrofit

MaterialDrawer

BottomBar

druid

MPAndroidChart

Hystrix

guice

recyclerview-animators

dubbo

androidannotations

RxJava-Android-Samples

PhotoView

clojure

CircleImageView

AndroidSwipeLayout

jedis

MaterialViewPager

butterknife

junit4

RxBinding

leakcanary

SimianArmy

picasso

UltimateRecyclerView

53

AndroidViewAnimations

AppIntro

FizzBuzzEnterpriseEdition

ion

cheesesquare

physical-web

RxAndroid

Android-CleanArchitecture

Calligraphy

Android-Bootstrap

iosched

Android_Data

MaterialDesignLibrary

ListViewAnimations

EventBus

java8-tutorial

AndroidSlidingUpPanel

dagger

okhttputils

logger

HomeMirror

Material-Animations

android-Ultra-Pull-To-Refresh

android-async-http

Android-ObservableScrollView

Android-Universal-Image-Loader

ActionBarSherlock

SlidingMenu

storm

PagerSlidingTabStrip

Android-PullToRefresh

54

  • Dedicatoacuteria
  • Agradecimentos
  • Resumo
  • Abstract
  • Introduccedilatildeo
    • Contexto
    • Objetivos
      • Objetivos Gerais
      • Objetivos Especiacuteficos
        • Metodologia
        • Organizaccedilatildeo do Trabalho
          • Evoluccedilatildeo e Mineraccedilatildeo de Repositoacuterios de Software
            • Evoluccedilatildeo de Software
            • MSR Mineraccedilatildeo de dados e a Engenharia de Software
              • Classificaccedilatildeo
                • Trabalhos Relacionados
                  • Java SE 8 e JDK 8
                    • Histoacuterico
                    • Princiacutepios
                    • Evoluccedilatildeo
                    • Expressotildees Lambda
                      • Sintaxe
                      • Principais formas de uso
                          • Estudo e o Processo de Mineraccedilatildeo
                            • Questotildees de Pesquisa
                            • Fonte de Dados e Objetos de Estudo
                            • Processo de Mineraccedilatildeo
                              • static-analysis
                              • BDAnalisador
                                • Classificaccedilatildeo e Anaacutelise
                                  • Meacutedia de Lambda
                                  • Anaacutelise Temporal
                                  • Refatoraccedilatildeo de Coacutedigo
                                  • Casos de Uso
                                      • Resultados Obtidos e Anaacutelise
                                        • Visatildeo Geral
                                          • Projetos Selecionados
                                          • agera
                                          • vertx
                                          • Android-CleanArchitecture
                                          • RxJava
                                          • guava
                                            • Refatoraccedilatildeo de Coacutedigo
                                            • Estudos de Caso
                                              • Consideraccedilotildees Finais
                                              • Referecircncias
                                              • Anexo
                                              • Projetos utilizados

Figura 53 Graacuteficos de anaacutelise temporal do projeto Vertx

514 Android-CleanArchitecture

Apesar de ser uma amostra de projeto Android-CleanArchitecture que tem como objetivoconstruir aplicaccedilotildees Android utilizando clean architecture foi lanccedilado em 2014 mas semanteacutem sempre atualizado [46]

A introduccedilatildeo de expressotildees lambda que aconteceu no ano de 2015 se deu de formatiacutemida com uma meacutedia de 35 lambdasnapshot De qualquer forma este projeto conseguerepresentar com seu graacutefico de anaacutelise temporal o grupo 3 composto por projetos em quea quantidade de expressotildees lambda aumentou mas sem ultrapassar AICs que diminuiacuteramdemonstrado no graacutefico da Figura 54

36

Figura 54 Graacuteficos de anaacutelise temporal do projeto Android-CleanArchitecture

515 RxJava

Dentre os repositoacuterios estudados RxJava eacute considerado o mais popular Como umaimplementaccedilatildeo de Reactive Extensions para a JVM RxJava teve seu lanccedilamento dadoem 2013 [47] Expressotildees lambda apareceram pela primeira vez no ano de 2015 comuma meacutedia de 766 lambdasnapshot

Apesar de uma meacutedia relativamente alta o tempo de vida das expressotildees lambda nesteprojeto foi bem curto caracterizando assim projetos do grupo 4 houve a introduccedilatildeo dasexpressotildees lambda no projeto poreacutem houve a remoccedilatildeo completa de todas as expressotildeeslambda previamente introduzidas desaparecendo completamente do projeto ateacute a datada coleta de dados (Figura 55)

37

Figura 55 Graacuteficos de anaacutelise temporal do projeto RxJava

516 guava

Guava eacute um conjunto de bibliotecas para Java da Google lanccedilado em 2011 A atualizaccedilatildeodo coacutedigo do projeto para Java 8 aconteceu somente em 2016 e apesar do projeto conteruma meacutedia de 281 lambdasnapshot ele foi escolhido como representante dos projetosdo Grupo 5 (Figura 56) que possuem expressotildees lambda mas de forma natildeo expressiva osuficiente quando comparado com a quantidade de AIC pelo fato de sua razatildeo de meacutedia delambdasnapshot por meacutedia de AICsnapshot ser 004 Ou seja embora o projeto tenhaexpressotildees lambda estas satildeo consideradas muito poucas quando inseridas no contextogeral deste projeto que eacute considerado um projeto grande

38

Figura 56 Graacuteficos de anaacutelise temporal do projeto Guava

52 Refatoraccedilatildeo de Coacutedigo

Com o objetivo de caracterizar melhor como as expressotildees lambda estatildeo sendo utilizadaseacute interessante identificar se estas estatildeo sendo introduzidas atraveacutes de refatoraccedilatildeo de coacutedigoou em coacutedigo novo

Os projetos classificados como pertencentes ao Grupo 2 possuem em comum o fatode expressotildees lambda aumentarem a medida que AICs diminuem ultrapassando-as eessa caracteriacutestica em comum pode indicar que nestes projetos possivelmente houve re-fatoraccedilatildeo de coacutedigo visto que AIC sendo substituiacutedo por expressotildees lambda dentro dascondiccedilotildees determinadas eacute a maneira mais comum de se identificar refatoraccedilatildeo de coacute-digo para introduccedilatildeo de expressotildees lambda [12] Os projetos que compotildeem o grupo 2representam 44 de todos os projetos estudados que possuem expressotildees lambda o quepode ser um indicativo caso a hipoacutetese de refatoraccedilatildeo de coacutedigo seja positiva de quemuitos projetos que estatildeo adotando o Java 8 estatildeo se preocupando de alguma formacom refatoraccedilatildeo se coacutedigo Fazem parte desse grupo os seguintes projetos elasticsearchjava-design-patterns PocketHub presto RxJava-Android-Samples spark vertx zipkinjava8-tutorial dropwizard e material-dialogs

39

Outra maneira de verificar possiacuteveis indicadores de refatoraccedilatildeo de coacutedigo foi atraveacutesda anaacutelise dos tamanhos (em quantidade de linhas de coacutedigo) dos meacutetodos com expressotildeeslambda no mecircs em que se introduziu expressotildees lambda e um mecircs imediatamente antesdeste Essa anaacutelise mostra que dos 25 projetos com expressotildees lambda 12 (48) projetostiveram ao menos um meacutetodo em que houve uma diminuiccedilatildeo no tamanho o que podeser considerado um indicativo de refatoraccedilatildeo de coacutedigo A Figura 57 mostra todos osprojetos em relaccedilatildeo agrave quantidade total de meacutetodos que possuem lambda no primeiro mecircsde introduccedilatildeo do mesmo em vermelho comparado com a quantidade desses meacutetodos quetiveram uma diminuiccedilatildeo no tamanho quando comparados com o coacutedigo do mecircs anteriorem azul

Figura 57 Comparaccedilatildeo entre todos os projetos com expressatildeo lambda sobre refatoraccedilatildeode coacutedigo no mecircs de introduccedilatildeo da caracteriacutestica

Ainda observando a figura 57 com relaccedilatildeo aos projetos que natildeo tiveram nenhummeacutetodo com diminuiccedilatildeo de tamanho (barra azul) percebe-se que todos os 13 projetossequer tiveram uma quantidade significativa de meacutetodos que possuem expressotildees lambda(com o maior tendo apenas 5 meacutetodos) no mecircs de introduccedilatildeo da caracteriacutestica no projetoe ao mesmo tempo jaacute existiam no mecircs em que natildeo existia lambda no projeto Essa eacuteuma observaccedilatildeo importante porque projetos como vertx sendo este o que possui a maiormeacutedia de lambdasnapshot de todos os projetos e ao mesmo tempo tendo apenas trecircsmeacutetodos que continham expressotildees lambda no mecircs da introduccedilatildeo e que existiam no mecircs

40

anterior permitem inferir que todas as outras expressotildees lambda existentes no projetopara este determinado mecircs de introduccedilatildeo encontram-se em coacutedigo novo introduzido

Eacute importante ressaltar que somente essa anaacutelise natildeo eacute exclusivamente suficiente paradeterminar se estes projetos estatildeo realmente introduzindo lambda em coacutedigo novo ourealizando refatoraccedilatildeo uma vez que como a comparaccedilatildeo aconteceu apenas no mecircs deintroduccedilatildeo com o mecircs imediatamente anterior natildeo reflete todo o ciclo de vida do pro-jeto Por exemplo algumas equipes podem escolher refatorar o coacutedigo depois de umtempo de adaptaccedilatildeo apoacutes a transiccedilatildeo para a nova versatildeo da linguagem Assim paraobter uma melhor anaacutelise sobre refatoraccedilatildeo de coacutedigo ou natildeo feita nestes projetos aleacutemde outras anaacutelises referentes aos padrotildees tipicamente adotados para implementaccedilatildeo delambda nestes projetos seratildeo apresentados a seguir os estudos de caso dos cinco projetospreviamente selecionados

Outro ponto importante eacute o fato de que apesar das informaccedilotildees quanto agraves quantida-des de filter e map terem sido incluiacutedas inicialmente no trabalho para observar possiacuteveispadrotildees de refatoraccedilatildeo de coacutedigo percebeu-se que estas natildeo satildeo utilizadas de forma con-sideraacutevel pelos projetos estudados e para fins de anaacutelises generalizadas natildeo apresentaramtanta influecircncia na utilizaccedilatildeo de expressotildees lambda quanto a quantidade de AICs noprojeto

53 Estudos de Caso

Dentre os projetos analisados verificou-se que os projetos de pequeno e meacutedio porte op-taram por refatorar de uma vez seus coacutedigos para incluir expressotildees lambda em situaccedilotildeesem que se utilizava AICs anteriormente ou em alguns poucos casos de utilizaccedilatildeo deCollection Os projetos de grande porte natildeo apresentaram nenhuma refatoraccedilatildeo de coacute-digo ou uma refatoraccedilatildeo parcial gradativa provavelmente devido agrave grande quantidade dearquivos e coacutedigo que possuem o que pode tornar o trabalho de refatoraccedilatildeo extenso ecansativo

O projeto vertx que pertence ao grupo 2 dos projetos em que a quantidade de ex-pressotildees lambda aumentaram e as de AICs diminuiacuteram com lambda ultrapassando AICsexecutou inicialmente commits em maio de 2014 com adiccedilatildeo de coacutedigo novo utilizandoexpressotildees lambda e apoacutes um mecircs realizou um commit maior com a refatoraccedilatildeo de todasas AICs para expressotildees lambda Apoacutes a refatoraccedilatildeo o projeto se preocupou em mantera utilizaccedilatildeo de expressotildees lambda ao mesmo tempo que o uso de AICs se manteve apenasaos casos de classes com interfaces natildeo funcionais A Figura 58 apresenta uma parte docommit de refatoraccedilatildeo de coacutedigo que mostra em vermelho a parte eliminada do coacutedigo(AIC) e em verde o coacutedigo novo representando a substituiccedilatildeo por uma expressatildeo lambda

41

Figura 58 Commit de refatoraccedilatildeo de coacutedigo do projeto Vertx [3]

Alguns projetos ainda natildeo se preocuparam em refatorar o coacutedigo para o uso de ex-pressotildees lambda ateacute a data deste trabalho que eacute o caso do projeto guava que apresentouum commit em 03112016 com a atualizaccedilatildeo do projeto para Java 8 Mas a partir daatualizaccedilatildeo se preocupou em utilizar as expressotildees lambda apenas na implementaccedilatildeo decoacutedigo novo O cenaacuterio em que a refatoraccedilatildeo natildeo eacute prioridade ainda eacute a realidade de vaacuteriosprojetos de grande porte visto que os dados de projetos sem nenhuma expressatildeo lambdasatildeo o maior nuacutemero neste trabalho Poreacutem projetos que jaacute adotaram a utilizaccedilatildeo do Java8 tendem a mudar isso com o passar do tempo A Figura 59 apresenta em verde umaadiccedilatildeo de coacutedigo novo com expressatildeo lambda sem a eliminaccedilatildeo de algum coacutedigo anteriora esse que estaria em vermelho

42

Figura 59 Exemplo de um arquivo do commit de adiccedilatildeo de coacutedigo novo em Java 8 doprojeto Guava [4]

Na categoria de projetos em que os AICs e expressotildees lambda aumentam proporci-onalmente (grupo 1) o projeto agera realizou um commit em 19052016 com a adiccedilatildeoda biblioteca retrolambda como dependecircncia do projeto Essa biblioteca utilizada prin-cipalmente por projetos Android permite executar coacutedigo Java 8 contendo expressotildeeslambda em Java 5 6 e 7 [48] O commit tambeacutem apresenta refatoraccedilatildeo dos AICs ad-vindos de interfaces funcionais para expressotildees lambda Apesar de o projeto continuar autilizar as expressotildees lambda em seus commits posteriores o nuacutemero de AICs tambeacutemcontinuou a aumentar visualizando os commits posteriores notou-se que esses AICs satildeorelativos a interfaces natildeo funcionais ou seja que possuem mais de um meacutetodo O projetoAndroid-CleanArchitecture eacute similar ao agera pois tambeacutem optou pela instalaccedilatildeo da bi-blioteca retrolambda para uso de expressotildees lambda em seus coacutedigos e como tambeacutem eacuteum projeto de pequeno porte houve uma pequena refatoraccedilatildeo dos AICs A Figura 510mostra a parte do commit de refatoraccedilatildeo de coacutedigo em que o desenvolvedor adiciona abiblioteca retrolambda como dependecircncia

43

Figura 510 Commit de adiccedilatildeo da biblioteca Retrolambda no projeto Agera [5]

Outro caso interessante eacute o do projeto RxJava que em 2015 optou pela refatoraccedilatildeodo coacutedigo para a utilizaccedilatildeo de expressotildees lambda quase eliminando por completo o usode AICs mas que no ano seguinte reverteu os commits de forma que eliminasse comple-tamente o uso de expressotildees lambda para manter a retrocompatibilidade com o Java 6A Figura 511 demonstra uma parte do commit de reversatildeo do coacutedigo para Java 6 emque pode ser visto em vermelho o coacutedigo anterior com expressotildees lambda e o verde como novo coacutedigo utilizando AIC novamente

44

Figura 511 Commit de remoccedilatildeo de Lambdas e volta para o uso de AICs no projetoRXJava [6]

Essa preocupaccedilatildeo com retrocompatibilidade de coacutedigo pode ser um fator crucial nadecisatildeo das equipes de desenvolvimento na hora de decidir como fazer o software co-evoluircom a linguagem sem perder a compatibilidade com versotildees anteriores

45

Capiacutetulo 6

Consideraccedilotildees Finais

Este estudo permitiu entender melhor como projetos estatildeo realizando a migraccedilatildeo para oJava 8 em especial utilizando uma nova caracteriacutestica introduzida expressatildeo lambdaApesar de a maioria dos projetos populares considerados natildeo possuiacuterem nenhuma ocor-recircncia de expressotildees lambda os projetos que tinham expressotildees lambda foram suficientespara realizar um primeiro estudo de caracterizaccedilatildeo no uso desta caracteriacutestica e com osprojetos efetivamente utilizados para estudo foi possiacutevel agrupaacute-los quanto a maneira emque as expressotildees lambda estavam sendo utilizadas quando comparadas com AICs em 5grandes grupos quando AIC e lambda aumentam proporcionalmente quando AIC dimi-nui e lambda aumenta ultrapassando AIC quando AIC diminui mas continua superior aolambda crescente expressotildees lambda que foram introduzidas e retiradas completamentedo coacutedigo e expressotildees lambda que natildeo existem em quantidades expressivas

Foi possiacutevel entatildeo realizar um estudo aprofundado levando em consideraccedilatildeo as di-ferentes maneiras com que as expressotildees lambda foram adotadas nos projetos atraveacutes daescolha de um projeto que representasse cada grupo para anaacutelise Dentre os cinco projetosestudados foi possiacutevel observar alguns padrotildees tipicamente adotados por desenvolvedorespara implementar expressotildees lambda em seus projetos como a utilizaccedilatildeo da bibliotecas(retrolambda) que permitissem uma flexibilizaccedilatildeo na utilizaccedilatildeo de expressotildees lambda oucomo lambda eacute primariamente utilizada para substituir determinados AICs ou operaccedilotildeesem Collection

Aleacutem disso foi possiacutevel observar como a refatoraccedilatildeo de coacutedigo acontece em cada umdesses projetos Observou-se como projetos menores tendem a refatorar coacutedigo maisfacilmente ao passo que projetos maiores e mais complexos fazem menos refatoraccedilatildeo oudemoram mais entre o periacuteodo em que houve a primeira migraccedilatildeo de coacutedigo para a novaversatildeo da linguagem ateacute o periacuteodo em que realmente decidem refatorar coacutedigo Aleacutem dacomplexidade do projeto influenciar na decisatildeo de migrar o projeto para uma versatildeo maisrecente da linguagem a preocupaccedilatildeo com retrocompatibilidade com versotildees anteriores da

46

linguagem tambeacutem podem ser uma barreira para que projetos comecem a evoluir o coacutedigojuntamente com a evoluccedilatildeo da linguagem

Ainda assim foi possiacutevel observar que a preocupaccedilatildeo com a co-evoluccedilatildeo do software-linguagem existe entre os desenvolvedores de projetos mas a realizaccedilatildeo da migraccedilatildeo aindaacontece lentamente devido agrave diversos fatores que precisam ser levados em consideraccedilatildeopara a manutenccedilatildeo do projeto

Para trabalhos e contribuiccedilotildees futuras seria interessante desenvolver uma ferramentaque pudesse analisar diretamente no coacutedigo-fonte as oportunidades de aplicaccedilatildeo de ex-pressotildees lambda dessa forma poderiam ser analisadas as porcentagens de conversatildeo decoacutedigo para Java 8 e obter melhores conclusotildees sobre a importacircncia que os projetos estatildeodando para a evoluccedilatildeo de seus coacutedigos Outro fator interessante seria aplicar mais Visitorsagrave ferramenta static-analysis e fazer este mesmo estudo aplicado agrave outras caracteriacutesticasda linguagem

47

Referecircncias

[1] Kagdi Huzefa Michael L Collard e Jonathan I Maletic A survey and taxonomyof approaches for mining software repositories in the context of software evolution2007 ix 3 8 9 10 11

[2] DBeaver Dbeaver - features httpdbeaverjkissorgdocsfeatures ix 29

[3] Eclipse Vertx commit Java8-ify code httpsgithubcomeclipsevertxcommit93f95e9c77419f442a42fe711b6eeaef88192fd3 ix 42

[4] Google Guava commit Release java 8 changes to guava httpsgithubcomgoogleguavacommit73e382fa877f80994817a136b0adcc4365ccd904 ix 43

[5] Google Agera commit Collapsed testapp with retrolambda httpsgithubcomgoogleageracommit5e518b7b05f9e7a34a314945f68deff7b2c3e334 ix 44

[6] ReactiveX Rxjava commit 2x full jdk 6 compatible backport + includ-ing bugfixes up to today httpsgithubcomReactiveXRxJavacommit000a174d87a901135f9665d3b11f3627fd2dc4ed ix 45

[7] Godfrey M W e D M German The past present and future of software evolutionEm 2008 Frontiers of Maintenance paacuteginas 129ndash138 Sept 2008 1 6

[8] Favre J M Languages evolve too changing the software time scale Em Principles ofSoftware Evolution Eighth International Workshop on paacuteginas 33ndash42 IEEE 20051 5 7

[9] Overbey Jeffrey L e Ralph E Johnson Regrowing a language refactoring tools allowprogramming languages to evolve Em ACM SIGPLAN Notices volume 44 paacuteginas493ndash502 ACM 2009 1 5 7 8 12

[10] Grechanik Mark Collin McMillan Luca DeFerrari Marco Comi Stefano CrespiDenys Poshyvanyk Chen Fu Qing Xie e Carlo Ghezzi An empirical investiga-tion into a large-scale java open source code repository Em Proceedings of the2010 ACM-IEEE International Symposium on Empirical Software Engineering andMeasurement ESEM rsquo10 paacuteginas 111ndash1110 New York NY USA 2010 ACMISBN 978-1-4503-0039-1 httpdoiacmorg10114518527861852801 1

[11] TIOBE Tiobe httpswwwtiobecomtiobe-index 1 14

48

[12] Gyori Alex Lyle Franklin Danny Dig e Jan Lahoda Crossing the gap from im-perative to functional programming through refactoring Em Proceedings of the 20139th Joint Meeting on Foundations of Software Engineering ESECFSE 2013 paacute-ginas 543ndash553 New York NY USA 2013 ACM ISBN 978-1-4503-2237-9 httpdoiacmorg10114524914112491461 2 11 24 39

[13] OpenJDK State of the lambda httpcropenjdkjavanet~briangoetzlambdalambda-state-4html 2

[14] Han Jiawei Micheline Kamber e Jian Pei Data Mining Concepts and TechniquesMorgan Kaufmann Publishers Inc San Francisco CA USA 3rd ediccedilatildeo 2011ISBN 0123814790 9780123814791 3

[15] Fowler Martin e Kent Beck Refactoring improving the design of existing codeAddison-Wesley Professional 1999 5 7

[16] Lehman M M J F Ramil P D Wernick D E Perry e W M Turski Met-rics and laws of software evolution - the nineties view Em Proceedings of the4th International Symposium on Software Metrics METRICS rsquo97 paacuteginas 20ndashWashington DC USA 1997 IEEE Computer Society ISBN 0-8186-8093-8 httpdlacmorgcitationcfmid=823454823901 6

[17] Hassan Ahmed E e Tao Xie Software intelligence The future of mining softwareengineering data Em Proceedings of the FSESDP Workshop on Future of SoftwareEngineering Research FoSER rsquo10 paacuteginas 161ndash166 New York NY USA 2010ACM ISBN 978-1-4503-0427-6 httpdoiacmorg101145188236218823978 9

[18] Hassan Ahmed E The road ahead for mining software repositories Em Frontiers ofSoftware Maintenance 2008 FoSM 2008 paacuteginas 48ndash57 IEEE 2008 8

[19] Berry Michael J e Gordon Linoff Data Mining Techniques For Marketing Salesand Customer Support John Wiley amp Sons Inc New York NY USA 1997ISBN 0471179809 10

[20] Parnin Chris Christian Bird e Emerson Murphy-Hill Java generics adoption hownew features are introduced championed or ignored Em Proceedings of the 8thWorking Conference on Mining Software Repositories paacuteginas 3ndash12 ACM 2011 12

[21] Oracle The java language specification httpsdocsoraclecomjavasespecsjlsse8jls8pdf 13

[22] Oracle The history of java technology httpwwworaclecomtechnetworkjavajavaseoverviewjavahistory-index-198355html 13

[23] Murphy Kieron So why did they decide to call itjava httpwwwjavaworldcomarticle2077265core-javaso-why-did-they-decide-to-call-it-java-html 13

[24] McGraw Tata Object-oriented Programming with Java Essentials and ApplicationsHill Education 13

49

[25] Oracle Differences between java ee and java se httpdocsoraclecomjavaee6firstcupdocgkhoyhtml 13

[26] Lindsey Clark S The History of Java Cambridge 14

[27] Oracle The java language environment httpwwworaclecomtechnetworkjavaintro-141325html 14

[28] Oracle Jdk 8 httpopenjdkjavanetprojectsjdk8 15 24

[29] Oracle Enhancements in java se 8 httpdocsoraclecomjavase8docstechnotesguideslanguageenhancementshtmljavase8 15 16 17

[30] Oracle Lambda expressions httpdocsoraclecomjavasetutorialjavajavaOOlambdaexpressionshtml 16 18 21

[31] Oracle Method references httpdocsoraclecomjavasetutorialjavajavaOOmethodreferenceshtml 16

[32] Oracle Default methods httpdocsoraclecomjavasetutorialjavaIandIdefaultmethodshtml 17

[33] Oracle Repeating annotations httpdocsoraclecomjavasetutorialjavaannotationsrepeatinghtml 17

[34] Oracle Type annotations httpdocsoraclecomjavasetutorialjavaannotationstype_annotationshtml 17

[35] Oracle Anonymous inner classes httpsdocsoraclecomjavasetutorialjavajavaOOanonymousclasseshtml 19

[36] Kothari CR Research Methodology Methods and Techniques New Age Interna-tional (P) Limited 2004 ISBN 9788122415223 httpsbooksgooglecombrbooksid=8c6gkbKi-F4C 22

[37] Nakakoji Kumiyo Yasuhiro Yamamoto Yoshiyuki Nishinaka Kouichi Kishida eYunwen Ye Evolution patterns of open-source software systems and communitiesEm IWPSE rsquo02 Proceedings of the International Workshop on Principles of SoftwareEvolution paacuteginas 76ndash85 New York NY USA 2002 ACM Press ISBN 1581135459httpdxdoiorg101145512035512055 23

[38] Rahman Foyzur Christian Bird e Premkumar Devanbu Clones What is that smellEmpirical Software Engineering 17(4-5)503ndash530 2012 24

[39] Chacon Scott Pro Git Apress Berkely CA USA 1st ediccedilatildeo 2009ISBN 1430218339 9781430218333 25

[40] Cavalcanti Thiago Gomes e Viniacutecius Correa de Almeida Caracterizaccedilatildeo do uso deconstruccedilotildees da linguagem java em projetos open-source Publicaccedilatildeo online 2016httpbdmunbbrhandle1048315733 27

50

[41] Parr Terence Language Implementation Patterns Create Your Own Domain-Specific and General Programming Languages Pragmatic Bookshelf 1st ediccedilatildeo 2009ISBN 193435645X 9781934356456 27

[42] Janssen Thorben 5 reasons to use jpa hibernate Publicaccedilatildeo online httpswwwsitepointcom5-reasons-to-use-jpa-hibernate 27

[43] Franklin Lyle Alex Gyori Jan Lahoda e Danny Dig Lambdaficator From imperativeto functional programming through automated refactoring Em Proceedings of the2013 International Conference on Software Engineering ICSE rsquo13 paacuteginas 1287ndash1290 Piscataway NJ USA 2013 IEEE Press ISBN 978-1-4673-3076-3 httpdlacmorgcitationcfmid=24867882486986 29

[44] Google Agera httpsgithubcomgoogleagerawiki 34

[45] Eclipse Eclipse vertx httpvertxio 35

[46] Cejas Fernando Android cleanarchitecture httpsgithubcomandroid10Android-CleanArchitecture 36

[47] ReactiveX Rxjava httpsgithubcomReactiveXRxJava 37

[48] Luontola Esko Retrolambda httpsgithubcomorfjackalretrolambda 43

51

Anexo I

Projetos utilizados

fastjson

platform_frameworks_base

netty

material-dialogs

kotlin

okhttp

tinker

AndroidUtilCode

RxJava

spring-boot

java-design-patterns

elasticsearch

ExoPlayer

kafka

vertx

realm-java

guava

zipkin

bazel

stetho

Signal-Android

glide

agera

fresco

plaid

presto

libgdx

spark

52

disruptor

lottie-android

flexbox-layout

PocketHub

zxing

spring-framework

deeplearning4j

dropwizard

interviews

BaseRecyclerViewAdapterHelper

uCrop

DanmakuFlameMaster

lottie-react-native

android-UniversalMusicPlayer

AndroidInterview-Q-A

greenDAO

retrofit

MaterialDrawer

BottomBar

druid

MPAndroidChart

Hystrix

guice

recyclerview-animators

dubbo

androidannotations

RxJava-Android-Samples

PhotoView

clojure

CircleImageView

AndroidSwipeLayout

jedis

MaterialViewPager

butterknife

junit4

RxBinding

leakcanary

SimianArmy

picasso

UltimateRecyclerView

53

AndroidViewAnimations

AppIntro

FizzBuzzEnterpriseEdition

ion

cheesesquare

physical-web

RxAndroid

Android-CleanArchitecture

Calligraphy

Android-Bootstrap

iosched

Android_Data

MaterialDesignLibrary

ListViewAnimations

EventBus

java8-tutorial

AndroidSlidingUpPanel

dagger

okhttputils

logger

HomeMirror

Material-Animations

android-Ultra-Pull-To-Refresh

android-async-http

Android-ObservableScrollView

Android-Universal-Image-Loader

ActionBarSherlock

SlidingMenu

storm

PagerSlidingTabStrip

Android-PullToRefresh

54

  • Dedicatoacuteria
  • Agradecimentos
  • Resumo
  • Abstract
  • Introduccedilatildeo
    • Contexto
    • Objetivos
      • Objetivos Gerais
      • Objetivos Especiacuteficos
        • Metodologia
        • Organizaccedilatildeo do Trabalho
          • Evoluccedilatildeo e Mineraccedilatildeo de Repositoacuterios de Software
            • Evoluccedilatildeo de Software
            • MSR Mineraccedilatildeo de dados e a Engenharia de Software
              • Classificaccedilatildeo
                • Trabalhos Relacionados
                  • Java SE 8 e JDK 8
                    • Histoacuterico
                    • Princiacutepios
                    • Evoluccedilatildeo
                    • Expressotildees Lambda
                      • Sintaxe
                      • Principais formas de uso
                          • Estudo e o Processo de Mineraccedilatildeo
                            • Questotildees de Pesquisa
                            • Fonte de Dados e Objetos de Estudo
                            • Processo de Mineraccedilatildeo
                              • static-analysis
                              • BDAnalisador
                                • Classificaccedilatildeo e Anaacutelise
                                  • Meacutedia de Lambda
                                  • Anaacutelise Temporal
                                  • Refatoraccedilatildeo de Coacutedigo
                                  • Casos de Uso
                                      • Resultados Obtidos e Anaacutelise
                                        • Visatildeo Geral
                                          • Projetos Selecionados
                                          • agera
                                          • vertx
                                          • Android-CleanArchitecture
                                          • RxJava
                                          • guava
                                            • Refatoraccedilatildeo de Coacutedigo
                                            • Estudos de Caso
                                              • Consideraccedilotildees Finais
                                              • Referecircncias
                                              • Anexo
                                              • Projetos utilizados

Figura 54 Graacuteficos de anaacutelise temporal do projeto Android-CleanArchitecture

515 RxJava

Dentre os repositoacuterios estudados RxJava eacute considerado o mais popular Como umaimplementaccedilatildeo de Reactive Extensions para a JVM RxJava teve seu lanccedilamento dadoem 2013 [47] Expressotildees lambda apareceram pela primeira vez no ano de 2015 comuma meacutedia de 766 lambdasnapshot

Apesar de uma meacutedia relativamente alta o tempo de vida das expressotildees lambda nesteprojeto foi bem curto caracterizando assim projetos do grupo 4 houve a introduccedilatildeo dasexpressotildees lambda no projeto poreacutem houve a remoccedilatildeo completa de todas as expressotildeeslambda previamente introduzidas desaparecendo completamente do projeto ateacute a datada coleta de dados (Figura 55)

37

Figura 55 Graacuteficos de anaacutelise temporal do projeto RxJava

516 guava

Guava eacute um conjunto de bibliotecas para Java da Google lanccedilado em 2011 A atualizaccedilatildeodo coacutedigo do projeto para Java 8 aconteceu somente em 2016 e apesar do projeto conteruma meacutedia de 281 lambdasnapshot ele foi escolhido como representante dos projetosdo Grupo 5 (Figura 56) que possuem expressotildees lambda mas de forma natildeo expressiva osuficiente quando comparado com a quantidade de AIC pelo fato de sua razatildeo de meacutedia delambdasnapshot por meacutedia de AICsnapshot ser 004 Ou seja embora o projeto tenhaexpressotildees lambda estas satildeo consideradas muito poucas quando inseridas no contextogeral deste projeto que eacute considerado um projeto grande

38

Figura 56 Graacuteficos de anaacutelise temporal do projeto Guava

52 Refatoraccedilatildeo de Coacutedigo

Com o objetivo de caracterizar melhor como as expressotildees lambda estatildeo sendo utilizadaseacute interessante identificar se estas estatildeo sendo introduzidas atraveacutes de refatoraccedilatildeo de coacutedigoou em coacutedigo novo

Os projetos classificados como pertencentes ao Grupo 2 possuem em comum o fatode expressotildees lambda aumentarem a medida que AICs diminuem ultrapassando-as eessa caracteriacutestica em comum pode indicar que nestes projetos possivelmente houve re-fatoraccedilatildeo de coacutedigo visto que AIC sendo substituiacutedo por expressotildees lambda dentro dascondiccedilotildees determinadas eacute a maneira mais comum de se identificar refatoraccedilatildeo de coacute-digo para introduccedilatildeo de expressotildees lambda [12] Os projetos que compotildeem o grupo 2representam 44 de todos os projetos estudados que possuem expressotildees lambda o quepode ser um indicativo caso a hipoacutetese de refatoraccedilatildeo de coacutedigo seja positiva de quemuitos projetos que estatildeo adotando o Java 8 estatildeo se preocupando de alguma formacom refatoraccedilatildeo se coacutedigo Fazem parte desse grupo os seguintes projetos elasticsearchjava-design-patterns PocketHub presto RxJava-Android-Samples spark vertx zipkinjava8-tutorial dropwizard e material-dialogs

39

Outra maneira de verificar possiacuteveis indicadores de refatoraccedilatildeo de coacutedigo foi atraveacutesda anaacutelise dos tamanhos (em quantidade de linhas de coacutedigo) dos meacutetodos com expressotildeeslambda no mecircs em que se introduziu expressotildees lambda e um mecircs imediatamente antesdeste Essa anaacutelise mostra que dos 25 projetos com expressotildees lambda 12 (48) projetostiveram ao menos um meacutetodo em que houve uma diminuiccedilatildeo no tamanho o que podeser considerado um indicativo de refatoraccedilatildeo de coacutedigo A Figura 57 mostra todos osprojetos em relaccedilatildeo agrave quantidade total de meacutetodos que possuem lambda no primeiro mecircsde introduccedilatildeo do mesmo em vermelho comparado com a quantidade desses meacutetodos quetiveram uma diminuiccedilatildeo no tamanho quando comparados com o coacutedigo do mecircs anteriorem azul

Figura 57 Comparaccedilatildeo entre todos os projetos com expressatildeo lambda sobre refatoraccedilatildeode coacutedigo no mecircs de introduccedilatildeo da caracteriacutestica

Ainda observando a figura 57 com relaccedilatildeo aos projetos que natildeo tiveram nenhummeacutetodo com diminuiccedilatildeo de tamanho (barra azul) percebe-se que todos os 13 projetossequer tiveram uma quantidade significativa de meacutetodos que possuem expressotildees lambda(com o maior tendo apenas 5 meacutetodos) no mecircs de introduccedilatildeo da caracteriacutestica no projetoe ao mesmo tempo jaacute existiam no mecircs em que natildeo existia lambda no projeto Essa eacuteuma observaccedilatildeo importante porque projetos como vertx sendo este o que possui a maiormeacutedia de lambdasnapshot de todos os projetos e ao mesmo tempo tendo apenas trecircsmeacutetodos que continham expressotildees lambda no mecircs da introduccedilatildeo e que existiam no mecircs

40

anterior permitem inferir que todas as outras expressotildees lambda existentes no projetopara este determinado mecircs de introduccedilatildeo encontram-se em coacutedigo novo introduzido

Eacute importante ressaltar que somente essa anaacutelise natildeo eacute exclusivamente suficiente paradeterminar se estes projetos estatildeo realmente introduzindo lambda em coacutedigo novo ourealizando refatoraccedilatildeo uma vez que como a comparaccedilatildeo aconteceu apenas no mecircs deintroduccedilatildeo com o mecircs imediatamente anterior natildeo reflete todo o ciclo de vida do pro-jeto Por exemplo algumas equipes podem escolher refatorar o coacutedigo depois de umtempo de adaptaccedilatildeo apoacutes a transiccedilatildeo para a nova versatildeo da linguagem Assim paraobter uma melhor anaacutelise sobre refatoraccedilatildeo de coacutedigo ou natildeo feita nestes projetos aleacutemde outras anaacutelises referentes aos padrotildees tipicamente adotados para implementaccedilatildeo delambda nestes projetos seratildeo apresentados a seguir os estudos de caso dos cinco projetospreviamente selecionados

Outro ponto importante eacute o fato de que apesar das informaccedilotildees quanto agraves quantida-des de filter e map terem sido incluiacutedas inicialmente no trabalho para observar possiacuteveispadrotildees de refatoraccedilatildeo de coacutedigo percebeu-se que estas natildeo satildeo utilizadas de forma con-sideraacutevel pelos projetos estudados e para fins de anaacutelises generalizadas natildeo apresentaramtanta influecircncia na utilizaccedilatildeo de expressotildees lambda quanto a quantidade de AICs noprojeto

53 Estudos de Caso

Dentre os projetos analisados verificou-se que os projetos de pequeno e meacutedio porte op-taram por refatorar de uma vez seus coacutedigos para incluir expressotildees lambda em situaccedilotildeesem que se utilizava AICs anteriormente ou em alguns poucos casos de utilizaccedilatildeo deCollection Os projetos de grande porte natildeo apresentaram nenhuma refatoraccedilatildeo de coacute-digo ou uma refatoraccedilatildeo parcial gradativa provavelmente devido agrave grande quantidade dearquivos e coacutedigo que possuem o que pode tornar o trabalho de refatoraccedilatildeo extenso ecansativo

O projeto vertx que pertence ao grupo 2 dos projetos em que a quantidade de ex-pressotildees lambda aumentaram e as de AICs diminuiacuteram com lambda ultrapassando AICsexecutou inicialmente commits em maio de 2014 com adiccedilatildeo de coacutedigo novo utilizandoexpressotildees lambda e apoacutes um mecircs realizou um commit maior com a refatoraccedilatildeo de todasas AICs para expressotildees lambda Apoacutes a refatoraccedilatildeo o projeto se preocupou em mantera utilizaccedilatildeo de expressotildees lambda ao mesmo tempo que o uso de AICs se manteve apenasaos casos de classes com interfaces natildeo funcionais A Figura 58 apresenta uma parte docommit de refatoraccedilatildeo de coacutedigo que mostra em vermelho a parte eliminada do coacutedigo(AIC) e em verde o coacutedigo novo representando a substituiccedilatildeo por uma expressatildeo lambda

41

Figura 58 Commit de refatoraccedilatildeo de coacutedigo do projeto Vertx [3]

Alguns projetos ainda natildeo se preocuparam em refatorar o coacutedigo para o uso de ex-pressotildees lambda ateacute a data deste trabalho que eacute o caso do projeto guava que apresentouum commit em 03112016 com a atualizaccedilatildeo do projeto para Java 8 Mas a partir daatualizaccedilatildeo se preocupou em utilizar as expressotildees lambda apenas na implementaccedilatildeo decoacutedigo novo O cenaacuterio em que a refatoraccedilatildeo natildeo eacute prioridade ainda eacute a realidade de vaacuteriosprojetos de grande porte visto que os dados de projetos sem nenhuma expressatildeo lambdasatildeo o maior nuacutemero neste trabalho Poreacutem projetos que jaacute adotaram a utilizaccedilatildeo do Java8 tendem a mudar isso com o passar do tempo A Figura 59 apresenta em verde umaadiccedilatildeo de coacutedigo novo com expressatildeo lambda sem a eliminaccedilatildeo de algum coacutedigo anteriora esse que estaria em vermelho

42

Figura 59 Exemplo de um arquivo do commit de adiccedilatildeo de coacutedigo novo em Java 8 doprojeto Guava [4]

Na categoria de projetos em que os AICs e expressotildees lambda aumentam proporci-onalmente (grupo 1) o projeto agera realizou um commit em 19052016 com a adiccedilatildeoda biblioteca retrolambda como dependecircncia do projeto Essa biblioteca utilizada prin-cipalmente por projetos Android permite executar coacutedigo Java 8 contendo expressotildeeslambda em Java 5 6 e 7 [48] O commit tambeacutem apresenta refatoraccedilatildeo dos AICs ad-vindos de interfaces funcionais para expressotildees lambda Apesar de o projeto continuar autilizar as expressotildees lambda em seus commits posteriores o nuacutemero de AICs tambeacutemcontinuou a aumentar visualizando os commits posteriores notou-se que esses AICs satildeorelativos a interfaces natildeo funcionais ou seja que possuem mais de um meacutetodo O projetoAndroid-CleanArchitecture eacute similar ao agera pois tambeacutem optou pela instalaccedilatildeo da bi-blioteca retrolambda para uso de expressotildees lambda em seus coacutedigos e como tambeacutem eacuteum projeto de pequeno porte houve uma pequena refatoraccedilatildeo dos AICs A Figura 510mostra a parte do commit de refatoraccedilatildeo de coacutedigo em que o desenvolvedor adiciona abiblioteca retrolambda como dependecircncia

43

Figura 510 Commit de adiccedilatildeo da biblioteca Retrolambda no projeto Agera [5]

Outro caso interessante eacute o do projeto RxJava que em 2015 optou pela refatoraccedilatildeodo coacutedigo para a utilizaccedilatildeo de expressotildees lambda quase eliminando por completo o usode AICs mas que no ano seguinte reverteu os commits de forma que eliminasse comple-tamente o uso de expressotildees lambda para manter a retrocompatibilidade com o Java 6A Figura 511 demonstra uma parte do commit de reversatildeo do coacutedigo para Java 6 emque pode ser visto em vermelho o coacutedigo anterior com expressotildees lambda e o verde como novo coacutedigo utilizando AIC novamente

44

Figura 511 Commit de remoccedilatildeo de Lambdas e volta para o uso de AICs no projetoRXJava [6]

Essa preocupaccedilatildeo com retrocompatibilidade de coacutedigo pode ser um fator crucial nadecisatildeo das equipes de desenvolvimento na hora de decidir como fazer o software co-evoluircom a linguagem sem perder a compatibilidade com versotildees anteriores

45

Capiacutetulo 6

Consideraccedilotildees Finais

Este estudo permitiu entender melhor como projetos estatildeo realizando a migraccedilatildeo para oJava 8 em especial utilizando uma nova caracteriacutestica introduzida expressatildeo lambdaApesar de a maioria dos projetos populares considerados natildeo possuiacuterem nenhuma ocor-recircncia de expressotildees lambda os projetos que tinham expressotildees lambda foram suficientespara realizar um primeiro estudo de caracterizaccedilatildeo no uso desta caracteriacutestica e com osprojetos efetivamente utilizados para estudo foi possiacutevel agrupaacute-los quanto a maneira emque as expressotildees lambda estavam sendo utilizadas quando comparadas com AICs em 5grandes grupos quando AIC e lambda aumentam proporcionalmente quando AIC dimi-nui e lambda aumenta ultrapassando AIC quando AIC diminui mas continua superior aolambda crescente expressotildees lambda que foram introduzidas e retiradas completamentedo coacutedigo e expressotildees lambda que natildeo existem em quantidades expressivas

Foi possiacutevel entatildeo realizar um estudo aprofundado levando em consideraccedilatildeo as di-ferentes maneiras com que as expressotildees lambda foram adotadas nos projetos atraveacutes daescolha de um projeto que representasse cada grupo para anaacutelise Dentre os cinco projetosestudados foi possiacutevel observar alguns padrotildees tipicamente adotados por desenvolvedorespara implementar expressotildees lambda em seus projetos como a utilizaccedilatildeo da bibliotecas(retrolambda) que permitissem uma flexibilizaccedilatildeo na utilizaccedilatildeo de expressotildees lambda oucomo lambda eacute primariamente utilizada para substituir determinados AICs ou operaccedilotildeesem Collection

Aleacutem disso foi possiacutevel observar como a refatoraccedilatildeo de coacutedigo acontece em cada umdesses projetos Observou-se como projetos menores tendem a refatorar coacutedigo maisfacilmente ao passo que projetos maiores e mais complexos fazem menos refatoraccedilatildeo oudemoram mais entre o periacuteodo em que houve a primeira migraccedilatildeo de coacutedigo para a novaversatildeo da linguagem ateacute o periacuteodo em que realmente decidem refatorar coacutedigo Aleacutem dacomplexidade do projeto influenciar na decisatildeo de migrar o projeto para uma versatildeo maisrecente da linguagem a preocupaccedilatildeo com retrocompatibilidade com versotildees anteriores da

46

linguagem tambeacutem podem ser uma barreira para que projetos comecem a evoluir o coacutedigojuntamente com a evoluccedilatildeo da linguagem

Ainda assim foi possiacutevel observar que a preocupaccedilatildeo com a co-evoluccedilatildeo do software-linguagem existe entre os desenvolvedores de projetos mas a realizaccedilatildeo da migraccedilatildeo aindaacontece lentamente devido agrave diversos fatores que precisam ser levados em consideraccedilatildeopara a manutenccedilatildeo do projeto

Para trabalhos e contribuiccedilotildees futuras seria interessante desenvolver uma ferramentaque pudesse analisar diretamente no coacutedigo-fonte as oportunidades de aplicaccedilatildeo de ex-pressotildees lambda dessa forma poderiam ser analisadas as porcentagens de conversatildeo decoacutedigo para Java 8 e obter melhores conclusotildees sobre a importacircncia que os projetos estatildeodando para a evoluccedilatildeo de seus coacutedigos Outro fator interessante seria aplicar mais Visitorsagrave ferramenta static-analysis e fazer este mesmo estudo aplicado agrave outras caracteriacutesticasda linguagem

47

Referecircncias

[1] Kagdi Huzefa Michael L Collard e Jonathan I Maletic A survey and taxonomyof approaches for mining software repositories in the context of software evolution2007 ix 3 8 9 10 11

[2] DBeaver Dbeaver - features httpdbeaverjkissorgdocsfeatures ix 29

[3] Eclipse Vertx commit Java8-ify code httpsgithubcomeclipsevertxcommit93f95e9c77419f442a42fe711b6eeaef88192fd3 ix 42

[4] Google Guava commit Release java 8 changes to guava httpsgithubcomgoogleguavacommit73e382fa877f80994817a136b0adcc4365ccd904 ix 43

[5] Google Agera commit Collapsed testapp with retrolambda httpsgithubcomgoogleageracommit5e518b7b05f9e7a34a314945f68deff7b2c3e334 ix 44

[6] ReactiveX Rxjava commit 2x full jdk 6 compatible backport + includ-ing bugfixes up to today httpsgithubcomReactiveXRxJavacommit000a174d87a901135f9665d3b11f3627fd2dc4ed ix 45

[7] Godfrey M W e D M German The past present and future of software evolutionEm 2008 Frontiers of Maintenance paacuteginas 129ndash138 Sept 2008 1 6

[8] Favre J M Languages evolve too changing the software time scale Em Principles ofSoftware Evolution Eighth International Workshop on paacuteginas 33ndash42 IEEE 20051 5 7

[9] Overbey Jeffrey L e Ralph E Johnson Regrowing a language refactoring tools allowprogramming languages to evolve Em ACM SIGPLAN Notices volume 44 paacuteginas493ndash502 ACM 2009 1 5 7 8 12

[10] Grechanik Mark Collin McMillan Luca DeFerrari Marco Comi Stefano CrespiDenys Poshyvanyk Chen Fu Qing Xie e Carlo Ghezzi An empirical investiga-tion into a large-scale java open source code repository Em Proceedings of the2010 ACM-IEEE International Symposium on Empirical Software Engineering andMeasurement ESEM rsquo10 paacuteginas 111ndash1110 New York NY USA 2010 ACMISBN 978-1-4503-0039-1 httpdoiacmorg10114518527861852801 1

[11] TIOBE Tiobe httpswwwtiobecomtiobe-index 1 14

48

[12] Gyori Alex Lyle Franklin Danny Dig e Jan Lahoda Crossing the gap from im-perative to functional programming through refactoring Em Proceedings of the 20139th Joint Meeting on Foundations of Software Engineering ESECFSE 2013 paacute-ginas 543ndash553 New York NY USA 2013 ACM ISBN 978-1-4503-2237-9 httpdoiacmorg10114524914112491461 2 11 24 39

[13] OpenJDK State of the lambda httpcropenjdkjavanet~briangoetzlambdalambda-state-4html 2

[14] Han Jiawei Micheline Kamber e Jian Pei Data Mining Concepts and TechniquesMorgan Kaufmann Publishers Inc San Francisco CA USA 3rd ediccedilatildeo 2011ISBN 0123814790 9780123814791 3

[15] Fowler Martin e Kent Beck Refactoring improving the design of existing codeAddison-Wesley Professional 1999 5 7

[16] Lehman M M J F Ramil P D Wernick D E Perry e W M Turski Met-rics and laws of software evolution - the nineties view Em Proceedings of the4th International Symposium on Software Metrics METRICS rsquo97 paacuteginas 20ndashWashington DC USA 1997 IEEE Computer Society ISBN 0-8186-8093-8 httpdlacmorgcitationcfmid=823454823901 6

[17] Hassan Ahmed E e Tao Xie Software intelligence The future of mining softwareengineering data Em Proceedings of the FSESDP Workshop on Future of SoftwareEngineering Research FoSER rsquo10 paacuteginas 161ndash166 New York NY USA 2010ACM ISBN 978-1-4503-0427-6 httpdoiacmorg101145188236218823978 9

[18] Hassan Ahmed E The road ahead for mining software repositories Em Frontiers ofSoftware Maintenance 2008 FoSM 2008 paacuteginas 48ndash57 IEEE 2008 8

[19] Berry Michael J e Gordon Linoff Data Mining Techniques For Marketing Salesand Customer Support John Wiley amp Sons Inc New York NY USA 1997ISBN 0471179809 10

[20] Parnin Chris Christian Bird e Emerson Murphy-Hill Java generics adoption hownew features are introduced championed or ignored Em Proceedings of the 8thWorking Conference on Mining Software Repositories paacuteginas 3ndash12 ACM 2011 12

[21] Oracle The java language specification httpsdocsoraclecomjavasespecsjlsse8jls8pdf 13

[22] Oracle The history of java technology httpwwworaclecomtechnetworkjavajavaseoverviewjavahistory-index-198355html 13

[23] Murphy Kieron So why did they decide to call itjava httpwwwjavaworldcomarticle2077265core-javaso-why-did-they-decide-to-call-it-java-html 13

[24] McGraw Tata Object-oriented Programming with Java Essentials and ApplicationsHill Education 13

49

[25] Oracle Differences between java ee and java se httpdocsoraclecomjavaee6firstcupdocgkhoyhtml 13

[26] Lindsey Clark S The History of Java Cambridge 14

[27] Oracle The java language environment httpwwworaclecomtechnetworkjavaintro-141325html 14

[28] Oracle Jdk 8 httpopenjdkjavanetprojectsjdk8 15 24

[29] Oracle Enhancements in java se 8 httpdocsoraclecomjavase8docstechnotesguideslanguageenhancementshtmljavase8 15 16 17

[30] Oracle Lambda expressions httpdocsoraclecomjavasetutorialjavajavaOOlambdaexpressionshtml 16 18 21

[31] Oracle Method references httpdocsoraclecomjavasetutorialjavajavaOOmethodreferenceshtml 16

[32] Oracle Default methods httpdocsoraclecomjavasetutorialjavaIandIdefaultmethodshtml 17

[33] Oracle Repeating annotations httpdocsoraclecomjavasetutorialjavaannotationsrepeatinghtml 17

[34] Oracle Type annotations httpdocsoraclecomjavasetutorialjavaannotationstype_annotationshtml 17

[35] Oracle Anonymous inner classes httpsdocsoraclecomjavasetutorialjavajavaOOanonymousclasseshtml 19

[36] Kothari CR Research Methodology Methods and Techniques New Age Interna-tional (P) Limited 2004 ISBN 9788122415223 httpsbooksgooglecombrbooksid=8c6gkbKi-F4C 22

[37] Nakakoji Kumiyo Yasuhiro Yamamoto Yoshiyuki Nishinaka Kouichi Kishida eYunwen Ye Evolution patterns of open-source software systems and communitiesEm IWPSE rsquo02 Proceedings of the International Workshop on Principles of SoftwareEvolution paacuteginas 76ndash85 New York NY USA 2002 ACM Press ISBN 1581135459httpdxdoiorg101145512035512055 23

[38] Rahman Foyzur Christian Bird e Premkumar Devanbu Clones What is that smellEmpirical Software Engineering 17(4-5)503ndash530 2012 24

[39] Chacon Scott Pro Git Apress Berkely CA USA 1st ediccedilatildeo 2009ISBN 1430218339 9781430218333 25

[40] Cavalcanti Thiago Gomes e Viniacutecius Correa de Almeida Caracterizaccedilatildeo do uso deconstruccedilotildees da linguagem java em projetos open-source Publicaccedilatildeo online 2016httpbdmunbbrhandle1048315733 27

50

[41] Parr Terence Language Implementation Patterns Create Your Own Domain-Specific and General Programming Languages Pragmatic Bookshelf 1st ediccedilatildeo 2009ISBN 193435645X 9781934356456 27

[42] Janssen Thorben 5 reasons to use jpa hibernate Publicaccedilatildeo online httpswwwsitepointcom5-reasons-to-use-jpa-hibernate 27

[43] Franklin Lyle Alex Gyori Jan Lahoda e Danny Dig Lambdaficator From imperativeto functional programming through automated refactoring Em Proceedings of the2013 International Conference on Software Engineering ICSE rsquo13 paacuteginas 1287ndash1290 Piscataway NJ USA 2013 IEEE Press ISBN 978-1-4673-3076-3 httpdlacmorgcitationcfmid=24867882486986 29

[44] Google Agera httpsgithubcomgoogleagerawiki 34

[45] Eclipse Eclipse vertx httpvertxio 35

[46] Cejas Fernando Android cleanarchitecture httpsgithubcomandroid10Android-CleanArchitecture 36

[47] ReactiveX Rxjava httpsgithubcomReactiveXRxJava 37

[48] Luontola Esko Retrolambda httpsgithubcomorfjackalretrolambda 43

51

Anexo I

Projetos utilizados

fastjson

platform_frameworks_base

netty

material-dialogs

kotlin

okhttp

tinker

AndroidUtilCode

RxJava

spring-boot

java-design-patterns

elasticsearch

ExoPlayer

kafka

vertx

realm-java

guava

zipkin

bazel

stetho

Signal-Android

glide

agera

fresco

plaid

presto

libgdx

spark

52

disruptor

lottie-android

flexbox-layout

PocketHub

zxing

spring-framework

deeplearning4j

dropwizard

interviews

BaseRecyclerViewAdapterHelper

uCrop

DanmakuFlameMaster

lottie-react-native

android-UniversalMusicPlayer

AndroidInterview-Q-A

greenDAO

retrofit

MaterialDrawer

BottomBar

druid

MPAndroidChart

Hystrix

guice

recyclerview-animators

dubbo

androidannotations

RxJava-Android-Samples

PhotoView

clojure

CircleImageView

AndroidSwipeLayout

jedis

MaterialViewPager

butterknife

junit4

RxBinding

leakcanary

SimianArmy

picasso

UltimateRecyclerView

53

AndroidViewAnimations

AppIntro

FizzBuzzEnterpriseEdition

ion

cheesesquare

physical-web

RxAndroid

Android-CleanArchitecture

Calligraphy

Android-Bootstrap

iosched

Android_Data

MaterialDesignLibrary

ListViewAnimations

EventBus

java8-tutorial

AndroidSlidingUpPanel

dagger

okhttputils

logger

HomeMirror

Material-Animations

android-Ultra-Pull-To-Refresh

android-async-http

Android-ObservableScrollView

Android-Universal-Image-Loader

ActionBarSherlock

SlidingMenu

storm

PagerSlidingTabStrip

Android-PullToRefresh

54

  • Dedicatoacuteria
  • Agradecimentos
  • Resumo
  • Abstract
  • Introduccedilatildeo
    • Contexto
    • Objetivos
      • Objetivos Gerais
      • Objetivos Especiacuteficos
        • Metodologia
        • Organizaccedilatildeo do Trabalho
          • Evoluccedilatildeo e Mineraccedilatildeo de Repositoacuterios de Software
            • Evoluccedilatildeo de Software
            • MSR Mineraccedilatildeo de dados e a Engenharia de Software
              • Classificaccedilatildeo
                • Trabalhos Relacionados
                  • Java SE 8 e JDK 8
                    • Histoacuterico
                    • Princiacutepios
                    • Evoluccedilatildeo
                    • Expressotildees Lambda
                      • Sintaxe
                      • Principais formas de uso
                          • Estudo e o Processo de Mineraccedilatildeo
                            • Questotildees de Pesquisa
                            • Fonte de Dados e Objetos de Estudo
                            • Processo de Mineraccedilatildeo
                              • static-analysis
                              • BDAnalisador
                                • Classificaccedilatildeo e Anaacutelise
                                  • Meacutedia de Lambda
                                  • Anaacutelise Temporal
                                  • Refatoraccedilatildeo de Coacutedigo
                                  • Casos de Uso
                                      • Resultados Obtidos e Anaacutelise
                                        • Visatildeo Geral
                                          • Projetos Selecionados
                                          • agera
                                          • vertx
                                          • Android-CleanArchitecture
                                          • RxJava
                                          • guava
                                            • Refatoraccedilatildeo de Coacutedigo
                                            • Estudos de Caso
                                              • Consideraccedilotildees Finais
                                              • Referecircncias
                                              • Anexo
                                              • Projetos utilizados

Figura 55 Graacuteficos de anaacutelise temporal do projeto RxJava

516 guava

Guava eacute um conjunto de bibliotecas para Java da Google lanccedilado em 2011 A atualizaccedilatildeodo coacutedigo do projeto para Java 8 aconteceu somente em 2016 e apesar do projeto conteruma meacutedia de 281 lambdasnapshot ele foi escolhido como representante dos projetosdo Grupo 5 (Figura 56) que possuem expressotildees lambda mas de forma natildeo expressiva osuficiente quando comparado com a quantidade de AIC pelo fato de sua razatildeo de meacutedia delambdasnapshot por meacutedia de AICsnapshot ser 004 Ou seja embora o projeto tenhaexpressotildees lambda estas satildeo consideradas muito poucas quando inseridas no contextogeral deste projeto que eacute considerado um projeto grande

38

Figura 56 Graacuteficos de anaacutelise temporal do projeto Guava

52 Refatoraccedilatildeo de Coacutedigo

Com o objetivo de caracterizar melhor como as expressotildees lambda estatildeo sendo utilizadaseacute interessante identificar se estas estatildeo sendo introduzidas atraveacutes de refatoraccedilatildeo de coacutedigoou em coacutedigo novo

Os projetos classificados como pertencentes ao Grupo 2 possuem em comum o fatode expressotildees lambda aumentarem a medida que AICs diminuem ultrapassando-as eessa caracteriacutestica em comum pode indicar que nestes projetos possivelmente houve re-fatoraccedilatildeo de coacutedigo visto que AIC sendo substituiacutedo por expressotildees lambda dentro dascondiccedilotildees determinadas eacute a maneira mais comum de se identificar refatoraccedilatildeo de coacute-digo para introduccedilatildeo de expressotildees lambda [12] Os projetos que compotildeem o grupo 2representam 44 de todos os projetos estudados que possuem expressotildees lambda o quepode ser um indicativo caso a hipoacutetese de refatoraccedilatildeo de coacutedigo seja positiva de quemuitos projetos que estatildeo adotando o Java 8 estatildeo se preocupando de alguma formacom refatoraccedilatildeo se coacutedigo Fazem parte desse grupo os seguintes projetos elasticsearchjava-design-patterns PocketHub presto RxJava-Android-Samples spark vertx zipkinjava8-tutorial dropwizard e material-dialogs

39

Outra maneira de verificar possiacuteveis indicadores de refatoraccedilatildeo de coacutedigo foi atraveacutesda anaacutelise dos tamanhos (em quantidade de linhas de coacutedigo) dos meacutetodos com expressotildeeslambda no mecircs em que se introduziu expressotildees lambda e um mecircs imediatamente antesdeste Essa anaacutelise mostra que dos 25 projetos com expressotildees lambda 12 (48) projetostiveram ao menos um meacutetodo em que houve uma diminuiccedilatildeo no tamanho o que podeser considerado um indicativo de refatoraccedilatildeo de coacutedigo A Figura 57 mostra todos osprojetos em relaccedilatildeo agrave quantidade total de meacutetodos que possuem lambda no primeiro mecircsde introduccedilatildeo do mesmo em vermelho comparado com a quantidade desses meacutetodos quetiveram uma diminuiccedilatildeo no tamanho quando comparados com o coacutedigo do mecircs anteriorem azul

Figura 57 Comparaccedilatildeo entre todos os projetos com expressatildeo lambda sobre refatoraccedilatildeode coacutedigo no mecircs de introduccedilatildeo da caracteriacutestica

Ainda observando a figura 57 com relaccedilatildeo aos projetos que natildeo tiveram nenhummeacutetodo com diminuiccedilatildeo de tamanho (barra azul) percebe-se que todos os 13 projetossequer tiveram uma quantidade significativa de meacutetodos que possuem expressotildees lambda(com o maior tendo apenas 5 meacutetodos) no mecircs de introduccedilatildeo da caracteriacutestica no projetoe ao mesmo tempo jaacute existiam no mecircs em que natildeo existia lambda no projeto Essa eacuteuma observaccedilatildeo importante porque projetos como vertx sendo este o que possui a maiormeacutedia de lambdasnapshot de todos os projetos e ao mesmo tempo tendo apenas trecircsmeacutetodos que continham expressotildees lambda no mecircs da introduccedilatildeo e que existiam no mecircs

40

anterior permitem inferir que todas as outras expressotildees lambda existentes no projetopara este determinado mecircs de introduccedilatildeo encontram-se em coacutedigo novo introduzido

Eacute importante ressaltar que somente essa anaacutelise natildeo eacute exclusivamente suficiente paradeterminar se estes projetos estatildeo realmente introduzindo lambda em coacutedigo novo ourealizando refatoraccedilatildeo uma vez que como a comparaccedilatildeo aconteceu apenas no mecircs deintroduccedilatildeo com o mecircs imediatamente anterior natildeo reflete todo o ciclo de vida do pro-jeto Por exemplo algumas equipes podem escolher refatorar o coacutedigo depois de umtempo de adaptaccedilatildeo apoacutes a transiccedilatildeo para a nova versatildeo da linguagem Assim paraobter uma melhor anaacutelise sobre refatoraccedilatildeo de coacutedigo ou natildeo feita nestes projetos aleacutemde outras anaacutelises referentes aos padrotildees tipicamente adotados para implementaccedilatildeo delambda nestes projetos seratildeo apresentados a seguir os estudos de caso dos cinco projetospreviamente selecionados

Outro ponto importante eacute o fato de que apesar das informaccedilotildees quanto agraves quantida-des de filter e map terem sido incluiacutedas inicialmente no trabalho para observar possiacuteveispadrotildees de refatoraccedilatildeo de coacutedigo percebeu-se que estas natildeo satildeo utilizadas de forma con-sideraacutevel pelos projetos estudados e para fins de anaacutelises generalizadas natildeo apresentaramtanta influecircncia na utilizaccedilatildeo de expressotildees lambda quanto a quantidade de AICs noprojeto

53 Estudos de Caso

Dentre os projetos analisados verificou-se que os projetos de pequeno e meacutedio porte op-taram por refatorar de uma vez seus coacutedigos para incluir expressotildees lambda em situaccedilotildeesem que se utilizava AICs anteriormente ou em alguns poucos casos de utilizaccedilatildeo deCollection Os projetos de grande porte natildeo apresentaram nenhuma refatoraccedilatildeo de coacute-digo ou uma refatoraccedilatildeo parcial gradativa provavelmente devido agrave grande quantidade dearquivos e coacutedigo que possuem o que pode tornar o trabalho de refatoraccedilatildeo extenso ecansativo

O projeto vertx que pertence ao grupo 2 dos projetos em que a quantidade de ex-pressotildees lambda aumentaram e as de AICs diminuiacuteram com lambda ultrapassando AICsexecutou inicialmente commits em maio de 2014 com adiccedilatildeo de coacutedigo novo utilizandoexpressotildees lambda e apoacutes um mecircs realizou um commit maior com a refatoraccedilatildeo de todasas AICs para expressotildees lambda Apoacutes a refatoraccedilatildeo o projeto se preocupou em mantera utilizaccedilatildeo de expressotildees lambda ao mesmo tempo que o uso de AICs se manteve apenasaos casos de classes com interfaces natildeo funcionais A Figura 58 apresenta uma parte docommit de refatoraccedilatildeo de coacutedigo que mostra em vermelho a parte eliminada do coacutedigo(AIC) e em verde o coacutedigo novo representando a substituiccedilatildeo por uma expressatildeo lambda

41

Figura 58 Commit de refatoraccedilatildeo de coacutedigo do projeto Vertx [3]

Alguns projetos ainda natildeo se preocuparam em refatorar o coacutedigo para o uso de ex-pressotildees lambda ateacute a data deste trabalho que eacute o caso do projeto guava que apresentouum commit em 03112016 com a atualizaccedilatildeo do projeto para Java 8 Mas a partir daatualizaccedilatildeo se preocupou em utilizar as expressotildees lambda apenas na implementaccedilatildeo decoacutedigo novo O cenaacuterio em que a refatoraccedilatildeo natildeo eacute prioridade ainda eacute a realidade de vaacuteriosprojetos de grande porte visto que os dados de projetos sem nenhuma expressatildeo lambdasatildeo o maior nuacutemero neste trabalho Poreacutem projetos que jaacute adotaram a utilizaccedilatildeo do Java8 tendem a mudar isso com o passar do tempo A Figura 59 apresenta em verde umaadiccedilatildeo de coacutedigo novo com expressatildeo lambda sem a eliminaccedilatildeo de algum coacutedigo anteriora esse que estaria em vermelho

42

Figura 59 Exemplo de um arquivo do commit de adiccedilatildeo de coacutedigo novo em Java 8 doprojeto Guava [4]

Na categoria de projetos em que os AICs e expressotildees lambda aumentam proporci-onalmente (grupo 1) o projeto agera realizou um commit em 19052016 com a adiccedilatildeoda biblioteca retrolambda como dependecircncia do projeto Essa biblioteca utilizada prin-cipalmente por projetos Android permite executar coacutedigo Java 8 contendo expressotildeeslambda em Java 5 6 e 7 [48] O commit tambeacutem apresenta refatoraccedilatildeo dos AICs ad-vindos de interfaces funcionais para expressotildees lambda Apesar de o projeto continuar autilizar as expressotildees lambda em seus commits posteriores o nuacutemero de AICs tambeacutemcontinuou a aumentar visualizando os commits posteriores notou-se que esses AICs satildeorelativos a interfaces natildeo funcionais ou seja que possuem mais de um meacutetodo O projetoAndroid-CleanArchitecture eacute similar ao agera pois tambeacutem optou pela instalaccedilatildeo da bi-blioteca retrolambda para uso de expressotildees lambda em seus coacutedigos e como tambeacutem eacuteum projeto de pequeno porte houve uma pequena refatoraccedilatildeo dos AICs A Figura 510mostra a parte do commit de refatoraccedilatildeo de coacutedigo em que o desenvolvedor adiciona abiblioteca retrolambda como dependecircncia

43

Figura 510 Commit de adiccedilatildeo da biblioteca Retrolambda no projeto Agera [5]

Outro caso interessante eacute o do projeto RxJava que em 2015 optou pela refatoraccedilatildeodo coacutedigo para a utilizaccedilatildeo de expressotildees lambda quase eliminando por completo o usode AICs mas que no ano seguinte reverteu os commits de forma que eliminasse comple-tamente o uso de expressotildees lambda para manter a retrocompatibilidade com o Java 6A Figura 511 demonstra uma parte do commit de reversatildeo do coacutedigo para Java 6 emque pode ser visto em vermelho o coacutedigo anterior com expressotildees lambda e o verde como novo coacutedigo utilizando AIC novamente

44

Figura 511 Commit de remoccedilatildeo de Lambdas e volta para o uso de AICs no projetoRXJava [6]

Essa preocupaccedilatildeo com retrocompatibilidade de coacutedigo pode ser um fator crucial nadecisatildeo das equipes de desenvolvimento na hora de decidir como fazer o software co-evoluircom a linguagem sem perder a compatibilidade com versotildees anteriores

45

Capiacutetulo 6

Consideraccedilotildees Finais

Este estudo permitiu entender melhor como projetos estatildeo realizando a migraccedilatildeo para oJava 8 em especial utilizando uma nova caracteriacutestica introduzida expressatildeo lambdaApesar de a maioria dos projetos populares considerados natildeo possuiacuterem nenhuma ocor-recircncia de expressotildees lambda os projetos que tinham expressotildees lambda foram suficientespara realizar um primeiro estudo de caracterizaccedilatildeo no uso desta caracteriacutestica e com osprojetos efetivamente utilizados para estudo foi possiacutevel agrupaacute-los quanto a maneira emque as expressotildees lambda estavam sendo utilizadas quando comparadas com AICs em 5grandes grupos quando AIC e lambda aumentam proporcionalmente quando AIC dimi-nui e lambda aumenta ultrapassando AIC quando AIC diminui mas continua superior aolambda crescente expressotildees lambda que foram introduzidas e retiradas completamentedo coacutedigo e expressotildees lambda que natildeo existem em quantidades expressivas

Foi possiacutevel entatildeo realizar um estudo aprofundado levando em consideraccedilatildeo as di-ferentes maneiras com que as expressotildees lambda foram adotadas nos projetos atraveacutes daescolha de um projeto que representasse cada grupo para anaacutelise Dentre os cinco projetosestudados foi possiacutevel observar alguns padrotildees tipicamente adotados por desenvolvedorespara implementar expressotildees lambda em seus projetos como a utilizaccedilatildeo da bibliotecas(retrolambda) que permitissem uma flexibilizaccedilatildeo na utilizaccedilatildeo de expressotildees lambda oucomo lambda eacute primariamente utilizada para substituir determinados AICs ou operaccedilotildeesem Collection

Aleacutem disso foi possiacutevel observar como a refatoraccedilatildeo de coacutedigo acontece em cada umdesses projetos Observou-se como projetos menores tendem a refatorar coacutedigo maisfacilmente ao passo que projetos maiores e mais complexos fazem menos refatoraccedilatildeo oudemoram mais entre o periacuteodo em que houve a primeira migraccedilatildeo de coacutedigo para a novaversatildeo da linguagem ateacute o periacuteodo em que realmente decidem refatorar coacutedigo Aleacutem dacomplexidade do projeto influenciar na decisatildeo de migrar o projeto para uma versatildeo maisrecente da linguagem a preocupaccedilatildeo com retrocompatibilidade com versotildees anteriores da

46

linguagem tambeacutem podem ser uma barreira para que projetos comecem a evoluir o coacutedigojuntamente com a evoluccedilatildeo da linguagem

Ainda assim foi possiacutevel observar que a preocupaccedilatildeo com a co-evoluccedilatildeo do software-linguagem existe entre os desenvolvedores de projetos mas a realizaccedilatildeo da migraccedilatildeo aindaacontece lentamente devido agrave diversos fatores que precisam ser levados em consideraccedilatildeopara a manutenccedilatildeo do projeto

Para trabalhos e contribuiccedilotildees futuras seria interessante desenvolver uma ferramentaque pudesse analisar diretamente no coacutedigo-fonte as oportunidades de aplicaccedilatildeo de ex-pressotildees lambda dessa forma poderiam ser analisadas as porcentagens de conversatildeo decoacutedigo para Java 8 e obter melhores conclusotildees sobre a importacircncia que os projetos estatildeodando para a evoluccedilatildeo de seus coacutedigos Outro fator interessante seria aplicar mais Visitorsagrave ferramenta static-analysis e fazer este mesmo estudo aplicado agrave outras caracteriacutesticasda linguagem

47

Referecircncias

[1] Kagdi Huzefa Michael L Collard e Jonathan I Maletic A survey and taxonomyof approaches for mining software repositories in the context of software evolution2007 ix 3 8 9 10 11

[2] DBeaver Dbeaver - features httpdbeaverjkissorgdocsfeatures ix 29

[3] Eclipse Vertx commit Java8-ify code httpsgithubcomeclipsevertxcommit93f95e9c77419f442a42fe711b6eeaef88192fd3 ix 42

[4] Google Guava commit Release java 8 changes to guava httpsgithubcomgoogleguavacommit73e382fa877f80994817a136b0adcc4365ccd904 ix 43

[5] Google Agera commit Collapsed testapp with retrolambda httpsgithubcomgoogleageracommit5e518b7b05f9e7a34a314945f68deff7b2c3e334 ix 44

[6] ReactiveX Rxjava commit 2x full jdk 6 compatible backport + includ-ing bugfixes up to today httpsgithubcomReactiveXRxJavacommit000a174d87a901135f9665d3b11f3627fd2dc4ed ix 45

[7] Godfrey M W e D M German The past present and future of software evolutionEm 2008 Frontiers of Maintenance paacuteginas 129ndash138 Sept 2008 1 6

[8] Favre J M Languages evolve too changing the software time scale Em Principles ofSoftware Evolution Eighth International Workshop on paacuteginas 33ndash42 IEEE 20051 5 7

[9] Overbey Jeffrey L e Ralph E Johnson Regrowing a language refactoring tools allowprogramming languages to evolve Em ACM SIGPLAN Notices volume 44 paacuteginas493ndash502 ACM 2009 1 5 7 8 12

[10] Grechanik Mark Collin McMillan Luca DeFerrari Marco Comi Stefano CrespiDenys Poshyvanyk Chen Fu Qing Xie e Carlo Ghezzi An empirical investiga-tion into a large-scale java open source code repository Em Proceedings of the2010 ACM-IEEE International Symposium on Empirical Software Engineering andMeasurement ESEM rsquo10 paacuteginas 111ndash1110 New York NY USA 2010 ACMISBN 978-1-4503-0039-1 httpdoiacmorg10114518527861852801 1

[11] TIOBE Tiobe httpswwwtiobecomtiobe-index 1 14

48

[12] Gyori Alex Lyle Franklin Danny Dig e Jan Lahoda Crossing the gap from im-perative to functional programming through refactoring Em Proceedings of the 20139th Joint Meeting on Foundations of Software Engineering ESECFSE 2013 paacute-ginas 543ndash553 New York NY USA 2013 ACM ISBN 978-1-4503-2237-9 httpdoiacmorg10114524914112491461 2 11 24 39

[13] OpenJDK State of the lambda httpcropenjdkjavanet~briangoetzlambdalambda-state-4html 2

[14] Han Jiawei Micheline Kamber e Jian Pei Data Mining Concepts and TechniquesMorgan Kaufmann Publishers Inc San Francisco CA USA 3rd ediccedilatildeo 2011ISBN 0123814790 9780123814791 3

[15] Fowler Martin e Kent Beck Refactoring improving the design of existing codeAddison-Wesley Professional 1999 5 7

[16] Lehman M M J F Ramil P D Wernick D E Perry e W M Turski Met-rics and laws of software evolution - the nineties view Em Proceedings of the4th International Symposium on Software Metrics METRICS rsquo97 paacuteginas 20ndashWashington DC USA 1997 IEEE Computer Society ISBN 0-8186-8093-8 httpdlacmorgcitationcfmid=823454823901 6

[17] Hassan Ahmed E e Tao Xie Software intelligence The future of mining softwareengineering data Em Proceedings of the FSESDP Workshop on Future of SoftwareEngineering Research FoSER rsquo10 paacuteginas 161ndash166 New York NY USA 2010ACM ISBN 978-1-4503-0427-6 httpdoiacmorg101145188236218823978 9

[18] Hassan Ahmed E The road ahead for mining software repositories Em Frontiers ofSoftware Maintenance 2008 FoSM 2008 paacuteginas 48ndash57 IEEE 2008 8

[19] Berry Michael J e Gordon Linoff Data Mining Techniques For Marketing Salesand Customer Support John Wiley amp Sons Inc New York NY USA 1997ISBN 0471179809 10

[20] Parnin Chris Christian Bird e Emerson Murphy-Hill Java generics adoption hownew features are introduced championed or ignored Em Proceedings of the 8thWorking Conference on Mining Software Repositories paacuteginas 3ndash12 ACM 2011 12

[21] Oracle The java language specification httpsdocsoraclecomjavasespecsjlsse8jls8pdf 13

[22] Oracle The history of java technology httpwwworaclecomtechnetworkjavajavaseoverviewjavahistory-index-198355html 13

[23] Murphy Kieron So why did they decide to call itjava httpwwwjavaworldcomarticle2077265core-javaso-why-did-they-decide-to-call-it-java-html 13

[24] McGraw Tata Object-oriented Programming with Java Essentials and ApplicationsHill Education 13

49

[25] Oracle Differences between java ee and java se httpdocsoraclecomjavaee6firstcupdocgkhoyhtml 13

[26] Lindsey Clark S The History of Java Cambridge 14

[27] Oracle The java language environment httpwwworaclecomtechnetworkjavaintro-141325html 14

[28] Oracle Jdk 8 httpopenjdkjavanetprojectsjdk8 15 24

[29] Oracle Enhancements in java se 8 httpdocsoraclecomjavase8docstechnotesguideslanguageenhancementshtmljavase8 15 16 17

[30] Oracle Lambda expressions httpdocsoraclecomjavasetutorialjavajavaOOlambdaexpressionshtml 16 18 21

[31] Oracle Method references httpdocsoraclecomjavasetutorialjavajavaOOmethodreferenceshtml 16

[32] Oracle Default methods httpdocsoraclecomjavasetutorialjavaIandIdefaultmethodshtml 17

[33] Oracle Repeating annotations httpdocsoraclecomjavasetutorialjavaannotationsrepeatinghtml 17

[34] Oracle Type annotations httpdocsoraclecomjavasetutorialjavaannotationstype_annotationshtml 17

[35] Oracle Anonymous inner classes httpsdocsoraclecomjavasetutorialjavajavaOOanonymousclasseshtml 19

[36] Kothari CR Research Methodology Methods and Techniques New Age Interna-tional (P) Limited 2004 ISBN 9788122415223 httpsbooksgooglecombrbooksid=8c6gkbKi-F4C 22

[37] Nakakoji Kumiyo Yasuhiro Yamamoto Yoshiyuki Nishinaka Kouichi Kishida eYunwen Ye Evolution patterns of open-source software systems and communitiesEm IWPSE rsquo02 Proceedings of the International Workshop on Principles of SoftwareEvolution paacuteginas 76ndash85 New York NY USA 2002 ACM Press ISBN 1581135459httpdxdoiorg101145512035512055 23

[38] Rahman Foyzur Christian Bird e Premkumar Devanbu Clones What is that smellEmpirical Software Engineering 17(4-5)503ndash530 2012 24

[39] Chacon Scott Pro Git Apress Berkely CA USA 1st ediccedilatildeo 2009ISBN 1430218339 9781430218333 25

[40] Cavalcanti Thiago Gomes e Viniacutecius Correa de Almeida Caracterizaccedilatildeo do uso deconstruccedilotildees da linguagem java em projetos open-source Publicaccedilatildeo online 2016httpbdmunbbrhandle1048315733 27

50

[41] Parr Terence Language Implementation Patterns Create Your Own Domain-Specific and General Programming Languages Pragmatic Bookshelf 1st ediccedilatildeo 2009ISBN 193435645X 9781934356456 27

[42] Janssen Thorben 5 reasons to use jpa hibernate Publicaccedilatildeo online httpswwwsitepointcom5-reasons-to-use-jpa-hibernate 27

[43] Franklin Lyle Alex Gyori Jan Lahoda e Danny Dig Lambdaficator From imperativeto functional programming through automated refactoring Em Proceedings of the2013 International Conference on Software Engineering ICSE rsquo13 paacuteginas 1287ndash1290 Piscataway NJ USA 2013 IEEE Press ISBN 978-1-4673-3076-3 httpdlacmorgcitationcfmid=24867882486986 29

[44] Google Agera httpsgithubcomgoogleagerawiki 34

[45] Eclipse Eclipse vertx httpvertxio 35

[46] Cejas Fernando Android cleanarchitecture httpsgithubcomandroid10Android-CleanArchitecture 36

[47] ReactiveX Rxjava httpsgithubcomReactiveXRxJava 37

[48] Luontola Esko Retrolambda httpsgithubcomorfjackalretrolambda 43

51

Anexo I

Projetos utilizados

fastjson

platform_frameworks_base

netty

material-dialogs

kotlin

okhttp

tinker

AndroidUtilCode

RxJava

spring-boot

java-design-patterns

elasticsearch

ExoPlayer

kafka

vertx

realm-java

guava

zipkin

bazel

stetho

Signal-Android

glide

agera

fresco

plaid

presto

libgdx

spark

52

disruptor

lottie-android

flexbox-layout

PocketHub

zxing

spring-framework

deeplearning4j

dropwizard

interviews

BaseRecyclerViewAdapterHelper

uCrop

DanmakuFlameMaster

lottie-react-native

android-UniversalMusicPlayer

AndroidInterview-Q-A

greenDAO

retrofit

MaterialDrawer

BottomBar

druid

MPAndroidChart

Hystrix

guice

recyclerview-animators

dubbo

androidannotations

RxJava-Android-Samples

PhotoView

clojure

CircleImageView

AndroidSwipeLayout

jedis

MaterialViewPager

butterknife

junit4

RxBinding

leakcanary

SimianArmy

picasso

UltimateRecyclerView

53

AndroidViewAnimations

AppIntro

FizzBuzzEnterpriseEdition

ion

cheesesquare

physical-web

RxAndroid

Android-CleanArchitecture

Calligraphy

Android-Bootstrap

iosched

Android_Data

MaterialDesignLibrary

ListViewAnimations

EventBus

java8-tutorial

AndroidSlidingUpPanel

dagger

okhttputils

logger

HomeMirror

Material-Animations

android-Ultra-Pull-To-Refresh

android-async-http

Android-ObservableScrollView

Android-Universal-Image-Loader

ActionBarSherlock

SlidingMenu

storm

PagerSlidingTabStrip

Android-PullToRefresh

54

  • Dedicatoacuteria
  • Agradecimentos
  • Resumo
  • Abstract
  • Introduccedilatildeo
    • Contexto
    • Objetivos
      • Objetivos Gerais
      • Objetivos Especiacuteficos
        • Metodologia
        • Organizaccedilatildeo do Trabalho
          • Evoluccedilatildeo e Mineraccedilatildeo de Repositoacuterios de Software
            • Evoluccedilatildeo de Software
            • MSR Mineraccedilatildeo de dados e a Engenharia de Software
              • Classificaccedilatildeo
                • Trabalhos Relacionados
                  • Java SE 8 e JDK 8
                    • Histoacuterico
                    • Princiacutepios
                    • Evoluccedilatildeo
                    • Expressotildees Lambda
                      • Sintaxe
                      • Principais formas de uso
                          • Estudo e o Processo de Mineraccedilatildeo
                            • Questotildees de Pesquisa
                            • Fonte de Dados e Objetos de Estudo
                            • Processo de Mineraccedilatildeo
                              • static-analysis
                              • BDAnalisador
                                • Classificaccedilatildeo e Anaacutelise
                                  • Meacutedia de Lambda
                                  • Anaacutelise Temporal
                                  • Refatoraccedilatildeo de Coacutedigo
                                  • Casos de Uso
                                      • Resultados Obtidos e Anaacutelise
                                        • Visatildeo Geral
                                          • Projetos Selecionados
                                          • agera
                                          • vertx
                                          • Android-CleanArchitecture
                                          • RxJava
                                          • guava
                                            • Refatoraccedilatildeo de Coacutedigo
                                            • Estudos de Caso
                                              • Consideraccedilotildees Finais
                                              • Referecircncias
                                              • Anexo
                                              • Projetos utilizados

Figura 56 Graacuteficos de anaacutelise temporal do projeto Guava

52 Refatoraccedilatildeo de Coacutedigo

Com o objetivo de caracterizar melhor como as expressotildees lambda estatildeo sendo utilizadaseacute interessante identificar se estas estatildeo sendo introduzidas atraveacutes de refatoraccedilatildeo de coacutedigoou em coacutedigo novo

Os projetos classificados como pertencentes ao Grupo 2 possuem em comum o fatode expressotildees lambda aumentarem a medida que AICs diminuem ultrapassando-as eessa caracteriacutestica em comum pode indicar que nestes projetos possivelmente houve re-fatoraccedilatildeo de coacutedigo visto que AIC sendo substituiacutedo por expressotildees lambda dentro dascondiccedilotildees determinadas eacute a maneira mais comum de se identificar refatoraccedilatildeo de coacute-digo para introduccedilatildeo de expressotildees lambda [12] Os projetos que compotildeem o grupo 2representam 44 de todos os projetos estudados que possuem expressotildees lambda o quepode ser um indicativo caso a hipoacutetese de refatoraccedilatildeo de coacutedigo seja positiva de quemuitos projetos que estatildeo adotando o Java 8 estatildeo se preocupando de alguma formacom refatoraccedilatildeo se coacutedigo Fazem parte desse grupo os seguintes projetos elasticsearchjava-design-patterns PocketHub presto RxJava-Android-Samples spark vertx zipkinjava8-tutorial dropwizard e material-dialogs

39

Outra maneira de verificar possiacuteveis indicadores de refatoraccedilatildeo de coacutedigo foi atraveacutesda anaacutelise dos tamanhos (em quantidade de linhas de coacutedigo) dos meacutetodos com expressotildeeslambda no mecircs em que se introduziu expressotildees lambda e um mecircs imediatamente antesdeste Essa anaacutelise mostra que dos 25 projetos com expressotildees lambda 12 (48) projetostiveram ao menos um meacutetodo em que houve uma diminuiccedilatildeo no tamanho o que podeser considerado um indicativo de refatoraccedilatildeo de coacutedigo A Figura 57 mostra todos osprojetos em relaccedilatildeo agrave quantidade total de meacutetodos que possuem lambda no primeiro mecircsde introduccedilatildeo do mesmo em vermelho comparado com a quantidade desses meacutetodos quetiveram uma diminuiccedilatildeo no tamanho quando comparados com o coacutedigo do mecircs anteriorem azul

Figura 57 Comparaccedilatildeo entre todos os projetos com expressatildeo lambda sobre refatoraccedilatildeode coacutedigo no mecircs de introduccedilatildeo da caracteriacutestica

Ainda observando a figura 57 com relaccedilatildeo aos projetos que natildeo tiveram nenhummeacutetodo com diminuiccedilatildeo de tamanho (barra azul) percebe-se que todos os 13 projetossequer tiveram uma quantidade significativa de meacutetodos que possuem expressotildees lambda(com o maior tendo apenas 5 meacutetodos) no mecircs de introduccedilatildeo da caracteriacutestica no projetoe ao mesmo tempo jaacute existiam no mecircs em que natildeo existia lambda no projeto Essa eacuteuma observaccedilatildeo importante porque projetos como vertx sendo este o que possui a maiormeacutedia de lambdasnapshot de todos os projetos e ao mesmo tempo tendo apenas trecircsmeacutetodos que continham expressotildees lambda no mecircs da introduccedilatildeo e que existiam no mecircs

40

anterior permitem inferir que todas as outras expressotildees lambda existentes no projetopara este determinado mecircs de introduccedilatildeo encontram-se em coacutedigo novo introduzido

Eacute importante ressaltar que somente essa anaacutelise natildeo eacute exclusivamente suficiente paradeterminar se estes projetos estatildeo realmente introduzindo lambda em coacutedigo novo ourealizando refatoraccedilatildeo uma vez que como a comparaccedilatildeo aconteceu apenas no mecircs deintroduccedilatildeo com o mecircs imediatamente anterior natildeo reflete todo o ciclo de vida do pro-jeto Por exemplo algumas equipes podem escolher refatorar o coacutedigo depois de umtempo de adaptaccedilatildeo apoacutes a transiccedilatildeo para a nova versatildeo da linguagem Assim paraobter uma melhor anaacutelise sobre refatoraccedilatildeo de coacutedigo ou natildeo feita nestes projetos aleacutemde outras anaacutelises referentes aos padrotildees tipicamente adotados para implementaccedilatildeo delambda nestes projetos seratildeo apresentados a seguir os estudos de caso dos cinco projetospreviamente selecionados

Outro ponto importante eacute o fato de que apesar das informaccedilotildees quanto agraves quantida-des de filter e map terem sido incluiacutedas inicialmente no trabalho para observar possiacuteveispadrotildees de refatoraccedilatildeo de coacutedigo percebeu-se que estas natildeo satildeo utilizadas de forma con-sideraacutevel pelos projetos estudados e para fins de anaacutelises generalizadas natildeo apresentaramtanta influecircncia na utilizaccedilatildeo de expressotildees lambda quanto a quantidade de AICs noprojeto

53 Estudos de Caso

Dentre os projetos analisados verificou-se que os projetos de pequeno e meacutedio porte op-taram por refatorar de uma vez seus coacutedigos para incluir expressotildees lambda em situaccedilotildeesem que se utilizava AICs anteriormente ou em alguns poucos casos de utilizaccedilatildeo deCollection Os projetos de grande porte natildeo apresentaram nenhuma refatoraccedilatildeo de coacute-digo ou uma refatoraccedilatildeo parcial gradativa provavelmente devido agrave grande quantidade dearquivos e coacutedigo que possuem o que pode tornar o trabalho de refatoraccedilatildeo extenso ecansativo

O projeto vertx que pertence ao grupo 2 dos projetos em que a quantidade de ex-pressotildees lambda aumentaram e as de AICs diminuiacuteram com lambda ultrapassando AICsexecutou inicialmente commits em maio de 2014 com adiccedilatildeo de coacutedigo novo utilizandoexpressotildees lambda e apoacutes um mecircs realizou um commit maior com a refatoraccedilatildeo de todasas AICs para expressotildees lambda Apoacutes a refatoraccedilatildeo o projeto se preocupou em mantera utilizaccedilatildeo de expressotildees lambda ao mesmo tempo que o uso de AICs se manteve apenasaos casos de classes com interfaces natildeo funcionais A Figura 58 apresenta uma parte docommit de refatoraccedilatildeo de coacutedigo que mostra em vermelho a parte eliminada do coacutedigo(AIC) e em verde o coacutedigo novo representando a substituiccedilatildeo por uma expressatildeo lambda

41

Figura 58 Commit de refatoraccedilatildeo de coacutedigo do projeto Vertx [3]

Alguns projetos ainda natildeo se preocuparam em refatorar o coacutedigo para o uso de ex-pressotildees lambda ateacute a data deste trabalho que eacute o caso do projeto guava que apresentouum commit em 03112016 com a atualizaccedilatildeo do projeto para Java 8 Mas a partir daatualizaccedilatildeo se preocupou em utilizar as expressotildees lambda apenas na implementaccedilatildeo decoacutedigo novo O cenaacuterio em que a refatoraccedilatildeo natildeo eacute prioridade ainda eacute a realidade de vaacuteriosprojetos de grande porte visto que os dados de projetos sem nenhuma expressatildeo lambdasatildeo o maior nuacutemero neste trabalho Poreacutem projetos que jaacute adotaram a utilizaccedilatildeo do Java8 tendem a mudar isso com o passar do tempo A Figura 59 apresenta em verde umaadiccedilatildeo de coacutedigo novo com expressatildeo lambda sem a eliminaccedilatildeo de algum coacutedigo anteriora esse que estaria em vermelho

42

Figura 59 Exemplo de um arquivo do commit de adiccedilatildeo de coacutedigo novo em Java 8 doprojeto Guava [4]

Na categoria de projetos em que os AICs e expressotildees lambda aumentam proporci-onalmente (grupo 1) o projeto agera realizou um commit em 19052016 com a adiccedilatildeoda biblioteca retrolambda como dependecircncia do projeto Essa biblioteca utilizada prin-cipalmente por projetos Android permite executar coacutedigo Java 8 contendo expressotildeeslambda em Java 5 6 e 7 [48] O commit tambeacutem apresenta refatoraccedilatildeo dos AICs ad-vindos de interfaces funcionais para expressotildees lambda Apesar de o projeto continuar autilizar as expressotildees lambda em seus commits posteriores o nuacutemero de AICs tambeacutemcontinuou a aumentar visualizando os commits posteriores notou-se que esses AICs satildeorelativos a interfaces natildeo funcionais ou seja que possuem mais de um meacutetodo O projetoAndroid-CleanArchitecture eacute similar ao agera pois tambeacutem optou pela instalaccedilatildeo da bi-blioteca retrolambda para uso de expressotildees lambda em seus coacutedigos e como tambeacutem eacuteum projeto de pequeno porte houve uma pequena refatoraccedilatildeo dos AICs A Figura 510mostra a parte do commit de refatoraccedilatildeo de coacutedigo em que o desenvolvedor adiciona abiblioteca retrolambda como dependecircncia

43

Figura 510 Commit de adiccedilatildeo da biblioteca Retrolambda no projeto Agera [5]

Outro caso interessante eacute o do projeto RxJava que em 2015 optou pela refatoraccedilatildeodo coacutedigo para a utilizaccedilatildeo de expressotildees lambda quase eliminando por completo o usode AICs mas que no ano seguinte reverteu os commits de forma que eliminasse comple-tamente o uso de expressotildees lambda para manter a retrocompatibilidade com o Java 6A Figura 511 demonstra uma parte do commit de reversatildeo do coacutedigo para Java 6 emque pode ser visto em vermelho o coacutedigo anterior com expressotildees lambda e o verde como novo coacutedigo utilizando AIC novamente

44

Figura 511 Commit de remoccedilatildeo de Lambdas e volta para o uso de AICs no projetoRXJava [6]

Essa preocupaccedilatildeo com retrocompatibilidade de coacutedigo pode ser um fator crucial nadecisatildeo das equipes de desenvolvimento na hora de decidir como fazer o software co-evoluircom a linguagem sem perder a compatibilidade com versotildees anteriores

45

Capiacutetulo 6

Consideraccedilotildees Finais

Este estudo permitiu entender melhor como projetos estatildeo realizando a migraccedilatildeo para oJava 8 em especial utilizando uma nova caracteriacutestica introduzida expressatildeo lambdaApesar de a maioria dos projetos populares considerados natildeo possuiacuterem nenhuma ocor-recircncia de expressotildees lambda os projetos que tinham expressotildees lambda foram suficientespara realizar um primeiro estudo de caracterizaccedilatildeo no uso desta caracteriacutestica e com osprojetos efetivamente utilizados para estudo foi possiacutevel agrupaacute-los quanto a maneira emque as expressotildees lambda estavam sendo utilizadas quando comparadas com AICs em 5grandes grupos quando AIC e lambda aumentam proporcionalmente quando AIC dimi-nui e lambda aumenta ultrapassando AIC quando AIC diminui mas continua superior aolambda crescente expressotildees lambda que foram introduzidas e retiradas completamentedo coacutedigo e expressotildees lambda que natildeo existem em quantidades expressivas

Foi possiacutevel entatildeo realizar um estudo aprofundado levando em consideraccedilatildeo as di-ferentes maneiras com que as expressotildees lambda foram adotadas nos projetos atraveacutes daescolha de um projeto que representasse cada grupo para anaacutelise Dentre os cinco projetosestudados foi possiacutevel observar alguns padrotildees tipicamente adotados por desenvolvedorespara implementar expressotildees lambda em seus projetos como a utilizaccedilatildeo da bibliotecas(retrolambda) que permitissem uma flexibilizaccedilatildeo na utilizaccedilatildeo de expressotildees lambda oucomo lambda eacute primariamente utilizada para substituir determinados AICs ou operaccedilotildeesem Collection

Aleacutem disso foi possiacutevel observar como a refatoraccedilatildeo de coacutedigo acontece em cada umdesses projetos Observou-se como projetos menores tendem a refatorar coacutedigo maisfacilmente ao passo que projetos maiores e mais complexos fazem menos refatoraccedilatildeo oudemoram mais entre o periacuteodo em que houve a primeira migraccedilatildeo de coacutedigo para a novaversatildeo da linguagem ateacute o periacuteodo em que realmente decidem refatorar coacutedigo Aleacutem dacomplexidade do projeto influenciar na decisatildeo de migrar o projeto para uma versatildeo maisrecente da linguagem a preocupaccedilatildeo com retrocompatibilidade com versotildees anteriores da

46

linguagem tambeacutem podem ser uma barreira para que projetos comecem a evoluir o coacutedigojuntamente com a evoluccedilatildeo da linguagem

Ainda assim foi possiacutevel observar que a preocupaccedilatildeo com a co-evoluccedilatildeo do software-linguagem existe entre os desenvolvedores de projetos mas a realizaccedilatildeo da migraccedilatildeo aindaacontece lentamente devido agrave diversos fatores que precisam ser levados em consideraccedilatildeopara a manutenccedilatildeo do projeto

Para trabalhos e contribuiccedilotildees futuras seria interessante desenvolver uma ferramentaque pudesse analisar diretamente no coacutedigo-fonte as oportunidades de aplicaccedilatildeo de ex-pressotildees lambda dessa forma poderiam ser analisadas as porcentagens de conversatildeo decoacutedigo para Java 8 e obter melhores conclusotildees sobre a importacircncia que os projetos estatildeodando para a evoluccedilatildeo de seus coacutedigos Outro fator interessante seria aplicar mais Visitorsagrave ferramenta static-analysis e fazer este mesmo estudo aplicado agrave outras caracteriacutesticasda linguagem

47

Referecircncias

[1] Kagdi Huzefa Michael L Collard e Jonathan I Maletic A survey and taxonomyof approaches for mining software repositories in the context of software evolution2007 ix 3 8 9 10 11

[2] DBeaver Dbeaver - features httpdbeaverjkissorgdocsfeatures ix 29

[3] Eclipse Vertx commit Java8-ify code httpsgithubcomeclipsevertxcommit93f95e9c77419f442a42fe711b6eeaef88192fd3 ix 42

[4] Google Guava commit Release java 8 changes to guava httpsgithubcomgoogleguavacommit73e382fa877f80994817a136b0adcc4365ccd904 ix 43

[5] Google Agera commit Collapsed testapp with retrolambda httpsgithubcomgoogleageracommit5e518b7b05f9e7a34a314945f68deff7b2c3e334 ix 44

[6] ReactiveX Rxjava commit 2x full jdk 6 compatible backport + includ-ing bugfixes up to today httpsgithubcomReactiveXRxJavacommit000a174d87a901135f9665d3b11f3627fd2dc4ed ix 45

[7] Godfrey M W e D M German The past present and future of software evolutionEm 2008 Frontiers of Maintenance paacuteginas 129ndash138 Sept 2008 1 6

[8] Favre J M Languages evolve too changing the software time scale Em Principles ofSoftware Evolution Eighth International Workshop on paacuteginas 33ndash42 IEEE 20051 5 7

[9] Overbey Jeffrey L e Ralph E Johnson Regrowing a language refactoring tools allowprogramming languages to evolve Em ACM SIGPLAN Notices volume 44 paacuteginas493ndash502 ACM 2009 1 5 7 8 12

[10] Grechanik Mark Collin McMillan Luca DeFerrari Marco Comi Stefano CrespiDenys Poshyvanyk Chen Fu Qing Xie e Carlo Ghezzi An empirical investiga-tion into a large-scale java open source code repository Em Proceedings of the2010 ACM-IEEE International Symposium on Empirical Software Engineering andMeasurement ESEM rsquo10 paacuteginas 111ndash1110 New York NY USA 2010 ACMISBN 978-1-4503-0039-1 httpdoiacmorg10114518527861852801 1

[11] TIOBE Tiobe httpswwwtiobecomtiobe-index 1 14

48

[12] Gyori Alex Lyle Franklin Danny Dig e Jan Lahoda Crossing the gap from im-perative to functional programming through refactoring Em Proceedings of the 20139th Joint Meeting on Foundations of Software Engineering ESECFSE 2013 paacute-ginas 543ndash553 New York NY USA 2013 ACM ISBN 978-1-4503-2237-9 httpdoiacmorg10114524914112491461 2 11 24 39

[13] OpenJDK State of the lambda httpcropenjdkjavanet~briangoetzlambdalambda-state-4html 2

[14] Han Jiawei Micheline Kamber e Jian Pei Data Mining Concepts and TechniquesMorgan Kaufmann Publishers Inc San Francisco CA USA 3rd ediccedilatildeo 2011ISBN 0123814790 9780123814791 3

[15] Fowler Martin e Kent Beck Refactoring improving the design of existing codeAddison-Wesley Professional 1999 5 7

[16] Lehman M M J F Ramil P D Wernick D E Perry e W M Turski Met-rics and laws of software evolution - the nineties view Em Proceedings of the4th International Symposium on Software Metrics METRICS rsquo97 paacuteginas 20ndashWashington DC USA 1997 IEEE Computer Society ISBN 0-8186-8093-8 httpdlacmorgcitationcfmid=823454823901 6

[17] Hassan Ahmed E e Tao Xie Software intelligence The future of mining softwareengineering data Em Proceedings of the FSESDP Workshop on Future of SoftwareEngineering Research FoSER rsquo10 paacuteginas 161ndash166 New York NY USA 2010ACM ISBN 978-1-4503-0427-6 httpdoiacmorg101145188236218823978 9

[18] Hassan Ahmed E The road ahead for mining software repositories Em Frontiers ofSoftware Maintenance 2008 FoSM 2008 paacuteginas 48ndash57 IEEE 2008 8

[19] Berry Michael J e Gordon Linoff Data Mining Techniques For Marketing Salesand Customer Support John Wiley amp Sons Inc New York NY USA 1997ISBN 0471179809 10

[20] Parnin Chris Christian Bird e Emerson Murphy-Hill Java generics adoption hownew features are introduced championed or ignored Em Proceedings of the 8thWorking Conference on Mining Software Repositories paacuteginas 3ndash12 ACM 2011 12

[21] Oracle The java language specification httpsdocsoraclecomjavasespecsjlsse8jls8pdf 13

[22] Oracle The history of java technology httpwwworaclecomtechnetworkjavajavaseoverviewjavahistory-index-198355html 13

[23] Murphy Kieron So why did they decide to call itjava httpwwwjavaworldcomarticle2077265core-javaso-why-did-they-decide-to-call-it-java-html 13

[24] McGraw Tata Object-oriented Programming with Java Essentials and ApplicationsHill Education 13

49

[25] Oracle Differences between java ee and java se httpdocsoraclecomjavaee6firstcupdocgkhoyhtml 13

[26] Lindsey Clark S The History of Java Cambridge 14

[27] Oracle The java language environment httpwwworaclecomtechnetworkjavaintro-141325html 14

[28] Oracle Jdk 8 httpopenjdkjavanetprojectsjdk8 15 24

[29] Oracle Enhancements in java se 8 httpdocsoraclecomjavase8docstechnotesguideslanguageenhancementshtmljavase8 15 16 17

[30] Oracle Lambda expressions httpdocsoraclecomjavasetutorialjavajavaOOlambdaexpressionshtml 16 18 21

[31] Oracle Method references httpdocsoraclecomjavasetutorialjavajavaOOmethodreferenceshtml 16

[32] Oracle Default methods httpdocsoraclecomjavasetutorialjavaIandIdefaultmethodshtml 17

[33] Oracle Repeating annotations httpdocsoraclecomjavasetutorialjavaannotationsrepeatinghtml 17

[34] Oracle Type annotations httpdocsoraclecomjavasetutorialjavaannotationstype_annotationshtml 17

[35] Oracle Anonymous inner classes httpsdocsoraclecomjavasetutorialjavajavaOOanonymousclasseshtml 19

[36] Kothari CR Research Methodology Methods and Techniques New Age Interna-tional (P) Limited 2004 ISBN 9788122415223 httpsbooksgooglecombrbooksid=8c6gkbKi-F4C 22

[37] Nakakoji Kumiyo Yasuhiro Yamamoto Yoshiyuki Nishinaka Kouichi Kishida eYunwen Ye Evolution patterns of open-source software systems and communitiesEm IWPSE rsquo02 Proceedings of the International Workshop on Principles of SoftwareEvolution paacuteginas 76ndash85 New York NY USA 2002 ACM Press ISBN 1581135459httpdxdoiorg101145512035512055 23

[38] Rahman Foyzur Christian Bird e Premkumar Devanbu Clones What is that smellEmpirical Software Engineering 17(4-5)503ndash530 2012 24

[39] Chacon Scott Pro Git Apress Berkely CA USA 1st ediccedilatildeo 2009ISBN 1430218339 9781430218333 25

[40] Cavalcanti Thiago Gomes e Viniacutecius Correa de Almeida Caracterizaccedilatildeo do uso deconstruccedilotildees da linguagem java em projetos open-source Publicaccedilatildeo online 2016httpbdmunbbrhandle1048315733 27

50

[41] Parr Terence Language Implementation Patterns Create Your Own Domain-Specific and General Programming Languages Pragmatic Bookshelf 1st ediccedilatildeo 2009ISBN 193435645X 9781934356456 27

[42] Janssen Thorben 5 reasons to use jpa hibernate Publicaccedilatildeo online httpswwwsitepointcom5-reasons-to-use-jpa-hibernate 27

[43] Franklin Lyle Alex Gyori Jan Lahoda e Danny Dig Lambdaficator From imperativeto functional programming through automated refactoring Em Proceedings of the2013 International Conference on Software Engineering ICSE rsquo13 paacuteginas 1287ndash1290 Piscataway NJ USA 2013 IEEE Press ISBN 978-1-4673-3076-3 httpdlacmorgcitationcfmid=24867882486986 29

[44] Google Agera httpsgithubcomgoogleagerawiki 34

[45] Eclipse Eclipse vertx httpvertxio 35

[46] Cejas Fernando Android cleanarchitecture httpsgithubcomandroid10Android-CleanArchitecture 36

[47] ReactiveX Rxjava httpsgithubcomReactiveXRxJava 37

[48] Luontola Esko Retrolambda httpsgithubcomorfjackalretrolambda 43

51

Anexo I

Projetos utilizados

fastjson

platform_frameworks_base

netty

material-dialogs

kotlin

okhttp

tinker

AndroidUtilCode

RxJava

spring-boot

java-design-patterns

elasticsearch

ExoPlayer

kafka

vertx

realm-java

guava

zipkin

bazel

stetho

Signal-Android

glide

agera

fresco

plaid

presto

libgdx

spark

52

disruptor

lottie-android

flexbox-layout

PocketHub

zxing

spring-framework

deeplearning4j

dropwizard

interviews

BaseRecyclerViewAdapterHelper

uCrop

DanmakuFlameMaster

lottie-react-native

android-UniversalMusicPlayer

AndroidInterview-Q-A

greenDAO

retrofit

MaterialDrawer

BottomBar

druid

MPAndroidChart

Hystrix

guice

recyclerview-animators

dubbo

androidannotations

RxJava-Android-Samples

PhotoView

clojure

CircleImageView

AndroidSwipeLayout

jedis

MaterialViewPager

butterknife

junit4

RxBinding

leakcanary

SimianArmy

picasso

UltimateRecyclerView

53

AndroidViewAnimations

AppIntro

FizzBuzzEnterpriseEdition

ion

cheesesquare

physical-web

RxAndroid

Android-CleanArchitecture

Calligraphy

Android-Bootstrap

iosched

Android_Data

MaterialDesignLibrary

ListViewAnimations

EventBus

java8-tutorial

AndroidSlidingUpPanel

dagger

okhttputils

logger

HomeMirror

Material-Animations

android-Ultra-Pull-To-Refresh

android-async-http

Android-ObservableScrollView

Android-Universal-Image-Loader

ActionBarSherlock

SlidingMenu

storm

PagerSlidingTabStrip

Android-PullToRefresh

54

  • Dedicatoacuteria
  • Agradecimentos
  • Resumo
  • Abstract
  • Introduccedilatildeo
    • Contexto
    • Objetivos
      • Objetivos Gerais
      • Objetivos Especiacuteficos
        • Metodologia
        • Organizaccedilatildeo do Trabalho
          • Evoluccedilatildeo e Mineraccedilatildeo de Repositoacuterios de Software
            • Evoluccedilatildeo de Software
            • MSR Mineraccedilatildeo de dados e a Engenharia de Software
              • Classificaccedilatildeo
                • Trabalhos Relacionados
                  • Java SE 8 e JDK 8
                    • Histoacuterico
                    • Princiacutepios
                    • Evoluccedilatildeo
                    • Expressotildees Lambda
                      • Sintaxe
                      • Principais formas de uso
                          • Estudo e o Processo de Mineraccedilatildeo
                            • Questotildees de Pesquisa
                            • Fonte de Dados e Objetos de Estudo
                            • Processo de Mineraccedilatildeo
                              • static-analysis
                              • BDAnalisador
                                • Classificaccedilatildeo e Anaacutelise
                                  • Meacutedia de Lambda
                                  • Anaacutelise Temporal
                                  • Refatoraccedilatildeo de Coacutedigo
                                  • Casos de Uso
                                      • Resultados Obtidos e Anaacutelise
                                        • Visatildeo Geral
                                          • Projetos Selecionados
                                          • agera
                                          • vertx
                                          • Android-CleanArchitecture
                                          • RxJava
                                          • guava
                                            • Refatoraccedilatildeo de Coacutedigo
                                            • Estudos de Caso
                                              • Consideraccedilotildees Finais
                                              • Referecircncias
                                              • Anexo
                                              • Projetos utilizados

Outra maneira de verificar possiacuteveis indicadores de refatoraccedilatildeo de coacutedigo foi atraveacutesda anaacutelise dos tamanhos (em quantidade de linhas de coacutedigo) dos meacutetodos com expressotildeeslambda no mecircs em que se introduziu expressotildees lambda e um mecircs imediatamente antesdeste Essa anaacutelise mostra que dos 25 projetos com expressotildees lambda 12 (48) projetostiveram ao menos um meacutetodo em que houve uma diminuiccedilatildeo no tamanho o que podeser considerado um indicativo de refatoraccedilatildeo de coacutedigo A Figura 57 mostra todos osprojetos em relaccedilatildeo agrave quantidade total de meacutetodos que possuem lambda no primeiro mecircsde introduccedilatildeo do mesmo em vermelho comparado com a quantidade desses meacutetodos quetiveram uma diminuiccedilatildeo no tamanho quando comparados com o coacutedigo do mecircs anteriorem azul

Figura 57 Comparaccedilatildeo entre todos os projetos com expressatildeo lambda sobre refatoraccedilatildeode coacutedigo no mecircs de introduccedilatildeo da caracteriacutestica

Ainda observando a figura 57 com relaccedilatildeo aos projetos que natildeo tiveram nenhummeacutetodo com diminuiccedilatildeo de tamanho (barra azul) percebe-se que todos os 13 projetossequer tiveram uma quantidade significativa de meacutetodos que possuem expressotildees lambda(com o maior tendo apenas 5 meacutetodos) no mecircs de introduccedilatildeo da caracteriacutestica no projetoe ao mesmo tempo jaacute existiam no mecircs em que natildeo existia lambda no projeto Essa eacuteuma observaccedilatildeo importante porque projetos como vertx sendo este o que possui a maiormeacutedia de lambdasnapshot de todos os projetos e ao mesmo tempo tendo apenas trecircsmeacutetodos que continham expressotildees lambda no mecircs da introduccedilatildeo e que existiam no mecircs

40

anterior permitem inferir que todas as outras expressotildees lambda existentes no projetopara este determinado mecircs de introduccedilatildeo encontram-se em coacutedigo novo introduzido

Eacute importante ressaltar que somente essa anaacutelise natildeo eacute exclusivamente suficiente paradeterminar se estes projetos estatildeo realmente introduzindo lambda em coacutedigo novo ourealizando refatoraccedilatildeo uma vez que como a comparaccedilatildeo aconteceu apenas no mecircs deintroduccedilatildeo com o mecircs imediatamente anterior natildeo reflete todo o ciclo de vida do pro-jeto Por exemplo algumas equipes podem escolher refatorar o coacutedigo depois de umtempo de adaptaccedilatildeo apoacutes a transiccedilatildeo para a nova versatildeo da linguagem Assim paraobter uma melhor anaacutelise sobre refatoraccedilatildeo de coacutedigo ou natildeo feita nestes projetos aleacutemde outras anaacutelises referentes aos padrotildees tipicamente adotados para implementaccedilatildeo delambda nestes projetos seratildeo apresentados a seguir os estudos de caso dos cinco projetospreviamente selecionados

Outro ponto importante eacute o fato de que apesar das informaccedilotildees quanto agraves quantida-des de filter e map terem sido incluiacutedas inicialmente no trabalho para observar possiacuteveispadrotildees de refatoraccedilatildeo de coacutedigo percebeu-se que estas natildeo satildeo utilizadas de forma con-sideraacutevel pelos projetos estudados e para fins de anaacutelises generalizadas natildeo apresentaramtanta influecircncia na utilizaccedilatildeo de expressotildees lambda quanto a quantidade de AICs noprojeto

53 Estudos de Caso

Dentre os projetos analisados verificou-se que os projetos de pequeno e meacutedio porte op-taram por refatorar de uma vez seus coacutedigos para incluir expressotildees lambda em situaccedilotildeesem que se utilizava AICs anteriormente ou em alguns poucos casos de utilizaccedilatildeo deCollection Os projetos de grande porte natildeo apresentaram nenhuma refatoraccedilatildeo de coacute-digo ou uma refatoraccedilatildeo parcial gradativa provavelmente devido agrave grande quantidade dearquivos e coacutedigo que possuem o que pode tornar o trabalho de refatoraccedilatildeo extenso ecansativo

O projeto vertx que pertence ao grupo 2 dos projetos em que a quantidade de ex-pressotildees lambda aumentaram e as de AICs diminuiacuteram com lambda ultrapassando AICsexecutou inicialmente commits em maio de 2014 com adiccedilatildeo de coacutedigo novo utilizandoexpressotildees lambda e apoacutes um mecircs realizou um commit maior com a refatoraccedilatildeo de todasas AICs para expressotildees lambda Apoacutes a refatoraccedilatildeo o projeto se preocupou em mantera utilizaccedilatildeo de expressotildees lambda ao mesmo tempo que o uso de AICs se manteve apenasaos casos de classes com interfaces natildeo funcionais A Figura 58 apresenta uma parte docommit de refatoraccedilatildeo de coacutedigo que mostra em vermelho a parte eliminada do coacutedigo(AIC) e em verde o coacutedigo novo representando a substituiccedilatildeo por uma expressatildeo lambda

41

Figura 58 Commit de refatoraccedilatildeo de coacutedigo do projeto Vertx [3]

Alguns projetos ainda natildeo se preocuparam em refatorar o coacutedigo para o uso de ex-pressotildees lambda ateacute a data deste trabalho que eacute o caso do projeto guava que apresentouum commit em 03112016 com a atualizaccedilatildeo do projeto para Java 8 Mas a partir daatualizaccedilatildeo se preocupou em utilizar as expressotildees lambda apenas na implementaccedilatildeo decoacutedigo novo O cenaacuterio em que a refatoraccedilatildeo natildeo eacute prioridade ainda eacute a realidade de vaacuteriosprojetos de grande porte visto que os dados de projetos sem nenhuma expressatildeo lambdasatildeo o maior nuacutemero neste trabalho Poreacutem projetos que jaacute adotaram a utilizaccedilatildeo do Java8 tendem a mudar isso com o passar do tempo A Figura 59 apresenta em verde umaadiccedilatildeo de coacutedigo novo com expressatildeo lambda sem a eliminaccedilatildeo de algum coacutedigo anteriora esse que estaria em vermelho

42

Figura 59 Exemplo de um arquivo do commit de adiccedilatildeo de coacutedigo novo em Java 8 doprojeto Guava [4]

Na categoria de projetos em que os AICs e expressotildees lambda aumentam proporci-onalmente (grupo 1) o projeto agera realizou um commit em 19052016 com a adiccedilatildeoda biblioteca retrolambda como dependecircncia do projeto Essa biblioteca utilizada prin-cipalmente por projetos Android permite executar coacutedigo Java 8 contendo expressotildeeslambda em Java 5 6 e 7 [48] O commit tambeacutem apresenta refatoraccedilatildeo dos AICs ad-vindos de interfaces funcionais para expressotildees lambda Apesar de o projeto continuar autilizar as expressotildees lambda em seus commits posteriores o nuacutemero de AICs tambeacutemcontinuou a aumentar visualizando os commits posteriores notou-se que esses AICs satildeorelativos a interfaces natildeo funcionais ou seja que possuem mais de um meacutetodo O projetoAndroid-CleanArchitecture eacute similar ao agera pois tambeacutem optou pela instalaccedilatildeo da bi-blioteca retrolambda para uso de expressotildees lambda em seus coacutedigos e como tambeacutem eacuteum projeto de pequeno porte houve uma pequena refatoraccedilatildeo dos AICs A Figura 510mostra a parte do commit de refatoraccedilatildeo de coacutedigo em que o desenvolvedor adiciona abiblioteca retrolambda como dependecircncia

43

Figura 510 Commit de adiccedilatildeo da biblioteca Retrolambda no projeto Agera [5]

Outro caso interessante eacute o do projeto RxJava que em 2015 optou pela refatoraccedilatildeodo coacutedigo para a utilizaccedilatildeo de expressotildees lambda quase eliminando por completo o usode AICs mas que no ano seguinte reverteu os commits de forma que eliminasse comple-tamente o uso de expressotildees lambda para manter a retrocompatibilidade com o Java 6A Figura 511 demonstra uma parte do commit de reversatildeo do coacutedigo para Java 6 emque pode ser visto em vermelho o coacutedigo anterior com expressotildees lambda e o verde como novo coacutedigo utilizando AIC novamente

44

Figura 511 Commit de remoccedilatildeo de Lambdas e volta para o uso de AICs no projetoRXJava [6]

Essa preocupaccedilatildeo com retrocompatibilidade de coacutedigo pode ser um fator crucial nadecisatildeo das equipes de desenvolvimento na hora de decidir como fazer o software co-evoluircom a linguagem sem perder a compatibilidade com versotildees anteriores

45

Capiacutetulo 6

Consideraccedilotildees Finais

Este estudo permitiu entender melhor como projetos estatildeo realizando a migraccedilatildeo para oJava 8 em especial utilizando uma nova caracteriacutestica introduzida expressatildeo lambdaApesar de a maioria dos projetos populares considerados natildeo possuiacuterem nenhuma ocor-recircncia de expressotildees lambda os projetos que tinham expressotildees lambda foram suficientespara realizar um primeiro estudo de caracterizaccedilatildeo no uso desta caracteriacutestica e com osprojetos efetivamente utilizados para estudo foi possiacutevel agrupaacute-los quanto a maneira emque as expressotildees lambda estavam sendo utilizadas quando comparadas com AICs em 5grandes grupos quando AIC e lambda aumentam proporcionalmente quando AIC dimi-nui e lambda aumenta ultrapassando AIC quando AIC diminui mas continua superior aolambda crescente expressotildees lambda que foram introduzidas e retiradas completamentedo coacutedigo e expressotildees lambda que natildeo existem em quantidades expressivas

Foi possiacutevel entatildeo realizar um estudo aprofundado levando em consideraccedilatildeo as di-ferentes maneiras com que as expressotildees lambda foram adotadas nos projetos atraveacutes daescolha de um projeto que representasse cada grupo para anaacutelise Dentre os cinco projetosestudados foi possiacutevel observar alguns padrotildees tipicamente adotados por desenvolvedorespara implementar expressotildees lambda em seus projetos como a utilizaccedilatildeo da bibliotecas(retrolambda) que permitissem uma flexibilizaccedilatildeo na utilizaccedilatildeo de expressotildees lambda oucomo lambda eacute primariamente utilizada para substituir determinados AICs ou operaccedilotildeesem Collection

Aleacutem disso foi possiacutevel observar como a refatoraccedilatildeo de coacutedigo acontece em cada umdesses projetos Observou-se como projetos menores tendem a refatorar coacutedigo maisfacilmente ao passo que projetos maiores e mais complexos fazem menos refatoraccedilatildeo oudemoram mais entre o periacuteodo em que houve a primeira migraccedilatildeo de coacutedigo para a novaversatildeo da linguagem ateacute o periacuteodo em que realmente decidem refatorar coacutedigo Aleacutem dacomplexidade do projeto influenciar na decisatildeo de migrar o projeto para uma versatildeo maisrecente da linguagem a preocupaccedilatildeo com retrocompatibilidade com versotildees anteriores da

46

linguagem tambeacutem podem ser uma barreira para que projetos comecem a evoluir o coacutedigojuntamente com a evoluccedilatildeo da linguagem

Ainda assim foi possiacutevel observar que a preocupaccedilatildeo com a co-evoluccedilatildeo do software-linguagem existe entre os desenvolvedores de projetos mas a realizaccedilatildeo da migraccedilatildeo aindaacontece lentamente devido agrave diversos fatores que precisam ser levados em consideraccedilatildeopara a manutenccedilatildeo do projeto

Para trabalhos e contribuiccedilotildees futuras seria interessante desenvolver uma ferramentaque pudesse analisar diretamente no coacutedigo-fonte as oportunidades de aplicaccedilatildeo de ex-pressotildees lambda dessa forma poderiam ser analisadas as porcentagens de conversatildeo decoacutedigo para Java 8 e obter melhores conclusotildees sobre a importacircncia que os projetos estatildeodando para a evoluccedilatildeo de seus coacutedigos Outro fator interessante seria aplicar mais Visitorsagrave ferramenta static-analysis e fazer este mesmo estudo aplicado agrave outras caracteriacutesticasda linguagem

47

Referecircncias

[1] Kagdi Huzefa Michael L Collard e Jonathan I Maletic A survey and taxonomyof approaches for mining software repositories in the context of software evolution2007 ix 3 8 9 10 11

[2] DBeaver Dbeaver - features httpdbeaverjkissorgdocsfeatures ix 29

[3] Eclipse Vertx commit Java8-ify code httpsgithubcomeclipsevertxcommit93f95e9c77419f442a42fe711b6eeaef88192fd3 ix 42

[4] Google Guava commit Release java 8 changes to guava httpsgithubcomgoogleguavacommit73e382fa877f80994817a136b0adcc4365ccd904 ix 43

[5] Google Agera commit Collapsed testapp with retrolambda httpsgithubcomgoogleageracommit5e518b7b05f9e7a34a314945f68deff7b2c3e334 ix 44

[6] ReactiveX Rxjava commit 2x full jdk 6 compatible backport + includ-ing bugfixes up to today httpsgithubcomReactiveXRxJavacommit000a174d87a901135f9665d3b11f3627fd2dc4ed ix 45

[7] Godfrey M W e D M German The past present and future of software evolutionEm 2008 Frontiers of Maintenance paacuteginas 129ndash138 Sept 2008 1 6

[8] Favre J M Languages evolve too changing the software time scale Em Principles ofSoftware Evolution Eighth International Workshop on paacuteginas 33ndash42 IEEE 20051 5 7

[9] Overbey Jeffrey L e Ralph E Johnson Regrowing a language refactoring tools allowprogramming languages to evolve Em ACM SIGPLAN Notices volume 44 paacuteginas493ndash502 ACM 2009 1 5 7 8 12

[10] Grechanik Mark Collin McMillan Luca DeFerrari Marco Comi Stefano CrespiDenys Poshyvanyk Chen Fu Qing Xie e Carlo Ghezzi An empirical investiga-tion into a large-scale java open source code repository Em Proceedings of the2010 ACM-IEEE International Symposium on Empirical Software Engineering andMeasurement ESEM rsquo10 paacuteginas 111ndash1110 New York NY USA 2010 ACMISBN 978-1-4503-0039-1 httpdoiacmorg10114518527861852801 1

[11] TIOBE Tiobe httpswwwtiobecomtiobe-index 1 14

48

[12] Gyori Alex Lyle Franklin Danny Dig e Jan Lahoda Crossing the gap from im-perative to functional programming through refactoring Em Proceedings of the 20139th Joint Meeting on Foundations of Software Engineering ESECFSE 2013 paacute-ginas 543ndash553 New York NY USA 2013 ACM ISBN 978-1-4503-2237-9 httpdoiacmorg10114524914112491461 2 11 24 39

[13] OpenJDK State of the lambda httpcropenjdkjavanet~briangoetzlambdalambda-state-4html 2

[14] Han Jiawei Micheline Kamber e Jian Pei Data Mining Concepts and TechniquesMorgan Kaufmann Publishers Inc San Francisco CA USA 3rd ediccedilatildeo 2011ISBN 0123814790 9780123814791 3

[15] Fowler Martin e Kent Beck Refactoring improving the design of existing codeAddison-Wesley Professional 1999 5 7

[16] Lehman M M J F Ramil P D Wernick D E Perry e W M Turski Met-rics and laws of software evolution - the nineties view Em Proceedings of the4th International Symposium on Software Metrics METRICS rsquo97 paacuteginas 20ndashWashington DC USA 1997 IEEE Computer Society ISBN 0-8186-8093-8 httpdlacmorgcitationcfmid=823454823901 6

[17] Hassan Ahmed E e Tao Xie Software intelligence The future of mining softwareengineering data Em Proceedings of the FSESDP Workshop on Future of SoftwareEngineering Research FoSER rsquo10 paacuteginas 161ndash166 New York NY USA 2010ACM ISBN 978-1-4503-0427-6 httpdoiacmorg101145188236218823978 9

[18] Hassan Ahmed E The road ahead for mining software repositories Em Frontiers ofSoftware Maintenance 2008 FoSM 2008 paacuteginas 48ndash57 IEEE 2008 8

[19] Berry Michael J e Gordon Linoff Data Mining Techniques For Marketing Salesand Customer Support John Wiley amp Sons Inc New York NY USA 1997ISBN 0471179809 10

[20] Parnin Chris Christian Bird e Emerson Murphy-Hill Java generics adoption hownew features are introduced championed or ignored Em Proceedings of the 8thWorking Conference on Mining Software Repositories paacuteginas 3ndash12 ACM 2011 12

[21] Oracle The java language specification httpsdocsoraclecomjavasespecsjlsse8jls8pdf 13

[22] Oracle The history of java technology httpwwworaclecomtechnetworkjavajavaseoverviewjavahistory-index-198355html 13

[23] Murphy Kieron So why did they decide to call itjava httpwwwjavaworldcomarticle2077265core-javaso-why-did-they-decide-to-call-it-java-html 13

[24] McGraw Tata Object-oriented Programming with Java Essentials and ApplicationsHill Education 13

49

[25] Oracle Differences between java ee and java se httpdocsoraclecomjavaee6firstcupdocgkhoyhtml 13

[26] Lindsey Clark S The History of Java Cambridge 14

[27] Oracle The java language environment httpwwworaclecomtechnetworkjavaintro-141325html 14

[28] Oracle Jdk 8 httpopenjdkjavanetprojectsjdk8 15 24

[29] Oracle Enhancements in java se 8 httpdocsoraclecomjavase8docstechnotesguideslanguageenhancementshtmljavase8 15 16 17

[30] Oracle Lambda expressions httpdocsoraclecomjavasetutorialjavajavaOOlambdaexpressionshtml 16 18 21

[31] Oracle Method references httpdocsoraclecomjavasetutorialjavajavaOOmethodreferenceshtml 16

[32] Oracle Default methods httpdocsoraclecomjavasetutorialjavaIandIdefaultmethodshtml 17

[33] Oracle Repeating annotations httpdocsoraclecomjavasetutorialjavaannotationsrepeatinghtml 17

[34] Oracle Type annotations httpdocsoraclecomjavasetutorialjavaannotationstype_annotationshtml 17

[35] Oracle Anonymous inner classes httpsdocsoraclecomjavasetutorialjavajavaOOanonymousclasseshtml 19

[36] Kothari CR Research Methodology Methods and Techniques New Age Interna-tional (P) Limited 2004 ISBN 9788122415223 httpsbooksgooglecombrbooksid=8c6gkbKi-F4C 22

[37] Nakakoji Kumiyo Yasuhiro Yamamoto Yoshiyuki Nishinaka Kouichi Kishida eYunwen Ye Evolution patterns of open-source software systems and communitiesEm IWPSE rsquo02 Proceedings of the International Workshop on Principles of SoftwareEvolution paacuteginas 76ndash85 New York NY USA 2002 ACM Press ISBN 1581135459httpdxdoiorg101145512035512055 23

[38] Rahman Foyzur Christian Bird e Premkumar Devanbu Clones What is that smellEmpirical Software Engineering 17(4-5)503ndash530 2012 24

[39] Chacon Scott Pro Git Apress Berkely CA USA 1st ediccedilatildeo 2009ISBN 1430218339 9781430218333 25

[40] Cavalcanti Thiago Gomes e Viniacutecius Correa de Almeida Caracterizaccedilatildeo do uso deconstruccedilotildees da linguagem java em projetos open-source Publicaccedilatildeo online 2016httpbdmunbbrhandle1048315733 27

50

[41] Parr Terence Language Implementation Patterns Create Your Own Domain-Specific and General Programming Languages Pragmatic Bookshelf 1st ediccedilatildeo 2009ISBN 193435645X 9781934356456 27

[42] Janssen Thorben 5 reasons to use jpa hibernate Publicaccedilatildeo online httpswwwsitepointcom5-reasons-to-use-jpa-hibernate 27

[43] Franklin Lyle Alex Gyori Jan Lahoda e Danny Dig Lambdaficator From imperativeto functional programming through automated refactoring Em Proceedings of the2013 International Conference on Software Engineering ICSE rsquo13 paacuteginas 1287ndash1290 Piscataway NJ USA 2013 IEEE Press ISBN 978-1-4673-3076-3 httpdlacmorgcitationcfmid=24867882486986 29

[44] Google Agera httpsgithubcomgoogleagerawiki 34

[45] Eclipse Eclipse vertx httpvertxio 35

[46] Cejas Fernando Android cleanarchitecture httpsgithubcomandroid10Android-CleanArchitecture 36

[47] ReactiveX Rxjava httpsgithubcomReactiveXRxJava 37

[48] Luontola Esko Retrolambda httpsgithubcomorfjackalretrolambda 43

51

Anexo I

Projetos utilizados

fastjson

platform_frameworks_base

netty

material-dialogs

kotlin

okhttp

tinker

AndroidUtilCode

RxJava

spring-boot

java-design-patterns

elasticsearch

ExoPlayer

kafka

vertx

realm-java

guava

zipkin

bazel

stetho

Signal-Android

glide

agera

fresco

plaid

presto

libgdx

spark

52

disruptor

lottie-android

flexbox-layout

PocketHub

zxing

spring-framework

deeplearning4j

dropwizard

interviews

BaseRecyclerViewAdapterHelper

uCrop

DanmakuFlameMaster

lottie-react-native

android-UniversalMusicPlayer

AndroidInterview-Q-A

greenDAO

retrofit

MaterialDrawer

BottomBar

druid

MPAndroidChart

Hystrix

guice

recyclerview-animators

dubbo

androidannotations

RxJava-Android-Samples

PhotoView

clojure

CircleImageView

AndroidSwipeLayout

jedis

MaterialViewPager

butterknife

junit4

RxBinding

leakcanary

SimianArmy

picasso

UltimateRecyclerView

53

AndroidViewAnimations

AppIntro

FizzBuzzEnterpriseEdition

ion

cheesesquare

physical-web

RxAndroid

Android-CleanArchitecture

Calligraphy

Android-Bootstrap

iosched

Android_Data

MaterialDesignLibrary

ListViewAnimations

EventBus

java8-tutorial

AndroidSlidingUpPanel

dagger

okhttputils

logger

HomeMirror

Material-Animations

android-Ultra-Pull-To-Refresh

android-async-http

Android-ObservableScrollView

Android-Universal-Image-Loader

ActionBarSherlock

SlidingMenu

storm

PagerSlidingTabStrip

Android-PullToRefresh

54

  • Dedicatoacuteria
  • Agradecimentos
  • Resumo
  • Abstract
  • Introduccedilatildeo
    • Contexto
    • Objetivos
      • Objetivos Gerais
      • Objetivos Especiacuteficos
        • Metodologia
        • Organizaccedilatildeo do Trabalho
          • Evoluccedilatildeo e Mineraccedilatildeo de Repositoacuterios de Software
            • Evoluccedilatildeo de Software
            • MSR Mineraccedilatildeo de dados e a Engenharia de Software
              • Classificaccedilatildeo
                • Trabalhos Relacionados
                  • Java SE 8 e JDK 8
                    • Histoacuterico
                    • Princiacutepios
                    • Evoluccedilatildeo
                    • Expressotildees Lambda
                      • Sintaxe
                      • Principais formas de uso
                          • Estudo e o Processo de Mineraccedilatildeo
                            • Questotildees de Pesquisa
                            • Fonte de Dados e Objetos de Estudo
                            • Processo de Mineraccedilatildeo
                              • static-analysis
                              • BDAnalisador
                                • Classificaccedilatildeo e Anaacutelise
                                  • Meacutedia de Lambda
                                  • Anaacutelise Temporal
                                  • Refatoraccedilatildeo de Coacutedigo
                                  • Casos de Uso
                                      • Resultados Obtidos e Anaacutelise
                                        • Visatildeo Geral
                                          • Projetos Selecionados
                                          • agera
                                          • vertx
                                          • Android-CleanArchitecture
                                          • RxJava
                                          • guava
                                            • Refatoraccedilatildeo de Coacutedigo
                                            • Estudos de Caso
                                              • Consideraccedilotildees Finais
                                              • Referecircncias
                                              • Anexo
                                              • Projetos utilizados

anterior permitem inferir que todas as outras expressotildees lambda existentes no projetopara este determinado mecircs de introduccedilatildeo encontram-se em coacutedigo novo introduzido

Eacute importante ressaltar que somente essa anaacutelise natildeo eacute exclusivamente suficiente paradeterminar se estes projetos estatildeo realmente introduzindo lambda em coacutedigo novo ourealizando refatoraccedilatildeo uma vez que como a comparaccedilatildeo aconteceu apenas no mecircs deintroduccedilatildeo com o mecircs imediatamente anterior natildeo reflete todo o ciclo de vida do pro-jeto Por exemplo algumas equipes podem escolher refatorar o coacutedigo depois de umtempo de adaptaccedilatildeo apoacutes a transiccedilatildeo para a nova versatildeo da linguagem Assim paraobter uma melhor anaacutelise sobre refatoraccedilatildeo de coacutedigo ou natildeo feita nestes projetos aleacutemde outras anaacutelises referentes aos padrotildees tipicamente adotados para implementaccedilatildeo delambda nestes projetos seratildeo apresentados a seguir os estudos de caso dos cinco projetospreviamente selecionados

Outro ponto importante eacute o fato de que apesar das informaccedilotildees quanto agraves quantida-des de filter e map terem sido incluiacutedas inicialmente no trabalho para observar possiacuteveispadrotildees de refatoraccedilatildeo de coacutedigo percebeu-se que estas natildeo satildeo utilizadas de forma con-sideraacutevel pelos projetos estudados e para fins de anaacutelises generalizadas natildeo apresentaramtanta influecircncia na utilizaccedilatildeo de expressotildees lambda quanto a quantidade de AICs noprojeto

53 Estudos de Caso

Dentre os projetos analisados verificou-se que os projetos de pequeno e meacutedio porte op-taram por refatorar de uma vez seus coacutedigos para incluir expressotildees lambda em situaccedilotildeesem que se utilizava AICs anteriormente ou em alguns poucos casos de utilizaccedilatildeo deCollection Os projetos de grande porte natildeo apresentaram nenhuma refatoraccedilatildeo de coacute-digo ou uma refatoraccedilatildeo parcial gradativa provavelmente devido agrave grande quantidade dearquivos e coacutedigo que possuem o que pode tornar o trabalho de refatoraccedilatildeo extenso ecansativo

O projeto vertx que pertence ao grupo 2 dos projetos em que a quantidade de ex-pressotildees lambda aumentaram e as de AICs diminuiacuteram com lambda ultrapassando AICsexecutou inicialmente commits em maio de 2014 com adiccedilatildeo de coacutedigo novo utilizandoexpressotildees lambda e apoacutes um mecircs realizou um commit maior com a refatoraccedilatildeo de todasas AICs para expressotildees lambda Apoacutes a refatoraccedilatildeo o projeto se preocupou em mantera utilizaccedilatildeo de expressotildees lambda ao mesmo tempo que o uso de AICs se manteve apenasaos casos de classes com interfaces natildeo funcionais A Figura 58 apresenta uma parte docommit de refatoraccedilatildeo de coacutedigo que mostra em vermelho a parte eliminada do coacutedigo(AIC) e em verde o coacutedigo novo representando a substituiccedilatildeo por uma expressatildeo lambda

41

Figura 58 Commit de refatoraccedilatildeo de coacutedigo do projeto Vertx [3]

Alguns projetos ainda natildeo se preocuparam em refatorar o coacutedigo para o uso de ex-pressotildees lambda ateacute a data deste trabalho que eacute o caso do projeto guava que apresentouum commit em 03112016 com a atualizaccedilatildeo do projeto para Java 8 Mas a partir daatualizaccedilatildeo se preocupou em utilizar as expressotildees lambda apenas na implementaccedilatildeo decoacutedigo novo O cenaacuterio em que a refatoraccedilatildeo natildeo eacute prioridade ainda eacute a realidade de vaacuteriosprojetos de grande porte visto que os dados de projetos sem nenhuma expressatildeo lambdasatildeo o maior nuacutemero neste trabalho Poreacutem projetos que jaacute adotaram a utilizaccedilatildeo do Java8 tendem a mudar isso com o passar do tempo A Figura 59 apresenta em verde umaadiccedilatildeo de coacutedigo novo com expressatildeo lambda sem a eliminaccedilatildeo de algum coacutedigo anteriora esse que estaria em vermelho

42

Figura 59 Exemplo de um arquivo do commit de adiccedilatildeo de coacutedigo novo em Java 8 doprojeto Guava [4]

Na categoria de projetos em que os AICs e expressotildees lambda aumentam proporci-onalmente (grupo 1) o projeto agera realizou um commit em 19052016 com a adiccedilatildeoda biblioteca retrolambda como dependecircncia do projeto Essa biblioteca utilizada prin-cipalmente por projetos Android permite executar coacutedigo Java 8 contendo expressotildeeslambda em Java 5 6 e 7 [48] O commit tambeacutem apresenta refatoraccedilatildeo dos AICs ad-vindos de interfaces funcionais para expressotildees lambda Apesar de o projeto continuar autilizar as expressotildees lambda em seus commits posteriores o nuacutemero de AICs tambeacutemcontinuou a aumentar visualizando os commits posteriores notou-se que esses AICs satildeorelativos a interfaces natildeo funcionais ou seja que possuem mais de um meacutetodo O projetoAndroid-CleanArchitecture eacute similar ao agera pois tambeacutem optou pela instalaccedilatildeo da bi-blioteca retrolambda para uso de expressotildees lambda em seus coacutedigos e como tambeacutem eacuteum projeto de pequeno porte houve uma pequena refatoraccedilatildeo dos AICs A Figura 510mostra a parte do commit de refatoraccedilatildeo de coacutedigo em que o desenvolvedor adiciona abiblioteca retrolambda como dependecircncia

43

Figura 510 Commit de adiccedilatildeo da biblioteca Retrolambda no projeto Agera [5]

Outro caso interessante eacute o do projeto RxJava que em 2015 optou pela refatoraccedilatildeodo coacutedigo para a utilizaccedilatildeo de expressotildees lambda quase eliminando por completo o usode AICs mas que no ano seguinte reverteu os commits de forma que eliminasse comple-tamente o uso de expressotildees lambda para manter a retrocompatibilidade com o Java 6A Figura 511 demonstra uma parte do commit de reversatildeo do coacutedigo para Java 6 emque pode ser visto em vermelho o coacutedigo anterior com expressotildees lambda e o verde como novo coacutedigo utilizando AIC novamente

44

Figura 511 Commit de remoccedilatildeo de Lambdas e volta para o uso de AICs no projetoRXJava [6]

Essa preocupaccedilatildeo com retrocompatibilidade de coacutedigo pode ser um fator crucial nadecisatildeo das equipes de desenvolvimento na hora de decidir como fazer o software co-evoluircom a linguagem sem perder a compatibilidade com versotildees anteriores

45

Capiacutetulo 6

Consideraccedilotildees Finais

Este estudo permitiu entender melhor como projetos estatildeo realizando a migraccedilatildeo para oJava 8 em especial utilizando uma nova caracteriacutestica introduzida expressatildeo lambdaApesar de a maioria dos projetos populares considerados natildeo possuiacuterem nenhuma ocor-recircncia de expressotildees lambda os projetos que tinham expressotildees lambda foram suficientespara realizar um primeiro estudo de caracterizaccedilatildeo no uso desta caracteriacutestica e com osprojetos efetivamente utilizados para estudo foi possiacutevel agrupaacute-los quanto a maneira emque as expressotildees lambda estavam sendo utilizadas quando comparadas com AICs em 5grandes grupos quando AIC e lambda aumentam proporcionalmente quando AIC dimi-nui e lambda aumenta ultrapassando AIC quando AIC diminui mas continua superior aolambda crescente expressotildees lambda que foram introduzidas e retiradas completamentedo coacutedigo e expressotildees lambda que natildeo existem em quantidades expressivas

Foi possiacutevel entatildeo realizar um estudo aprofundado levando em consideraccedilatildeo as di-ferentes maneiras com que as expressotildees lambda foram adotadas nos projetos atraveacutes daescolha de um projeto que representasse cada grupo para anaacutelise Dentre os cinco projetosestudados foi possiacutevel observar alguns padrotildees tipicamente adotados por desenvolvedorespara implementar expressotildees lambda em seus projetos como a utilizaccedilatildeo da bibliotecas(retrolambda) que permitissem uma flexibilizaccedilatildeo na utilizaccedilatildeo de expressotildees lambda oucomo lambda eacute primariamente utilizada para substituir determinados AICs ou operaccedilotildeesem Collection

Aleacutem disso foi possiacutevel observar como a refatoraccedilatildeo de coacutedigo acontece em cada umdesses projetos Observou-se como projetos menores tendem a refatorar coacutedigo maisfacilmente ao passo que projetos maiores e mais complexos fazem menos refatoraccedilatildeo oudemoram mais entre o periacuteodo em que houve a primeira migraccedilatildeo de coacutedigo para a novaversatildeo da linguagem ateacute o periacuteodo em que realmente decidem refatorar coacutedigo Aleacutem dacomplexidade do projeto influenciar na decisatildeo de migrar o projeto para uma versatildeo maisrecente da linguagem a preocupaccedilatildeo com retrocompatibilidade com versotildees anteriores da

46

linguagem tambeacutem podem ser uma barreira para que projetos comecem a evoluir o coacutedigojuntamente com a evoluccedilatildeo da linguagem

Ainda assim foi possiacutevel observar que a preocupaccedilatildeo com a co-evoluccedilatildeo do software-linguagem existe entre os desenvolvedores de projetos mas a realizaccedilatildeo da migraccedilatildeo aindaacontece lentamente devido agrave diversos fatores que precisam ser levados em consideraccedilatildeopara a manutenccedilatildeo do projeto

Para trabalhos e contribuiccedilotildees futuras seria interessante desenvolver uma ferramentaque pudesse analisar diretamente no coacutedigo-fonte as oportunidades de aplicaccedilatildeo de ex-pressotildees lambda dessa forma poderiam ser analisadas as porcentagens de conversatildeo decoacutedigo para Java 8 e obter melhores conclusotildees sobre a importacircncia que os projetos estatildeodando para a evoluccedilatildeo de seus coacutedigos Outro fator interessante seria aplicar mais Visitorsagrave ferramenta static-analysis e fazer este mesmo estudo aplicado agrave outras caracteriacutesticasda linguagem

47

Referecircncias

[1] Kagdi Huzefa Michael L Collard e Jonathan I Maletic A survey and taxonomyof approaches for mining software repositories in the context of software evolution2007 ix 3 8 9 10 11

[2] DBeaver Dbeaver - features httpdbeaverjkissorgdocsfeatures ix 29

[3] Eclipse Vertx commit Java8-ify code httpsgithubcomeclipsevertxcommit93f95e9c77419f442a42fe711b6eeaef88192fd3 ix 42

[4] Google Guava commit Release java 8 changes to guava httpsgithubcomgoogleguavacommit73e382fa877f80994817a136b0adcc4365ccd904 ix 43

[5] Google Agera commit Collapsed testapp with retrolambda httpsgithubcomgoogleageracommit5e518b7b05f9e7a34a314945f68deff7b2c3e334 ix 44

[6] ReactiveX Rxjava commit 2x full jdk 6 compatible backport + includ-ing bugfixes up to today httpsgithubcomReactiveXRxJavacommit000a174d87a901135f9665d3b11f3627fd2dc4ed ix 45

[7] Godfrey M W e D M German The past present and future of software evolutionEm 2008 Frontiers of Maintenance paacuteginas 129ndash138 Sept 2008 1 6

[8] Favre J M Languages evolve too changing the software time scale Em Principles ofSoftware Evolution Eighth International Workshop on paacuteginas 33ndash42 IEEE 20051 5 7

[9] Overbey Jeffrey L e Ralph E Johnson Regrowing a language refactoring tools allowprogramming languages to evolve Em ACM SIGPLAN Notices volume 44 paacuteginas493ndash502 ACM 2009 1 5 7 8 12

[10] Grechanik Mark Collin McMillan Luca DeFerrari Marco Comi Stefano CrespiDenys Poshyvanyk Chen Fu Qing Xie e Carlo Ghezzi An empirical investiga-tion into a large-scale java open source code repository Em Proceedings of the2010 ACM-IEEE International Symposium on Empirical Software Engineering andMeasurement ESEM rsquo10 paacuteginas 111ndash1110 New York NY USA 2010 ACMISBN 978-1-4503-0039-1 httpdoiacmorg10114518527861852801 1

[11] TIOBE Tiobe httpswwwtiobecomtiobe-index 1 14

48

[12] Gyori Alex Lyle Franklin Danny Dig e Jan Lahoda Crossing the gap from im-perative to functional programming through refactoring Em Proceedings of the 20139th Joint Meeting on Foundations of Software Engineering ESECFSE 2013 paacute-ginas 543ndash553 New York NY USA 2013 ACM ISBN 978-1-4503-2237-9 httpdoiacmorg10114524914112491461 2 11 24 39

[13] OpenJDK State of the lambda httpcropenjdkjavanet~briangoetzlambdalambda-state-4html 2

[14] Han Jiawei Micheline Kamber e Jian Pei Data Mining Concepts and TechniquesMorgan Kaufmann Publishers Inc San Francisco CA USA 3rd ediccedilatildeo 2011ISBN 0123814790 9780123814791 3

[15] Fowler Martin e Kent Beck Refactoring improving the design of existing codeAddison-Wesley Professional 1999 5 7

[16] Lehman M M J F Ramil P D Wernick D E Perry e W M Turski Met-rics and laws of software evolution - the nineties view Em Proceedings of the4th International Symposium on Software Metrics METRICS rsquo97 paacuteginas 20ndashWashington DC USA 1997 IEEE Computer Society ISBN 0-8186-8093-8 httpdlacmorgcitationcfmid=823454823901 6

[17] Hassan Ahmed E e Tao Xie Software intelligence The future of mining softwareengineering data Em Proceedings of the FSESDP Workshop on Future of SoftwareEngineering Research FoSER rsquo10 paacuteginas 161ndash166 New York NY USA 2010ACM ISBN 978-1-4503-0427-6 httpdoiacmorg101145188236218823978 9

[18] Hassan Ahmed E The road ahead for mining software repositories Em Frontiers ofSoftware Maintenance 2008 FoSM 2008 paacuteginas 48ndash57 IEEE 2008 8

[19] Berry Michael J e Gordon Linoff Data Mining Techniques For Marketing Salesand Customer Support John Wiley amp Sons Inc New York NY USA 1997ISBN 0471179809 10

[20] Parnin Chris Christian Bird e Emerson Murphy-Hill Java generics adoption hownew features are introduced championed or ignored Em Proceedings of the 8thWorking Conference on Mining Software Repositories paacuteginas 3ndash12 ACM 2011 12

[21] Oracle The java language specification httpsdocsoraclecomjavasespecsjlsse8jls8pdf 13

[22] Oracle The history of java technology httpwwworaclecomtechnetworkjavajavaseoverviewjavahistory-index-198355html 13

[23] Murphy Kieron So why did they decide to call itjava httpwwwjavaworldcomarticle2077265core-javaso-why-did-they-decide-to-call-it-java-html 13

[24] McGraw Tata Object-oriented Programming with Java Essentials and ApplicationsHill Education 13

49

[25] Oracle Differences between java ee and java se httpdocsoraclecomjavaee6firstcupdocgkhoyhtml 13

[26] Lindsey Clark S The History of Java Cambridge 14

[27] Oracle The java language environment httpwwworaclecomtechnetworkjavaintro-141325html 14

[28] Oracle Jdk 8 httpopenjdkjavanetprojectsjdk8 15 24

[29] Oracle Enhancements in java se 8 httpdocsoraclecomjavase8docstechnotesguideslanguageenhancementshtmljavase8 15 16 17

[30] Oracle Lambda expressions httpdocsoraclecomjavasetutorialjavajavaOOlambdaexpressionshtml 16 18 21

[31] Oracle Method references httpdocsoraclecomjavasetutorialjavajavaOOmethodreferenceshtml 16

[32] Oracle Default methods httpdocsoraclecomjavasetutorialjavaIandIdefaultmethodshtml 17

[33] Oracle Repeating annotations httpdocsoraclecomjavasetutorialjavaannotationsrepeatinghtml 17

[34] Oracle Type annotations httpdocsoraclecomjavasetutorialjavaannotationstype_annotationshtml 17

[35] Oracle Anonymous inner classes httpsdocsoraclecomjavasetutorialjavajavaOOanonymousclasseshtml 19

[36] Kothari CR Research Methodology Methods and Techniques New Age Interna-tional (P) Limited 2004 ISBN 9788122415223 httpsbooksgooglecombrbooksid=8c6gkbKi-F4C 22

[37] Nakakoji Kumiyo Yasuhiro Yamamoto Yoshiyuki Nishinaka Kouichi Kishida eYunwen Ye Evolution patterns of open-source software systems and communitiesEm IWPSE rsquo02 Proceedings of the International Workshop on Principles of SoftwareEvolution paacuteginas 76ndash85 New York NY USA 2002 ACM Press ISBN 1581135459httpdxdoiorg101145512035512055 23

[38] Rahman Foyzur Christian Bird e Premkumar Devanbu Clones What is that smellEmpirical Software Engineering 17(4-5)503ndash530 2012 24

[39] Chacon Scott Pro Git Apress Berkely CA USA 1st ediccedilatildeo 2009ISBN 1430218339 9781430218333 25

[40] Cavalcanti Thiago Gomes e Viniacutecius Correa de Almeida Caracterizaccedilatildeo do uso deconstruccedilotildees da linguagem java em projetos open-source Publicaccedilatildeo online 2016httpbdmunbbrhandle1048315733 27

50

[41] Parr Terence Language Implementation Patterns Create Your Own Domain-Specific and General Programming Languages Pragmatic Bookshelf 1st ediccedilatildeo 2009ISBN 193435645X 9781934356456 27

[42] Janssen Thorben 5 reasons to use jpa hibernate Publicaccedilatildeo online httpswwwsitepointcom5-reasons-to-use-jpa-hibernate 27

[43] Franklin Lyle Alex Gyori Jan Lahoda e Danny Dig Lambdaficator From imperativeto functional programming through automated refactoring Em Proceedings of the2013 International Conference on Software Engineering ICSE rsquo13 paacuteginas 1287ndash1290 Piscataway NJ USA 2013 IEEE Press ISBN 978-1-4673-3076-3 httpdlacmorgcitationcfmid=24867882486986 29

[44] Google Agera httpsgithubcomgoogleagerawiki 34

[45] Eclipse Eclipse vertx httpvertxio 35

[46] Cejas Fernando Android cleanarchitecture httpsgithubcomandroid10Android-CleanArchitecture 36

[47] ReactiveX Rxjava httpsgithubcomReactiveXRxJava 37

[48] Luontola Esko Retrolambda httpsgithubcomorfjackalretrolambda 43

51

Anexo I

Projetos utilizados

fastjson

platform_frameworks_base

netty

material-dialogs

kotlin

okhttp

tinker

AndroidUtilCode

RxJava

spring-boot

java-design-patterns

elasticsearch

ExoPlayer

kafka

vertx

realm-java

guava

zipkin

bazel

stetho

Signal-Android

glide

agera

fresco

plaid

presto

libgdx

spark

52

disruptor

lottie-android

flexbox-layout

PocketHub

zxing

spring-framework

deeplearning4j

dropwizard

interviews

BaseRecyclerViewAdapterHelper

uCrop

DanmakuFlameMaster

lottie-react-native

android-UniversalMusicPlayer

AndroidInterview-Q-A

greenDAO

retrofit

MaterialDrawer

BottomBar

druid

MPAndroidChart

Hystrix

guice

recyclerview-animators

dubbo

androidannotations

RxJava-Android-Samples

PhotoView

clojure

CircleImageView

AndroidSwipeLayout

jedis

MaterialViewPager

butterknife

junit4

RxBinding

leakcanary

SimianArmy

picasso

UltimateRecyclerView

53

AndroidViewAnimations

AppIntro

FizzBuzzEnterpriseEdition

ion

cheesesquare

physical-web

RxAndroid

Android-CleanArchitecture

Calligraphy

Android-Bootstrap

iosched

Android_Data

MaterialDesignLibrary

ListViewAnimations

EventBus

java8-tutorial

AndroidSlidingUpPanel

dagger

okhttputils

logger

HomeMirror

Material-Animations

android-Ultra-Pull-To-Refresh

android-async-http

Android-ObservableScrollView

Android-Universal-Image-Loader

ActionBarSherlock

SlidingMenu

storm

PagerSlidingTabStrip

Android-PullToRefresh

54

  • Dedicatoacuteria
  • Agradecimentos
  • Resumo
  • Abstract
  • Introduccedilatildeo
    • Contexto
    • Objetivos
      • Objetivos Gerais
      • Objetivos Especiacuteficos
        • Metodologia
        • Organizaccedilatildeo do Trabalho
          • Evoluccedilatildeo e Mineraccedilatildeo de Repositoacuterios de Software
            • Evoluccedilatildeo de Software
            • MSR Mineraccedilatildeo de dados e a Engenharia de Software
              • Classificaccedilatildeo
                • Trabalhos Relacionados
                  • Java SE 8 e JDK 8
                    • Histoacuterico
                    • Princiacutepios
                    • Evoluccedilatildeo
                    • Expressotildees Lambda
                      • Sintaxe
                      • Principais formas de uso
                          • Estudo e o Processo de Mineraccedilatildeo
                            • Questotildees de Pesquisa
                            • Fonte de Dados e Objetos de Estudo
                            • Processo de Mineraccedilatildeo
                              • static-analysis
                              • BDAnalisador
                                • Classificaccedilatildeo e Anaacutelise
                                  • Meacutedia de Lambda
                                  • Anaacutelise Temporal
                                  • Refatoraccedilatildeo de Coacutedigo
                                  • Casos de Uso
                                      • Resultados Obtidos e Anaacutelise
                                        • Visatildeo Geral
                                          • Projetos Selecionados
                                          • agera
                                          • vertx
                                          • Android-CleanArchitecture
                                          • RxJava
                                          • guava
                                            • Refatoraccedilatildeo de Coacutedigo
                                            • Estudos de Caso
                                              • Consideraccedilotildees Finais
                                              • Referecircncias
                                              • Anexo
                                              • Projetos utilizados

Figura 58 Commit de refatoraccedilatildeo de coacutedigo do projeto Vertx [3]

Alguns projetos ainda natildeo se preocuparam em refatorar o coacutedigo para o uso de ex-pressotildees lambda ateacute a data deste trabalho que eacute o caso do projeto guava que apresentouum commit em 03112016 com a atualizaccedilatildeo do projeto para Java 8 Mas a partir daatualizaccedilatildeo se preocupou em utilizar as expressotildees lambda apenas na implementaccedilatildeo decoacutedigo novo O cenaacuterio em que a refatoraccedilatildeo natildeo eacute prioridade ainda eacute a realidade de vaacuteriosprojetos de grande porte visto que os dados de projetos sem nenhuma expressatildeo lambdasatildeo o maior nuacutemero neste trabalho Poreacutem projetos que jaacute adotaram a utilizaccedilatildeo do Java8 tendem a mudar isso com o passar do tempo A Figura 59 apresenta em verde umaadiccedilatildeo de coacutedigo novo com expressatildeo lambda sem a eliminaccedilatildeo de algum coacutedigo anteriora esse que estaria em vermelho

42

Figura 59 Exemplo de um arquivo do commit de adiccedilatildeo de coacutedigo novo em Java 8 doprojeto Guava [4]

Na categoria de projetos em que os AICs e expressotildees lambda aumentam proporci-onalmente (grupo 1) o projeto agera realizou um commit em 19052016 com a adiccedilatildeoda biblioteca retrolambda como dependecircncia do projeto Essa biblioteca utilizada prin-cipalmente por projetos Android permite executar coacutedigo Java 8 contendo expressotildeeslambda em Java 5 6 e 7 [48] O commit tambeacutem apresenta refatoraccedilatildeo dos AICs ad-vindos de interfaces funcionais para expressotildees lambda Apesar de o projeto continuar autilizar as expressotildees lambda em seus commits posteriores o nuacutemero de AICs tambeacutemcontinuou a aumentar visualizando os commits posteriores notou-se que esses AICs satildeorelativos a interfaces natildeo funcionais ou seja que possuem mais de um meacutetodo O projetoAndroid-CleanArchitecture eacute similar ao agera pois tambeacutem optou pela instalaccedilatildeo da bi-blioteca retrolambda para uso de expressotildees lambda em seus coacutedigos e como tambeacutem eacuteum projeto de pequeno porte houve uma pequena refatoraccedilatildeo dos AICs A Figura 510mostra a parte do commit de refatoraccedilatildeo de coacutedigo em que o desenvolvedor adiciona abiblioteca retrolambda como dependecircncia

43

Figura 510 Commit de adiccedilatildeo da biblioteca Retrolambda no projeto Agera [5]

Outro caso interessante eacute o do projeto RxJava que em 2015 optou pela refatoraccedilatildeodo coacutedigo para a utilizaccedilatildeo de expressotildees lambda quase eliminando por completo o usode AICs mas que no ano seguinte reverteu os commits de forma que eliminasse comple-tamente o uso de expressotildees lambda para manter a retrocompatibilidade com o Java 6A Figura 511 demonstra uma parte do commit de reversatildeo do coacutedigo para Java 6 emque pode ser visto em vermelho o coacutedigo anterior com expressotildees lambda e o verde como novo coacutedigo utilizando AIC novamente

44

Figura 511 Commit de remoccedilatildeo de Lambdas e volta para o uso de AICs no projetoRXJava [6]

Essa preocupaccedilatildeo com retrocompatibilidade de coacutedigo pode ser um fator crucial nadecisatildeo das equipes de desenvolvimento na hora de decidir como fazer o software co-evoluircom a linguagem sem perder a compatibilidade com versotildees anteriores

45

Capiacutetulo 6

Consideraccedilotildees Finais

Este estudo permitiu entender melhor como projetos estatildeo realizando a migraccedilatildeo para oJava 8 em especial utilizando uma nova caracteriacutestica introduzida expressatildeo lambdaApesar de a maioria dos projetos populares considerados natildeo possuiacuterem nenhuma ocor-recircncia de expressotildees lambda os projetos que tinham expressotildees lambda foram suficientespara realizar um primeiro estudo de caracterizaccedilatildeo no uso desta caracteriacutestica e com osprojetos efetivamente utilizados para estudo foi possiacutevel agrupaacute-los quanto a maneira emque as expressotildees lambda estavam sendo utilizadas quando comparadas com AICs em 5grandes grupos quando AIC e lambda aumentam proporcionalmente quando AIC dimi-nui e lambda aumenta ultrapassando AIC quando AIC diminui mas continua superior aolambda crescente expressotildees lambda que foram introduzidas e retiradas completamentedo coacutedigo e expressotildees lambda que natildeo existem em quantidades expressivas

Foi possiacutevel entatildeo realizar um estudo aprofundado levando em consideraccedilatildeo as di-ferentes maneiras com que as expressotildees lambda foram adotadas nos projetos atraveacutes daescolha de um projeto que representasse cada grupo para anaacutelise Dentre os cinco projetosestudados foi possiacutevel observar alguns padrotildees tipicamente adotados por desenvolvedorespara implementar expressotildees lambda em seus projetos como a utilizaccedilatildeo da bibliotecas(retrolambda) que permitissem uma flexibilizaccedilatildeo na utilizaccedilatildeo de expressotildees lambda oucomo lambda eacute primariamente utilizada para substituir determinados AICs ou operaccedilotildeesem Collection

Aleacutem disso foi possiacutevel observar como a refatoraccedilatildeo de coacutedigo acontece em cada umdesses projetos Observou-se como projetos menores tendem a refatorar coacutedigo maisfacilmente ao passo que projetos maiores e mais complexos fazem menos refatoraccedilatildeo oudemoram mais entre o periacuteodo em que houve a primeira migraccedilatildeo de coacutedigo para a novaversatildeo da linguagem ateacute o periacuteodo em que realmente decidem refatorar coacutedigo Aleacutem dacomplexidade do projeto influenciar na decisatildeo de migrar o projeto para uma versatildeo maisrecente da linguagem a preocupaccedilatildeo com retrocompatibilidade com versotildees anteriores da

46

linguagem tambeacutem podem ser uma barreira para que projetos comecem a evoluir o coacutedigojuntamente com a evoluccedilatildeo da linguagem

Ainda assim foi possiacutevel observar que a preocupaccedilatildeo com a co-evoluccedilatildeo do software-linguagem existe entre os desenvolvedores de projetos mas a realizaccedilatildeo da migraccedilatildeo aindaacontece lentamente devido agrave diversos fatores que precisam ser levados em consideraccedilatildeopara a manutenccedilatildeo do projeto

Para trabalhos e contribuiccedilotildees futuras seria interessante desenvolver uma ferramentaque pudesse analisar diretamente no coacutedigo-fonte as oportunidades de aplicaccedilatildeo de ex-pressotildees lambda dessa forma poderiam ser analisadas as porcentagens de conversatildeo decoacutedigo para Java 8 e obter melhores conclusotildees sobre a importacircncia que os projetos estatildeodando para a evoluccedilatildeo de seus coacutedigos Outro fator interessante seria aplicar mais Visitorsagrave ferramenta static-analysis e fazer este mesmo estudo aplicado agrave outras caracteriacutesticasda linguagem

47

Referecircncias

[1] Kagdi Huzefa Michael L Collard e Jonathan I Maletic A survey and taxonomyof approaches for mining software repositories in the context of software evolution2007 ix 3 8 9 10 11

[2] DBeaver Dbeaver - features httpdbeaverjkissorgdocsfeatures ix 29

[3] Eclipse Vertx commit Java8-ify code httpsgithubcomeclipsevertxcommit93f95e9c77419f442a42fe711b6eeaef88192fd3 ix 42

[4] Google Guava commit Release java 8 changes to guava httpsgithubcomgoogleguavacommit73e382fa877f80994817a136b0adcc4365ccd904 ix 43

[5] Google Agera commit Collapsed testapp with retrolambda httpsgithubcomgoogleageracommit5e518b7b05f9e7a34a314945f68deff7b2c3e334 ix 44

[6] ReactiveX Rxjava commit 2x full jdk 6 compatible backport + includ-ing bugfixes up to today httpsgithubcomReactiveXRxJavacommit000a174d87a901135f9665d3b11f3627fd2dc4ed ix 45

[7] Godfrey M W e D M German The past present and future of software evolutionEm 2008 Frontiers of Maintenance paacuteginas 129ndash138 Sept 2008 1 6

[8] Favre J M Languages evolve too changing the software time scale Em Principles ofSoftware Evolution Eighth International Workshop on paacuteginas 33ndash42 IEEE 20051 5 7

[9] Overbey Jeffrey L e Ralph E Johnson Regrowing a language refactoring tools allowprogramming languages to evolve Em ACM SIGPLAN Notices volume 44 paacuteginas493ndash502 ACM 2009 1 5 7 8 12

[10] Grechanik Mark Collin McMillan Luca DeFerrari Marco Comi Stefano CrespiDenys Poshyvanyk Chen Fu Qing Xie e Carlo Ghezzi An empirical investiga-tion into a large-scale java open source code repository Em Proceedings of the2010 ACM-IEEE International Symposium on Empirical Software Engineering andMeasurement ESEM rsquo10 paacuteginas 111ndash1110 New York NY USA 2010 ACMISBN 978-1-4503-0039-1 httpdoiacmorg10114518527861852801 1

[11] TIOBE Tiobe httpswwwtiobecomtiobe-index 1 14

48

[12] Gyori Alex Lyle Franklin Danny Dig e Jan Lahoda Crossing the gap from im-perative to functional programming through refactoring Em Proceedings of the 20139th Joint Meeting on Foundations of Software Engineering ESECFSE 2013 paacute-ginas 543ndash553 New York NY USA 2013 ACM ISBN 978-1-4503-2237-9 httpdoiacmorg10114524914112491461 2 11 24 39

[13] OpenJDK State of the lambda httpcropenjdkjavanet~briangoetzlambdalambda-state-4html 2

[14] Han Jiawei Micheline Kamber e Jian Pei Data Mining Concepts and TechniquesMorgan Kaufmann Publishers Inc San Francisco CA USA 3rd ediccedilatildeo 2011ISBN 0123814790 9780123814791 3

[15] Fowler Martin e Kent Beck Refactoring improving the design of existing codeAddison-Wesley Professional 1999 5 7

[16] Lehman M M J F Ramil P D Wernick D E Perry e W M Turski Met-rics and laws of software evolution - the nineties view Em Proceedings of the4th International Symposium on Software Metrics METRICS rsquo97 paacuteginas 20ndashWashington DC USA 1997 IEEE Computer Society ISBN 0-8186-8093-8 httpdlacmorgcitationcfmid=823454823901 6

[17] Hassan Ahmed E e Tao Xie Software intelligence The future of mining softwareengineering data Em Proceedings of the FSESDP Workshop on Future of SoftwareEngineering Research FoSER rsquo10 paacuteginas 161ndash166 New York NY USA 2010ACM ISBN 978-1-4503-0427-6 httpdoiacmorg101145188236218823978 9

[18] Hassan Ahmed E The road ahead for mining software repositories Em Frontiers ofSoftware Maintenance 2008 FoSM 2008 paacuteginas 48ndash57 IEEE 2008 8

[19] Berry Michael J e Gordon Linoff Data Mining Techniques For Marketing Salesand Customer Support John Wiley amp Sons Inc New York NY USA 1997ISBN 0471179809 10

[20] Parnin Chris Christian Bird e Emerson Murphy-Hill Java generics adoption hownew features are introduced championed or ignored Em Proceedings of the 8thWorking Conference on Mining Software Repositories paacuteginas 3ndash12 ACM 2011 12

[21] Oracle The java language specification httpsdocsoraclecomjavasespecsjlsse8jls8pdf 13

[22] Oracle The history of java technology httpwwworaclecomtechnetworkjavajavaseoverviewjavahistory-index-198355html 13

[23] Murphy Kieron So why did they decide to call itjava httpwwwjavaworldcomarticle2077265core-javaso-why-did-they-decide-to-call-it-java-html 13

[24] McGraw Tata Object-oriented Programming with Java Essentials and ApplicationsHill Education 13

49

[25] Oracle Differences between java ee and java se httpdocsoraclecomjavaee6firstcupdocgkhoyhtml 13

[26] Lindsey Clark S The History of Java Cambridge 14

[27] Oracle The java language environment httpwwworaclecomtechnetworkjavaintro-141325html 14

[28] Oracle Jdk 8 httpopenjdkjavanetprojectsjdk8 15 24

[29] Oracle Enhancements in java se 8 httpdocsoraclecomjavase8docstechnotesguideslanguageenhancementshtmljavase8 15 16 17

[30] Oracle Lambda expressions httpdocsoraclecomjavasetutorialjavajavaOOlambdaexpressionshtml 16 18 21

[31] Oracle Method references httpdocsoraclecomjavasetutorialjavajavaOOmethodreferenceshtml 16

[32] Oracle Default methods httpdocsoraclecomjavasetutorialjavaIandIdefaultmethodshtml 17

[33] Oracle Repeating annotations httpdocsoraclecomjavasetutorialjavaannotationsrepeatinghtml 17

[34] Oracle Type annotations httpdocsoraclecomjavasetutorialjavaannotationstype_annotationshtml 17

[35] Oracle Anonymous inner classes httpsdocsoraclecomjavasetutorialjavajavaOOanonymousclasseshtml 19

[36] Kothari CR Research Methodology Methods and Techniques New Age Interna-tional (P) Limited 2004 ISBN 9788122415223 httpsbooksgooglecombrbooksid=8c6gkbKi-F4C 22

[37] Nakakoji Kumiyo Yasuhiro Yamamoto Yoshiyuki Nishinaka Kouichi Kishida eYunwen Ye Evolution patterns of open-source software systems and communitiesEm IWPSE rsquo02 Proceedings of the International Workshop on Principles of SoftwareEvolution paacuteginas 76ndash85 New York NY USA 2002 ACM Press ISBN 1581135459httpdxdoiorg101145512035512055 23

[38] Rahman Foyzur Christian Bird e Premkumar Devanbu Clones What is that smellEmpirical Software Engineering 17(4-5)503ndash530 2012 24

[39] Chacon Scott Pro Git Apress Berkely CA USA 1st ediccedilatildeo 2009ISBN 1430218339 9781430218333 25

[40] Cavalcanti Thiago Gomes e Viniacutecius Correa de Almeida Caracterizaccedilatildeo do uso deconstruccedilotildees da linguagem java em projetos open-source Publicaccedilatildeo online 2016httpbdmunbbrhandle1048315733 27

50

[41] Parr Terence Language Implementation Patterns Create Your Own Domain-Specific and General Programming Languages Pragmatic Bookshelf 1st ediccedilatildeo 2009ISBN 193435645X 9781934356456 27

[42] Janssen Thorben 5 reasons to use jpa hibernate Publicaccedilatildeo online httpswwwsitepointcom5-reasons-to-use-jpa-hibernate 27

[43] Franklin Lyle Alex Gyori Jan Lahoda e Danny Dig Lambdaficator From imperativeto functional programming through automated refactoring Em Proceedings of the2013 International Conference on Software Engineering ICSE rsquo13 paacuteginas 1287ndash1290 Piscataway NJ USA 2013 IEEE Press ISBN 978-1-4673-3076-3 httpdlacmorgcitationcfmid=24867882486986 29

[44] Google Agera httpsgithubcomgoogleagerawiki 34

[45] Eclipse Eclipse vertx httpvertxio 35

[46] Cejas Fernando Android cleanarchitecture httpsgithubcomandroid10Android-CleanArchitecture 36

[47] ReactiveX Rxjava httpsgithubcomReactiveXRxJava 37

[48] Luontola Esko Retrolambda httpsgithubcomorfjackalretrolambda 43

51

Anexo I

Projetos utilizados

fastjson

platform_frameworks_base

netty

material-dialogs

kotlin

okhttp

tinker

AndroidUtilCode

RxJava

spring-boot

java-design-patterns

elasticsearch

ExoPlayer

kafka

vertx

realm-java

guava

zipkin

bazel

stetho

Signal-Android

glide

agera

fresco

plaid

presto

libgdx

spark

52

disruptor

lottie-android

flexbox-layout

PocketHub

zxing

spring-framework

deeplearning4j

dropwizard

interviews

BaseRecyclerViewAdapterHelper

uCrop

DanmakuFlameMaster

lottie-react-native

android-UniversalMusicPlayer

AndroidInterview-Q-A

greenDAO

retrofit

MaterialDrawer

BottomBar

druid

MPAndroidChart

Hystrix

guice

recyclerview-animators

dubbo

androidannotations

RxJava-Android-Samples

PhotoView

clojure

CircleImageView

AndroidSwipeLayout

jedis

MaterialViewPager

butterknife

junit4

RxBinding

leakcanary

SimianArmy

picasso

UltimateRecyclerView

53

AndroidViewAnimations

AppIntro

FizzBuzzEnterpriseEdition

ion

cheesesquare

physical-web

RxAndroid

Android-CleanArchitecture

Calligraphy

Android-Bootstrap

iosched

Android_Data

MaterialDesignLibrary

ListViewAnimations

EventBus

java8-tutorial

AndroidSlidingUpPanel

dagger

okhttputils

logger

HomeMirror

Material-Animations

android-Ultra-Pull-To-Refresh

android-async-http

Android-ObservableScrollView

Android-Universal-Image-Loader

ActionBarSherlock

SlidingMenu

storm

PagerSlidingTabStrip

Android-PullToRefresh

54

  • Dedicatoacuteria
  • Agradecimentos
  • Resumo
  • Abstract
  • Introduccedilatildeo
    • Contexto
    • Objetivos
      • Objetivos Gerais
      • Objetivos Especiacuteficos
        • Metodologia
        • Organizaccedilatildeo do Trabalho
          • Evoluccedilatildeo e Mineraccedilatildeo de Repositoacuterios de Software
            • Evoluccedilatildeo de Software
            • MSR Mineraccedilatildeo de dados e a Engenharia de Software
              • Classificaccedilatildeo
                • Trabalhos Relacionados
                  • Java SE 8 e JDK 8
                    • Histoacuterico
                    • Princiacutepios
                    • Evoluccedilatildeo
                    • Expressotildees Lambda
                      • Sintaxe
                      • Principais formas de uso
                          • Estudo e o Processo de Mineraccedilatildeo
                            • Questotildees de Pesquisa
                            • Fonte de Dados e Objetos de Estudo
                            • Processo de Mineraccedilatildeo
                              • static-analysis
                              • BDAnalisador
                                • Classificaccedilatildeo e Anaacutelise
                                  • Meacutedia de Lambda
                                  • Anaacutelise Temporal
                                  • Refatoraccedilatildeo de Coacutedigo
                                  • Casos de Uso
                                      • Resultados Obtidos e Anaacutelise
                                        • Visatildeo Geral
                                          • Projetos Selecionados
                                          • agera
                                          • vertx
                                          • Android-CleanArchitecture
                                          • RxJava
                                          • guava
                                            • Refatoraccedilatildeo de Coacutedigo
                                            • Estudos de Caso
                                              • Consideraccedilotildees Finais
                                              • Referecircncias
                                              • Anexo
                                              • Projetos utilizados

Figura 59 Exemplo de um arquivo do commit de adiccedilatildeo de coacutedigo novo em Java 8 doprojeto Guava [4]

Na categoria de projetos em que os AICs e expressotildees lambda aumentam proporci-onalmente (grupo 1) o projeto agera realizou um commit em 19052016 com a adiccedilatildeoda biblioteca retrolambda como dependecircncia do projeto Essa biblioteca utilizada prin-cipalmente por projetos Android permite executar coacutedigo Java 8 contendo expressotildeeslambda em Java 5 6 e 7 [48] O commit tambeacutem apresenta refatoraccedilatildeo dos AICs ad-vindos de interfaces funcionais para expressotildees lambda Apesar de o projeto continuar autilizar as expressotildees lambda em seus commits posteriores o nuacutemero de AICs tambeacutemcontinuou a aumentar visualizando os commits posteriores notou-se que esses AICs satildeorelativos a interfaces natildeo funcionais ou seja que possuem mais de um meacutetodo O projetoAndroid-CleanArchitecture eacute similar ao agera pois tambeacutem optou pela instalaccedilatildeo da bi-blioteca retrolambda para uso de expressotildees lambda em seus coacutedigos e como tambeacutem eacuteum projeto de pequeno porte houve uma pequena refatoraccedilatildeo dos AICs A Figura 510mostra a parte do commit de refatoraccedilatildeo de coacutedigo em que o desenvolvedor adiciona abiblioteca retrolambda como dependecircncia

43

Figura 510 Commit de adiccedilatildeo da biblioteca Retrolambda no projeto Agera [5]

Outro caso interessante eacute o do projeto RxJava que em 2015 optou pela refatoraccedilatildeodo coacutedigo para a utilizaccedilatildeo de expressotildees lambda quase eliminando por completo o usode AICs mas que no ano seguinte reverteu os commits de forma que eliminasse comple-tamente o uso de expressotildees lambda para manter a retrocompatibilidade com o Java 6A Figura 511 demonstra uma parte do commit de reversatildeo do coacutedigo para Java 6 emque pode ser visto em vermelho o coacutedigo anterior com expressotildees lambda e o verde como novo coacutedigo utilizando AIC novamente

44

Figura 511 Commit de remoccedilatildeo de Lambdas e volta para o uso de AICs no projetoRXJava [6]

Essa preocupaccedilatildeo com retrocompatibilidade de coacutedigo pode ser um fator crucial nadecisatildeo das equipes de desenvolvimento na hora de decidir como fazer o software co-evoluircom a linguagem sem perder a compatibilidade com versotildees anteriores

45

Capiacutetulo 6

Consideraccedilotildees Finais

Este estudo permitiu entender melhor como projetos estatildeo realizando a migraccedilatildeo para oJava 8 em especial utilizando uma nova caracteriacutestica introduzida expressatildeo lambdaApesar de a maioria dos projetos populares considerados natildeo possuiacuterem nenhuma ocor-recircncia de expressotildees lambda os projetos que tinham expressotildees lambda foram suficientespara realizar um primeiro estudo de caracterizaccedilatildeo no uso desta caracteriacutestica e com osprojetos efetivamente utilizados para estudo foi possiacutevel agrupaacute-los quanto a maneira emque as expressotildees lambda estavam sendo utilizadas quando comparadas com AICs em 5grandes grupos quando AIC e lambda aumentam proporcionalmente quando AIC dimi-nui e lambda aumenta ultrapassando AIC quando AIC diminui mas continua superior aolambda crescente expressotildees lambda que foram introduzidas e retiradas completamentedo coacutedigo e expressotildees lambda que natildeo existem em quantidades expressivas

Foi possiacutevel entatildeo realizar um estudo aprofundado levando em consideraccedilatildeo as di-ferentes maneiras com que as expressotildees lambda foram adotadas nos projetos atraveacutes daescolha de um projeto que representasse cada grupo para anaacutelise Dentre os cinco projetosestudados foi possiacutevel observar alguns padrotildees tipicamente adotados por desenvolvedorespara implementar expressotildees lambda em seus projetos como a utilizaccedilatildeo da bibliotecas(retrolambda) que permitissem uma flexibilizaccedilatildeo na utilizaccedilatildeo de expressotildees lambda oucomo lambda eacute primariamente utilizada para substituir determinados AICs ou operaccedilotildeesem Collection

Aleacutem disso foi possiacutevel observar como a refatoraccedilatildeo de coacutedigo acontece em cada umdesses projetos Observou-se como projetos menores tendem a refatorar coacutedigo maisfacilmente ao passo que projetos maiores e mais complexos fazem menos refatoraccedilatildeo oudemoram mais entre o periacuteodo em que houve a primeira migraccedilatildeo de coacutedigo para a novaversatildeo da linguagem ateacute o periacuteodo em que realmente decidem refatorar coacutedigo Aleacutem dacomplexidade do projeto influenciar na decisatildeo de migrar o projeto para uma versatildeo maisrecente da linguagem a preocupaccedilatildeo com retrocompatibilidade com versotildees anteriores da

46

linguagem tambeacutem podem ser uma barreira para que projetos comecem a evoluir o coacutedigojuntamente com a evoluccedilatildeo da linguagem

Ainda assim foi possiacutevel observar que a preocupaccedilatildeo com a co-evoluccedilatildeo do software-linguagem existe entre os desenvolvedores de projetos mas a realizaccedilatildeo da migraccedilatildeo aindaacontece lentamente devido agrave diversos fatores que precisam ser levados em consideraccedilatildeopara a manutenccedilatildeo do projeto

Para trabalhos e contribuiccedilotildees futuras seria interessante desenvolver uma ferramentaque pudesse analisar diretamente no coacutedigo-fonte as oportunidades de aplicaccedilatildeo de ex-pressotildees lambda dessa forma poderiam ser analisadas as porcentagens de conversatildeo decoacutedigo para Java 8 e obter melhores conclusotildees sobre a importacircncia que os projetos estatildeodando para a evoluccedilatildeo de seus coacutedigos Outro fator interessante seria aplicar mais Visitorsagrave ferramenta static-analysis e fazer este mesmo estudo aplicado agrave outras caracteriacutesticasda linguagem

47

Referecircncias

[1] Kagdi Huzefa Michael L Collard e Jonathan I Maletic A survey and taxonomyof approaches for mining software repositories in the context of software evolution2007 ix 3 8 9 10 11

[2] DBeaver Dbeaver - features httpdbeaverjkissorgdocsfeatures ix 29

[3] Eclipse Vertx commit Java8-ify code httpsgithubcomeclipsevertxcommit93f95e9c77419f442a42fe711b6eeaef88192fd3 ix 42

[4] Google Guava commit Release java 8 changes to guava httpsgithubcomgoogleguavacommit73e382fa877f80994817a136b0adcc4365ccd904 ix 43

[5] Google Agera commit Collapsed testapp with retrolambda httpsgithubcomgoogleageracommit5e518b7b05f9e7a34a314945f68deff7b2c3e334 ix 44

[6] ReactiveX Rxjava commit 2x full jdk 6 compatible backport + includ-ing bugfixes up to today httpsgithubcomReactiveXRxJavacommit000a174d87a901135f9665d3b11f3627fd2dc4ed ix 45

[7] Godfrey M W e D M German The past present and future of software evolutionEm 2008 Frontiers of Maintenance paacuteginas 129ndash138 Sept 2008 1 6

[8] Favre J M Languages evolve too changing the software time scale Em Principles ofSoftware Evolution Eighth International Workshop on paacuteginas 33ndash42 IEEE 20051 5 7

[9] Overbey Jeffrey L e Ralph E Johnson Regrowing a language refactoring tools allowprogramming languages to evolve Em ACM SIGPLAN Notices volume 44 paacuteginas493ndash502 ACM 2009 1 5 7 8 12

[10] Grechanik Mark Collin McMillan Luca DeFerrari Marco Comi Stefano CrespiDenys Poshyvanyk Chen Fu Qing Xie e Carlo Ghezzi An empirical investiga-tion into a large-scale java open source code repository Em Proceedings of the2010 ACM-IEEE International Symposium on Empirical Software Engineering andMeasurement ESEM rsquo10 paacuteginas 111ndash1110 New York NY USA 2010 ACMISBN 978-1-4503-0039-1 httpdoiacmorg10114518527861852801 1

[11] TIOBE Tiobe httpswwwtiobecomtiobe-index 1 14

48

[12] Gyori Alex Lyle Franklin Danny Dig e Jan Lahoda Crossing the gap from im-perative to functional programming through refactoring Em Proceedings of the 20139th Joint Meeting on Foundations of Software Engineering ESECFSE 2013 paacute-ginas 543ndash553 New York NY USA 2013 ACM ISBN 978-1-4503-2237-9 httpdoiacmorg10114524914112491461 2 11 24 39

[13] OpenJDK State of the lambda httpcropenjdkjavanet~briangoetzlambdalambda-state-4html 2

[14] Han Jiawei Micheline Kamber e Jian Pei Data Mining Concepts and TechniquesMorgan Kaufmann Publishers Inc San Francisco CA USA 3rd ediccedilatildeo 2011ISBN 0123814790 9780123814791 3

[15] Fowler Martin e Kent Beck Refactoring improving the design of existing codeAddison-Wesley Professional 1999 5 7

[16] Lehman M M J F Ramil P D Wernick D E Perry e W M Turski Met-rics and laws of software evolution - the nineties view Em Proceedings of the4th International Symposium on Software Metrics METRICS rsquo97 paacuteginas 20ndashWashington DC USA 1997 IEEE Computer Society ISBN 0-8186-8093-8 httpdlacmorgcitationcfmid=823454823901 6

[17] Hassan Ahmed E e Tao Xie Software intelligence The future of mining softwareengineering data Em Proceedings of the FSESDP Workshop on Future of SoftwareEngineering Research FoSER rsquo10 paacuteginas 161ndash166 New York NY USA 2010ACM ISBN 978-1-4503-0427-6 httpdoiacmorg101145188236218823978 9

[18] Hassan Ahmed E The road ahead for mining software repositories Em Frontiers ofSoftware Maintenance 2008 FoSM 2008 paacuteginas 48ndash57 IEEE 2008 8

[19] Berry Michael J e Gordon Linoff Data Mining Techniques For Marketing Salesand Customer Support John Wiley amp Sons Inc New York NY USA 1997ISBN 0471179809 10

[20] Parnin Chris Christian Bird e Emerson Murphy-Hill Java generics adoption hownew features are introduced championed or ignored Em Proceedings of the 8thWorking Conference on Mining Software Repositories paacuteginas 3ndash12 ACM 2011 12

[21] Oracle The java language specification httpsdocsoraclecomjavasespecsjlsse8jls8pdf 13

[22] Oracle The history of java technology httpwwworaclecomtechnetworkjavajavaseoverviewjavahistory-index-198355html 13

[23] Murphy Kieron So why did they decide to call itjava httpwwwjavaworldcomarticle2077265core-javaso-why-did-they-decide-to-call-it-java-html 13

[24] McGraw Tata Object-oriented Programming with Java Essentials and ApplicationsHill Education 13

49

[25] Oracle Differences between java ee and java se httpdocsoraclecomjavaee6firstcupdocgkhoyhtml 13

[26] Lindsey Clark S The History of Java Cambridge 14

[27] Oracle The java language environment httpwwworaclecomtechnetworkjavaintro-141325html 14

[28] Oracle Jdk 8 httpopenjdkjavanetprojectsjdk8 15 24

[29] Oracle Enhancements in java se 8 httpdocsoraclecomjavase8docstechnotesguideslanguageenhancementshtmljavase8 15 16 17

[30] Oracle Lambda expressions httpdocsoraclecomjavasetutorialjavajavaOOlambdaexpressionshtml 16 18 21

[31] Oracle Method references httpdocsoraclecomjavasetutorialjavajavaOOmethodreferenceshtml 16

[32] Oracle Default methods httpdocsoraclecomjavasetutorialjavaIandIdefaultmethodshtml 17

[33] Oracle Repeating annotations httpdocsoraclecomjavasetutorialjavaannotationsrepeatinghtml 17

[34] Oracle Type annotations httpdocsoraclecomjavasetutorialjavaannotationstype_annotationshtml 17

[35] Oracle Anonymous inner classes httpsdocsoraclecomjavasetutorialjavajavaOOanonymousclasseshtml 19

[36] Kothari CR Research Methodology Methods and Techniques New Age Interna-tional (P) Limited 2004 ISBN 9788122415223 httpsbooksgooglecombrbooksid=8c6gkbKi-F4C 22

[37] Nakakoji Kumiyo Yasuhiro Yamamoto Yoshiyuki Nishinaka Kouichi Kishida eYunwen Ye Evolution patterns of open-source software systems and communitiesEm IWPSE rsquo02 Proceedings of the International Workshop on Principles of SoftwareEvolution paacuteginas 76ndash85 New York NY USA 2002 ACM Press ISBN 1581135459httpdxdoiorg101145512035512055 23

[38] Rahman Foyzur Christian Bird e Premkumar Devanbu Clones What is that smellEmpirical Software Engineering 17(4-5)503ndash530 2012 24

[39] Chacon Scott Pro Git Apress Berkely CA USA 1st ediccedilatildeo 2009ISBN 1430218339 9781430218333 25

[40] Cavalcanti Thiago Gomes e Viniacutecius Correa de Almeida Caracterizaccedilatildeo do uso deconstruccedilotildees da linguagem java em projetos open-source Publicaccedilatildeo online 2016httpbdmunbbrhandle1048315733 27

50

[41] Parr Terence Language Implementation Patterns Create Your Own Domain-Specific and General Programming Languages Pragmatic Bookshelf 1st ediccedilatildeo 2009ISBN 193435645X 9781934356456 27

[42] Janssen Thorben 5 reasons to use jpa hibernate Publicaccedilatildeo online httpswwwsitepointcom5-reasons-to-use-jpa-hibernate 27

[43] Franklin Lyle Alex Gyori Jan Lahoda e Danny Dig Lambdaficator From imperativeto functional programming through automated refactoring Em Proceedings of the2013 International Conference on Software Engineering ICSE rsquo13 paacuteginas 1287ndash1290 Piscataway NJ USA 2013 IEEE Press ISBN 978-1-4673-3076-3 httpdlacmorgcitationcfmid=24867882486986 29

[44] Google Agera httpsgithubcomgoogleagerawiki 34

[45] Eclipse Eclipse vertx httpvertxio 35

[46] Cejas Fernando Android cleanarchitecture httpsgithubcomandroid10Android-CleanArchitecture 36

[47] ReactiveX Rxjava httpsgithubcomReactiveXRxJava 37

[48] Luontola Esko Retrolambda httpsgithubcomorfjackalretrolambda 43

51

Anexo I

Projetos utilizados

fastjson

platform_frameworks_base

netty

material-dialogs

kotlin

okhttp

tinker

AndroidUtilCode

RxJava

spring-boot

java-design-patterns

elasticsearch

ExoPlayer

kafka

vertx

realm-java

guava

zipkin

bazel

stetho

Signal-Android

glide

agera

fresco

plaid

presto

libgdx

spark

52

disruptor

lottie-android

flexbox-layout

PocketHub

zxing

spring-framework

deeplearning4j

dropwizard

interviews

BaseRecyclerViewAdapterHelper

uCrop

DanmakuFlameMaster

lottie-react-native

android-UniversalMusicPlayer

AndroidInterview-Q-A

greenDAO

retrofit

MaterialDrawer

BottomBar

druid

MPAndroidChart

Hystrix

guice

recyclerview-animators

dubbo

androidannotations

RxJava-Android-Samples

PhotoView

clojure

CircleImageView

AndroidSwipeLayout

jedis

MaterialViewPager

butterknife

junit4

RxBinding

leakcanary

SimianArmy

picasso

UltimateRecyclerView

53

AndroidViewAnimations

AppIntro

FizzBuzzEnterpriseEdition

ion

cheesesquare

physical-web

RxAndroid

Android-CleanArchitecture

Calligraphy

Android-Bootstrap

iosched

Android_Data

MaterialDesignLibrary

ListViewAnimations

EventBus

java8-tutorial

AndroidSlidingUpPanel

dagger

okhttputils

logger

HomeMirror

Material-Animations

android-Ultra-Pull-To-Refresh

android-async-http

Android-ObservableScrollView

Android-Universal-Image-Loader

ActionBarSherlock

SlidingMenu

storm

PagerSlidingTabStrip

Android-PullToRefresh

54

  • Dedicatoacuteria
  • Agradecimentos
  • Resumo
  • Abstract
  • Introduccedilatildeo
    • Contexto
    • Objetivos
      • Objetivos Gerais
      • Objetivos Especiacuteficos
        • Metodologia
        • Organizaccedilatildeo do Trabalho
          • Evoluccedilatildeo e Mineraccedilatildeo de Repositoacuterios de Software
            • Evoluccedilatildeo de Software
            • MSR Mineraccedilatildeo de dados e a Engenharia de Software
              • Classificaccedilatildeo
                • Trabalhos Relacionados
                  • Java SE 8 e JDK 8
                    • Histoacuterico
                    • Princiacutepios
                    • Evoluccedilatildeo
                    • Expressotildees Lambda
                      • Sintaxe
                      • Principais formas de uso
                          • Estudo e o Processo de Mineraccedilatildeo
                            • Questotildees de Pesquisa
                            • Fonte de Dados e Objetos de Estudo
                            • Processo de Mineraccedilatildeo
                              • static-analysis
                              • BDAnalisador
                                • Classificaccedilatildeo e Anaacutelise
                                  • Meacutedia de Lambda
                                  • Anaacutelise Temporal
                                  • Refatoraccedilatildeo de Coacutedigo
                                  • Casos de Uso
                                      • Resultados Obtidos e Anaacutelise
                                        • Visatildeo Geral
                                          • Projetos Selecionados
                                          • agera
                                          • vertx
                                          • Android-CleanArchitecture
                                          • RxJava
                                          • guava
                                            • Refatoraccedilatildeo de Coacutedigo
                                            • Estudos de Caso
                                              • Consideraccedilotildees Finais
                                              • Referecircncias
                                              • Anexo
                                              • Projetos utilizados

Figura 510 Commit de adiccedilatildeo da biblioteca Retrolambda no projeto Agera [5]

Outro caso interessante eacute o do projeto RxJava que em 2015 optou pela refatoraccedilatildeodo coacutedigo para a utilizaccedilatildeo de expressotildees lambda quase eliminando por completo o usode AICs mas que no ano seguinte reverteu os commits de forma que eliminasse comple-tamente o uso de expressotildees lambda para manter a retrocompatibilidade com o Java 6A Figura 511 demonstra uma parte do commit de reversatildeo do coacutedigo para Java 6 emque pode ser visto em vermelho o coacutedigo anterior com expressotildees lambda e o verde como novo coacutedigo utilizando AIC novamente

44

Figura 511 Commit de remoccedilatildeo de Lambdas e volta para o uso de AICs no projetoRXJava [6]

Essa preocupaccedilatildeo com retrocompatibilidade de coacutedigo pode ser um fator crucial nadecisatildeo das equipes de desenvolvimento na hora de decidir como fazer o software co-evoluircom a linguagem sem perder a compatibilidade com versotildees anteriores

45

Capiacutetulo 6

Consideraccedilotildees Finais

Este estudo permitiu entender melhor como projetos estatildeo realizando a migraccedilatildeo para oJava 8 em especial utilizando uma nova caracteriacutestica introduzida expressatildeo lambdaApesar de a maioria dos projetos populares considerados natildeo possuiacuterem nenhuma ocor-recircncia de expressotildees lambda os projetos que tinham expressotildees lambda foram suficientespara realizar um primeiro estudo de caracterizaccedilatildeo no uso desta caracteriacutestica e com osprojetos efetivamente utilizados para estudo foi possiacutevel agrupaacute-los quanto a maneira emque as expressotildees lambda estavam sendo utilizadas quando comparadas com AICs em 5grandes grupos quando AIC e lambda aumentam proporcionalmente quando AIC dimi-nui e lambda aumenta ultrapassando AIC quando AIC diminui mas continua superior aolambda crescente expressotildees lambda que foram introduzidas e retiradas completamentedo coacutedigo e expressotildees lambda que natildeo existem em quantidades expressivas

Foi possiacutevel entatildeo realizar um estudo aprofundado levando em consideraccedilatildeo as di-ferentes maneiras com que as expressotildees lambda foram adotadas nos projetos atraveacutes daescolha de um projeto que representasse cada grupo para anaacutelise Dentre os cinco projetosestudados foi possiacutevel observar alguns padrotildees tipicamente adotados por desenvolvedorespara implementar expressotildees lambda em seus projetos como a utilizaccedilatildeo da bibliotecas(retrolambda) que permitissem uma flexibilizaccedilatildeo na utilizaccedilatildeo de expressotildees lambda oucomo lambda eacute primariamente utilizada para substituir determinados AICs ou operaccedilotildeesem Collection

Aleacutem disso foi possiacutevel observar como a refatoraccedilatildeo de coacutedigo acontece em cada umdesses projetos Observou-se como projetos menores tendem a refatorar coacutedigo maisfacilmente ao passo que projetos maiores e mais complexos fazem menos refatoraccedilatildeo oudemoram mais entre o periacuteodo em que houve a primeira migraccedilatildeo de coacutedigo para a novaversatildeo da linguagem ateacute o periacuteodo em que realmente decidem refatorar coacutedigo Aleacutem dacomplexidade do projeto influenciar na decisatildeo de migrar o projeto para uma versatildeo maisrecente da linguagem a preocupaccedilatildeo com retrocompatibilidade com versotildees anteriores da

46

linguagem tambeacutem podem ser uma barreira para que projetos comecem a evoluir o coacutedigojuntamente com a evoluccedilatildeo da linguagem

Ainda assim foi possiacutevel observar que a preocupaccedilatildeo com a co-evoluccedilatildeo do software-linguagem existe entre os desenvolvedores de projetos mas a realizaccedilatildeo da migraccedilatildeo aindaacontece lentamente devido agrave diversos fatores que precisam ser levados em consideraccedilatildeopara a manutenccedilatildeo do projeto

Para trabalhos e contribuiccedilotildees futuras seria interessante desenvolver uma ferramentaque pudesse analisar diretamente no coacutedigo-fonte as oportunidades de aplicaccedilatildeo de ex-pressotildees lambda dessa forma poderiam ser analisadas as porcentagens de conversatildeo decoacutedigo para Java 8 e obter melhores conclusotildees sobre a importacircncia que os projetos estatildeodando para a evoluccedilatildeo de seus coacutedigos Outro fator interessante seria aplicar mais Visitorsagrave ferramenta static-analysis e fazer este mesmo estudo aplicado agrave outras caracteriacutesticasda linguagem

47

Referecircncias

[1] Kagdi Huzefa Michael L Collard e Jonathan I Maletic A survey and taxonomyof approaches for mining software repositories in the context of software evolution2007 ix 3 8 9 10 11

[2] DBeaver Dbeaver - features httpdbeaverjkissorgdocsfeatures ix 29

[3] Eclipse Vertx commit Java8-ify code httpsgithubcomeclipsevertxcommit93f95e9c77419f442a42fe711b6eeaef88192fd3 ix 42

[4] Google Guava commit Release java 8 changes to guava httpsgithubcomgoogleguavacommit73e382fa877f80994817a136b0adcc4365ccd904 ix 43

[5] Google Agera commit Collapsed testapp with retrolambda httpsgithubcomgoogleageracommit5e518b7b05f9e7a34a314945f68deff7b2c3e334 ix 44

[6] ReactiveX Rxjava commit 2x full jdk 6 compatible backport + includ-ing bugfixes up to today httpsgithubcomReactiveXRxJavacommit000a174d87a901135f9665d3b11f3627fd2dc4ed ix 45

[7] Godfrey M W e D M German The past present and future of software evolutionEm 2008 Frontiers of Maintenance paacuteginas 129ndash138 Sept 2008 1 6

[8] Favre J M Languages evolve too changing the software time scale Em Principles ofSoftware Evolution Eighth International Workshop on paacuteginas 33ndash42 IEEE 20051 5 7

[9] Overbey Jeffrey L e Ralph E Johnson Regrowing a language refactoring tools allowprogramming languages to evolve Em ACM SIGPLAN Notices volume 44 paacuteginas493ndash502 ACM 2009 1 5 7 8 12

[10] Grechanik Mark Collin McMillan Luca DeFerrari Marco Comi Stefano CrespiDenys Poshyvanyk Chen Fu Qing Xie e Carlo Ghezzi An empirical investiga-tion into a large-scale java open source code repository Em Proceedings of the2010 ACM-IEEE International Symposium on Empirical Software Engineering andMeasurement ESEM rsquo10 paacuteginas 111ndash1110 New York NY USA 2010 ACMISBN 978-1-4503-0039-1 httpdoiacmorg10114518527861852801 1

[11] TIOBE Tiobe httpswwwtiobecomtiobe-index 1 14

48

[12] Gyori Alex Lyle Franklin Danny Dig e Jan Lahoda Crossing the gap from im-perative to functional programming through refactoring Em Proceedings of the 20139th Joint Meeting on Foundations of Software Engineering ESECFSE 2013 paacute-ginas 543ndash553 New York NY USA 2013 ACM ISBN 978-1-4503-2237-9 httpdoiacmorg10114524914112491461 2 11 24 39

[13] OpenJDK State of the lambda httpcropenjdkjavanet~briangoetzlambdalambda-state-4html 2

[14] Han Jiawei Micheline Kamber e Jian Pei Data Mining Concepts and TechniquesMorgan Kaufmann Publishers Inc San Francisco CA USA 3rd ediccedilatildeo 2011ISBN 0123814790 9780123814791 3

[15] Fowler Martin e Kent Beck Refactoring improving the design of existing codeAddison-Wesley Professional 1999 5 7

[16] Lehman M M J F Ramil P D Wernick D E Perry e W M Turski Met-rics and laws of software evolution - the nineties view Em Proceedings of the4th International Symposium on Software Metrics METRICS rsquo97 paacuteginas 20ndashWashington DC USA 1997 IEEE Computer Society ISBN 0-8186-8093-8 httpdlacmorgcitationcfmid=823454823901 6

[17] Hassan Ahmed E e Tao Xie Software intelligence The future of mining softwareengineering data Em Proceedings of the FSESDP Workshop on Future of SoftwareEngineering Research FoSER rsquo10 paacuteginas 161ndash166 New York NY USA 2010ACM ISBN 978-1-4503-0427-6 httpdoiacmorg101145188236218823978 9

[18] Hassan Ahmed E The road ahead for mining software repositories Em Frontiers ofSoftware Maintenance 2008 FoSM 2008 paacuteginas 48ndash57 IEEE 2008 8

[19] Berry Michael J e Gordon Linoff Data Mining Techniques For Marketing Salesand Customer Support John Wiley amp Sons Inc New York NY USA 1997ISBN 0471179809 10

[20] Parnin Chris Christian Bird e Emerson Murphy-Hill Java generics adoption hownew features are introduced championed or ignored Em Proceedings of the 8thWorking Conference on Mining Software Repositories paacuteginas 3ndash12 ACM 2011 12

[21] Oracle The java language specification httpsdocsoraclecomjavasespecsjlsse8jls8pdf 13

[22] Oracle The history of java technology httpwwworaclecomtechnetworkjavajavaseoverviewjavahistory-index-198355html 13

[23] Murphy Kieron So why did they decide to call itjava httpwwwjavaworldcomarticle2077265core-javaso-why-did-they-decide-to-call-it-java-html 13

[24] McGraw Tata Object-oriented Programming with Java Essentials and ApplicationsHill Education 13

49

[25] Oracle Differences between java ee and java se httpdocsoraclecomjavaee6firstcupdocgkhoyhtml 13

[26] Lindsey Clark S The History of Java Cambridge 14

[27] Oracle The java language environment httpwwworaclecomtechnetworkjavaintro-141325html 14

[28] Oracle Jdk 8 httpopenjdkjavanetprojectsjdk8 15 24

[29] Oracle Enhancements in java se 8 httpdocsoraclecomjavase8docstechnotesguideslanguageenhancementshtmljavase8 15 16 17

[30] Oracle Lambda expressions httpdocsoraclecomjavasetutorialjavajavaOOlambdaexpressionshtml 16 18 21

[31] Oracle Method references httpdocsoraclecomjavasetutorialjavajavaOOmethodreferenceshtml 16

[32] Oracle Default methods httpdocsoraclecomjavasetutorialjavaIandIdefaultmethodshtml 17

[33] Oracle Repeating annotations httpdocsoraclecomjavasetutorialjavaannotationsrepeatinghtml 17

[34] Oracle Type annotations httpdocsoraclecomjavasetutorialjavaannotationstype_annotationshtml 17

[35] Oracle Anonymous inner classes httpsdocsoraclecomjavasetutorialjavajavaOOanonymousclasseshtml 19

[36] Kothari CR Research Methodology Methods and Techniques New Age Interna-tional (P) Limited 2004 ISBN 9788122415223 httpsbooksgooglecombrbooksid=8c6gkbKi-F4C 22

[37] Nakakoji Kumiyo Yasuhiro Yamamoto Yoshiyuki Nishinaka Kouichi Kishida eYunwen Ye Evolution patterns of open-source software systems and communitiesEm IWPSE rsquo02 Proceedings of the International Workshop on Principles of SoftwareEvolution paacuteginas 76ndash85 New York NY USA 2002 ACM Press ISBN 1581135459httpdxdoiorg101145512035512055 23

[38] Rahman Foyzur Christian Bird e Premkumar Devanbu Clones What is that smellEmpirical Software Engineering 17(4-5)503ndash530 2012 24

[39] Chacon Scott Pro Git Apress Berkely CA USA 1st ediccedilatildeo 2009ISBN 1430218339 9781430218333 25

[40] Cavalcanti Thiago Gomes e Viniacutecius Correa de Almeida Caracterizaccedilatildeo do uso deconstruccedilotildees da linguagem java em projetos open-source Publicaccedilatildeo online 2016httpbdmunbbrhandle1048315733 27

50

[41] Parr Terence Language Implementation Patterns Create Your Own Domain-Specific and General Programming Languages Pragmatic Bookshelf 1st ediccedilatildeo 2009ISBN 193435645X 9781934356456 27

[42] Janssen Thorben 5 reasons to use jpa hibernate Publicaccedilatildeo online httpswwwsitepointcom5-reasons-to-use-jpa-hibernate 27

[43] Franklin Lyle Alex Gyori Jan Lahoda e Danny Dig Lambdaficator From imperativeto functional programming through automated refactoring Em Proceedings of the2013 International Conference on Software Engineering ICSE rsquo13 paacuteginas 1287ndash1290 Piscataway NJ USA 2013 IEEE Press ISBN 978-1-4673-3076-3 httpdlacmorgcitationcfmid=24867882486986 29

[44] Google Agera httpsgithubcomgoogleagerawiki 34

[45] Eclipse Eclipse vertx httpvertxio 35

[46] Cejas Fernando Android cleanarchitecture httpsgithubcomandroid10Android-CleanArchitecture 36

[47] ReactiveX Rxjava httpsgithubcomReactiveXRxJava 37

[48] Luontola Esko Retrolambda httpsgithubcomorfjackalretrolambda 43

51

Anexo I

Projetos utilizados

fastjson

platform_frameworks_base

netty

material-dialogs

kotlin

okhttp

tinker

AndroidUtilCode

RxJava

spring-boot

java-design-patterns

elasticsearch

ExoPlayer

kafka

vertx

realm-java

guava

zipkin

bazel

stetho

Signal-Android

glide

agera

fresco

plaid

presto

libgdx

spark

52

disruptor

lottie-android

flexbox-layout

PocketHub

zxing

spring-framework

deeplearning4j

dropwizard

interviews

BaseRecyclerViewAdapterHelper

uCrop

DanmakuFlameMaster

lottie-react-native

android-UniversalMusicPlayer

AndroidInterview-Q-A

greenDAO

retrofit

MaterialDrawer

BottomBar

druid

MPAndroidChart

Hystrix

guice

recyclerview-animators

dubbo

androidannotations

RxJava-Android-Samples

PhotoView

clojure

CircleImageView

AndroidSwipeLayout

jedis

MaterialViewPager

butterknife

junit4

RxBinding

leakcanary

SimianArmy

picasso

UltimateRecyclerView

53

AndroidViewAnimations

AppIntro

FizzBuzzEnterpriseEdition

ion

cheesesquare

physical-web

RxAndroid

Android-CleanArchitecture

Calligraphy

Android-Bootstrap

iosched

Android_Data

MaterialDesignLibrary

ListViewAnimations

EventBus

java8-tutorial

AndroidSlidingUpPanel

dagger

okhttputils

logger

HomeMirror

Material-Animations

android-Ultra-Pull-To-Refresh

android-async-http

Android-ObservableScrollView

Android-Universal-Image-Loader

ActionBarSherlock

SlidingMenu

storm

PagerSlidingTabStrip

Android-PullToRefresh

54

  • Dedicatoacuteria
  • Agradecimentos
  • Resumo
  • Abstract
  • Introduccedilatildeo
    • Contexto
    • Objetivos
      • Objetivos Gerais
      • Objetivos Especiacuteficos
        • Metodologia
        • Organizaccedilatildeo do Trabalho
          • Evoluccedilatildeo e Mineraccedilatildeo de Repositoacuterios de Software
            • Evoluccedilatildeo de Software
            • MSR Mineraccedilatildeo de dados e a Engenharia de Software
              • Classificaccedilatildeo
                • Trabalhos Relacionados
                  • Java SE 8 e JDK 8
                    • Histoacuterico
                    • Princiacutepios
                    • Evoluccedilatildeo
                    • Expressotildees Lambda
                      • Sintaxe
                      • Principais formas de uso
                          • Estudo e o Processo de Mineraccedilatildeo
                            • Questotildees de Pesquisa
                            • Fonte de Dados e Objetos de Estudo
                            • Processo de Mineraccedilatildeo
                              • static-analysis
                              • BDAnalisador
                                • Classificaccedilatildeo e Anaacutelise
                                  • Meacutedia de Lambda
                                  • Anaacutelise Temporal
                                  • Refatoraccedilatildeo de Coacutedigo
                                  • Casos de Uso
                                      • Resultados Obtidos e Anaacutelise
                                        • Visatildeo Geral
                                          • Projetos Selecionados
                                          • agera
                                          • vertx
                                          • Android-CleanArchitecture
                                          • RxJava
                                          • guava
                                            • Refatoraccedilatildeo de Coacutedigo
                                            • Estudos de Caso
                                              • Consideraccedilotildees Finais
                                              • Referecircncias
                                              • Anexo
                                              • Projetos utilizados

Figura 511 Commit de remoccedilatildeo de Lambdas e volta para o uso de AICs no projetoRXJava [6]

Essa preocupaccedilatildeo com retrocompatibilidade de coacutedigo pode ser um fator crucial nadecisatildeo das equipes de desenvolvimento na hora de decidir como fazer o software co-evoluircom a linguagem sem perder a compatibilidade com versotildees anteriores

45

Capiacutetulo 6

Consideraccedilotildees Finais

Este estudo permitiu entender melhor como projetos estatildeo realizando a migraccedilatildeo para oJava 8 em especial utilizando uma nova caracteriacutestica introduzida expressatildeo lambdaApesar de a maioria dos projetos populares considerados natildeo possuiacuterem nenhuma ocor-recircncia de expressotildees lambda os projetos que tinham expressotildees lambda foram suficientespara realizar um primeiro estudo de caracterizaccedilatildeo no uso desta caracteriacutestica e com osprojetos efetivamente utilizados para estudo foi possiacutevel agrupaacute-los quanto a maneira emque as expressotildees lambda estavam sendo utilizadas quando comparadas com AICs em 5grandes grupos quando AIC e lambda aumentam proporcionalmente quando AIC dimi-nui e lambda aumenta ultrapassando AIC quando AIC diminui mas continua superior aolambda crescente expressotildees lambda que foram introduzidas e retiradas completamentedo coacutedigo e expressotildees lambda que natildeo existem em quantidades expressivas

Foi possiacutevel entatildeo realizar um estudo aprofundado levando em consideraccedilatildeo as di-ferentes maneiras com que as expressotildees lambda foram adotadas nos projetos atraveacutes daescolha de um projeto que representasse cada grupo para anaacutelise Dentre os cinco projetosestudados foi possiacutevel observar alguns padrotildees tipicamente adotados por desenvolvedorespara implementar expressotildees lambda em seus projetos como a utilizaccedilatildeo da bibliotecas(retrolambda) que permitissem uma flexibilizaccedilatildeo na utilizaccedilatildeo de expressotildees lambda oucomo lambda eacute primariamente utilizada para substituir determinados AICs ou operaccedilotildeesem Collection

Aleacutem disso foi possiacutevel observar como a refatoraccedilatildeo de coacutedigo acontece em cada umdesses projetos Observou-se como projetos menores tendem a refatorar coacutedigo maisfacilmente ao passo que projetos maiores e mais complexos fazem menos refatoraccedilatildeo oudemoram mais entre o periacuteodo em que houve a primeira migraccedilatildeo de coacutedigo para a novaversatildeo da linguagem ateacute o periacuteodo em que realmente decidem refatorar coacutedigo Aleacutem dacomplexidade do projeto influenciar na decisatildeo de migrar o projeto para uma versatildeo maisrecente da linguagem a preocupaccedilatildeo com retrocompatibilidade com versotildees anteriores da

46

linguagem tambeacutem podem ser uma barreira para que projetos comecem a evoluir o coacutedigojuntamente com a evoluccedilatildeo da linguagem

Ainda assim foi possiacutevel observar que a preocupaccedilatildeo com a co-evoluccedilatildeo do software-linguagem existe entre os desenvolvedores de projetos mas a realizaccedilatildeo da migraccedilatildeo aindaacontece lentamente devido agrave diversos fatores que precisam ser levados em consideraccedilatildeopara a manutenccedilatildeo do projeto

Para trabalhos e contribuiccedilotildees futuras seria interessante desenvolver uma ferramentaque pudesse analisar diretamente no coacutedigo-fonte as oportunidades de aplicaccedilatildeo de ex-pressotildees lambda dessa forma poderiam ser analisadas as porcentagens de conversatildeo decoacutedigo para Java 8 e obter melhores conclusotildees sobre a importacircncia que os projetos estatildeodando para a evoluccedilatildeo de seus coacutedigos Outro fator interessante seria aplicar mais Visitorsagrave ferramenta static-analysis e fazer este mesmo estudo aplicado agrave outras caracteriacutesticasda linguagem

47

Referecircncias

[1] Kagdi Huzefa Michael L Collard e Jonathan I Maletic A survey and taxonomyof approaches for mining software repositories in the context of software evolution2007 ix 3 8 9 10 11

[2] DBeaver Dbeaver - features httpdbeaverjkissorgdocsfeatures ix 29

[3] Eclipse Vertx commit Java8-ify code httpsgithubcomeclipsevertxcommit93f95e9c77419f442a42fe711b6eeaef88192fd3 ix 42

[4] Google Guava commit Release java 8 changes to guava httpsgithubcomgoogleguavacommit73e382fa877f80994817a136b0adcc4365ccd904 ix 43

[5] Google Agera commit Collapsed testapp with retrolambda httpsgithubcomgoogleageracommit5e518b7b05f9e7a34a314945f68deff7b2c3e334 ix 44

[6] ReactiveX Rxjava commit 2x full jdk 6 compatible backport + includ-ing bugfixes up to today httpsgithubcomReactiveXRxJavacommit000a174d87a901135f9665d3b11f3627fd2dc4ed ix 45

[7] Godfrey M W e D M German The past present and future of software evolutionEm 2008 Frontiers of Maintenance paacuteginas 129ndash138 Sept 2008 1 6

[8] Favre J M Languages evolve too changing the software time scale Em Principles ofSoftware Evolution Eighth International Workshop on paacuteginas 33ndash42 IEEE 20051 5 7

[9] Overbey Jeffrey L e Ralph E Johnson Regrowing a language refactoring tools allowprogramming languages to evolve Em ACM SIGPLAN Notices volume 44 paacuteginas493ndash502 ACM 2009 1 5 7 8 12

[10] Grechanik Mark Collin McMillan Luca DeFerrari Marco Comi Stefano CrespiDenys Poshyvanyk Chen Fu Qing Xie e Carlo Ghezzi An empirical investiga-tion into a large-scale java open source code repository Em Proceedings of the2010 ACM-IEEE International Symposium on Empirical Software Engineering andMeasurement ESEM rsquo10 paacuteginas 111ndash1110 New York NY USA 2010 ACMISBN 978-1-4503-0039-1 httpdoiacmorg10114518527861852801 1

[11] TIOBE Tiobe httpswwwtiobecomtiobe-index 1 14

48

[12] Gyori Alex Lyle Franklin Danny Dig e Jan Lahoda Crossing the gap from im-perative to functional programming through refactoring Em Proceedings of the 20139th Joint Meeting on Foundations of Software Engineering ESECFSE 2013 paacute-ginas 543ndash553 New York NY USA 2013 ACM ISBN 978-1-4503-2237-9 httpdoiacmorg10114524914112491461 2 11 24 39

[13] OpenJDK State of the lambda httpcropenjdkjavanet~briangoetzlambdalambda-state-4html 2

[14] Han Jiawei Micheline Kamber e Jian Pei Data Mining Concepts and TechniquesMorgan Kaufmann Publishers Inc San Francisco CA USA 3rd ediccedilatildeo 2011ISBN 0123814790 9780123814791 3

[15] Fowler Martin e Kent Beck Refactoring improving the design of existing codeAddison-Wesley Professional 1999 5 7

[16] Lehman M M J F Ramil P D Wernick D E Perry e W M Turski Met-rics and laws of software evolution - the nineties view Em Proceedings of the4th International Symposium on Software Metrics METRICS rsquo97 paacuteginas 20ndashWashington DC USA 1997 IEEE Computer Society ISBN 0-8186-8093-8 httpdlacmorgcitationcfmid=823454823901 6

[17] Hassan Ahmed E e Tao Xie Software intelligence The future of mining softwareengineering data Em Proceedings of the FSESDP Workshop on Future of SoftwareEngineering Research FoSER rsquo10 paacuteginas 161ndash166 New York NY USA 2010ACM ISBN 978-1-4503-0427-6 httpdoiacmorg101145188236218823978 9

[18] Hassan Ahmed E The road ahead for mining software repositories Em Frontiers ofSoftware Maintenance 2008 FoSM 2008 paacuteginas 48ndash57 IEEE 2008 8

[19] Berry Michael J e Gordon Linoff Data Mining Techniques For Marketing Salesand Customer Support John Wiley amp Sons Inc New York NY USA 1997ISBN 0471179809 10

[20] Parnin Chris Christian Bird e Emerson Murphy-Hill Java generics adoption hownew features are introduced championed or ignored Em Proceedings of the 8thWorking Conference on Mining Software Repositories paacuteginas 3ndash12 ACM 2011 12

[21] Oracle The java language specification httpsdocsoraclecomjavasespecsjlsse8jls8pdf 13

[22] Oracle The history of java technology httpwwworaclecomtechnetworkjavajavaseoverviewjavahistory-index-198355html 13

[23] Murphy Kieron So why did they decide to call itjava httpwwwjavaworldcomarticle2077265core-javaso-why-did-they-decide-to-call-it-java-html 13

[24] McGraw Tata Object-oriented Programming with Java Essentials and ApplicationsHill Education 13

49

[25] Oracle Differences between java ee and java se httpdocsoraclecomjavaee6firstcupdocgkhoyhtml 13

[26] Lindsey Clark S The History of Java Cambridge 14

[27] Oracle The java language environment httpwwworaclecomtechnetworkjavaintro-141325html 14

[28] Oracle Jdk 8 httpopenjdkjavanetprojectsjdk8 15 24

[29] Oracle Enhancements in java se 8 httpdocsoraclecomjavase8docstechnotesguideslanguageenhancementshtmljavase8 15 16 17

[30] Oracle Lambda expressions httpdocsoraclecomjavasetutorialjavajavaOOlambdaexpressionshtml 16 18 21

[31] Oracle Method references httpdocsoraclecomjavasetutorialjavajavaOOmethodreferenceshtml 16

[32] Oracle Default methods httpdocsoraclecomjavasetutorialjavaIandIdefaultmethodshtml 17

[33] Oracle Repeating annotations httpdocsoraclecomjavasetutorialjavaannotationsrepeatinghtml 17

[34] Oracle Type annotations httpdocsoraclecomjavasetutorialjavaannotationstype_annotationshtml 17

[35] Oracle Anonymous inner classes httpsdocsoraclecomjavasetutorialjavajavaOOanonymousclasseshtml 19

[36] Kothari CR Research Methodology Methods and Techniques New Age Interna-tional (P) Limited 2004 ISBN 9788122415223 httpsbooksgooglecombrbooksid=8c6gkbKi-F4C 22

[37] Nakakoji Kumiyo Yasuhiro Yamamoto Yoshiyuki Nishinaka Kouichi Kishida eYunwen Ye Evolution patterns of open-source software systems and communitiesEm IWPSE rsquo02 Proceedings of the International Workshop on Principles of SoftwareEvolution paacuteginas 76ndash85 New York NY USA 2002 ACM Press ISBN 1581135459httpdxdoiorg101145512035512055 23

[38] Rahman Foyzur Christian Bird e Premkumar Devanbu Clones What is that smellEmpirical Software Engineering 17(4-5)503ndash530 2012 24

[39] Chacon Scott Pro Git Apress Berkely CA USA 1st ediccedilatildeo 2009ISBN 1430218339 9781430218333 25

[40] Cavalcanti Thiago Gomes e Viniacutecius Correa de Almeida Caracterizaccedilatildeo do uso deconstruccedilotildees da linguagem java em projetos open-source Publicaccedilatildeo online 2016httpbdmunbbrhandle1048315733 27

50

[41] Parr Terence Language Implementation Patterns Create Your Own Domain-Specific and General Programming Languages Pragmatic Bookshelf 1st ediccedilatildeo 2009ISBN 193435645X 9781934356456 27

[42] Janssen Thorben 5 reasons to use jpa hibernate Publicaccedilatildeo online httpswwwsitepointcom5-reasons-to-use-jpa-hibernate 27

[43] Franklin Lyle Alex Gyori Jan Lahoda e Danny Dig Lambdaficator From imperativeto functional programming through automated refactoring Em Proceedings of the2013 International Conference on Software Engineering ICSE rsquo13 paacuteginas 1287ndash1290 Piscataway NJ USA 2013 IEEE Press ISBN 978-1-4673-3076-3 httpdlacmorgcitationcfmid=24867882486986 29

[44] Google Agera httpsgithubcomgoogleagerawiki 34

[45] Eclipse Eclipse vertx httpvertxio 35

[46] Cejas Fernando Android cleanarchitecture httpsgithubcomandroid10Android-CleanArchitecture 36

[47] ReactiveX Rxjava httpsgithubcomReactiveXRxJava 37

[48] Luontola Esko Retrolambda httpsgithubcomorfjackalretrolambda 43

51

Anexo I

Projetos utilizados

fastjson

platform_frameworks_base

netty

material-dialogs

kotlin

okhttp

tinker

AndroidUtilCode

RxJava

spring-boot

java-design-patterns

elasticsearch

ExoPlayer

kafka

vertx

realm-java

guava

zipkin

bazel

stetho

Signal-Android

glide

agera

fresco

plaid

presto

libgdx

spark

52

disruptor

lottie-android

flexbox-layout

PocketHub

zxing

spring-framework

deeplearning4j

dropwizard

interviews

BaseRecyclerViewAdapterHelper

uCrop

DanmakuFlameMaster

lottie-react-native

android-UniversalMusicPlayer

AndroidInterview-Q-A

greenDAO

retrofit

MaterialDrawer

BottomBar

druid

MPAndroidChart

Hystrix

guice

recyclerview-animators

dubbo

androidannotations

RxJava-Android-Samples

PhotoView

clojure

CircleImageView

AndroidSwipeLayout

jedis

MaterialViewPager

butterknife

junit4

RxBinding

leakcanary

SimianArmy

picasso

UltimateRecyclerView

53

AndroidViewAnimations

AppIntro

FizzBuzzEnterpriseEdition

ion

cheesesquare

physical-web

RxAndroid

Android-CleanArchitecture

Calligraphy

Android-Bootstrap

iosched

Android_Data

MaterialDesignLibrary

ListViewAnimations

EventBus

java8-tutorial

AndroidSlidingUpPanel

dagger

okhttputils

logger

HomeMirror

Material-Animations

android-Ultra-Pull-To-Refresh

android-async-http

Android-ObservableScrollView

Android-Universal-Image-Loader

ActionBarSherlock

SlidingMenu

storm

PagerSlidingTabStrip

Android-PullToRefresh

54

  • Dedicatoacuteria
  • Agradecimentos
  • Resumo
  • Abstract
  • Introduccedilatildeo
    • Contexto
    • Objetivos
      • Objetivos Gerais
      • Objetivos Especiacuteficos
        • Metodologia
        • Organizaccedilatildeo do Trabalho
          • Evoluccedilatildeo e Mineraccedilatildeo de Repositoacuterios de Software
            • Evoluccedilatildeo de Software
            • MSR Mineraccedilatildeo de dados e a Engenharia de Software
              • Classificaccedilatildeo
                • Trabalhos Relacionados
                  • Java SE 8 e JDK 8
                    • Histoacuterico
                    • Princiacutepios
                    • Evoluccedilatildeo
                    • Expressotildees Lambda
                      • Sintaxe
                      • Principais formas de uso
                          • Estudo e o Processo de Mineraccedilatildeo
                            • Questotildees de Pesquisa
                            • Fonte de Dados e Objetos de Estudo
                            • Processo de Mineraccedilatildeo
                              • static-analysis
                              • BDAnalisador
                                • Classificaccedilatildeo e Anaacutelise
                                  • Meacutedia de Lambda
                                  • Anaacutelise Temporal
                                  • Refatoraccedilatildeo de Coacutedigo
                                  • Casos de Uso
                                      • Resultados Obtidos e Anaacutelise
                                        • Visatildeo Geral
                                          • Projetos Selecionados
                                          • agera
                                          • vertx
                                          • Android-CleanArchitecture
                                          • RxJava
                                          • guava
                                            • Refatoraccedilatildeo de Coacutedigo
                                            • Estudos de Caso
                                              • Consideraccedilotildees Finais
                                              • Referecircncias
                                              • Anexo
                                              • Projetos utilizados

Capiacutetulo 6

Consideraccedilotildees Finais

Este estudo permitiu entender melhor como projetos estatildeo realizando a migraccedilatildeo para oJava 8 em especial utilizando uma nova caracteriacutestica introduzida expressatildeo lambdaApesar de a maioria dos projetos populares considerados natildeo possuiacuterem nenhuma ocor-recircncia de expressotildees lambda os projetos que tinham expressotildees lambda foram suficientespara realizar um primeiro estudo de caracterizaccedilatildeo no uso desta caracteriacutestica e com osprojetos efetivamente utilizados para estudo foi possiacutevel agrupaacute-los quanto a maneira emque as expressotildees lambda estavam sendo utilizadas quando comparadas com AICs em 5grandes grupos quando AIC e lambda aumentam proporcionalmente quando AIC dimi-nui e lambda aumenta ultrapassando AIC quando AIC diminui mas continua superior aolambda crescente expressotildees lambda que foram introduzidas e retiradas completamentedo coacutedigo e expressotildees lambda que natildeo existem em quantidades expressivas

Foi possiacutevel entatildeo realizar um estudo aprofundado levando em consideraccedilatildeo as di-ferentes maneiras com que as expressotildees lambda foram adotadas nos projetos atraveacutes daescolha de um projeto que representasse cada grupo para anaacutelise Dentre os cinco projetosestudados foi possiacutevel observar alguns padrotildees tipicamente adotados por desenvolvedorespara implementar expressotildees lambda em seus projetos como a utilizaccedilatildeo da bibliotecas(retrolambda) que permitissem uma flexibilizaccedilatildeo na utilizaccedilatildeo de expressotildees lambda oucomo lambda eacute primariamente utilizada para substituir determinados AICs ou operaccedilotildeesem Collection

Aleacutem disso foi possiacutevel observar como a refatoraccedilatildeo de coacutedigo acontece em cada umdesses projetos Observou-se como projetos menores tendem a refatorar coacutedigo maisfacilmente ao passo que projetos maiores e mais complexos fazem menos refatoraccedilatildeo oudemoram mais entre o periacuteodo em que houve a primeira migraccedilatildeo de coacutedigo para a novaversatildeo da linguagem ateacute o periacuteodo em que realmente decidem refatorar coacutedigo Aleacutem dacomplexidade do projeto influenciar na decisatildeo de migrar o projeto para uma versatildeo maisrecente da linguagem a preocupaccedilatildeo com retrocompatibilidade com versotildees anteriores da

46

linguagem tambeacutem podem ser uma barreira para que projetos comecem a evoluir o coacutedigojuntamente com a evoluccedilatildeo da linguagem

Ainda assim foi possiacutevel observar que a preocupaccedilatildeo com a co-evoluccedilatildeo do software-linguagem existe entre os desenvolvedores de projetos mas a realizaccedilatildeo da migraccedilatildeo aindaacontece lentamente devido agrave diversos fatores que precisam ser levados em consideraccedilatildeopara a manutenccedilatildeo do projeto

Para trabalhos e contribuiccedilotildees futuras seria interessante desenvolver uma ferramentaque pudesse analisar diretamente no coacutedigo-fonte as oportunidades de aplicaccedilatildeo de ex-pressotildees lambda dessa forma poderiam ser analisadas as porcentagens de conversatildeo decoacutedigo para Java 8 e obter melhores conclusotildees sobre a importacircncia que os projetos estatildeodando para a evoluccedilatildeo de seus coacutedigos Outro fator interessante seria aplicar mais Visitorsagrave ferramenta static-analysis e fazer este mesmo estudo aplicado agrave outras caracteriacutesticasda linguagem

47

Referecircncias

[1] Kagdi Huzefa Michael L Collard e Jonathan I Maletic A survey and taxonomyof approaches for mining software repositories in the context of software evolution2007 ix 3 8 9 10 11

[2] DBeaver Dbeaver - features httpdbeaverjkissorgdocsfeatures ix 29

[3] Eclipse Vertx commit Java8-ify code httpsgithubcomeclipsevertxcommit93f95e9c77419f442a42fe711b6eeaef88192fd3 ix 42

[4] Google Guava commit Release java 8 changes to guava httpsgithubcomgoogleguavacommit73e382fa877f80994817a136b0adcc4365ccd904 ix 43

[5] Google Agera commit Collapsed testapp with retrolambda httpsgithubcomgoogleageracommit5e518b7b05f9e7a34a314945f68deff7b2c3e334 ix 44

[6] ReactiveX Rxjava commit 2x full jdk 6 compatible backport + includ-ing bugfixes up to today httpsgithubcomReactiveXRxJavacommit000a174d87a901135f9665d3b11f3627fd2dc4ed ix 45

[7] Godfrey M W e D M German The past present and future of software evolutionEm 2008 Frontiers of Maintenance paacuteginas 129ndash138 Sept 2008 1 6

[8] Favre J M Languages evolve too changing the software time scale Em Principles ofSoftware Evolution Eighth International Workshop on paacuteginas 33ndash42 IEEE 20051 5 7

[9] Overbey Jeffrey L e Ralph E Johnson Regrowing a language refactoring tools allowprogramming languages to evolve Em ACM SIGPLAN Notices volume 44 paacuteginas493ndash502 ACM 2009 1 5 7 8 12

[10] Grechanik Mark Collin McMillan Luca DeFerrari Marco Comi Stefano CrespiDenys Poshyvanyk Chen Fu Qing Xie e Carlo Ghezzi An empirical investiga-tion into a large-scale java open source code repository Em Proceedings of the2010 ACM-IEEE International Symposium on Empirical Software Engineering andMeasurement ESEM rsquo10 paacuteginas 111ndash1110 New York NY USA 2010 ACMISBN 978-1-4503-0039-1 httpdoiacmorg10114518527861852801 1

[11] TIOBE Tiobe httpswwwtiobecomtiobe-index 1 14

48

[12] Gyori Alex Lyle Franklin Danny Dig e Jan Lahoda Crossing the gap from im-perative to functional programming through refactoring Em Proceedings of the 20139th Joint Meeting on Foundations of Software Engineering ESECFSE 2013 paacute-ginas 543ndash553 New York NY USA 2013 ACM ISBN 978-1-4503-2237-9 httpdoiacmorg10114524914112491461 2 11 24 39

[13] OpenJDK State of the lambda httpcropenjdkjavanet~briangoetzlambdalambda-state-4html 2

[14] Han Jiawei Micheline Kamber e Jian Pei Data Mining Concepts and TechniquesMorgan Kaufmann Publishers Inc San Francisco CA USA 3rd ediccedilatildeo 2011ISBN 0123814790 9780123814791 3

[15] Fowler Martin e Kent Beck Refactoring improving the design of existing codeAddison-Wesley Professional 1999 5 7

[16] Lehman M M J F Ramil P D Wernick D E Perry e W M Turski Met-rics and laws of software evolution - the nineties view Em Proceedings of the4th International Symposium on Software Metrics METRICS rsquo97 paacuteginas 20ndashWashington DC USA 1997 IEEE Computer Society ISBN 0-8186-8093-8 httpdlacmorgcitationcfmid=823454823901 6

[17] Hassan Ahmed E e Tao Xie Software intelligence The future of mining softwareengineering data Em Proceedings of the FSESDP Workshop on Future of SoftwareEngineering Research FoSER rsquo10 paacuteginas 161ndash166 New York NY USA 2010ACM ISBN 978-1-4503-0427-6 httpdoiacmorg101145188236218823978 9

[18] Hassan Ahmed E The road ahead for mining software repositories Em Frontiers ofSoftware Maintenance 2008 FoSM 2008 paacuteginas 48ndash57 IEEE 2008 8

[19] Berry Michael J e Gordon Linoff Data Mining Techniques For Marketing Salesand Customer Support John Wiley amp Sons Inc New York NY USA 1997ISBN 0471179809 10

[20] Parnin Chris Christian Bird e Emerson Murphy-Hill Java generics adoption hownew features are introduced championed or ignored Em Proceedings of the 8thWorking Conference on Mining Software Repositories paacuteginas 3ndash12 ACM 2011 12

[21] Oracle The java language specification httpsdocsoraclecomjavasespecsjlsse8jls8pdf 13

[22] Oracle The history of java technology httpwwworaclecomtechnetworkjavajavaseoverviewjavahistory-index-198355html 13

[23] Murphy Kieron So why did they decide to call itjava httpwwwjavaworldcomarticle2077265core-javaso-why-did-they-decide-to-call-it-java-html 13

[24] McGraw Tata Object-oriented Programming with Java Essentials and ApplicationsHill Education 13

49

[25] Oracle Differences between java ee and java se httpdocsoraclecomjavaee6firstcupdocgkhoyhtml 13

[26] Lindsey Clark S The History of Java Cambridge 14

[27] Oracle The java language environment httpwwworaclecomtechnetworkjavaintro-141325html 14

[28] Oracle Jdk 8 httpopenjdkjavanetprojectsjdk8 15 24

[29] Oracle Enhancements in java se 8 httpdocsoraclecomjavase8docstechnotesguideslanguageenhancementshtmljavase8 15 16 17

[30] Oracle Lambda expressions httpdocsoraclecomjavasetutorialjavajavaOOlambdaexpressionshtml 16 18 21

[31] Oracle Method references httpdocsoraclecomjavasetutorialjavajavaOOmethodreferenceshtml 16

[32] Oracle Default methods httpdocsoraclecomjavasetutorialjavaIandIdefaultmethodshtml 17

[33] Oracle Repeating annotations httpdocsoraclecomjavasetutorialjavaannotationsrepeatinghtml 17

[34] Oracle Type annotations httpdocsoraclecomjavasetutorialjavaannotationstype_annotationshtml 17

[35] Oracle Anonymous inner classes httpsdocsoraclecomjavasetutorialjavajavaOOanonymousclasseshtml 19

[36] Kothari CR Research Methodology Methods and Techniques New Age Interna-tional (P) Limited 2004 ISBN 9788122415223 httpsbooksgooglecombrbooksid=8c6gkbKi-F4C 22

[37] Nakakoji Kumiyo Yasuhiro Yamamoto Yoshiyuki Nishinaka Kouichi Kishida eYunwen Ye Evolution patterns of open-source software systems and communitiesEm IWPSE rsquo02 Proceedings of the International Workshop on Principles of SoftwareEvolution paacuteginas 76ndash85 New York NY USA 2002 ACM Press ISBN 1581135459httpdxdoiorg101145512035512055 23

[38] Rahman Foyzur Christian Bird e Premkumar Devanbu Clones What is that smellEmpirical Software Engineering 17(4-5)503ndash530 2012 24

[39] Chacon Scott Pro Git Apress Berkely CA USA 1st ediccedilatildeo 2009ISBN 1430218339 9781430218333 25

[40] Cavalcanti Thiago Gomes e Viniacutecius Correa de Almeida Caracterizaccedilatildeo do uso deconstruccedilotildees da linguagem java em projetos open-source Publicaccedilatildeo online 2016httpbdmunbbrhandle1048315733 27

50

[41] Parr Terence Language Implementation Patterns Create Your Own Domain-Specific and General Programming Languages Pragmatic Bookshelf 1st ediccedilatildeo 2009ISBN 193435645X 9781934356456 27

[42] Janssen Thorben 5 reasons to use jpa hibernate Publicaccedilatildeo online httpswwwsitepointcom5-reasons-to-use-jpa-hibernate 27

[43] Franklin Lyle Alex Gyori Jan Lahoda e Danny Dig Lambdaficator From imperativeto functional programming through automated refactoring Em Proceedings of the2013 International Conference on Software Engineering ICSE rsquo13 paacuteginas 1287ndash1290 Piscataway NJ USA 2013 IEEE Press ISBN 978-1-4673-3076-3 httpdlacmorgcitationcfmid=24867882486986 29

[44] Google Agera httpsgithubcomgoogleagerawiki 34

[45] Eclipse Eclipse vertx httpvertxio 35

[46] Cejas Fernando Android cleanarchitecture httpsgithubcomandroid10Android-CleanArchitecture 36

[47] ReactiveX Rxjava httpsgithubcomReactiveXRxJava 37

[48] Luontola Esko Retrolambda httpsgithubcomorfjackalretrolambda 43

51

Anexo I

Projetos utilizados

fastjson

platform_frameworks_base

netty

material-dialogs

kotlin

okhttp

tinker

AndroidUtilCode

RxJava

spring-boot

java-design-patterns

elasticsearch

ExoPlayer

kafka

vertx

realm-java

guava

zipkin

bazel

stetho

Signal-Android

glide

agera

fresco

plaid

presto

libgdx

spark

52

disruptor

lottie-android

flexbox-layout

PocketHub

zxing

spring-framework

deeplearning4j

dropwizard

interviews

BaseRecyclerViewAdapterHelper

uCrop

DanmakuFlameMaster

lottie-react-native

android-UniversalMusicPlayer

AndroidInterview-Q-A

greenDAO

retrofit

MaterialDrawer

BottomBar

druid

MPAndroidChart

Hystrix

guice

recyclerview-animators

dubbo

androidannotations

RxJava-Android-Samples

PhotoView

clojure

CircleImageView

AndroidSwipeLayout

jedis

MaterialViewPager

butterknife

junit4

RxBinding

leakcanary

SimianArmy

picasso

UltimateRecyclerView

53

AndroidViewAnimations

AppIntro

FizzBuzzEnterpriseEdition

ion

cheesesquare

physical-web

RxAndroid

Android-CleanArchitecture

Calligraphy

Android-Bootstrap

iosched

Android_Data

MaterialDesignLibrary

ListViewAnimations

EventBus

java8-tutorial

AndroidSlidingUpPanel

dagger

okhttputils

logger

HomeMirror

Material-Animations

android-Ultra-Pull-To-Refresh

android-async-http

Android-ObservableScrollView

Android-Universal-Image-Loader

ActionBarSherlock

SlidingMenu

storm

PagerSlidingTabStrip

Android-PullToRefresh

54

  • Dedicatoacuteria
  • Agradecimentos
  • Resumo
  • Abstract
  • Introduccedilatildeo
    • Contexto
    • Objetivos
      • Objetivos Gerais
      • Objetivos Especiacuteficos
        • Metodologia
        • Organizaccedilatildeo do Trabalho
          • Evoluccedilatildeo e Mineraccedilatildeo de Repositoacuterios de Software
            • Evoluccedilatildeo de Software
            • MSR Mineraccedilatildeo de dados e a Engenharia de Software
              • Classificaccedilatildeo
                • Trabalhos Relacionados
                  • Java SE 8 e JDK 8
                    • Histoacuterico
                    • Princiacutepios
                    • Evoluccedilatildeo
                    • Expressotildees Lambda
                      • Sintaxe
                      • Principais formas de uso
                          • Estudo e o Processo de Mineraccedilatildeo
                            • Questotildees de Pesquisa
                            • Fonte de Dados e Objetos de Estudo
                            • Processo de Mineraccedilatildeo
                              • static-analysis
                              • BDAnalisador
                                • Classificaccedilatildeo e Anaacutelise
                                  • Meacutedia de Lambda
                                  • Anaacutelise Temporal
                                  • Refatoraccedilatildeo de Coacutedigo
                                  • Casos de Uso
                                      • Resultados Obtidos e Anaacutelise
                                        • Visatildeo Geral
                                          • Projetos Selecionados
                                          • agera
                                          • vertx
                                          • Android-CleanArchitecture
                                          • RxJava
                                          • guava
                                            • Refatoraccedilatildeo de Coacutedigo
                                            • Estudos de Caso
                                              • Consideraccedilotildees Finais
                                              • Referecircncias
                                              • Anexo
                                              • Projetos utilizados

linguagem tambeacutem podem ser uma barreira para que projetos comecem a evoluir o coacutedigojuntamente com a evoluccedilatildeo da linguagem

Ainda assim foi possiacutevel observar que a preocupaccedilatildeo com a co-evoluccedilatildeo do software-linguagem existe entre os desenvolvedores de projetos mas a realizaccedilatildeo da migraccedilatildeo aindaacontece lentamente devido agrave diversos fatores que precisam ser levados em consideraccedilatildeopara a manutenccedilatildeo do projeto

Para trabalhos e contribuiccedilotildees futuras seria interessante desenvolver uma ferramentaque pudesse analisar diretamente no coacutedigo-fonte as oportunidades de aplicaccedilatildeo de ex-pressotildees lambda dessa forma poderiam ser analisadas as porcentagens de conversatildeo decoacutedigo para Java 8 e obter melhores conclusotildees sobre a importacircncia que os projetos estatildeodando para a evoluccedilatildeo de seus coacutedigos Outro fator interessante seria aplicar mais Visitorsagrave ferramenta static-analysis e fazer este mesmo estudo aplicado agrave outras caracteriacutesticasda linguagem

47

Referecircncias

[1] Kagdi Huzefa Michael L Collard e Jonathan I Maletic A survey and taxonomyof approaches for mining software repositories in the context of software evolution2007 ix 3 8 9 10 11

[2] DBeaver Dbeaver - features httpdbeaverjkissorgdocsfeatures ix 29

[3] Eclipse Vertx commit Java8-ify code httpsgithubcomeclipsevertxcommit93f95e9c77419f442a42fe711b6eeaef88192fd3 ix 42

[4] Google Guava commit Release java 8 changes to guava httpsgithubcomgoogleguavacommit73e382fa877f80994817a136b0adcc4365ccd904 ix 43

[5] Google Agera commit Collapsed testapp with retrolambda httpsgithubcomgoogleageracommit5e518b7b05f9e7a34a314945f68deff7b2c3e334 ix 44

[6] ReactiveX Rxjava commit 2x full jdk 6 compatible backport + includ-ing bugfixes up to today httpsgithubcomReactiveXRxJavacommit000a174d87a901135f9665d3b11f3627fd2dc4ed ix 45

[7] Godfrey M W e D M German The past present and future of software evolutionEm 2008 Frontiers of Maintenance paacuteginas 129ndash138 Sept 2008 1 6

[8] Favre J M Languages evolve too changing the software time scale Em Principles ofSoftware Evolution Eighth International Workshop on paacuteginas 33ndash42 IEEE 20051 5 7

[9] Overbey Jeffrey L e Ralph E Johnson Regrowing a language refactoring tools allowprogramming languages to evolve Em ACM SIGPLAN Notices volume 44 paacuteginas493ndash502 ACM 2009 1 5 7 8 12

[10] Grechanik Mark Collin McMillan Luca DeFerrari Marco Comi Stefano CrespiDenys Poshyvanyk Chen Fu Qing Xie e Carlo Ghezzi An empirical investiga-tion into a large-scale java open source code repository Em Proceedings of the2010 ACM-IEEE International Symposium on Empirical Software Engineering andMeasurement ESEM rsquo10 paacuteginas 111ndash1110 New York NY USA 2010 ACMISBN 978-1-4503-0039-1 httpdoiacmorg10114518527861852801 1

[11] TIOBE Tiobe httpswwwtiobecomtiobe-index 1 14

48

[12] Gyori Alex Lyle Franklin Danny Dig e Jan Lahoda Crossing the gap from im-perative to functional programming through refactoring Em Proceedings of the 20139th Joint Meeting on Foundations of Software Engineering ESECFSE 2013 paacute-ginas 543ndash553 New York NY USA 2013 ACM ISBN 978-1-4503-2237-9 httpdoiacmorg10114524914112491461 2 11 24 39

[13] OpenJDK State of the lambda httpcropenjdkjavanet~briangoetzlambdalambda-state-4html 2

[14] Han Jiawei Micheline Kamber e Jian Pei Data Mining Concepts and TechniquesMorgan Kaufmann Publishers Inc San Francisco CA USA 3rd ediccedilatildeo 2011ISBN 0123814790 9780123814791 3

[15] Fowler Martin e Kent Beck Refactoring improving the design of existing codeAddison-Wesley Professional 1999 5 7

[16] Lehman M M J F Ramil P D Wernick D E Perry e W M Turski Met-rics and laws of software evolution - the nineties view Em Proceedings of the4th International Symposium on Software Metrics METRICS rsquo97 paacuteginas 20ndashWashington DC USA 1997 IEEE Computer Society ISBN 0-8186-8093-8 httpdlacmorgcitationcfmid=823454823901 6

[17] Hassan Ahmed E e Tao Xie Software intelligence The future of mining softwareengineering data Em Proceedings of the FSESDP Workshop on Future of SoftwareEngineering Research FoSER rsquo10 paacuteginas 161ndash166 New York NY USA 2010ACM ISBN 978-1-4503-0427-6 httpdoiacmorg101145188236218823978 9

[18] Hassan Ahmed E The road ahead for mining software repositories Em Frontiers ofSoftware Maintenance 2008 FoSM 2008 paacuteginas 48ndash57 IEEE 2008 8

[19] Berry Michael J e Gordon Linoff Data Mining Techniques For Marketing Salesand Customer Support John Wiley amp Sons Inc New York NY USA 1997ISBN 0471179809 10

[20] Parnin Chris Christian Bird e Emerson Murphy-Hill Java generics adoption hownew features are introduced championed or ignored Em Proceedings of the 8thWorking Conference on Mining Software Repositories paacuteginas 3ndash12 ACM 2011 12

[21] Oracle The java language specification httpsdocsoraclecomjavasespecsjlsse8jls8pdf 13

[22] Oracle The history of java technology httpwwworaclecomtechnetworkjavajavaseoverviewjavahistory-index-198355html 13

[23] Murphy Kieron So why did they decide to call itjava httpwwwjavaworldcomarticle2077265core-javaso-why-did-they-decide-to-call-it-java-html 13

[24] McGraw Tata Object-oriented Programming with Java Essentials and ApplicationsHill Education 13

49

[25] Oracle Differences between java ee and java se httpdocsoraclecomjavaee6firstcupdocgkhoyhtml 13

[26] Lindsey Clark S The History of Java Cambridge 14

[27] Oracle The java language environment httpwwworaclecomtechnetworkjavaintro-141325html 14

[28] Oracle Jdk 8 httpopenjdkjavanetprojectsjdk8 15 24

[29] Oracle Enhancements in java se 8 httpdocsoraclecomjavase8docstechnotesguideslanguageenhancementshtmljavase8 15 16 17

[30] Oracle Lambda expressions httpdocsoraclecomjavasetutorialjavajavaOOlambdaexpressionshtml 16 18 21

[31] Oracle Method references httpdocsoraclecomjavasetutorialjavajavaOOmethodreferenceshtml 16

[32] Oracle Default methods httpdocsoraclecomjavasetutorialjavaIandIdefaultmethodshtml 17

[33] Oracle Repeating annotations httpdocsoraclecomjavasetutorialjavaannotationsrepeatinghtml 17

[34] Oracle Type annotations httpdocsoraclecomjavasetutorialjavaannotationstype_annotationshtml 17

[35] Oracle Anonymous inner classes httpsdocsoraclecomjavasetutorialjavajavaOOanonymousclasseshtml 19

[36] Kothari CR Research Methodology Methods and Techniques New Age Interna-tional (P) Limited 2004 ISBN 9788122415223 httpsbooksgooglecombrbooksid=8c6gkbKi-F4C 22

[37] Nakakoji Kumiyo Yasuhiro Yamamoto Yoshiyuki Nishinaka Kouichi Kishida eYunwen Ye Evolution patterns of open-source software systems and communitiesEm IWPSE rsquo02 Proceedings of the International Workshop on Principles of SoftwareEvolution paacuteginas 76ndash85 New York NY USA 2002 ACM Press ISBN 1581135459httpdxdoiorg101145512035512055 23

[38] Rahman Foyzur Christian Bird e Premkumar Devanbu Clones What is that smellEmpirical Software Engineering 17(4-5)503ndash530 2012 24

[39] Chacon Scott Pro Git Apress Berkely CA USA 1st ediccedilatildeo 2009ISBN 1430218339 9781430218333 25

[40] Cavalcanti Thiago Gomes e Viniacutecius Correa de Almeida Caracterizaccedilatildeo do uso deconstruccedilotildees da linguagem java em projetos open-source Publicaccedilatildeo online 2016httpbdmunbbrhandle1048315733 27

50

[41] Parr Terence Language Implementation Patterns Create Your Own Domain-Specific and General Programming Languages Pragmatic Bookshelf 1st ediccedilatildeo 2009ISBN 193435645X 9781934356456 27

[42] Janssen Thorben 5 reasons to use jpa hibernate Publicaccedilatildeo online httpswwwsitepointcom5-reasons-to-use-jpa-hibernate 27

[43] Franklin Lyle Alex Gyori Jan Lahoda e Danny Dig Lambdaficator From imperativeto functional programming through automated refactoring Em Proceedings of the2013 International Conference on Software Engineering ICSE rsquo13 paacuteginas 1287ndash1290 Piscataway NJ USA 2013 IEEE Press ISBN 978-1-4673-3076-3 httpdlacmorgcitationcfmid=24867882486986 29

[44] Google Agera httpsgithubcomgoogleagerawiki 34

[45] Eclipse Eclipse vertx httpvertxio 35

[46] Cejas Fernando Android cleanarchitecture httpsgithubcomandroid10Android-CleanArchitecture 36

[47] ReactiveX Rxjava httpsgithubcomReactiveXRxJava 37

[48] Luontola Esko Retrolambda httpsgithubcomorfjackalretrolambda 43

51

Anexo I

Projetos utilizados

fastjson

platform_frameworks_base

netty

material-dialogs

kotlin

okhttp

tinker

AndroidUtilCode

RxJava

spring-boot

java-design-patterns

elasticsearch

ExoPlayer

kafka

vertx

realm-java

guava

zipkin

bazel

stetho

Signal-Android

glide

agera

fresco

plaid

presto

libgdx

spark

52

disruptor

lottie-android

flexbox-layout

PocketHub

zxing

spring-framework

deeplearning4j

dropwizard

interviews

BaseRecyclerViewAdapterHelper

uCrop

DanmakuFlameMaster

lottie-react-native

android-UniversalMusicPlayer

AndroidInterview-Q-A

greenDAO

retrofit

MaterialDrawer

BottomBar

druid

MPAndroidChart

Hystrix

guice

recyclerview-animators

dubbo

androidannotations

RxJava-Android-Samples

PhotoView

clojure

CircleImageView

AndroidSwipeLayout

jedis

MaterialViewPager

butterknife

junit4

RxBinding

leakcanary

SimianArmy

picasso

UltimateRecyclerView

53

AndroidViewAnimations

AppIntro

FizzBuzzEnterpriseEdition

ion

cheesesquare

physical-web

RxAndroid

Android-CleanArchitecture

Calligraphy

Android-Bootstrap

iosched

Android_Data

MaterialDesignLibrary

ListViewAnimations

EventBus

java8-tutorial

AndroidSlidingUpPanel

dagger

okhttputils

logger

HomeMirror

Material-Animations

android-Ultra-Pull-To-Refresh

android-async-http

Android-ObservableScrollView

Android-Universal-Image-Loader

ActionBarSherlock

SlidingMenu

storm

PagerSlidingTabStrip

Android-PullToRefresh

54

  • Dedicatoacuteria
  • Agradecimentos
  • Resumo
  • Abstract
  • Introduccedilatildeo
    • Contexto
    • Objetivos
      • Objetivos Gerais
      • Objetivos Especiacuteficos
        • Metodologia
        • Organizaccedilatildeo do Trabalho
          • Evoluccedilatildeo e Mineraccedilatildeo de Repositoacuterios de Software
            • Evoluccedilatildeo de Software
            • MSR Mineraccedilatildeo de dados e a Engenharia de Software
              • Classificaccedilatildeo
                • Trabalhos Relacionados
                  • Java SE 8 e JDK 8
                    • Histoacuterico
                    • Princiacutepios
                    • Evoluccedilatildeo
                    • Expressotildees Lambda
                      • Sintaxe
                      • Principais formas de uso
                          • Estudo e o Processo de Mineraccedilatildeo
                            • Questotildees de Pesquisa
                            • Fonte de Dados e Objetos de Estudo
                            • Processo de Mineraccedilatildeo
                              • static-analysis
                              • BDAnalisador
                                • Classificaccedilatildeo e Anaacutelise
                                  • Meacutedia de Lambda
                                  • Anaacutelise Temporal
                                  • Refatoraccedilatildeo de Coacutedigo
                                  • Casos de Uso
                                      • Resultados Obtidos e Anaacutelise
                                        • Visatildeo Geral
                                          • Projetos Selecionados
                                          • agera
                                          • vertx
                                          • Android-CleanArchitecture
                                          • RxJava
                                          • guava
                                            • Refatoraccedilatildeo de Coacutedigo
                                            • Estudos de Caso
                                              • Consideraccedilotildees Finais
                                              • Referecircncias
                                              • Anexo
                                              • Projetos utilizados

Referecircncias

[1] Kagdi Huzefa Michael L Collard e Jonathan I Maletic A survey and taxonomyof approaches for mining software repositories in the context of software evolution2007 ix 3 8 9 10 11

[2] DBeaver Dbeaver - features httpdbeaverjkissorgdocsfeatures ix 29

[3] Eclipse Vertx commit Java8-ify code httpsgithubcomeclipsevertxcommit93f95e9c77419f442a42fe711b6eeaef88192fd3 ix 42

[4] Google Guava commit Release java 8 changes to guava httpsgithubcomgoogleguavacommit73e382fa877f80994817a136b0adcc4365ccd904 ix 43

[5] Google Agera commit Collapsed testapp with retrolambda httpsgithubcomgoogleageracommit5e518b7b05f9e7a34a314945f68deff7b2c3e334 ix 44

[6] ReactiveX Rxjava commit 2x full jdk 6 compatible backport + includ-ing bugfixes up to today httpsgithubcomReactiveXRxJavacommit000a174d87a901135f9665d3b11f3627fd2dc4ed ix 45

[7] Godfrey M W e D M German The past present and future of software evolutionEm 2008 Frontiers of Maintenance paacuteginas 129ndash138 Sept 2008 1 6

[8] Favre J M Languages evolve too changing the software time scale Em Principles ofSoftware Evolution Eighth International Workshop on paacuteginas 33ndash42 IEEE 20051 5 7

[9] Overbey Jeffrey L e Ralph E Johnson Regrowing a language refactoring tools allowprogramming languages to evolve Em ACM SIGPLAN Notices volume 44 paacuteginas493ndash502 ACM 2009 1 5 7 8 12

[10] Grechanik Mark Collin McMillan Luca DeFerrari Marco Comi Stefano CrespiDenys Poshyvanyk Chen Fu Qing Xie e Carlo Ghezzi An empirical investiga-tion into a large-scale java open source code repository Em Proceedings of the2010 ACM-IEEE International Symposium on Empirical Software Engineering andMeasurement ESEM rsquo10 paacuteginas 111ndash1110 New York NY USA 2010 ACMISBN 978-1-4503-0039-1 httpdoiacmorg10114518527861852801 1

[11] TIOBE Tiobe httpswwwtiobecomtiobe-index 1 14

48

[12] Gyori Alex Lyle Franklin Danny Dig e Jan Lahoda Crossing the gap from im-perative to functional programming through refactoring Em Proceedings of the 20139th Joint Meeting on Foundations of Software Engineering ESECFSE 2013 paacute-ginas 543ndash553 New York NY USA 2013 ACM ISBN 978-1-4503-2237-9 httpdoiacmorg10114524914112491461 2 11 24 39

[13] OpenJDK State of the lambda httpcropenjdkjavanet~briangoetzlambdalambda-state-4html 2

[14] Han Jiawei Micheline Kamber e Jian Pei Data Mining Concepts and TechniquesMorgan Kaufmann Publishers Inc San Francisco CA USA 3rd ediccedilatildeo 2011ISBN 0123814790 9780123814791 3

[15] Fowler Martin e Kent Beck Refactoring improving the design of existing codeAddison-Wesley Professional 1999 5 7

[16] Lehman M M J F Ramil P D Wernick D E Perry e W M Turski Met-rics and laws of software evolution - the nineties view Em Proceedings of the4th International Symposium on Software Metrics METRICS rsquo97 paacuteginas 20ndashWashington DC USA 1997 IEEE Computer Society ISBN 0-8186-8093-8 httpdlacmorgcitationcfmid=823454823901 6

[17] Hassan Ahmed E e Tao Xie Software intelligence The future of mining softwareengineering data Em Proceedings of the FSESDP Workshop on Future of SoftwareEngineering Research FoSER rsquo10 paacuteginas 161ndash166 New York NY USA 2010ACM ISBN 978-1-4503-0427-6 httpdoiacmorg101145188236218823978 9

[18] Hassan Ahmed E The road ahead for mining software repositories Em Frontiers ofSoftware Maintenance 2008 FoSM 2008 paacuteginas 48ndash57 IEEE 2008 8

[19] Berry Michael J e Gordon Linoff Data Mining Techniques For Marketing Salesand Customer Support John Wiley amp Sons Inc New York NY USA 1997ISBN 0471179809 10

[20] Parnin Chris Christian Bird e Emerson Murphy-Hill Java generics adoption hownew features are introduced championed or ignored Em Proceedings of the 8thWorking Conference on Mining Software Repositories paacuteginas 3ndash12 ACM 2011 12

[21] Oracle The java language specification httpsdocsoraclecomjavasespecsjlsse8jls8pdf 13

[22] Oracle The history of java technology httpwwworaclecomtechnetworkjavajavaseoverviewjavahistory-index-198355html 13

[23] Murphy Kieron So why did they decide to call itjava httpwwwjavaworldcomarticle2077265core-javaso-why-did-they-decide-to-call-it-java-html 13

[24] McGraw Tata Object-oriented Programming with Java Essentials and ApplicationsHill Education 13

49

[25] Oracle Differences between java ee and java se httpdocsoraclecomjavaee6firstcupdocgkhoyhtml 13

[26] Lindsey Clark S The History of Java Cambridge 14

[27] Oracle The java language environment httpwwworaclecomtechnetworkjavaintro-141325html 14

[28] Oracle Jdk 8 httpopenjdkjavanetprojectsjdk8 15 24

[29] Oracle Enhancements in java se 8 httpdocsoraclecomjavase8docstechnotesguideslanguageenhancementshtmljavase8 15 16 17

[30] Oracle Lambda expressions httpdocsoraclecomjavasetutorialjavajavaOOlambdaexpressionshtml 16 18 21

[31] Oracle Method references httpdocsoraclecomjavasetutorialjavajavaOOmethodreferenceshtml 16

[32] Oracle Default methods httpdocsoraclecomjavasetutorialjavaIandIdefaultmethodshtml 17

[33] Oracle Repeating annotations httpdocsoraclecomjavasetutorialjavaannotationsrepeatinghtml 17

[34] Oracle Type annotations httpdocsoraclecomjavasetutorialjavaannotationstype_annotationshtml 17

[35] Oracle Anonymous inner classes httpsdocsoraclecomjavasetutorialjavajavaOOanonymousclasseshtml 19

[36] Kothari CR Research Methodology Methods and Techniques New Age Interna-tional (P) Limited 2004 ISBN 9788122415223 httpsbooksgooglecombrbooksid=8c6gkbKi-F4C 22

[37] Nakakoji Kumiyo Yasuhiro Yamamoto Yoshiyuki Nishinaka Kouichi Kishida eYunwen Ye Evolution patterns of open-source software systems and communitiesEm IWPSE rsquo02 Proceedings of the International Workshop on Principles of SoftwareEvolution paacuteginas 76ndash85 New York NY USA 2002 ACM Press ISBN 1581135459httpdxdoiorg101145512035512055 23

[38] Rahman Foyzur Christian Bird e Premkumar Devanbu Clones What is that smellEmpirical Software Engineering 17(4-5)503ndash530 2012 24

[39] Chacon Scott Pro Git Apress Berkely CA USA 1st ediccedilatildeo 2009ISBN 1430218339 9781430218333 25

[40] Cavalcanti Thiago Gomes e Viniacutecius Correa de Almeida Caracterizaccedilatildeo do uso deconstruccedilotildees da linguagem java em projetos open-source Publicaccedilatildeo online 2016httpbdmunbbrhandle1048315733 27

50

[41] Parr Terence Language Implementation Patterns Create Your Own Domain-Specific and General Programming Languages Pragmatic Bookshelf 1st ediccedilatildeo 2009ISBN 193435645X 9781934356456 27

[42] Janssen Thorben 5 reasons to use jpa hibernate Publicaccedilatildeo online httpswwwsitepointcom5-reasons-to-use-jpa-hibernate 27

[43] Franklin Lyle Alex Gyori Jan Lahoda e Danny Dig Lambdaficator From imperativeto functional programming through automated refactoring Em Proceedings of the2013 International Conference on Software Engineering ICSE rsquo13 paacuteginas 1287ndash1290 Piscataway NJ USA 2013 IEEE Press ISBN 978-1-4673-3076-3 httpdlacmorgcitationcfmid=24867882486986 29

[44] Google Agera httpsgithubcomgoogleagerawiki 34

[45] Eclipse Eclipse vertx httpvertxio 35

[46] Cejas Fernando Android cleanarchitecture httpsgithubcomandroid10Android-CleanArchitecture 36

[47] ReactiveX Rxjava httpsgithubcomReactiveXRxJava 37

[48] Luontola Esko Retrolambda httpsgithubcomorfjackalretrolambda 43

51

Anexo I

Projetos utilizados

fastjson

platform_frameworks_base

netty

material-dialogs

kotlin

okhttp

tinker

AndroidUtilCode

RxJava

spring-boot

java-design-patterns

elasticsearch

ExoPlayer

kafka

vertx

realm-java

guava

zipkin

bazel

stetho

Signal-Android

glide

agera

fresco

plaid

presto

libgdx

spark

52

disruptor

lottie-android

flexbox-layout

PocketHub

zxing

spring-framework

deeplearning4j

dropwizard

interviews

BaseRecyclerViewAdapterHelper

uCrop

DanmakuFlameMaster

lottie-react-native

android-UniversalMusicPlayer

AndroidInterview-Q-A

greenDAO

retrofit

MaterialDrawer

BottomBar

druid

MPAndroidChart

Hystrix

guice

recyclerview-animators

dubbo

androidannotations

RxJava-Android-Samples

PhotoView

clojure

CircleImageView

AndroidSwipeLayout

jedis

MaterialViewPager

butterknife

junit4

RxBinding

leakcanary

SimianArmy

picasso

UltimateRecyclerView

53

AndroidViewAnimations

AppIntro

FizzBuzzEnterpriseEdition

ion

cheesesquare

physical-web

RxAndroid

Android-CleanArchitecture

Calligraphy

Android-Bootstrap

iosched

Android_Data

MaterialDesignLibrary

ListViewAnimations

EventBus

java8-tutorial

AndroidSlidingUpPanel

dagger

okhttputils

logger

HomeMirror

Material-Animations

android-Ultra-Pull-To-Refresh

android-async-http

Android-ObservableScrollView

Android-Universal-Image-Loader

ActionBarSherlock

SlidingMenu

storm

PagerSlidingTabStrip

Android-PullToRefresh

54

  • Dedicatoacuteria
  • Agradecimentos
  • Resumo
  • Abstract
  • Introduccedilatildeo
    • Contexto
    • Objetivos
      • Objetivos Gerais
      • Objetivos Especiacuteficos
        • Metodologia
        • Organizaccedilatildeo do Trabalho
          • Evoluccedilatildeo e Mineraccedilatildeo de Repositoacuterios de Software
            • Evoluccedilatildeo de Software
            • MSR Mineraccedilatildeo de dados e a Engenharia de Software
              • Classificaccedilatildeo
                • Trabalhos Relacionados
                  • Java SE 8 e JDK 8
                    • Histoacuterico
                    • Princiacutepios
                    • Evoluccedilatildeo
                    • Expressotildees Lambda
                      • Sintaxe
                      • Principais formas de uso
                          • Estudo e o Processo de Mineraccedilatildeo
                            • Questotildees de Pesquisa
                            • Fonte de Dados e Objetos de Estudo
                            • Processo de Mineraccedilatildeo
                              • static-analysis
                              • BDAnalisador
                                • Classificaccedilatildeo e Anaacutelise
                                  • Meacutedia de Lambda
                                  • Anaacutelise Temporal
                                  • Refatoraccedilatildeo de Coacutedigo
                                  • Casos de Uso
                                      • Resultados Obtidos e Anaacutelise
                                        • Visatildeo Geral
                                          • Projetos Selecionados
                                          • agera
                                          • vertx
                                          • Android-CleanArchitecture
                                          • RxJava
                                          • guava
                                            • Refatoraccedilatildeo de Coacutedigo
                                            • Estudos de Caso
                                              • Consideraccedilotildees Finais
                                              • Referecircncias
                                              • Anexo
                                              • Projetos utilizados

[12] Gyori Alex Lyle Franklin Danny Dig e Jan Lahoda Crossing the gap from im-perative to functional programming through refactoring Em Proceedings of the 20139th Joint Meeting on Foundations of Software Engineering ESECFSE 2013 paacute-ginas 543ndash553 New York NY USA 2013 ACM ISBN 978-1-4503-2237-9 httpdoiacmorg10114524914112491461 2 11 24 39

[13] OpenJDK State of the lambda httpcropenjdkjavanet~briangoetzlambdalambda-state-4html 2

[14] Han Jiawei Micheline Kamber e Jian Pei Data Mining Concepts and TechniquesMorgan Kaufmann Publishers Inc San Francisco CA USA 3rd ediccedilatildeo 2011ISBN 0123814790 9780123814791 3

[15] Fowler Martin e Kent Beck Refactoring improving the design of existing codeAddison-Wesley Professional 1999 5 7

[16] Lehman M M J F Ramil P D Wernick D E Perry e W M Turski Met-rics and laws of software evolution - the nineties view Em Proceedings of the4th International Symposium on Software Metrics METRICS rsquo97 paacuteginas 20ndashWashington DC USA 1997 IEEE Computer Society ISBN 0-8186-8093-8 httpdlacmorgcitationcfmid=823454823901 6

[17] Hassan Ahmed E e Tao Xie Software intelligence The future of mining softwareengineering data Em Proceedings of the FSESDP Workshop on Future of SoftwareEngineering Research FoSER rsquo10 paacuteginas 161ndash166 New York NY USA 2010ACM ISBN 978-1-4503-0427-6 httpdoiacmorg101145188236218823978 9

[18] Hassan Ahmed E The road ahead for mining software repositories Em Frontiers ofSoftware Maintenance 2008 FoSM 2008 paacuteginas 48ndash57 IEEE 2008 8

[19] Berry Michael J e Gordon Linoff Data Mining Techniques For Marketing Salesand Customer Support John Wiley amp Sons Inc New York NY USA 1997ISBN 0471179809 10

[20] Parnin Chris Christian Bird e Emerson Murphy-Hill Java generics adoption hownew features are introduced championed or ignored Em Proceedings of the 8thWorking Conference on Mining Software Repositories paacuteginas 3ndash12 ACM 2011 12

[21] Oracle The java language specification httpsdocsoraclecomjavasespecsjlsse8jls8pdf 13

[22] Oracle The history of java technology httpwwworaclecomtechnetworkjavajavaseoverviewjavahistory-index-198355html 13

[23] Murphy Kieron So why did they decide to call itjava httpwwwjavaworldcomarticle2077265core-javaso-why-did-they-decide-to-call-it-java-html 13

[24] McGraw Tata Object-oriented Programming with Java Essentials and ApplicationsHill Education 13

49

[25] Oracle Differences between java ee and java se httpdocsoraclecomjavaee6firstcupdocgkhoyhtml 13

[26] Lindsey Clark S The History of Java Cambridge 14

[27] Oracle The java language environment httpwwworaclecomtechnetworkjavaintro-141325html 14

[28] Oracle Jdk 8 httpopenjdkjavanetprojectsjdk8 15 24

[29] Oracle Enhancements in java se 8 httpdocsoraclecomjavase8docstechnotesguideslanguageenhancementshtmljavase8 15 16 17

[30] Oracle Lambda expressions httpdocsoraclecomjavasetutorialjavajavaOOlambdaexpressionshtml 16 18 21

[31] Oracle Method references httpdocsoraclecomjavasetutorialjavajavaOOmethodreferenceshtml 16

[32] Oracle Default methods httpdocsoraclecomjavasetutorialjavaIandIdefaultmethodshtml 17

[33] Oracle Repeating annotations httpdocsoraclecomjavasetutorialjavaannotationsrepeatinghtml 17

[34] Oracle Type annotations httpdocsoraclecomjavasetutorialjavaannotationstype_annotationshtml 17

[35] Oracle Anonymous inner classes httpsdocsoraclecomjavasetutorialjavajavaOOanonymousclasseshtml 19

[36] Kothari CR Research Methodology Methods and Techniques New Age Interna-tional (P) Limited 2004 ISBN 9788122415223 httpsbooksgooglecombrbooksid=8c6gkbKi-F4C 22

[37] Nakakoji Kumiyo Yasuhiro Yamamoto Yoshiyuki Nishinaka Kouichi Kishida eYunwen Ye Evolution patterns of open-source software systems and communitiesEm IWPSE rsquo02 Proceedings of the International Workshop on Principles of SoftwareEvolution paacuteginas 76ndash85 New York NY USA 2002 ACM Press ISBN 1581135459httpdxdoiorg101145512035512055 23

[38] Rahman Foyzur Christian Bird e Premkumar Devanbu Clones What is that smellEmpirical Software Engineering 17(4-5)503ndash530 2012 24

[39] Chacon Scott Pro Git Apress Berkely CA USA 1st ediccedilatildeo 2009ISBN 1430218339 9781430218333 25

[40] Cavalcanti Thiago Gomes e Viniacutecius Correa de Almeida Caracterizaccedilatildeo do uso deconstruccedilotildees da linguagem java em projetos open-source Publicaccedilatildeo online 2016httpbdmunbbrhandle1048315733 27

50

[41] Parr Terence Language Implementation Patterns Create Your Own Domain-Specific and General Programming Languages Pragmatic Bookshelf 1st ediccedilatildeo 2009ISBN 193435645X 9781934356456 27

[42] Janssen Thorben 5 reasons to use jpa hibernate Publicaccedilatildeo online httpswwwsitepointcom5-reasons-to-use-jpa-hibernate 27

[43] Franklin Lyle Alex Gyori Jan Lahoda e Danny Dig Lambdaficator From imperativeto functional programming through automated refactoring Em Proceedings of the2013 International Conference on Software Engineering ICSE rsquo13 paacuteginas 1287ndash1290 Piscataway NJ USA 2013 IEEE Press ISBN 978-1-4673-3076-3 httpdlacmorgcitationcfmid=24867882486986 29

[44] Google Agera httpsgithubcomgoogleagerawiki 34

[45] Eclipse Eclipse vertx httpvertxio 35

[46] Cejas Fernando Android cleanarchitecture httpsgithubcomandroid10Android-CleanArchitecture 36

[47] ReactiveX Rxjava httpsgithubcomReactiveXRxJava 37

[48] Luontola Esko Retrolambda httpsgithubcomorfjackalretrolambda 43

51

Anexo I

Projetos utilizados

fastjson

platform_frameworks_base

netty

material-dialogs

kotlin

okhttp

tinker

AndroidUtilCode

RxJava

spring-boot

java-design-patterns

elasticsearch

ExoPlayer

kafka

vertx

realm-java

guava

zipkin

bazel

stetho

Signal-Android

glide

agera

fresco

plaid

presto

libgdx

spark

52

disruptor

lottie-android

flexbox-layout

PocketHub

zxing

spring-framework

deeplearning4j

dropwizard

interviews

BaseRecyclerViewAdapterHelper

uCrop

DanmakuFlameMaster

lottie-react-native

android-UniversalMusicPlayer

AndroidInterview-Q-A

greenDAO

retrofit

MaterialDrawer

BottomBar

druid

MPAndroidChart

Hystrix

guice

recyclerview-animators

dubbo

androidannotations

RxJava-Android-Samples

PhotoView

clojure

CircleImageView

AndroidSwipeLayout

jedis

MaterialViewPager

butterknife

junit4

RxBinding

leakcanary

SimianArmy

picasso

UltimateRecyclerView

53

AndroidViewAnimations

AppIntro

FizzBuzzEnterpriseEdition

ion

cheesesquare

physical-web

RxAndroid

Android-CleanArchitecture

Calligraphy

Android-Bootstrap

iosched

Android_Data

MaterialDesignLibrary

ListViewAnimations

EventBus

java8-tutorial

AndroidSlidingUpPanel

dagger

okhttputils

logger

HomeMirror

Material-Animations

android-Ultra-Pull-To-Refresh

android-async-http

Android-ObservableScrollView

Android-Universal-Image-Loader

ActionBarSherlock

SlidingMenu

storm

PagerSlidingTabStrip

Android-PullToRefresh

54

  • Dedicatoacuteria
  • Agradecimentos
  • Resumo
  • Abstract
  • Introduccedilatildeo
    • Contexto
    • Objetivos
      • Objetivos Gerais
      • Objetivos Especiacuteficos
        • Metodologia
        • Organizaccedilatildeo do Trabalho
          • Evoluccedilatildeo e Mineraccedilatildeo de Repositoacuterios de Software
            • Evoluccedilatildeo de Software
            • MSR Mineraccedilatildeo de dados e a Engenharia de Software
              • Classificaccedilatildeo
                • Trabalhos Relacionados
                  • Java SE 8 e JDK 8
                    • Histoacuterico
                    • Princiacutepios
                    • Evoluccedilatildeo
                    • Expressotildees Lambda
                      • Sintaxe
                      • Principais formas de uso
                          • Estudo e o Processo de Mineraccedilatildeo
                            • Questotildees de Pesquisa
                            • Fonte de Dados e Objetos de Estudo
                            • Processo de Mineraccedilatildeo
                              • static-analysis
                              • BDAnalisador
                                • Classificaccedilatildeo e Anaacutelise
                                  • Meacutedia de Lambda
                                  • Anaacutelise Temporal
                                  • Refatoraccedilatildeo de Coacutedigo
                                  • Casos de Uso
                                      • Resultados Obtidos e Anaacutelise
                                        • Visatildeo Geral
                                          • Projetos Selecionados
                                          • agera
                                          • vertx
                                          • Android-CleanArchitecture
                                          • RxJava
                                          • guava
                                            • Refatoraccedilatildeo de Coacutedigo
                                            • Estudos de Caso
                                              • Consideraccedilotildees Finais
                                              • Referecircncias
                                              • Anexo
                                              • Projetos utilizados

[25] Oracle Differences between java ee and java se httpdocsoraclecomjavaee6firstcupdocgkhoyhtml 13

[26] Lindsey Clark S The History of Java Cambridge 14

[27] Oracle The java language environment httpwwworaclecomtechnetworkjavaintro-141325html 14

[28] Oracle Jdk 8 httpopenjdkjavanetprojectsjdk8 15 24

[29] Oracle Enhancements in java se 8 httpdocsoraclecomjavase8docstechnotesguideslanguageenhancementshtmljavase8 15 16 17

[30] Oracle Lambda expressions httpdocsoraclecomjavasetutorialjavajavaOOlambdaexpressionshtml 16 18 21

[31] Oracle Method references httpdocsoraclecomjavasetutorialjavajavaOOmethodreferenceshtml 16

[32] Oracle Default methods httpdocsoraclecomjavasetutorialjavaIandIdefaultmethodshtml 17

[33] Oracle Repeating annotations httpdocsoraclecomjavasetutorialjavaannotationsrepeatinghtml 17

[34] Oracle Type annotations httpdocsoraclecomjavasetutorialjavaannotationstype_annotationshtml 17

[35] Oracle Anonymous inner classes httpsdocsoraclecomjavasetutorialjavajavaOOanonymousclasseshtml 19

[36] Kothari CR Research Methodology Methods and Techniques New Age Interna-tional (P) Limited 2004 ISBN 9788122415223 httpsbooksgooglecombrbooksid=8c6gkbKi-F4C 22

[37] Nakakoji Kumiyo Yasuhiro Yamamoto Yoshiyuki Nishinaka Kouichi Kishida eYunwen Ye Evolution patterns of open-source software systems and communitiesEm IWPSE rsquo02 Proceedings of the International Workshop on Principles of SoftwareEvolution paacuteginas 76ndash85 New York NY USA 2002 ACM Press ISBN 1581135459httpdxdoiorg101145512035512055 23

[38] Rahman Foyzur Christian Bird e Premkumar Devanbu Clones What is that smellEmpirical Software Engineering 17(4-5)503ndash530 2012 24

[39] Chacon Scott Pro Git Apress Berkely CA USA 1st ediccedilatildeo 2009ISBN 1430218339 9781430218333 25

[40] Cavalcanti Thiago Gomes e Viniacutecius Correa de Almeida Caracterizaccedilatildeo do uso deconstruccedilotildees da linguagem java em projetos open-source Publicaccedilatildeo online 2016httpbdmunbbrhandle1048315733 27

50

[41] Parr Terence Language Implementation Patterns Create Your Own Domain-Specific and General Programming Languages Pragmatic Bookshelf 1st ediccedilatildeo 2009ISBN 193435645X 9781934356456 27

[42] Janssen Thorben 5 reasons to use jpa hibernate Publicaccedilatildeo online httpswwwsitepointcom5-reasons-to-use-jpa-hibernate 27

[43] Franklin Lyle Alex Gyori Jan Lahoda e Danny Dig Lambdaficator From imperativeto functional programming through automated refactoring Em Proceedings of the2013 International Conference on Software Engineering ICSE rsquo13 paacuteginas 1287ndash1290 Piscataway NJ USA 2013 IEEE Press ISBN 978-1-4673-3076-3 httpdlacmorgcitationcfmid=24867882486986 29

[44] Google Agera httpsgithubcomgoogleagerawiki 34

[45] Eclipse Eclipse vertx httpvertxio 35

[46] Cejas Fernando Android cleanarchitecture httpsgithubcomandroid10Android-CleanArchitecture 36

[47] ReactiveX Rxjava httpsgithubcomReactiveXRxJava 37

[48] Luontola Esko Retrolambda httpsgithubcomorfjackalretrolambda 43

51

Anexo I

Projetos utilizados

fastjson

platform_frameworks_base

netty

material-dialogs

kotlin

okhttp

tinker

AndroidUtilCode

RxJava

spring-boot

java-design-patterns

elasticsearch

ExoPlayer

kafka

vertx

realm-java

guava

zipkin

bazel

stetho

Signal-Android

glide

agera

fresco

plaid

presto

libgdx

spark

52

disruptor

lottie-android

flexbox-layout

PocketHub

zxing

spring-framework

deeplearning4j

dropwizard

interviews

BaseRecyclerViewAdapterHelper

uCrop

DanmakuFlameMaster

lottie-react-native

android-UniversalMusicPlayer

AndroidInterview-Q-A

greenDAO

retrofit

MaterialDrawer

BottomBar

druid

MPAndroidChart

Hystrix

guice

recyclerview-animators

dubbo

androidannotations

RxJava-Android-Samples

PhotoView

clojure

CircleImageView

AndroidSwipeLayout

jedis

MaterialViewPager

butterknife

junit4

RxBinding

leakcanary

SimianArmy

picasso

UltimateRecyclerView

53

AndroidViewAnimations

AppIntro

FizzBuzzEnterpriseEdition

ion

cheesesquare

physical-web

RxAndroid

Android-CleanArchitecture

Calligraphy

Android-Bootstrap

iosched

Android_Data

MaterialDesignLibrary

ListViewAnimations

EventBus

java8-tutorial

AndroidSlidingUpPanel

dagger

okhttputils

logger

HomeMirror

Material-Animations

android-Ultra-Pull-To-Refresh

android-async-http

Android-ObservableScrollView

Android-Universal-Image-Loader

ActionBarSherlock

SlidingMenu

storm

PagerSlidingTabStrip

Android-PullToRefresh

54

  • Dedicatoacuteria
  • Agradecimentos
  • Resumo
  • Abstract
  • Introduccedilatildeo
    • Contexto
    • Objetivos
      • Objetivos Gerais
      • Objetivos Especiacuteficos
        • Metodologia
        • Organizaccedilatildeo do Trabalho
          • Evoluccedilatildeo e Mineraccedilatildeo de Repositoacuterios de Software
            • Evoluccedilatildeo de Software
            • MSR Mineraccedilatildeo de dados e a Engenharia de Software
              • Classificaccedilatildeo
                • Trabalhos Relacionados
                  • Java SE 8 e JDK 8
                    • Histoacuterico
                    • Princiacutepios
                    • Evoluccedilatildeo
                    • Expressotildees Lambda
                      • Sintaxe
                      • Principais formas de uso
                          • Estudo e o Processo de Mineraccedilatildeo
                            • Questotildees de Pesquisa
                            • Fonte de Dados e Objetos de Estudo
                            • Processo de Mineraccedilatildeo
                              • static-analysis
                              • BDAnalisador
                                • Classificaccedilatildeo e Anaacutelise
                                  • Meacutedia de Lambda
                                  • Anaacutelise Temporal
                                  • Refatoraccedilatildeo de Coacutedigo
                                  • Casos de Uso
                                      • Resultados Obtidos e Anaacutelise
                                        • Visatildeo Geral
                                          • Projetos Selecionados
                                          • agera
                                          • vertx
                                          • Android-CleanArchitecture
                                          • RxJava
                                          • guava
                                            • Refatoraccedilatildeo de Coacutedigo
                                            • Estudos de Caso
                                              • Consideraccedilotildees Finais
                                              • Referecircncias
                                              • Anexo
                                              • Projetos utilizados

[41] Parr Terence Language Implementation Patterns Create Your Own Domain-Specific and General Programming Languages Pragmatic Bookshelf 1st ediccedilatildeo 2009ISBN 193435645X 9781934356456 27

[42] Janssen Thorben 5 reasons to use jpa hibernate Publicaccedilatildeo online httpswwwsitepointcom5-reasons-to-use-jpa-hibernate 27

[43] Franklin Lyle Alex Gyori Jan Lahoda e Danny Dig Lambdaficator From imperativeto functional programming through automated refactoring Em Proceedings of the2013 International Conference on Software Engineering ICSE rsquo13 paacuteginas 1287ndash1290 Piscataway NJ USA 2013 IEEE Press ISBN 978-1-4673-3076-3 httpdlacmorgcitationcfmid=24867882486986 29

[44] Google Agera httpsgithubcomgoogleagerawiki 34

[45] Eclipse Eclipse vertx httpvertxio 35

[46] Cejas Fernando Android cleanarchitecture httpsgithubcomandroid10Android-CleanArchitecture 36

[47] ReactiveX Rxjava httpsgithubcomReactiveXRxJava 37

[48] Luontola Esko Retrolambda httpsgithubcomorfjackalretrolambda 43

51

Anexo I

Projetos utilizados

fastjson

platform_frameworks_base

netty

material-dialogs

kotlin

okhttp

tinker

AndroidUtilCode

RxJava

spring-boot

java-design-patterns

elasticsearch

ExoPlayer

kafka

vertx

realm-java

guava

zipkin

bazel

stetho

Signal-Android

glide

agera

fresco

plaid

presto

libgdx

spark

52

disruptor

lottie-android

flexbox-layout

PocketHub

zxing

spring-framework

deeplearning4j

dropwizard

interviews

BaseRecyclerViewAdapterHelper

uCrop

DanmakuFlameMaster

lottie-react-native

android-UniversalMusicPlayer

AndroidInterview-Q-A

greenDAO

retrofit

MaterialDrawer

BottomBar

druid

MPAndroidChart

Hystrix

guice

recyclerview-animators

dubbo

androidannotations

RxJava-Android-Samples

PhotoView

clojure

CircleImageView

AndroidSwipeLayout

jedis

MaterialViewPager

butterknife

junit4

RxBinding

leakcanary

SimianArmy

picasso

UltimateRecyclerView

53

AndroidViewAnimations

AppIntro

FizzBuzzEnterpriseEdition

ion

cheesesquare

physical-web

RxAndroid

Android-CleanArchitecture

Calligraphy

Android-Bootstrap

iosched

Android_Data

MaterialDesignLibrary

ListViewAnimations

EventBus

java8-tutorial

AndroidSlidingUpPanel

dagger

okhttputils

logger

HomeMirror

Material-Animations

android-Ultra-Pull-To-Refresh

android-async-http

Android-ObservableScrollView

Android-Universal-Image-Loader

ActionBarSherlock

SlidingMenu

storm

PagerSlidingTabStrip

Android-PullToRefresh

54

  • Dedicatoacuteria
  • Agradecimentos
  • Resumo
  • Abstract
  • Introduccedilatildeo
    • Contexto
    • Objetivos
      • Objetivos Gerais
      • Objetivos Especiacuteficos
        • Metodologia
        • Organizaccedilatildeo do Trabalho
          • Evoluccedilatildeo e Mineraccedilatildeo de Repositoacuterios de Software
            • Evoluccedilatildeo de Software
            • MSR Mineraccedilatildeo de dados e a Engenharia de Software
              • Classificaccedilatildeo
                • Trabalhos Relacionados
                  • Java SE 8 e JDK 8
                    • Histoacuterico
                    • Princiacutepios
                    • Evoluccedilatildeo
                    • Expressotildees Lambda
                      • Sintaxe
                      • Principais formas de uso
                          • Estudo e o Processo de Mineraccedilatildeo
                            • Questotildees de Pesquisa
                            • Fonte de Dados e Objetos de Estudo
                            • Processo de Mineraccedilatildeo
                              • static-analysis
                              • BDAnalisador
                                • Classificaccedilatildeo e Anaacutelise
                                  • Meacutedia de Lambda
                                  • Anaacutelise Temporal
                                  • Refatoraccedilatildeo de Coacutedigo
                                  • Casos de Uso
                                      • Resultados Obtidos e Anaacutelise
                                        • Visatildeo Geral
                                          • Projetos Selecionados
                                          • agera
                                          • vertx
                                          • Android-CleanArchitecture
                                          • RxJava
                                          • guava
                                            • Refatoraccedilatildeo de Coacutedigo
                                            • Estudos de Caso
                                              • Consideraccedilotildees Finais
                                              • Referecircncias
                                              • Anexo
                                              • Projetos utilizados

Anexo I

Projetos utilizados

fastjson

platform_frameworks_base

netty

material-dialogs

kotlin

okhttp

tinker

AndroidUtilCode

RxJava

spring-boot

java-design-patterns

elasticsearch

ExoPlayer

kafka

vertx

realm-java

guava

zipkin

bazel

stetho

Signal-Android

glide

agera

fresco

plaid

presto

libgdx

spark

52

disruptor

lottie-android

flexbox-layout

PocketHub

zxing

spring-framework

deeplearning4j

dropwizard

interviews

BaseRecyclerViewAdapterHelper

uCrop

DanmakuFlameMaster

lottie-react-native

android-UniversalMusicPlayer

AndroidInterview-Q-A

greenDAO

retrofit

MaterialDrawer

BottomBar

druid

MPAndroidChart

Hystrix

guice

recyclerview-animators

dubbo

androidannotations

RxJava-Android-Samples

PhotoView

clojure

CircleImageView

AndroidSwipeLayout

jedis

MaterialViewPager

butterknife

junit4

RxBinding

leakcanary

SimianArmy

picasso

UltimateRecyclerView

53

AndroidViewAnimations

AppIntro

FizzBuzzEnterpriseEdition

ion

cheesesquare

physical-web

RxAndroid

Android-CleanArchitecture

Calligraphy

Android-Bootstrap

iosched

Android_Data

MaterialDesignLibrary

ListViewAnimations

EventBus

java8-tutorial

AndroidSlidingUpPanel

dagger

okhttputils

logger

HomeMirror

Material-Animations

android-Ultra-Pull-To-Refresh

android-async-http

Android-ObservableScrollView

Android-Universal-Image-Loader

ActionBarSherlock

SlidingMenu

storm

PagerSlidingTabStrip

Android-PullToRefresh

54

  • Dedicatoacuteria
  • Agradecimentos
  • Resumo
  • Abstract
  • Introduccedilatildeo
    • Contexto
    • Objetivos
      • Objetivos Gerais
      • Objetivos Especiacuteficos
        • Metodologia
        • Organizaccedilatildeo do Trabalho
          • Evoluccedilatildeo e Mineraccedilatildeo de Repositoacuterios de Software
            • Evoluccedilatildeo de Software
            • MSR Mineraccedilatildeo de dados e a Engenharia de Software
              • Classificaccedilatildeo
                • Trabalhos Relacionados
                  • Java SE 8 e JDK 8
                    • Histoacuterico
                    • Princiacutepios
                    • Evoluccedilatildeo
                    • Expressotildees Lambda
                      • Sintaxe
                      • Principais formas de uso
                          • Estudo e o Processo de Mineraccedilatildeo
                            • Questotildees de Pesquisa
                            • Fonte de Dados e Objetos de Estudo
                            • Processo de Mineraccedilatildeo
                              • static-analysis
                              • BDAnalisador
                                • Classificaccedilatildeo e Anaacutelise
                                  • Meacutedia de Lambda
                                  • Anaacutelise Temporal
                                  • Refatoraccedilatildeo de Coacutedigo
                                  • Casos de Uso
                                      • Resultados Obtidos e Anaacutelise
                                        • Visatildeo Geral
                                          • Projetos Selecionados
                                          • agera
                                          • vertx
                                          • Android-CleanArchitecture
                                          • RxJava
                                          • guava
                                            • Refatoraccedilatildeo de Coacutedigo
                                            • Estudos de Caso
                                              • Consideraccedilotildees Finais
                                              • Referecircncias
                                              • Anexo
                                              • Projetos utilizados

disruptor

lottie-android

flexbox-layout

PocketHub

zxing

spring-framework

deeplearning4j

dropwizard

interviews

BaseRecyclerViewAdapterHelper

uCrop

DanmakuFlameMaster

lottie-react-native

android-UniversalMusicPlayer

AndroidInterview-Q-A

greenDAO

retrofit

MaterialDrawer

BottomBar

druid

MPAndroidChart

Hystrix

guice

recyclerview-animators

dubbo

androidannotations

RxJava-Android-Samples

PhotoView

clojure

CircleImageView

AndroidSwipeLayout

jedis

MaterialViewPager

butterknife

junit4

RxBinding

leakcanary

SimianArmy

picasso

UltimateRecyclerView

53

AndroidViewAnimations

AppIntro

FizzBuzzEnterpriseEdition

ion

cheesesquare

physical-web

RxAndroid

Android-CleanArchitecture

Calligraphy

Android-Bootstrap

iosched

Android_Data

MaterialDesignLibrary

ListViewAnimations

EventBus

java8-tutorial

AndroidSlidingUpPanel

dagger

okhttputils

logger

HomeMirror

Material-Animations

android-Ultra-Pull-To-Refresh

android-async-http

Android-ObservableScrollView

Android-Universal-Image-Loader

ActionBarSherlock

SlidingMenu

storm

PagerSlidingTabStrip

Android-PullToRefresh

54

  • Dedicatoacuteria
  • Agradecimentos
  • Resumo
  • Abstract
  • Introduccedilatildeo
    • Contexto
    • Objetivos
      • Objetivos Gerais
      • Objetivos Especiacuteficos
        • Metodologia
        • Organizaccedilatildeo do Trabalho
          • Evoluccedilatildeo e Mineraccedilatildeo de Repositoacuterios de Software
            • Evoluccedilatildeo de Software
            • MSR Mineraccedilatildeo de dados e a Engenharia de Software
              • Classificaccedilatildeo
                • Trabalhos Relacionados
                  • Java SE 8 e JDK 8
                    • Histoacuterico
                    • Princiacutepios
                    • Evoluccedilatildeo
                    • Expressotildees Lambda
                      • Sintaxe
                      • Principais formas de uso
                          • Estudo e o Processo de Mineraccedilatildeo
                            • Questotildees de Pesquisa
                            • Fonte de Dados e Objetos de Estudo
                            • Processo de Mineraccedilatildeo
                              • static-analysis
                              • BDAnalisador
                                • Classificaccedilatildeo e Anaacutelise
                                  • Meacutedia de Lambda
                                  • Anaacutelise Temporal
                                  • Refatoraccedilatildeo de Coacutedigo
                                  • Casos de Uso
                                      • Resultados Obtidos e Anaacutelise
                                        • Visatildeo Geral
                                          • Projetos Selecionados
                                          • agera
                                          • vertx
                                          • Android-CleanArchitecture
                                          • RxJava
                                          • guava
                                            • Refatoraccedilatildeo de Coacutedigo
                                            • Estudos de Caso
                                              • Consideraccedilotildees Finais
                                              • Referecircncias
                                              • Anexo
                                              • Projetos utilizados

AndroidViewAnimations

AppIntro

FizzBuzzEnterpriseEdition

ion

cheesesquare

physical-web

RxAndroid

Android-CleanArchitecture

Calligraphy

Android-Bootstrap

iosched

Android_Data

MaterialDesignLibrary

ListViewAnimations

EventBus

java8-tutorial

AndroidSlidingUpPanel

dagger

okhttputils

logger

HomeMirror

Material-Animations

android-Ultra-Pull-To-Refresh

android-async-http

Android-ObservableScrollView

Android-Universal-Image-Loader

ActionBarSherlock

SlidingMenu

storm

PagerSlidingTabStrip

Android-PullToRefresh

54

  • Dedicatoacuteria
  • Agradecimentos
  • Resumo
  • Abstract
  • Introduccedilatildeo
    • Contexto
    • Objetivos
      • Objetivos Gerais
      • Objetivos Especiacuteficos
        • Metodologia
        • Organizaccedilatildeo do Trabalho
          • Evoluccedilatildeo e Mineraccedilatildeo de Repositoacuterios de Software
            • Evoluccedilatildeo de Software
            • MSR Mineraccedilatildeo de dados e a Engenharia de Software
              • Classificaccedilatildeo
                • Trabalhos Relacionados
                  • Java SE 8 e JDK 8
                    • Histoacuterico
                    • Princiacutepios
                    • Evoluccedilatildeo
                    • Expressotildees Lambda
                      • Sintaxe
                      • Principais formas de uso
                          • Estudo e o Processo de Mineraccedilatildeo
                            • Questotildees de Pesquisa
                            • Fonte de Dados e Objetos de Estudo
                            • Processo de Mineraccedilatildeo
                              • static-analysis
                              • BDAnalisador
                                • Classificaccedilatildeo e Anaacutelise
                                  • Meacutedia de Lambda
                                  • Anaacutelise Temporal
                                  • Refatoraccedilatildeo de Coacutedigo
                                  • Casos de Uso
                                      • Resultados Obtidos e Anaacutelise
                                        • Visatildeo Geral
                                          • Projetos Selecionados
                                          • agera
                                          • vertx
                                          • Android-CleanArchitecture
                                          • RxJava
                                          • guava
                                            • Refatoraccedilatildeo de Coacutedigo
                                            • Estudos de Caso
                                              • Consideraccedilotildees Finais
                                              • Referecircncias
                                              • Anexo
                                              • Projetos utilizados