Escolar Documentos
Profissional Documentos
Cultura Documentos
Recife, PE - Brasil
2017
Alessandro Borges Rodrigues
Recife, PE - Brasil
2017
Dedico este trabalho minha esposa, Rejane, pelo apoio e auxlio durante toda nossa vida
juntos, e por me proporcionar o privilgio de me tornar pai.
Agradecimentos
Agradeo aos meus pais, Dulce e Adail, por terem me ensinado que a educao
um patrimnio para toda a vida e por ter me dado o suporte necessrio para seguir neste
caminho.
Aos companheiros de mestrado, em especial aos amigos do alojamento do IFPE.
Aos meus colegas de trabalho do IFTO e a esta instituio que, junto com a UFPE
e demais instituies, possibilitaram a oportunidade desse mestrado vrios servidores de
todo o pas.
Aos professores do Centro de Informtica da UFPE pelos seus ensinamentos, aos
funcionrios do CIn que contriburam para que este curso fosse realizado e especialmente
ao meu orientador Vinicius Garcia, pela acompanhamento deste trabalho.
"Se voc encontrar um caminho sem obstculos, ele provavelmente no leva a lugar
nenhum."
Frank Clark
Resumo
A constante evoluo tecnolgica, tanto de hardware quanto de software, faz com que
muitos sistemas tornem-se obsoletos, apesar de ainda atenderem seus requisitos e serem
estveis. Outrora foi a poca dos sistemas procedurais, hoje vemos que a prpria evoluo
deles, os orientados a objetos, em muitos casos, se tornaram obsoletos, grandes e complexos,
com tecnologias ultrapassadas e contendo centenas ou milhares de classes, sendo esses
problemas agravados naqueles que foram construdos de forma monoltica, possuindo assim
apenas um nico arquivo como resultado. A arquitetura orientada a servios permite
a criao de sistemas com menor complexidade, j que seus servios possuem baixo
acoplamento, permitindo atualizaes individuais sem afetar os demais servios. Porm,
a reconstruo dos sistemas j existentes nessa nova arquitetura invivel, devido ao
custo necessrio (tempo, mo de obra etc.), sendo a reengenharia deles uma possvel
soluo, que permite a reformulao desses sistemas de uma maneira menos onerosa.
Apesar da arquitetura em camadas ser bastante utilizada nos sistemas orientados a
objetos, faltam solues de reengenharia que leve esse fato em considerao, no sendo to
efetivas quando executadas em sistemas com essa arquitetura. Este trabalho busca definir
uma abordagem para modernizao de sistemas monolticos, orientados a objetos e que
tenham sido desenvolvidos com a arquitetura em camadas, para a arquitetura orientada a
servios, de uma forma semi-automatizada, sem a necessidade de o engenheiro de software
possuir um profundo conhecimento do sistema a ser modernizado. No sistema reconstrudo,
as classes das camadas de negcio e persistncia sero agrupadas de acordo com seus
relacionamentos, e os mtodos das classes de negcio sero disponibilizados como servios.
As etapas da abordagem proposta so constitudas de tcnicas, cujas frmulas e algoritmos
podem ser adicionados/transformados em ferramentas que automatizaro o processo. Esta
metodologia de modernizao permite que os web services criados possuam uma quantidade
menor de classes, alm de menor complexidade em cada servio, mantendo a funcionalidade
original. Isso conseguido tanto atravs de refatoraes no cdigo original que diminui a
quantidade de dependncia entre as classes, quanto atravs da separao de agrupamentos
de classes em pedaos menores. Foram obtidos resultados satisfatrios no estudo de caso,
como reduo de 24% da dependncia mdia entre as classes, diminuio de 80% e 6,33%
do tamanho e da complexidade esttica do componente (CSC), respectivamente e 100%
de sucesso nos testes de regresso.
Tabela 2.1 Viso geral das famlias de modernizao para SOA (RAZAVIAN;
LAGO, 2010) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
Tabela 5.1 Lista de mtricas e relao com as questes do paradigma GQM. . . . 51
Tabela 5.2 Pesos com base no tipo de relacionamento para o clculo do CSC (CHO;
KIM; KIM, 2001). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
Tabela 5.3 Comparao entre ferramentas de anlise de cdigo (ALVES; HAGE;
RADEMAKER, 2011). . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
Tabela 5.4 Segmento do resultado da identificao das classes persistncias com
suas respectivas classes de negcios . . . . . . . . . . . . . . . . . . . . 59
Tabela 5.5 Valores de tipo de fluxo existentes (ORACLE, 2016). . . . . . . . . . . 67
Tabela 5.6 Clculo da quantidade mdia de dependncias das classes por camada . 68
Tabela 5.7 Variao dos valores das mtricas de acordo com ponto de corte da
clusterizao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
Tabela 5.8 Resultado dos casos de teste . . . . . . . . . . . . . . . . . . . . . . . . 70
Lista de abreviaturas e siglas
1 INTRODUO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.1 Contextualizao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.2 Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
1.3 Organizao da Dissertao . . . . . . . . . . . . . . . . . . . . . . . . 15
2 REENGENHARIA DE SOFTWARE . . . . . . . . . . . . . . . . . . 17
2.1 Conceitos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.1.1 Terminologia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.2 Abordagens de Reengenharia de Sofware para SOA . . . . . . . . . . 19
2.3 Consideraes finais . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
2.4 Resumo do Captulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
3 ARQUITETURAS DE SOFTWARE . . . . . . . . . . . . . . . . . . 23
3.1 Conceitos Bsicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
3.2 Arquitetura monoltica . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
3.3 SOA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
3.4 Arquitetura em Camadas . . . . . . . . . . . . . . . . . . . . . . . . . 26
3.5 Consideraes Finais . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
3.6 Resumo do Captulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
REFERNCIAS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
13
1 Introduo
1.1 Contextualizao
Atualmente existe um grande nmero de empresas que trabalham com sistemas
implementados com linguagens de programao antigas, alm de arquiteturas muito
restritivas. A defasagem das linguagens e arquiteturas um problema recorrente e pode
acontecer com qualquer sistema em seu ciclo de vida, pois sempre surgem novas tecnologias
e paradigmas que melhoram a qualidade dos sistemas desenvolvidos, alm de diminuir o
tempo de desenvolvimento necessrio, tornando as tecnologias existentes obsoletas.
Apesar das grandes vantagens na utilizao das novas tecnologias, reconstruir os
sistemas legados geralmente um trabalho complexo, demanda tempo, possui um custo
alto e muitas vezes chega a ser invivel. Porm, devido a quantidade de informaes
armazenadas e a confiabilidade que suas funcionalidades possuem aps vrios anos de
utilizao e aprimoramento, esses sistemas continuam sendo essenciais para as empresas
(CONNALL; BURNS, 1993; ULRICH, 1994), de forma que uma opo mais vivel a
atualizao do sistema legado existente para que usufrua das novas tecnologias.
A Reengenharia de Software uma forma de conseguir evoluir esses sistemas
legados, mantendo o conhecimento existente neles (Dos Santos Brito et al., 2008). No
incio dos anos 90, com a popularizao das linguagens orientadas a objetos (OO), foram
iniciadas vrias pesquisas relacionadas modernizao dos sistemas procedurais para
OO atravs da Reengenharia, devido ao ganho na reutilizao e manutenibilidade que a
orientao a objetos possibilita.
Em pouco tempo, linguagens orientadas a objetos se tornaram as mais utilizadas
no desenvolvimento de sistemas (TIOBE.COM, 2017), o que significa que uma grande
quantidade de sistemas foram e vm sendo desenvolvidos nessas linguagens OO. Porm,
com o tempo, o aprimoramento gradual desses sistemas OO aumentou sua complexidade
na manuteno e testes. Essa complexidade agravada naqueles que so monolticos
(STOJANOVI, 2005), ou seja, geram apenas um executvel ou componente como resultado,
dificultando tambm na escalabilidade e introduo de novas tecnologias em funcionalidades
especficas, (DRAGONI et al., 2016), sendo essas novas tecnologias, em alguns casos,
incompatveis com as utilizadas.
A arquitetura orientada a servio (SOA) resolve os problemas dos sistemas monol-
ticos, melhorando a escalabilidade, que pode ser feita para cada servio, alm de diminuir
a complexidade da manuteno e testes, j que estes podem ser feitos em componentes
menores (VILLAMIZAR et al., 2015).
Captulo 1. Introduo 14
1.2 Objetivos
Esta dissertao tem o objetivo de definir um catlogo de tcnicas para auxiliar
na modernizao de sistemas orientados a objetos, monolticos e com arquitetura em
camadas para SOA, independente da linguagem de programao utilizada. Por causa da
aplicabilidade dessa abordagem em vrias linguagens de programao, no so definidas
ferramentas especficas a serem utilizadas, e sim tcnicas, frmulas e algortimos que podem
ser adicionados/transformados em ferramentas de apoio. Esta abordagem composta
de trs etapas, diminuio de dependncias, clusterizao 1 e criao dos servios, sendo
que cada uma delas possui tcnicas semi-automatizadas que agilizar o processo. O foco
principal dessa abordagem na identificao dos possveis servios, atravs do agrupamento
de classes que se relacionam entre si.
Um dos objetivos da primeira etapa, diminuio de dependncias, a reduo do
acoplamento entre as classes, diminuindo a quantidade de relacionamentos entre elas e
permitindo a criao de servios menores, ou seja com menos classes. Essa etapa tambm
padroniza a comunicao que deve acontecer somente entre as classes da camada de
negcio.
Na segunda etapa, "clusterizao", definida uma tcnica que permite a diviso de
um servio em servios menores, de acordo com a modularidade que essa diviso ir gerar.
O objetivo dessa etapa , tambm, permitir a criao de servios menores, que facilitar
1
Clusterizao a palavra equivalente em portugus para o termo clustering, em ingls, que significa
agrupamento, referenciando a agrupamento de classes no contexto desta pesquisa.
Captulo 1. Introduo 15
2 Reengenharia de Software
Nos dias atuais fcil perceber a dependncia das organizaes em relao aos
softwares por ela utilizados, no sendo mais possvel a existncia de uma organizao
sem eles (CONNALL; BURNS, 1993; ULRICH, 1994). Tal importncia faz com que
essas organizaes procurem utilizar as mais modernas tecnologias, seja para melhorar o
desempenho interno, seja para ganhar alguma vantagem em relao a seus concorrentes.
Porm, grande parte dos sistemas crticos utilizados foram desenvolvidos h muitos anos e
apenas sua manuteno no o bastante para mant-los atualizados.
Lehman e Belady (1985) demonstram que pior que a desatualizao, quando
no se faz alguma melhoria, a degradao da qualidade atravs da manuteno e,
consequentemente, a manutenibilidade do software. Visaggio (2001) chama essa degradao
de "sintomas de envelhecimento"(aging symptoms) e apresenta evidncias de que o processo
de Reengenharia pode diminui-los.
Neste captulo so apresentados conceitos de Reengenharia de Software que sero
relevantes na abordagem proposta.
2.1 Conceitos
Segundo Seacord, Plakosh e Lewis (2003), reengenharia uma forma de moderni-
zao que melhora as capacidades ou manutenibilidade de um sistema legado atravs da
introduo de tecnologias e prticas modernas. Os objetivos principais da Reengenharia
so (SNEED, 1995):
2.1.1 Terminologia
Chikofsky e Cross (1990) apresenta a terminologia empregada na engenharia de
software relacionadas as tecnologias de anlise e entendimento de sistemas legados, sendo
os principais termos:
A Figura 2.1 mostra o relacionamento entre esses termos, sendo que foi considerado
apenas trs estgios do ciclo de vida (Requisitos, Projeto e Implementao), com claras
Captulo 2. Reengenharia de Software 19
A Tabela 2.1 mostra a diviso das 75 abordagens avaliadas dentro das fmlias
definidas, sendo que a coluna Quantidade mostra o nmero de abordagens dentro de
cada famlia e a coluna Percentual mostra seu percentual equivalente em relao ao total
de abordagens analisadas.
Tabela 2.1 Viso geral das famlias de modernizao para SOA (RAZAVIAN; LAGO,
2010)
Famlia Quantidade Percentual
Famlia da transformao de cdigo 12 16%
Famlia da identificao de servio 12 16%
Famlia da transformao do modelo de negcio 5 7%
Famlia de transformao de elementos de projeto 21 28%
Famlia da Engenharia Avante 8 10%
Famlia da transformao de projetos e elementos compostos 10 14%
Famlia da transformao de composio baseada em padres 3 4%
Famlia da Engenharia Avante com anlise de lacunas 4 5%
Captulo 2. Reengenharia de Software 22
3 Arquiteturas de Software
Simplicidade de escalonamento, uma vez que basta criar mltiplas cpias da aplicao
acessadas por um balanceador de carga.
Limitao na escalabilidade do sistema, uma vez que para escalar deve-se criar novas
instncias de toda a aplicao, mesmo que o trfego seja intenso em apenas um
grupo pequeno de mdulos, ou mesmo apenas um;
3.3 SOA
Erl (2005) define a arquitetura orientada a servios (SOA) como um estilo arquite-
tural que define o uso de servios de software com baixo acoplamento e interoperacionais
para atender os requisitos dos processos de negcio e usurios. Segundo Daigneau (2012),
o servio se refere a qualquer funo de software que executa uma operao de negcio.
Apesar de ser possvel utilizar tecnologias como CORBA e DCOM para dispo-
nibilizar servios atravs de componentes, o foco deste trabalho ser na utilizao de
web services, pois provm os meios para integrar sistemas diferentes e expem funes
reutilizveis atravs de HTTP (DAIGNEAU, 2012), utilizando-se de padres abertos e
interoperveis em diferentes plataformas de computao e independentes das tecnologias
de execuo subjacentes.
De acordo com Daigneau (2012), os web services podem utilizar o HTTP (Hypertext
Transfer Protocol) de duas maneiras, sendo a primeira para a troca de dados, empregando
para isso padres como XML e JSON (servios SOAP/WSDL). A segunda usando o HTTP
como protocolo de aplicao que define semnticas para o comportamento dos servios
(servios REST).
REST (REpresentational State Transfer), inicialmente definido por Fielding (2000),
um estilo de arquitetura de software para sistemas de hipermdia distribudos, ou
sistemas em que texto, imagens, udios, e outras mdias so armazenadas atravs da rede
e interconectadas atravs de hyperlinks (KALIM, 2013). REST web services so baseados
em URLs e nos quatro mtodos do protocolo HTTP, utilizando POST para inserir um
novo registro, PUT para alterar um registro existente, DELETE para excluir um registro
e GET para pegar as informaes de um registro.
SOAP (Simple Object Access Protocol) um protocolo para troca de mensagens,
utilizado para traduzir as informaes de um web service (por exemplo request e response),
sendo as mensagens documentos XML (KHAN; ABBASI, 2015). SOAP tambm conhecido
como Envelope SOAP, j que seu elemento raiz o Envelope. Seu formato segue o padro
mostrado na Figura 3.1.
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
, xmlns:ser="http://servicos.estoque.knight.com/"/>
</soapenv:Body>
</soapenv:Envelope>
endereo de retorno), e Body, que possui o corpo da requisio (ex: nome da operao
e seus parmetros). O Header tambm permite a adio de especificaes de recursos
adicionais relativos a web services, como o WS-Transaction, que permite um controle extra
de transaes entre servios, e o WS-Security que adiciona camadas de segurana ao web
service.
A existncia dessas extenses, em especial a WS-Transaction (detalhado na Seo
4.2.3) foi o principal motivo para a escolha do protocolo SOAP ao invs de REST para os
web services a serem criados pela proposta de modernizao de arquitetura. Apesar de
existirem formas para controle de transaes entre REST web services, isso geralmente no
conseguido de forma to transparente, sendo necessria a adio de uma nova camada ou
framework, como por exemplo o Atomikos1 , e a criao de funes especficas para desfazer
as operaes j concludas quando ocorrer um erro. Essa adio de operaes acrescenta
um ponto crtico modernizao, pois o cdigo acrescentado, se feito de forma incorreta,
pode prejudicar a confiabilidade dos dados, alm de ser necessrio um maior conhecimento
do sistema a ser modernizada. Apesar de dificuldades adicionais existentes com utilizao
de REST, esta ainda uma opo vivel, desde que observados os pontos levantados.
Porm, para simplificar o processo de modernizao e aumentar a confiabilidade do sistema
modernizado, todos os web services citados neste trabalho esto relacionados a SOAP.
Alm de SOA existem outras arquiteturas baseadas em servio, sendo que a de
microservios merece mais destaque. A diferenciao entre a arquitetura de microservios
e SOA um ponto de discusso delicado entre os pesquisadores, pois ambas utilizam
servios como principal componente de implementao e execuo de funcionalidades
(RICHARDS, 2015). Alm disso, existem autores que inclusive colocam microservio como
uma abordagem SOA (NEWMAN, 2015).
Embora possa se discutir se microservios ou no SOA, existem algumas
caractersticas que uma arquitetura deve possuir para receber tal classificao. Newman
(2015) define microservios como servios pequenos e autnomos que trabalham em
conjunto. Com base nessa definio, possvel inferir que a proposta da utilizao de
servios neste trabalho no atende estes requisitos, isso porque nem o tamanho ou sua
independncia esto entre as restries impostas pela abordagem de modernizao proposta,
podendo gerar servios de vrios tamanhos, tanto independentes quanto relacionados entre
si. A criao destes servios apresentada com mais detalhes na Seo 4.2.3.
1
Disponvel em <https://www.atomikos.com/>
Captulo 3. Arquiteturas de Software 27
Apesar de ser a camada de apresentao que mostra os dados para o usurio, ela
no tem acesso direto a eles, mas sim a persistncia. Como apenas a camada superior
pode fazer requisies a camada abaixo dela, uma requisio da apresentao deve passar
pela camada de negcio, que processar e retransmitir para a camada subjacente que a
persistncia. A resposta para essa requisio far o caminho inverso.
Em sistemas orientados a objetos, geralmente usada uma outra estrutura para
representar os dados do banco de dados (Entidade da Figura 3.2), sendo que ela trafega
entre as camadas. Pelo fato dessa arquitetura estar relacionada a separao das estruturas
estticas, ela pode estar presente tanto em um sistema monoltico quanto dentro de um
servio SOA.
aplicaes Java Enterprise Edition (BASS; CLEMENTS; KAZMAN, 2012), muitas das
pesquisas relacionadas modernizao de sistemas legados para componentes ou servios
no levam em considerao a existncia dessas camadas.
Essa declarao pode ser observada na pesquisa de Wang et al. (2008), que evidencia
a desconsiderao da existncia de camadas. Apesar disso no estar explcito em outras
pesquisas (ADJOYAN; SERIAI; SHATNAWI, 2014; CONSTANTINOU et al., 2015;
BUDHKAR; GOPAL, 2012; YOUSEF; ADWAN; ABUSHARIAH, 2014; Liang Bao et al.,
2010; Eunjoo Lee et al., 2003; WANG et al., 2008), o mesmo fato pode ser constatado.
Pois estas outras pesquisas observam apenas os relacionamentos entre as classes, podendo
por exemplo gerar componentes/servios onde pode existir uma classe de negcio e uma de
persistncia, mas sem as entidades que trafegaro as informaes, ou uma classe entidade
e uma de negcio, sem uma persistncia para salvar as informaes.
As arquiteturas baseadas em servios resolvem os problemas listados na Seo 3.2.
Porm, mesmo utilizando essas novas arquiteturas para os novos desenvolvimentos, ainda
restam os sistemas legados, escritos monoliticamente, que precisam ter sua arquitetura
migrada de forma a aproveitar de seus benefcios, sendo o auxlio a essa modernizao o
foco deste trabalho.
class ClasseN1{ class ClasseN2{
public void metodo1(){ public void metodo2(){
ClasseN2 classeN2 = new ClasseN2(); ClasseP2 classeP2 = new ClasseP2();
classeN2.metodo2(); classeP2.alterar();
}
ClasseP1 classeP1 = new ClasseP1();
classeP1.alterar(); public void metodo4(){
} ClasseN1 classeN1 = new ClasseN1();
classeN1.metodo3();
public void metodo3(){
ClasseP1 classeP1 = new ClasseP1(); ClasseP2 classeP2 = new ClasseP2();
classeP1.alterar(); classeP2.alterar();
} }
} }
@WebService @WebService
class ClasseN1{ class ClasseN2{
public void metodo1(){ public void metodo2(){
//ServicoClasseN2 referencia ao web service da ClasseP2 classeP2 = new ClasseP2();
, classe ClasseN2 classeP2.alterar();
ServicoClasseN2 servicoClasseN2 = new }
, ServicoClasseN2();
servicoClasseN2.metodo2(); public void metodo4(){
//ServicoClasseN1 referencia ao web service da
ClasseP1 classeP1 = new ClasseP1(); , classe ClasseN1
classeP1.alterar(); ServicoClasseN1 servicoClasseN1 = new
} , ServicoClasseN1();
servicoClasseN1.metodo3();
public void metodo3(){
ClasseP1 classeP1 = new ClasseP1(); ClasseP2 classeP2 = new ClasseP2();
classeP1.alterar(); classeP2.alterar();
} }
} }
da equao:
X X
F C(N1 , P1 ) = F C(Mn , Mp ) (4.1)
Mn M SET (N1 ) Mp M SET (P1 )
PAbscount(Mp )
P ricount(M ) w + COX(Pi ) , se Mn chama Mp
p pri i=0
F C(Mn , Mp ) =
0 , caso contrrio
(4.2)
P
w
aT Y P E(Pi ) pri
, se a primitivo
COX(Pi ) = wabs , se a membro de Pi (4.3)
COX(a) wabs , caso contrrio
Em que:
wpri , wabs = pesos para parmetros primitivo e criados pelo desenvolvedor (wpri +
wabs . = 1, geralmente wabs > wpri , pois tipos criados costumam ser mais complexos
que tipos primitivos). Esses pesos devem ser definidos pelo Engenheiro de Sofware
responsvel pela modernizao do sistema legado (Eunjoo Lee et al., 2003);
Pi = classe passada como parmetro para o mtodo Mp e que foi criada pelo desen-
volvedor e
considerado para esse caso, apenas o peso wabs para representar essa complexidade. Para
os parmetros primitivos, i1 e flt1, tero como complexidade o peso wpri .
possvel verificar que o primeiro agrupamento foi o das classes N2 e N1, pois, com
ele, conseguiu-se o maior ganho de modularidade (W=0,6250) em relao as outras
possibilidades de agrupamento (N2-N3, N2-N4 e N3-N4). Na segunda iterao o maior ganho
da modularidade foi com a juno de N2 com N3 (W=0,500), e para a ltima iterao
restou a juno dos dois nicos componentes existentes, N1-N2 e N2-N3, transformando
tudo em um nico cluster e encerrando o algoritmo.
A escolha do ponto de corte ser baseada na modularizao que cada iterao gera,
de acordo com a modularidade que o sistema possui em cada iterao. Neste exemplo,
optando-se pelo ponto de corte nas junes N1-N2 ou N3-N4 o mesmo resultado ser
gerado, ou seja, produzir dois componentes, um contendo as classes N1 e N2 e outro
contendo as classes N3 e N4. importante ressaltar que pode haver casos em que o
melhor no selecionar nenhum ponto de corte, mantendo todas as classes em um nico
componente. O clculo da modularidade feito atravs da seguinte frmula (ERDEMIR;
TEKIN; BUZLUCA, 2011; SHIOKAWA; FUJIWARA; ONIZUKA, 2013; ERDEMIR;
BUZLUCA, 2014):
P
Qw = i (C(i))
Em que:
Qw = modularidade;
Captulo 4. Modernizao de sistemas monolticos para arquitetura orientada a servios 35
eii = quantidade de arestas internas dividida pelo total de arestas do grafo (frao
de arestas internas ao cluster) e
Como boa parte dos sistemas legados no possuem documentao ou estas esto
desatualizadas ou incompletas (LEWIS; MORRIS; SMITH, 2005; KHADKA et al., 2013;
ERDEMIR; BUZLUCA, 2014), todas as tcnicas apresentadas usam como entrada apenas
o prprio cdigo fonte do sistema, analisando-o e/ou refatorando-o para atingir o objetivo
final.
Na primeira etapa feita uma anlise do cdigo, verificando as ligaes entre as
classes e calculando a fora de conectividade (FC) entre as classes de negcio e as classes
de persistncia utilizadas. A FC utilizada como base nas refatoraes para diminuir a
quantidade de relacionamentos existentes. Na segunda etapa, a partir do cdigo refatorado,
executado o agrupamento das classes de acordo com seus relacionamentos. Para os casos
necessrios, o engenheiro de software executa o algoritmo de "clusterizao"fast community
(Seo 4.1.2), responsvel pela diviso em grupos menores. A etapa final culmina na criao
de web services a partir das classes de negcio. Nesta ltima etapa no so definidas
tcnicas especficas, mas critrios para auxiliar na tomada de deciso do engenheiro na
Captulo 4. Modernizao de sistemas monolticos para arquitetura orientada a servios 36
criao dos servios. Devido a variedade de formas possveis que os desenvolvedores podem
utilizar para determinar se uma classe de negcio ou persistncia, como incluso em
pacotes especficos ou estender determinada classe, a identificao da camada das classes
ficar a cargo do Engenheiro de Software encarregado pela modernizao do sistema.
Nas sees a seguir sero detalhadas as etapas da abordagem, suas tcnicas e
ferramentas utilizadas, alm de demonstr-las atravs de sua execuo sobre o sistema SIGA-
EPCT (Sistema Integrado de Gesto Acadmica da Educao Profissional e Tecnolgica).
Esse sistema atende os requisitos iniciais e utilizado por alguns Institutos Federais de
Educao, Cincia e Tecnologia do pas.
conceito de camadas (FOWLER, 2002), essa prtica dificulta a criao das classes em
componentes menores, conforme ilustrado pela Figura 4.6a.
Para tentar diminuir o tamanho do componente a ser gerado, definiu-se mais uma
refatorao, na qual cada classe de persistncia ir se relacionar com apenas uma classe de
negcio, conforme ilustrado na Figura 4.6b.
Porm, para realizar a operao proposta primeiro deve-se identificar qual classe de
negcio ser responsvel por qual classe de persistncia. Isto feito calculando a FC entre
cada classe das camadas de negcio e persistncia, sendo que a frmula para o clculo da
FC foi explicada na Seo 4.1.1. Com base na FC, cada classe de persistncia dever se
relacionar com a classe de negcio que possuir a maior conectividade.
Para exemplificar essa refatorao, supem-se um sistema com duas classes de
negcio (N1 e N2), duas de persistncia (P1 e P2) e trs de entidade (E1, E2 e E3),
conforme mostrado na Figura 4.7.
Inicialmente necessrio calcular a complexidade (COX) das classes usadas como
parmetros entre N1 e P1, ou seja, as entidades E1 e E2. Como E1 tem dois atributos
primitivos ento sua complexidade COX(E1) = 2 * wpri 2 * 0,3 0,6. Para o clculo
referente a classe E2, temos COX(E2) = 1 * wpri + COX(E3) * wabs 1 * 0,3 + (1 *
0,3) * 0,7 0,51. Para esse exemplo usou-se os valores 0,3 e 0,7 para os pesos wpri e wabs
respectivamente, conforme definidos por Eunjoo Lee et al. (2003).
Com o valor das complexidades obtidas anteriormente possvel calcular a fora
de conectividade entre N1P1, N1P2, N2P1, N2P2, tendo:
F C(N 1, P 2) = 1 wpri 1 0, 3 0, 3
Captulo 4. Modernizao de sistemas monolticos para arquitetura orientada a servios 38
public void metodoP3(E2 e2, int i1){ public void metodoP4(E1 e1, E2 e2){
... ...
} }
} }
...
}
...
}
4.2.2 Clusterizao
Aps as refatoraes para diminuio das dependncias, deve-se reanalisar o cdigo
fonte, de forma a agrupar as classes para que, posteriormente, venham a formar componentes
que iro disponibilizar servios. Como cada classe de negcio j engloba um conjunto
especfico de persistncias, torna-se possvel simplificar essa anlise, focando apenas na
camada de negcio.
O objetivo dessa etapa unir as classes que possuem relacionamento, criando
grupos independentes. Porm, pode ser necessrio que alguns desses componentes precisem
ser divididos, diminuindo, assim, seus tamanhos. Como uma tentativa dessa reduo,
executado o algoritmo apresentado na Seo 4.1.2.
Para exemplificar a execuo desse algoritmo, primeiramente deve-se criar um grafo
a partir do cdigo do sistema. A Figura 4.11 mostra o grafo contendo as classes de negcio
do cdigo da Figura 4.7, sendo includo outras arestas nesse grafo para melhor ilustrar a
execuo do algoritmo de "clusterizao".
Para esse grafo, inicialmente efetuado o clculo de sua modularidade, considerando
cada aresta como um cluster diferente, obtendo os valores:
2
0 2
C(N 1) = 4
4
0, 25
2
0 3
C(N 2) = 4
4
0, 5625
2
0 2
C(N 3) = 4
4
0, 25
Captulo 4. Modernizao de sistemas monolticos para arquitetura orientada a servios 41
2
0 1
C(N 4) = 4
4
0, 0625
A modularidade Qw acima reflete o valor quando considera que cada aresta, que
representa uma classe, um cluster diferente, sendo Qw obtido atravs da soma do clculo
de C(N1), C(N2), C(N3) e C(N4), que levam em considerao as arestas internas e externas
de cada cluster.
O prximo passo do algoritmo agrupar os dois clusters que geraram um maior
ganho de modularidade. Essa variao da modularidade deve ser calculada agrupando as
classes que possuem arestas entre si (N1N2, N1N3, N2N3 e N2N4), sendo o valor
da modularidade Qw para cada agrupamento demonstrado a seguir.
A unio de N1 a N2 resulta em:
2
1 3
C(N 1, N 2) = 4
4
= 0, 3125
2
1 2
C(N 1, N 3) = 4
4
=0
2
1 3
C(N 2, N 3) = 4
4
= 0, 3125
Captulo 4. Modernizao de sistemas monolticos para arquitetura orientada a servios 42
2
1 2
C(N 2, N 4) = 4
4
=0
Com base nas simulaes apresentadas acima, a juno que trouxe o maior ganho
de modularidade foi a juno de N2 com N4 que obteve um ganho de 0,625 (Q4 = 0, 625).
Essa juno encerra a primeira iterao do algoritmo, lembrando que as iteraes acabam
somente quando todas as arestas estiverem dentro do mesmo cluster.
Para a segunda iterao deve-se fazer novamente todas as junes possveis, mas
agora considerando N2 e N4 como um nico cluster. Dessa forma as junes possveis so
N1N3, N1N2,N4 e N2,N4N3. Nessa iterao a modularidade a ser utilizada como
base deve ser a que gerou a juno, ou seja Qw4 .
A unio de N1 a N2 resulta em:
2
1 2
C(N 1, N 3) = 4
4
=0
2
2 2
C(N 1, N 2 N 4) = 4
4
= 0, 25
2
2 2
C(N 2 N 4, N 3) = 4
4
= 0, 25
Segundo Girvan e Newman (2003) o valor de Qw [-0,5, +1] geralmente varia entre
0,3 e 0,7, sendo que o valor para estruturas com forte ligao varia entre 0,6 e 0,7. Com
base nesses dados, verifica-se que, para o exemplo da Figura 4.12, o melhor deixar todas
as classes em um nico componente, pois no foi encontrado um ponto de corte em que o
valor da modularidade esteja dentro da variao citada.
Utilizando das informaes obtidas nessa etapa, possvel separar os grupos de
classes de negcio e suas respectivas dependncias em projetos separados. Cada projeto
ter classes de negcio e de persistncia exclusivas. Porm, como a camada de entidade a
representao da base de dados, as entidades utilizadas sero copiadas para cada projeto,
de acordo com a utilizao, podendo haver duplicao de classes. Contudo, no o foco
desse trabalho tratar da separao das entidades. Caso haja interfaces e superclasses na
camada de negcio e/ou de persistncia, elas tambm sero copiadas, conforme sugerido
por Wang et al. (2008).
O processo de "clusterizao"dessa seo pode ser visto na Figura 4.13. O prximo
passo consiste na a criao e disponibilizao dos servios para cada um dos projetos
criados, de forma que possam ser acessados atravs da internet.
Captulo 4. Modernizao de sistemas monolticos para arquitetura orientada a servios 44
2. Mtodos abstratos no podem ser publicados porque esse tipo de mtodo no contm
um corpo com sua implementao, ficando esta implementao a cargo de suas
subclasses que podero publicar seus mtodos;
Captulo 4. Modernizao de sistemas monolticos para arquitetura orientada a servios 45
3. Mtodos com mesmo nome devem possuir nomes de servio diferentes, pois o padro
WSDL, responsvel pela descrio e localizao dos servios, no leva em considerao
as assinaturas dos mtodos, somente seus nomes;
Durabilidade: uma vez que a transao for concluda com sucesso, as alteraes
devem permanecer mesmo em caso de futuras falhas.
A Seo 4.2.3.1 traz mais detalhes sobre o controle de transaes entre servios
diferentes.
WS-Coordination
Identificador da atividade;
WS-Transaction
trs camadas, composta por trs etapas (Seo 4.1). A primeira a diminuio de
dependncias (Seo 4.2.1), que ir reduzir a quantidade de relacionamentos entre as
classes, tanto na camada de persistncia quanto na de negcio. A segunda etapa a
"clusterizao", (5.3.2) que agrupar as classes relacionadas, e a ltima define critrios a
serem seguidos durante a criao dos web services.
Para auxiliar na etapa de diminuio de dependncias, utilizada a frmula da
fora de conectividade (Seo 4.1.1), que calcula a fora de ligao entre as classes. Na
etapa de "clusterizao" executado o algoritmo fast community (Seo 4.1.2) que agrupa
as classes relacionadas permitindo a diviso dos grupos com tamanhos indesejados.
No prximo captulo apresentado o estudo de caso, feito sobre um sistema acad-
mico, que executa as trs etapas apresentadas, demonstrando a efetividade das mesmas.
Foram utilizadas ferramentas que automatizam a execuo das duas primeiras etapas,
diminuio de dependncias e clusterizao, mostrando a eficcia da semi-automatizao
dessas etapas. Para a etapa de criao de servios, apresentada a implementao dos
critrios definidos, para a criao dos web services, dentro do sistema acadmico.
50
5.1 Contexto
Segundo Kitchenham e Pickard (1998), o estudo de caso define o conjunto de
objetivos e limitaes em que ele deve ser executado. Para definir esses objetivos, a
metodologia GQM (Goal/Question/Metric) foi utilizada, derivando em um conjunto de
questes que devem ser respondidas para determinar se o objetivo foi alcanado.
Objetivo (Goal): Avaliar a abordagem proposta, em relao a sua eficcia, do
ponto de vista do engenheiro de software e no contexto de sistemas monolticos, orientados
a objetos e que tenham sido desenvolvidos com arquitetura de trs camadas.
Definido o objetivo, ele refinado em questes para caracterizar a forma em que
a avaliao do objetivo ser realizada (BASILI; CALDIERA; ROMBACH, 1994). As
questes (questions) definidas foram:
Questo 1: Que tipo de melhoria a refatorao das classes traz?
Nesta questo, tenta-se identificar a melhoria obtida com a etapa de Diminuio
de dependncias (Seo 4.2.1).
Questo 2: Quais foram as melhorias obtidas nos componentes gerados?
Nesta questo, tenta-se identificar os benefcios obtidos com a etapa de "Clusteriza-
o"(Seo 5.3.2).
Questo 3: A funcionalidade original mantida aps a criao dos servios?
Nesta questo, tenta-se verificar se as funcionalidades originais foram mantidas
aps a modernizao de arquitetura.
Para responder s perguntas, um conjunto de mtricas (metrics) so definidas e
associadas s questes (WOHLIN et al., 2000), sendo elas apresentadas na Tabela 5.1,
na qual a coluna Medida mostra a medida utilizada para o clculo, a coluna Questes
mostra qual questo a mtrica est relacionada e a coluna Resultados Esperados
indica se esperado que os percentuais aumentem () ou diminuam (), para as mtricas
M1 a M4. Para a mtrica M5, a coluna de resultados indica o percentual de testes de
Captulo 5. Estudo de caso e avaliao da abordagem 51
m
X
CSC = (Count(Ri ) W (Ri ))
i=1
Em que:
Tabela 5.2 Pesos com base no tipo de relacionamento para o clculo do CSC (CHO;
KIM; KIM, 2001).
5.2 Planejamento
Para o teste da proposta foi escolhido o sistema acadmico SIGA-EPCT12 (Sistema
Integrado de Gesto Acadmica da Educao Profissional e Tecnolgica), na qual as
tcnicas apresentadas foram testadas. Este sistema foi idealizado inicialmente atravs de
um projeto de pesquisa da SETEC/MEC que financiou o seu desenvolvimento atravs de
parcerias com vrios Institutos Federais em todo o Brasil. Hoje, o sistema acadmico
utilizado por alguns desses institutos.
A escolha desse sistema se deve ao fato dele atender aos requisitos da pesquisa
sendo um sistema Java, desenvolvido sob a arquitetura trs camadas e monoltico, pois
possui apenas um arquivo EAR (Enterprise Application aRchive) a ser publicado em
um servidor de aplicao. Ele possui 200 classes de negcio, 244 persistncias e 474
entidades, totalizando 1148 classes e 77.092 linhas de cdigo, desconsiderando a camada
de apresentao.
5.2.1.1 JCluster
1
Site do sistema: <http://colaboracao.sigaepct.net/>
2
Foi utilizada nessa pesquisa foi a verso em desenvolvimento 11.1 (commits do dia 05/10/2016)
3
Site da ferramenta <https://sewiki.iai.uni-bonn.de/research/jtransformer/start>
4
Disponibilizado no github atravs do link <https://github.com/aborgesrodrigues/
hierarchical-clustering>
Captulo 5. Estudo de caso e avaliao da abordagem 53
Separao dos componentes: para cada conjunto de cores do grafo criada uma
pasta com todas as classes de mesma cor, alm de suas dependncias. Com isso
possvel criar projetos independentes para cada componente, observando apenas as
bibliotecas necessrias.
5
Foi utilizado como base o sistema j existente disponvel atravs do link <https://github.com/
lbehnke/hierarchical-clustering-java>:
Captulo 5. Estudo de caso e avaliao da abordagem 54
O if/else da linha 6 do algoritmo 2 faz com que um vrtice que possua mais de
uma origem no tenha a mesma cor de nenhuma delas. Esse passo foi definido para que o
engenheiro de software no seja induzido a englobar esses vrtices a nenhuma das origens
primrias.
5.2.1.2 JTransformer
6
Detalhes da linguagem Prolog pode ser encontrado no link <http://lpn.swi-prolog.org/lpnpage.php?
pageid=online>
Captulo 5. Estudo de caso e avaliao da abordagem 55
Polimorfismo que especifica se as consultas podem ser abstradas dos tipos em que
as relaes so construdas;
Tabela 5.3 Comparao entre ferramentas de anlise de cdigo (ALVES; HAGE; RADE-
MAKER, 2011).
Criterio vs. Grok Rscript JRelCal SemmleCode CrocoPat JGraLab JTransformer
Ferramentas
Paradigma Relational Relational and API OO and FO-logic SQL-like and FO-logic
Comprehensions Relational SQL-like Imperative Path Expr
String x x x x x x x
Tipos Int x x x x x x x
Real x - x x x x x
Bool - x x x x x x
Other - Composite Java Object - Edges Logic terms
and Location and Node
Parametrizao - x x - x x x
Polimorfismo - x x x - x x
Modularidade x x x x x - x
Bibliotecas - - x x - - x
1 type(Type,Name) :-
2 classDefT(Type, _,Name, _).
3
4 field(Field, InClass, FType, FName) :-
5 type(_ ,FType, _),
6 fieldT(Field,InClass,T,FName, _).
7
8 method(Meth,InClass,MName,Args,RetType) :-
9 type( _,RetType, _),
10 methodT(Meth,InClass,MName,Args,T, _, _).
11
12 instanceMethod(Method,InClass,Name,Args,Type) :-
13 method(Method,InClass,Name,Args,Type),
14 not(Name = <init>),
15 not(Name = <cinit>).
16
17 accesses(AccessingM,InBlock,OnRecv,AccessedField) :-
18 getFieldT( _,InBlock,AccessingM,OnRecv,AccessedField).
19
20 calls(CallingM,InBlock,CalledM,Args) :- // %Inst. method
21 execT(Exec,InBlock,CallingM, Call),
22 applyT(Call,Exec,CallingM, _, _,Args,CalledM).
23 calls(CallingM,InBlock,CalledM,Args) :- // %Constructor
24 newClassT( _,InBlock,CallingM,CalledM,Args, _, _, _).
25
26 param(Param,InMethod,Type) :-
27 paramT(Param,InMethod,type( _,Type, _), _).
28
29 forLoopBody(For,InMethod, LoopBody) :-
30 forLoopT(For, _,InMethod, _, _, _,LoopBody).
5.3 Execuo
Nessa seo, ser descrita a execuo da abordagem de modernizao sobre o
sistema SIGA-EPCT, detalhando cada uma das etapas, facilitando o entendimento das
questes, das mtricas e de seus clculos.
A prxima etapa para diminuio das dependncias fazer com que uma classe de
persistncia fique relacionada a somente uma classe de negcio, conforme explicado na
Seo 4.2.1. Para isso, primeiramente necessrio identificar as persistncias e a classe de
Captulo 5. Estudo de caso e avaliao da abordagem 59
negcio correspondente a cada uma delas. Assim, foi desenvolvido o plugin JCluster (Seo
5.2.1.1) que analisa o cdigo e calcula a fora de conectividade (Seo 4.1.1) entre todas
as classes de negcio e persistncia. Ao final do processo gerado um arquivo contendo
essa relao, conforme pode ser observado na Tabela 5.4.
Tabela 5.4 Segmento do resultado da identificao das classes persistncias com suas
respectivas classes de negcios
informao. Dessa forma, esse mtodo torna-se irrelevante, j que possvel obter a mesma
informao apenas chamando a classe de destino diretamente. Conforme dito antes, ao
realizar essas excluses, pode acontecer de algumas classes ficarem sem nenhum mtodo
em seu corpo, podendo, ento, ser excludas do projeto, sendo que no sistema SIGA-EPCT,
sete classes de negcio foram removidas.
Figura 5.5 Resultado das refatoraes da modernizao onde uma persistncia est
associada apenas um negcio
Captulo 5. Estudo de caso e avaliao da abordagem 61
A Figura 5.5 mostra parte do resultado das etapas da refatorao citada anterior-
mente, sendo que a 5.5a exibe alguns mtodos inseridos na classe ManterCalendarioA-
cademicoEJB, referentes a chamadas de sua persistncia que estavam includas em outras
classes. A Figura 5.5b demonstra a excluso de mtodos que no agregavam informao
ou processamento ao resultado da chamada (item 2.2 das etapas de refatorao). Alm
disso, tambm revela o resultado da alterao do mtodo removerFaltasDaAula, que
teve a chamada ao mtodo remover da classe FaltaDAO, alterado para uma chamada
ao mtodo de mesmo nome mas pertencente classe ManterDiarioClasseEJB, que a
responsvel pela persistncia.
Apesar de agilizar bastante o processo, ainda necessrio fazer pequenas adequaes
manuais no cdigo aps as refatoraes, como adequao dos imports e adaptao dos
mtodos duplicados que podem ter sido inseridos, alm da excluso, quando possvel, de
classes que ficaram sem nenhum mtodo, entre outros.
1 :- module(persistence_migration_transformation, []).
2
3 :- multifile(user:ct/3).
4
5 %CallId - Chamada a uma persistncia que no pertence classe de negcio
6 %Business - Classe de negcio onde ocorre a chamada
7 %BusinessTarget - Classe de negcio para onde foi a persistncia chamada
8 user:ct( replaceCalls(CallId, Business, BusinessTarget),
9 (
10 %cria a varivel do negcio a ser chamado
11 classT(BusinessTarget, _, NameBusinessTarget, _, _),
12 implementsT(_, BusinessTarget, BusinessTargetInterface),
13 fieldT(FieldEJB, Business, BusinessTargetInterface, NameBusinessTarget, null),
14 new_id(NewGetFieldEJB)
15 ),
16 (
17 %insere a varivel no cdigo
18 add(fieldAccessT(NewGetFieldEJB,_,_,_,FieldEJB,_)),
19 %substitui a chamada da persistncia para o negcio
20 replace(callT(CallId, Parent, Encl, _, Args, Method, TypeParams, Type),
21 callT(CallId, Parent, Encl, NewGetFieldEJB, Args, Method, TypeParams, Type))
22 )
23 ).
Linha 8: Varivel CallId identifica uma chamada a uma persistncia que no pertence
a classe de negcio, e BusinessTarget representa a classe de negcio para a qual a
persistncia foi migrada;
5.3.2 Clusterizao
Seguindo o procedimento detalhado na Seo 4.2.2, foi criado o grafo do sistema
SIGA-EPCT, atravs da ferramenta JCluster (Seo 5.2.1.1), que representa as classes de
negcio e seus relacionamentos, sendo possvel visualizar parte dele na Figura 5.7. Nessa
figura cada conjunto de cores representa um possvel componente a ser gerado, sendo que
a colorao seguiu o Algoritmo 2 da Seo 5.2.1.1.
Na Figura 5.7 possvel ver a existncia de alguns grupos de vrtices isolados, porm
verifica-se que em grande parte eles esto inter-relacionados (dentro da marcao). Para esse
caso, e mesmo para os grupos menores, pode-se executar o algoritmo de "clusterizao"fast
community, descrito na Seo 4.1.2, gerando um dendrograma para tentar identificar uma
melhor diviso das classes. O algoritmo no executado sobre todo o sistema de uma vez,
sendo necessrio que o engenheiro de software escolha cada conjunto de classes que deseja
tratar. A Figura 5.8 mostra um zoom maior nas classes presentes dentro da marcao,
para melhor visualizao.
O dendrograma da Figura 5.9 representa a "clusterizao"dos vrtices contidos
dentro da marcao da Figura 5.7 e gerado ao se clicar em qualquer um desses vrtices.
Nessa imagem possvel verificar a modularidade em cada iterao e sua variao, conforme
explicado na Seo 4.1.2. Com base nas informaes disponibilizadas, o engenheiro de
software pode selecionar um dos pontos de juno e visualizar a quantidade de componentes
que esse ponto de corte ir gerar, atravs das cores apresentadas (Figura 5.9).
Ao escolher um ponto de corte, as cores do dendrograma so repassadas para o
grafo. Apesar do Engenheiro de Software ter liberdade na escolha do ponto de corte, Girvan
e Newman (2003) sugere que a modularidade do ponto escolhido seja igual ou superior a
0,6, conforme explicado na Seo 4.2.2. O engenheiro dever fazer esse procedimento em
todos os grupos de classes nos quais deseja diminuir seu tamanho.
Captulo 5. Estudo de caso e avaliao da abordagem 63
Aps o trmino das clusterizaes, JCluster (Seo 5.2.1.1) cria diretrios separados
para cada grupo de cores existentes no grafo e move para elas cada conjunto que possuem a
mesma cor, levando alm das classes de negcio, suas persistncias, e copiando as entidades,
interfaces e superclasses utilizadas. Cada pasta conter todas as classes necessrias para
Captulo 5. Estudo de caso e avaliao da abordagem 64
@WebService
public class ManterStatusAlunoEJB implements IManterStatusAlunoEJB {
@PersistenceContext(unitName = "siga")
private EntityManager em;
@WebMethod
public List<TipoStatusAluno> consultarTodosTipoStatusAluno() throws NegocioException {
return new TipoStatusAlunoDAO(this.em).consultarTodos();
}
duplicated_method_names_finder(MethodId, MethodIdAux) :-
%filtrar somente as classes de negcio
packageT(Package, 'org.sigaept.edu.negocio.ejb'),
compilationUnitT(CompilationUnit, Package, _, _, [ClassId]),
classT(ClassId, CompilationUnit, _, _, _),
%compara os mtodos dentro de uma mesma classe
methodT(MethodId, ClassId, MethodName, _, _, _, _, _),
methodT(MethodIdAux, ClassId, MethodNameAux, _, _, _, _, _),
%ignora a comparao de um mtodo com ele mesmo
MethodId \== MethodIdAux,
%compara mtodo com mesmo nome
MethodName == MethodNameAux.
4.2.3.
Alterao do nome do mtodo Alterao do nome do servio
@WebService @WebService
public class ManterAbonoFaltaEJB{ public class ManterAbonoFaltaEJB{
... ...
@WebMethod @WebMethod
public List<AbonoFalta> pesquisaSimples(...) { public List<AbonoFalta> pesquisaSimples(...) {
... ...
} }
@WebMethod @WebMethod(operationName="pesquisaSimples2")
public List<AbonoFalta> pesquisaSimples2(...){ public List<AbonoFalta> pesquisaSimples(...) {
... ...
} }
... ...
} }
Figura 5.12 Mudana dos nomes dos mtodos dos web services
@WebService
@Transactional(value=Transactional.TransactionFlowType.SUPPORTS, version=Transactional.Version.DEFAULT)
public class ManterTurmaEJB extends GenericCrudEJB<Turma, TurmaDAO> implements IManterTurmaEJB {
...
@WebMethod
public List<Turma> consultarTodosTurmasPorDocente(Docente docente) {
return new TurmaDAO(em).consultarTodosTurmasPorDocente(docente);
}
...
}
Tabela 5.6 Clculo da quantidade mdia de dependncias das classes por camada
Um exemplo que demonstra essa realidade apresentado pela Figura 5.15, mos-
trando que originalmente a classe CopiarTurmaEJB fazia uso de trs classes de persistn-
cia, PeriodoLetivoDAO, CursoDAO, TurmaDAO, e depois da refatorao passou a
referenciar apenas uma nica classe de negcio ManterTurmaEJB. Essa figura tambm
mostra a remoo de mtodos que deixaram de ser relevantes, pois passaram a existir na
classe de negcio ManterTurmaEJB.
Tabela 5.7 Variao dos valores das mtricas de acordo com ponto de corte da clusteri-
zao
Aps Clusterizao
Ponto de Ponto de Ponto de Ponto de
Original
Corte 1 Corte 2 Corte 3 Corte 4
Modularidade 1 0,9612 0,8999 0,8117 0,7253
Qtde de componentes 1 2 3 4 5
COXP 14,20 13,96 13,73 13,51 13,30
TACO 22 11 7,33 5,5 4,4
ACCO 0 0,50 1,33 1,50 1,80
Com base nas medidas da Tabela 5.7 possvel calcular as mtricas M2, M3 e M4,
tambm calculadas a partir dos pontos de corte definidos nessa tabela (1 ao 4). Temos
ento:
Para a mtrica M4 foi utilizado como base o valor de ACCO calculado para o ponto
de corte 1, j que originalmente no existe dependncia com outro componente (ACCO =
0). Essas dependncias passam a existir aps a diviso do componente original, que gera
componentes menores que se relacionam.
Captulo 5. Estudo de caso e avaliao da abordagem 70
Em todos os casos de teste foram obtidos sucesso nas comparaes, indicando que
a funcionalidade continuou trazendo os mesmos resultados. Os asteriscos (*) nos dois
ltimos resultados da Tabela 5.8 so para informar que foi necessrio uma refatorao
antes de sua execuo. O motivo foi pelo fato de as entidades utilizadas como parmetros
formarem um ciclo a partir de seus atributos, que geram erro no momento da montagem
dos XMLs para troca de mensagens, sendo necessrio retirar os ciclos encontrados. Um
exemplo de ciclo encontrado pode ser verificado pelas linhas destacadas dos trechos de
cdigos mostrados na Figura 5.16, onde para esse caso foi retirado o atributo private
List<ProjetoPedagogicoCurso> projetosPedagogicosCurso da classe Curso.
public class Curso extends GenericEntidadeId { public class ProjetoPedagogicoCurso extends
@CampoUnico(descricao="Cdigo") , GenericEntidadeId{
@Column(name="codigo")
private String codigo; ...
... @Column(name="nome_arquivo")
private String nomeArquivo;
@OneToMany(mappedBy="curso")
private List<ProjetoPedagogicoCurso> @ManyToOne
, projetosPedagogicosCurso; @JoinColumn(name = "curso_id")
private Curso curso;
...
} ...
}
Apesar de a alterao para retirada dos ciclos das entidades no ter uma complexi-
dade alta, pode afetar vrias partes do sistema, onde necessrio substituir as chamadas
aos atributos retirados por novos mtodos de consulta para trazer os mesmos dados.
5.5 Discusso
Com base nas mtricas calculadas para as questes definidas anteriormente pode-se
observar a eficcia da proposta de modernizao, sendo esse o objetivo principal deste
estudo de caso. Uma das principais caractersticas est na reduo do tamanho dos web
services gerados. Isso feito tanto na primeira etapa, diminuio de dependncias, que
reduz o acoplamento entre as classes, quanto na etapa de "clusterizao", que permite a
quebra dos grupos de classes. Outro ponto a incluso do controle de transaes entre
servios, que ajuda a garantir que as funcionalidades originais continuaro funcionando da
mesma forma.
Apesar dos benefcios obtidos, existem alguns pontos crticos a serem observados
nesta pesquisa. O primeiro relacionados ao uso da frmula da fora de conectividade
(Seo 4.1.1) para a diminuio do acoplamento das classes, e o segundo na utilizao
do algoritmo fast community na "clusterizao"das classes(Seo 4.1.2). Apesar de serem
tcnicas sobre as quais j foram comprovadas suas eficcias, no possvel assegurar que
so as melhores opes existentes para subsidiar essas operaes, pois embora existam
vrias abordagens que podem ser utilizadas para atingir o mesmo objetivo, faltam trabalhos
que os comparem de forma a auxiliar na escolha. Devido a complexidade existente em
realizar essas comparaes, essa atividade no foi includa no escopo desse trabalho.
Outro ponto crtico est relacionado aos testes. No foi utilizado nenhum framework
para a execuo dos testes da Seo 5.4.3, mas criou-se um ambiente integrado com o
sistema original e com os web services gerados, onde foi possvel executar ambos e comparar
os resultados. A no utilizao de um framework de testes como Junit8 ou Arquillian9 foi
por causa de problemas tcnicos encontrados, como a chamada de classes EJB (Enterprise
JavaBeans) de dentro dos casos de teste. Tambm no foi testado a performance dos web
services criados, ficando a cargo do engenheiro de software definir uma forma de fazer tais
validaes, alm de realizar um conjunto de testes que abranjam mais reas do sistema.
Apesar da abordagem proposta no exigir que o Engenheiro de Software possua um
profundo conhecimento sobre sistema a ser modernizado, o cdigo sistema SIGA-EPCT,
do estudo de caso foi conseguido pelo fato do autor pertencer a equipe de desenvolvimento,
o que prejudica essa avaliao. Apesar disso, a utilizao do sistema SIGA-EPCT como
estudo se caso foi devido a dificuldade de se conseguir acesso ao cdigo fonte de sistemas
8
Site do Junit: <http://junit.org/junit4/>
9
Site do Arquillian: <http://arquillian.org/>
Captulo 5. Estudo de caso e avaliao da abordagem 72
razoavelmente complexos.
A metodologia proposta no tem a pretenso de gerar uma arquitetura ideal de
servios ao final do processo, mas garantir que esse novo cdigo seja funcional, mantenha as
mesmas funcionalidades do sistema original e facilite a manuteno dos servios disponibili-
zados. Um importante resultado a ser obtido permitir ao engenheiro de software, a partir
do cdigo refatorado, analisar pontualmente a performance de cada servio, identificando
possveis gargalos. A partir de uma anlise mais restrita, e no da totalidade do sistema,
possvel fazer novas refatoraes que se julgarem necessrias, podendo alterar a arquitetura
ou at mesmo a linguagem utilizada em cada servio sem afetar os demais web services,
desde que no sejam alteradas as assinaturas dos mtodos disponibilizados.
"clusterizao"hierrquico com base nos valores das FF obtidos. Para definir o ponto de
corte utilizado o algoritmo depth first search (DFS), sendo que inicialmente, no n raiz,
comparado a similaridade do n corrente com a similaridade dos ns filhos, sendo que
quando a similaridade do n corrente for maior que a mdia da similaridade dos ns filhos,
este n ser o ponto de corte.
Tanto o agrupamento das classes quanto a clusterizao delas se assemelham nas
propostas apresentadas acima, inclusive em relao a proposta desta pesquisa. Todas
essas abordagens, apesar de definirem critrios distintos, agrupam as classes atravs destes
critrios e utilizam algoritmos de "clusterizao"hierrquica para o agrupamento dessas
classes. Essas clusterizaes so todas feitas de forma hierrquica, sendo que algumas geram
grafos, criam dendrogramas e escolhem um ponto de corte (Eunjoo Lee et al., 2003; WANG
et al., 2008; ADJOYAN; SERIAI; SHATNAWI, 2014), ou agrupam hierarquicamente as
classes, analisando o valor que esse agrupamento gera at que se atinja um ponto de
parada, ou treshold, que assemelha-se ao uso do ponto de corte (BUDHKAR; GOPAL,
2012).
Uma das vantagens da abordagem de modernizao proposta em relao as apre-
sentadas anteriormente, so as refatoraes definidas com o intuito de diminuir o tamanho
dos servios a serem criados, enquanto as demais no possuem esta etapa. Outra vantagem
que a abordagem desta pesquisa leva em considerao a existncia de uma arquitetura
de camadas no sistema legado a ser modernizado, enquanto as demais abordagens descon-
sideram esse fato, podendo causar agrupamentos de classes inviveis de se manter, como
entidades e persistncia sem negcio, ou negcio e persistncia sem entidades, tornando-as
difceis de se aplicar nos sistemas com esse tipo de arquitetura.
6.2 Contribuies
A principal contribuio a definio de uma abordagem para a modernizao
para SOA de sistemas monolticos, orientados a objetos e que tambm possuam uma
arquitetura em camadas, atravs das etapas e tcnicas semi-automatizadas que foram
definidas nela.
A primeira etapa dessa abordagem, diminuio das dependncias, contribui com
tcnicas que permitem a semi-automatizao de refatoraes que reduzir a quantidade
de dependncias que cada classe possui, em relao a outras classes, tanto na camada
de persistncia quanto na de negcio, de modo a permitir um menor acoplamento nos
servios a serem gerados.
A segunda etapa, "clusterizao", tambm apresenta tcnicas que possibilitam
a semi-automatizao da identificao dos grupos de classes de negcio, que podero
disponibilizar seus mtodos como servios. Alm disso, tambm apresentada tcnicas
Captulo 6. Consideraes finais e trabalhos futuros 75
que permitem a diviso desses grupos, caso seja necessrio, devido quantidade de classes
que possuram em um primeiro momento.
Apesar da abordagem no ser direcionada a uma linguagem de programao
especfica, foi criado o plugin JCluster que implementa as tcnicas das duas primeiras
etapas da abordagem, semi-automatizando o processo para os sistemas desenvolvidos
na linguagem Java. A descrio da utilizao do plugin JTransformer para a anlise e
refatorao de cdigo contribui para elucidar seu funcionamento, que pode ser utilizado
das mais diversas formas.
A terceira etapa, criao de servios, apesar de no descrever nenhuma tcnica
para a criao dos web services, contribui com a descrio de como eles devem ser criados,
e as caractersticas que eles devem possuir.
1
Disponvel em <https://www.soapui.org>
2
Disponvel em <http://www.testing-whiz.com/>
3
Disponvel em <https://www.parasoft.com/product/soatest/>
77
Referncias
BASILI, V. R.; CALDIERA, G.; ROMBACH, H. D. The goal question metric approach.
Encyclopedia of Software Engineering, v. 2, p. 528532, 1994. Citado na pgina 50.
BASS, L.; CLEMENTS, P.; KAZMAN, R. Software Architecture in Practice (3rd Edition)
(SEI Series in Software Engineering). [S.l.: s.n.], 2012. 640 p. ISBN 0321815734. Citado 2
vezes nas pginas 23 e 28.
BINUN, A.; KNIESEL, G. Joining forces for higher precision and recall of design pattern
detection. . . . , Technical report IAI-TR-2012-01, 2012. Citado na pgina 54.
CHO, E. S.; KIM, M. S.; KIM, S. D. Component metrics to measure component quality.
Proceedings Eighth Asia-Pacific Software Engineering Conference, p. 419426, 2001. ISSN
1530-1362. Citado 2 vezes nas pginas 9 e 51.
DAIGNEAU, R. Service Design Pattern. [S.l.: s.n.], 2012. XXXIII. 8187 p. ISSN
0717-6163. ISBN 9780874216561. Citado na pgina 25.
Dos Santos Brito, K. et al. LIFT - A Legacy information retrieval tool. Journal of
Universal Computer Science, v. 14, n. 8, p. 12561284, 2008. ISSN 0958695X. Disponvel
em: <http://www.scopus.com/inward/record.url?eid=2-s2.0-45949097336{&}partnerID=
40{&}md5=717a584161cfa00c2741519582>. Citado na pgina 13.
Referncias 78
DRAGONI, N. et al. Microservices: yesterday, today, and tomorrow. 2016. Citado 2 vezes
nas pginas 13 e 24.
ERDEMIR, U.; TEKIN, U.; BUZLUCA, F. Object Oriented Software Clustering Based on
Community Structure. Proceedings - 18th Asia-Pacific Software Engineering Conference,
APSEC 2011, p. 315321, 2011. ISSN 1530-1362. Citado 4 vezes nas pginas 30, 32, 33
e 34.
Eunjoo Lee et al. A reengineering process for migrating from an object-oriented legacy
system to a component-based system. In: Proceedings 27th Annual International Computer
Software and Applications Conference. COMPAC 2003. [S.l.]: IEEE Comput. Soc, 2003. p.
336341. ISBN 0-7695-2020-0. ISSN 0730-3157. Citado 6 vezes nas pginas 28, 30, 31, 37,
73 e 74.
FREUND, T.; STOREY, T. Transactions in the world of Web services. Research Paper,
IBM, 2002. Citado 3 vezes nas pginas 7, 46 e 47.
GUO, H. et al. Wrapping client-server application to Web services for Internet computing.
Parallel and Distributed Computing, Applications and Technologies, PDCAT Proceedings,
v. 2005, p. 366370, 2005. Citado na pgina 44.
KALIM, M. Java Web Services: Up and Running, 2nd Edition. [S.l.: s.n.], 2013. 359 p.
ISBN 9781449365110. Citado 2 vezes nas pginas 25 e 64.
KHADKA, R. et al. A structured legacy to SOA migration process and its evaluation in
practice. c2013 IEEE 7th International Symposium on the Maintenance and Evolution
of Service-Oriented and Cloud-Based Systems, MESOCA 2013, p. 211, 2013. ISSN
2326-6910. Citado na pgina 35.
KHAN, M. W.; ABBASI, E. Differentiating Parameters for Selecting Simple Object Access
Protocol ( SOAP ) vs . Representational State Transfer ( REST ) Based Architecture.
Journal of Advances in Computer Networks, v. 3, n. 1, 2015. ISSN 17938244. Citado na
pgina 25.
Referncias 79
LEWIS, G.; MORRIS, E.; SMITH, D. Service-Oriented Migration and Reuse Technique
(SMART). Software Technology and Engineering Practice, 2005. 13th IEEE International
Workshop on, n. September, p. 222229, 2005. Citado na pgina 35.
Liang Bao et al. Extracting reusable services from legacy object-oriented systems. 2010
IEEE International Conference on Software Maintenance, p. 15, 2010. ISSN 1063-6773.
Citado 3 vezes nas pginas 14, 28 e 30.
NEWMAN, S. Building Microservices. 1st. ed. [S.l.]: OReilly Media, Inc., 2015. 280 p.
ISBN 1491950358, 9781491950357. Citado na pgina 26.
Object Management Group (OMG). Business Process Model and Notation (BPMN)
Version 2.0. Business, v. 50, n. January, p. 170, 2011. ISSN 13507540. Citado na pgina
35.
RAZAVIAN, M.; LAGO, P. Towards a conceptual framework for legacy to SOA migration.
Lecture Notes in Computer Science (including subseries Lecture Notes in Artificial
Intelligence and Lecture Notes in Bioinformatics), v. 6275 LNCS, p. 445455, 2010. ISSN
03029743. Citado 3 vezes nas pginas 9, 19 e 21.
REUTER, A.; GRAY, J. Transaction Processing: Concepts and Techniques. [S.l.: s.n.],
1993. Citado na pgina 45.
SAUDATE, A. SOA Aplicado Integrando com web services e alm. [S.l.: s.n.], 2013. 293 p.
ISBN 9788566250152. Citado 2 vezes nas pginas 7 e 25.
TIOBE.COM. TIOBE Index for January 2017. 2017. Disponvel em: <http:
//www.tiobe.com/tiobe-index/>. Acesso em: 28/01/2017. Citado na pgina 13.
TZERPOS, V.; HOLT, R. MoJo: a distance metric for software clusterings. Sixth Working
Conference on Reverse Engineering, p. 187193, 1999. Citado na pgina 76.