Você está na página 1de 49

CENTRO UNIVERSITRIO SERRA DOS RGOS

CENTRO DE CINCIAS E TECNOLOGIA


CURSO DE BACHARELADO EM CINCIA DA COMPUTAO
DESENVOLVIMENTO PROFISSIONAL UTILIZANDO TCNICAS
DE CDIGO LIMPO
Autor:
Marcello Torres de Oliveira Galhardo
Orientador:
Chessman Kennedy Faria Correa
Terespolis
Julho de 20!
Galhardo" Marcello Torres de Oliveira# Desenv!v"#en$
P%&"ss"n'! U$"!"('n) T*+n"+'s )e C,)"- L"#.
Terespolis: Centro $niversit%rio &erra dos 'r()os" 20!#
Orientador: Chessman Kennedy Faria Correa
Mono(ra*ia + C$,&O -. /AC0A,.1A-O .M C234C2A -A
COM5$TA67O -O C.4T,O $428.,&2T9,2O &.,,A -O&
',G7O&#
# Cdi(o limpo# 2# .n(enharia de so*t:are# ;# -esenvolvimento
de so*t:are#

Tra<alho de conclus)o de curso apresentado ao Centro


$niversit%rio &erra dos 'r()os = Curso de /acharelado
em Ci>ncia da Computa?)o = como um dos re@uisitos para
o<ten?)o do tAtulo de /acharel em Ci>ncia da
Computa?)o#
.1A/O,A-O 5O, MA,C.11O TO,,.& -. O128.2,A GA10A,-O .
A5,O8A-O 5O, TO-O& O& M.M/,O& -A /A4CA .BAM24A-O,A#
FO2 AC.2TO 5.1O C$,&O -. /AC0A,.1A-O .M C234C2A -A
COM5$TA67O#
T.,.&'5O12&" 0 -. AGO&TO -. 200C
/A4CA .BAM24A-O,A:
DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
Chessman Kennedy EOrientadorF
DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
4elson /ar<osa
DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
1aion 1uiG
DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
An(elo Macedo
Terespolis
Julho de 20!
Agradecimentos
Primeiramente, agradeo aos meus pais pelo
amor, incentivo e apoio incondicional.
Ao meu orientador Chessman Kennedy Faria
Correa, pelo suporte no pouco tempo que lhe
coube, suas correes e incentivos.
A esta universidade, seu corpo docente e
direo. Ao coordenador elson !arbosa e
sua disposio a sempre receber seus alunos
sorrindo e pronto para a"udar.
A meus companheiros de curso que dividiram
#elicidades e triste$as durante estes %ltimos
anos. &m especial, a Anderson Chaves da
'ilva pelos dias de a"uda e incentivo. A (anilo
do Prado Pinto, pelas madrugadas de estudo e
por muitas ve$es me convencer a no desistir.
& a todos que direta ou indiretamente #i$eram
parte da minha #ormao, o meu obrigado.
)uitos que vivem merecem a morte. & alguns
que morrem merecem viver. *oc+ pode,lhes
dar vida- &nto no se"a to .vido para
"ulgar e condenar algu/m a morte. Pois
mesmo os muito s.bios no conseguem ver os
dois lados.
Gandalf, Senhor dos Anis
Resumo
Todo desenvolvedor de so*t:are com eHperi>ncia sa<e o @u)o ruim I um so*t:are mal
escrito# $m so*t:are JsuKoL# AlIm de atrasar o desenvolvimento do proKeto" ao lon(o de dois
ou tr>s anos" a e@uipe pode perce<er a (rande perda de produtividade por causa de um cdi(o
mal escrito# Altera?Mes podem resultar em de*eitos em outras partes do cdi(o# 5ara evitar
esse empecilho" eHiste o Jcdi(o limpoL# TIcnicas de desenvolvimento com o *oco em manter
o cdi(o le(Avel e aumentar a produtividade da e@uipe# -essa *orma" neste tra<alho" s)o
apresentadas as tIcnicas de desenvolvimento limpo e o uso destas no dia=a=dia# AlIm disto" I
proposto um so*t:are capaG de analisar o cdi(o *onte de um proKeto" permitindo diGer se o
mesmo utiliGa tIcnicas de cdi(o limpo ou n)o#
P'!'v%'s/C0've1 Cdi(o limpo" en(enharia de so*t:are" desenvolvimento de so*t:are#
Abstract
.very eHperienced so*t:are developer Nno:s ho: <ad is a poorly :ritten so*t:are# A
OdirtyO so*t:are# 2n addition to delayin( the development o* the proKect" over t:o or three
years" the team mi(ht realiGe the (reat loss o* productivity due to a <adly :ritten code#
Modi*ications may result in de*ects in other parts o* the code# To avoid this dra:<acN" there is
a concept called Oclean codeO: development techni@ues that *ocus on Neepin( the code
understanda<le and on increasin( the sta** productivity# Thus" :e :ill present on this research
such developin( techni@ues and their use in day=to=day# Moreover" :e propose a so*t:are
system to analyGe the source code o* a proKect and in*orm :hether it uses clean code
techni@ues or not#
2e34%)s1 clean code" so*t:are en(ineerin(" so*t:are development#
Sumrio
Agradecimentos..........................................................................................................4
Resumo.........................................................................................................................6
Abstract........................................................................................................................7
Sumrio........................................................................................................................8
Lista de Imagens.........................................................................................................9
1 Introduo...............................................................................................................10
1.1 Objetivos........................................................................................................................ 10
1.2 Organizao do trabalho................................................................................................ 11
!"cnicas de #$digo Lim%o...................................................................................1
2.1 Definio de um Bom Cdigo......................................................................................... 12
2.2 Desenvolvendo Cdigo im!o.......................................................................................12
2.2.1 Nomes de Variveis..................................................................................................................... 14
2.2.2 Mtodos....................................................................................................................................... 16
2.2.3 Parmetros.................................................................................................................................. 18
2.2.4 Classes........................................................................................................................................ 21
2." #$em!lo de %m!lementao &tilizando '()ni)as de Cdigo im!o...............................2*
2.3.1 Analise do aplicativo.................................................................................................................... 2
2.3.2 !rec"os do C#di$o %onte &etal"ado........................................................................................... 31
& Ana'isador de #$digo Lim%o................................................................................4
".1 'e)nologias utilizadas..................................................................................................... +2
3.1.1 '(per!e)t Mar*+p ,an$+a$e -'tml............................................................................................. 42
3.1.2 Cascadin$ /t(le /"eet -C//...................................................................................................... 42
3.1.3 0ava/cript.................................................................................................................................... 43
3.1.4 12+er(.......................................................................................................................................... 44
3.1.3 C"rome Pac*a$ed Apps.............................................................................................................. 44
".2 Desenvolvimento do ,nalisador.....................................................................................+-
3.2.1 AC4 4ditor................................................................................................................................... 43
3.2.2 5rvore /inttica........................................................................................................................... 43
3.2.3 4str+t+ra 6sica.......................................................................................................................... 46
3.2.4 Vis7o 8eral /o9re o Analisador................................................................................................... 4:
4 #onsidera(es )inais............................................................................................49
* Re+er,ncias bib'iogr+icas....................................................................................*0
Lista de Imagens

Fi(ura = .Hemplo de cdi(o com nome de vari%vel ile(Avel############################################!
Fi(ura 2 = .Hemplo de cdi(o com nome de vari%vel le(Avel#############################################!
Fi(ura ; = .Hemplo de cdi(o com le(Avel com utiliGa?)o de constantes##########################P
Fi(ura ! = -ia(rama da classe produto##############################################################################22
Fi(ura P = -ia(rama de entidades#######################################################################################2;
Fi(ura Q = -ia(rama de persist>ncia###################################################################################2;
Fi(ura R = Classe CarrinhoCompras sem utiliGar a 1ei de -emeter###################################2P
Fi(ura S = Classe CarrinhoCompras utiliGando a 1ei de -emeter######################################2Q
Fi(ura C = Tela de 1ista(em de A(endamentos###################################################################2R
Fi(ura 0 = Tela de Cadastro T .di?)o################################################################################2S
Fi(ura = Classe de modelo do a(endamento##################################################################;
Fi(ura 2 = Classe de persist>ncia do MinervaModel E&u(arO,MF##################################;2
Fi(ura ; = Classe de lista(em de a(endamentos Eparte F################################################;;
Fi(ura ! = Classe de lista(em de a(endamentos Eparte 2F################################################;;
Fi(ura P = Classe MinervaActivity####################################################################################;P
Fi(ura Q = Classe de cadastro de a(endamento Eparte F#################################################;Q
Fi(ura R = Classe de cadastro de a(endamento Eparte 2F#################################################;R
Fi(ura S + Classe MethodMap#########################################################################################;S
Fi(ura C = Classe Messa(e0elper#####################################################################################;C
Fi(ura 20 = Classe 1ist8ie:0elper#####################################################################################!0
Fi(ura 2 = Classe 1ist8ie:Map########################################################################################!
Fi(ura 22 = 2nter*ace do analisador utiliGando o recurso de Auto Complete do AceJ&######!P
Fi(ura 2; = Arvore sint%tica criada pelo .sprimaJ&###########################################################!Q
Fi(ura 2! = Tela do Analisador de Cdi(o 1impo##############################################################!R
Fi(ura 2P = .Hecu?)o da An%lise de Cdi(o Fonte############################################################!S
10
1 Introduo
Atualmente" as empresas de desenvolvimento de so*t:are <uscam por melhorias continuas
em seus mItodos de desenvolvimento# A %rdua necessidade de competir com outras empresas
*aG com @ue maneiras de se desenvolver so*t:are mais rapidamente seKam criadas" tornando
cada veG mais competitivo o mercado# 8%rias metodolo(ias %(eis *oram desenvolvidas" tendo
como *oco a entre(a do produto o mais <reve possAvel com o m%Himo de @ualidade#
2ndependente da pr%tica de desenvolvimento escolhida" I impossAvel evitar @ue v%rios
desenvolvedores implementem (radativamente a aplica?)o# AlIm disto" invariavelmente"
di*erentes pro(ramadores *ar)o altera?Mes constantes no cdi(o *onte do so*t:are para
adicionar novas *uncionalidades e corri(ir de*eitos @ue um so*t:are venha a possuir#
O mais comum em (randes empresas I @ue seus desenvolvedores venham a analisar
trechos do cdi(o *onte com o @ual ainda n)o tiveram contato" tendo @ue lidar" desta *orma"
com classes" *un?Mes e v%rias linhas de cdi(o @ue se usam outros o<Ketos# 8ari%veis com
nomes desatualiGados e a<reviados" sem @ual@uer si(ni*icado" e coment%rios o<soletos" @ue
por *alta de atualiGa?)o" n)o *aGem mais @ual@uer sentido" servem apenas para con*undir o
leitor# -epois de entender Eou n)oF o cdi(o a ser alterado" o desenvolvedor na maioria dos
casos modi*icar% al(umas poucas linhas e considerar% seu tra<alho como terminado" sem ter
*eito @ual@uer melhoria no cdi(o compleHo e con*uso com o @ual teve tantas di*iculdades" e
provavelmente outros desenvolvedores vir)o a ter o mesmo pro<lema#
.sse ciclo pode se repetir" causando cada veG mais pro<lemas U le(i<ilidade do cdi(o"
a estrutura do so*t:are e" posteriormente" pode resultar em diversos erros e pro<lemas para a
e@uipe de desenvolvimento respons%vel pelo sistema EMartin" 200SF#
Considerando os *atos a<ordados" este proKeto apresenta dicas e tIcnicas de como
escrever um cdi(o limpo <aseadas no material de 0obert Cecil )artin EMartin" 200SF" o
proKeto se *oca em como analisar um cdi(o e veri*icar se o mesmo se trata ou n)o de um
cdi(o limpo# 5osteriormente" I apresentado um prottipo de aplicativo @ue pode analisar o
cdi(o *onte e veri*icar pontos crAticos @ue devem ser revisados#
1.1 -b.eti/os
O tra<alho atual teve como o<Ketivo principal *ornecer apoio para o processo de
desenvolvimento de so*t:are# 5ara isto" ser% apresentado um levantamento dos conceitos @ue
compMem o denominado cdi(o limpo# .sse levantamento apresenta diversas tIcnicas e <oas
pr%ticas para a tomada de decisMes @ue possam ser adotadas para o desenvolvimento de um
so*t:are de *orma mais ele(ante" eHpressiva e simples possAvel# TIcnicas e pr%ticas estas
11
recomendadas por diversos desenvolvedores reconhecidos internacionalmente @ue tra<alham
diariamente com o paradi(ma de Orienta?)o a O<Ketos e precisam en*rentar os desa*ios de
desenvolver um so*t:are com um pe@ueno praGo de entre(a#
5orIm" mesmo possuindo o conhecimento necess%rio so<re as <oas pr%ticas de
desenvolvimento" um cdi(o limpo pode se tornar uma tare*a compleHa de ser eHecutada#AlIm
disto" com a proposta de *ornecer um auHAlio mais pr%tico ao desenvolvedor" o tra<alho atual
teve tam<Im como o<Ketivo o desenvolvimento de uma *erramenta capaG de *ornecer uma
an%lise do cdi(o desenvolvido" e alertar o usu%rio so<re pontos em @ue as pr%ticas de cdi(o
limpo n)o estivessem sendo o<edecidas#
-esta *orma" ser% apresentado neste tra<alho:
56 T*+n"+'s )e +,)"- !"#.6
&)o apresentadas as re(ras para @ue desenvolvedores escrevam seus cdi(os de *orma
mais le(Avel e assim melhorem seus al(oritmos#
76 P%$,$". )e 8# 'n'!"s')% )e +,)"- &n$e6
V apresentado um aplicativo prottipo @ue I capaG de analisar o cdi(o *onte e avaliar
pontos em @ue ele est% @ue<rando as re(ras de cdi(o limpo#
1.2 -rgani0ao do traba'1o
Tendo como *oco a le(i<ilidade do cdi(o sem comprometer o desempenho de um
so*t:are" a estratI(ia utiliGada neste tra<alho *oi demonstrar as tIcnicas de um cdi(o limpo e
eHemplos pr%ticos de seu uso# Foram realiGadas compara?Mes entre dois cdi(os *onte
demonstrando o @u)o vantaKoso I a utiliGa?)o de tIcnicas de cdi(o limpo# Foram estudadas
maneiras de se analisar um cdi(o *onte" permitindo" assim" desenvolver posteriormente um
so*t:are prottipo capaG de analisar o cdi(o *onte de um determinado proKeto e apontar os
locais com de*ici>ncia em rela?)o aos princApios do cdi(o limpo#
O prprio desenvolvimento do prottipo do so*t:are proposto neste tra<alho *oi
<aseado nas mesmas tIcnicas de cdi(o limpo apresentadas#
1
!"cnicas de #$digo Lim%o
Comple1idade mata. &la suga a vida dos
desenvolvedores, di#iculta o plane"amento, a
construo e o teste dos produtos.
Ray Ozzie, CTO, Microsoft Corporation
2.1 2e+inio de um 3om #$digo
,ealiGar a de*ini?)o de um cdi(o limpo I compleHo" pois se trata de um termo a<strato
para a tare*a de avaliar o cdi(o *onte de um aplicativo n)o tan(Avel# Geralmente" para esta
de*ini?)o" utiliGa=se aspectos como testa<ilidade" e*ici>ncia" *acilidade de# -iante disso" *oi
utiliGado o conceito do Clean Code 2)artin, 3445#
,o<ert Cecil Martin E200SF entrevistou v%rios especialistas em desenvolvimento de
so*t:are e cada um ela<orou respostas di*erentes" destacando caracterAsticas como ele(Wncia"
*acilidade de manuten?)o" simplicidade" *alta de duplica?)o de cdi(o e presen?a de testes de
unidade# -esta *orma" o melhor seria considerar a opini)o dos entrevistados mais eHperientes
2)artin, 34456:
7&legante e e#iciente, c8digo limpo #a$ bem apenas uma coisa.7" /Karne
&troustrup" criador da lin(ua(em de pro(rama?)o CXX#
7'imples e direto, pode ser lido como uma conversa, como uma prosa.7" Grady
/ooch" criador da modela(em de so*t:are $M1#
7Parece ter sido escrito por algu/m que se importa.7" Michael Feathers"
en(enheiro s>nior na O<Kect Mentor#
7Cada rotina que voc+ l+ #a$ o que voc+ espera.7" Yard Cunnin(ham" criador do
YiNi" cocriador da eBtreme 5ro(rammin(# 1Ader da comunidade &malltalN#
Com isto" podemos concluir @ue um <om cdi(o deve ser simples" ele(ante e e*iciente#
$m cdi(o limpo I um estilo de pro(rama?)o @ue <usca valores como eHpressividade"
simplicidade e *leHi<ilidade#
2.2 2esen/o'/endo #$digo Lim%o
$m aspecto citado por 0obert Cecil )artin no desenvolvimento de cdi(o limpo I @ue
este nunca I o<tido em uma primeira tentativa# Assim" I importante ter paci>ncia e sa<er @ue as
primeiras versMes de vari%veis" mItodos e classes n)o ser)o <oas# V necess%ria uma
preocupa?)o por parte do desenvolvedor para escrever um <om cdi(o# V necess%rio atentar
1&
para cada elemento" desde o nome escolhido para uma vari%vel atI um conKunto de classes @ue
representar% um mdulo do aplicativo#
&a<endo disto" precisamos nos preocupar em (arantir @ue n)o haver% pro<lemas em
re*atora?Mes

# &e ao *aGer uma altera?)o" *icamos receosos de al(uma *uncionalidade do


pro(rama ter pro<lemas" provavelmente n)o iremos realiG%=las# 5ossivelmente" tentaremos
a<orda(ens @ue ir)o poluir ainda mais o cdi(o" a*astando=nos completamente do cdi(o
limpo#
A Znica solu?)o I a utiliGa?)o de testes# Testes automatiGados d)o a se(uran?a necess%ria
de @ue tudo *uncionar% corretamente aps uma altera?)o" possi<ilitando a realiGa?)o das
pr%ticas @ue permitem o desenvolvimento de cdi(o limpo# AlIm disto" os testes permitem @ue
outras pessoas @ue n)o seKam o autor compreendam como cada parte do cdi(o deve ser
utiliGada" aumentando a eHpressividade do cdi(o# 5or Zltimo" uma veG @ue todos os testes
est)o corretos" I possAvel @ue os desenvolvedores possam concentrar=se em apenas adicionar
melhorias ao cdi(o#
Outro ponto importante para implementar um cdi(o limpo I ter aten?)o ao usar
coment%rios# Con*orme !rian 9. Kernighan e P.:. Plaugher EMartin" 200SF" J4)o insira
coment%rios num cdi(o ruim" reescreva=oL# 5ara o<ter um cdi(o limpo" deve=se ter uma
(rande preocupa?)o para @ue os desenvolvedores" ao invIs de se preocuparem em escrever
coment%rios" escrevam um cdi(o mais ele(ante e simples# &e as vari%veis" parWmetros"
mItodos e classes estiverem <em nomeadas" n)o ser% necess%rio eHplic%=las com um
coment%rio# &e o cdi(o respeitar o princ;pio da responsabilidade %nica
2
" n)o ser% necess%rio
documentar o @ue s)o os parWmetros e o valor de retorno#
O<viamente" eHistem casos em @ue uma documenta?)o pode ser utiliGada para aKudar os
desenvolvedores# -eve ser en*atiGado @ue o o<Ketivo n)o I en(essar o desenvolvimento com
di*iculdades para os pro(ramadores" mas compreender @uais elementos do so*t:are precisam
de documenta?)o" para @ue n)o seKa construAdo coment%rios con*usos @ue n)o ser)o
atualiGados com a manuten?)o do cdi(o *onte#

,e*atora?)o Edo in(l>s" ,e*actorin(F I um ato de rescrever um al(oritmo sem alterar seu comportamento
inicial#
2
O princApio da responsa<ilidade Znica I um dos princApios &O12-# Os princApios &O12-" s)o uma sIrie de
cinco princApios introduGidos por ,o<ert C# Martin" como <oas pr%ticas de desi(n de so*t:are# O princApio
da responsa<ilidade Znica" *oca na preocupa?)o de @ue uma classe tenha seu papel e venha desempenhar
somente ele de *orma e*iciente#
14
..1 4omes de 5ari/eis
0% nomes por toda a parte em um so*t:are# 4omeamos nossas vari%veis" *un?Mes"
parWmetros" classes e pacotes" assim como o cdi(o *onte e os diretrios @ue os possui#
4omeamos tam<Im nossos ar@uivos# Como *aGemos muito isso" I melhor @ue o *a?amos <em#
..1.1 4omes 6ue re/e'am a inteno
Os nomes de vari%veis" mItodos ou classes devem responder a todas as @uestMes so<re o
elemento @ue est% sendo nomeado[ caso esteKa muito amplo" talveG eHista muita
responsa<ilidade em uma Znica vari%vel# 5or @ue ela eHiste" o @ue *aG e como deve ser usada#
&e um nome eHplicar completamente a *inalidade da vari%vel" um coment%rio seria
completamente redundante#
5or eHemplo" o al(oritmo da *i(ura poderia ser escrito de *orma mais le(Avel E*i(ura 2F"
tornando redundante o coment%rio#
)igura 1 7 89em%'o de c$digo com nome de /ari/e' i'eg:/e'
:
)igura 7 89em%'o de c$digo com nome de /ari/e' 'eg:/e'
AlIm disto" pode=se utiliGar constantes com nomes <em de*inidos para evitar @ue
si(ni*icados de valores est%ticos se percam durante o cdi(o# 5or eHemplo" o mesmo eHemplo
a(ora poderia ser escrito con*orme demonstrado na *i(ura ;:
1*
)igura & 7 89em%'o de c$digo com 'eg:/e' com uti'i0ao de constantes
-esta *orma" deve se preocupar com a eHpressividade @ue o cdi(o vai passar para seu
leitor# &e necess%rio" revise novamente o cdi(o e altere @uantas veGes *or necess%rio" de
*orma @ue o cdi(o *i@ue mais claro# MItodos" por eHemplo" podem traGer mais
eHpressividade e *lu>ncia para o leitor se *orem nomeados levando=se em conta como ser%
utiliGado e as circunstWncias em @ue ser% utiliGado#
..1. 2i+erenas Signi+icati/as
V importante n)o apenas escolher nomes si(ni*icativos" mas ser capaG de desenvolver
mItodos e classes @ue possuam di*eren?as si(ni*icativas" de *orma @ue o leitor n)o se con*unda
ao ler# 5ara isso" I importante @ue n)o seKam construAdas classes e mItodos @ue realiGem o
mesmo tipo de a?)o" necessitando n)o apenas de um nome claro" mas tam<Im de uma
di*eren?a em sua utiliGa?)o @ue seKa perceptAvel#
5ara isso" tam<Im deve=se levar em conta os parWmetros e a ordem dos mesmos para @ue
seKa possAvel tornar ainda mais *%cil esta percep?)o# Tendo este conceito em mente" I possAvel
melhorar a le(i<ilidade do cdi(o" tornando a semWntica mais clara#
..1.& 4omes !em%orrios
V importante perce<er @ue os nomes escolhidos s)o importantes para melhorar a
le(i<ilidade do cdi(o" mas n)o somente isto# .m al(uns casos" I muito Ztil e aconselhado
utiliGar vari%veis tempor%rias para @ue seKa possAvel revelar como o o<Keto ser% utiliGado
na@uele conteHto#
..1.4 4ome ;nico %or #onceito
V importante n)o s se preocupar com nomes eHpressivos" mais n)o con*undir o leitor
com nomes @ue seKam utiliGados para mais de um conceito# 4omear um conceito de maneiras
di*erentes pode ser <astante con*uso" uma veG @ue o leitor poder% con*undir os conteHtos e
tratar ideias @ue deveriam ser distintas como se *ossem a mesma coisa#
16
5or eHemplo" @ual a di*eren?a entre encontrar" procurar e <uscar\ &e apenas uma
nomenclatura *or utiliGada para o conceito de localiGar al(o em um o<Keto" o leitor Kamais ter%
dZvidas so<re o @ue ser% realiGado pelo mItodo#
4)o I por acaso @ue os mItodos de cole?Mes em Java sempre possuem um mesmo
conKunto de nome como o mItodo ')) para adicionar elementos# -esta *orma" as dZvidas de
@ual deles utiliGar para cada opera?)o I minimiGada" sendo mais *%cil a assimila?)o do
conceito#
..1.* 4omes de <"todos
Os nomes dos mItodos devem ser <em escolhidos de modo @ue descrevam muito <em
as tare*as @ue realiGam# O uso de nomes descritivos pode muitas veGes resultar em nomes
lon(os e di*Aceis de serem di(itados# .ntretanto" a @uantidade de ocasiMes em @ue ser)o lidos I
su<stancialmente maior do @ue a @uantidade em @ue as escrevemos# -esta maneira" a
economia de palavras deve ser descartada em *avor de uma <oa eHpressividade#
.. <"todos
Os mItodos s)o a parte principal para a cria?)o de um cdi(o eHpressivo# A ideia I
desenvolver um cdi(o @ue seKa lido como um teHto utiliGando os nomes dos mItodos para
narrar a eHecu?)o das tare*as#
-e acordo com tudo @ue *oi a<ordado anteriormente" I necess%rio minimiGar as repeti?Mes
e @ual@uer mudan?a dever% ser *acilmente localiGada# -esta *orma" I importante @ue a l(ica
esteKa perto dos dados @ue manipula# 4este conteHto" os mItodos devem encapsular apenas um
trecho de cdi(o" provendo um escopo *echado para as vari%veis locais e permitindo chamadas
como uma maneira de evitar duplica?Mes#
-evemos considerar a di*iculdade de assimila?)o de (randes @uantidades de in*orma?Mes
durante a leitura e o *ato de @ue nem sempre um mItodo ser% claro# -esta *orma" um mItodo
dever% ser curto e tra<alhar com poucas vari%veis" tendo um nome eHplicativo @ue espelha a
sua *uncionalidade#
V importante compreender @ue n)o necessariamente o nZmero de linhas ser% o tamanho de
um mItodo" apesar de tam<Im ser um *ator a se levar em considera?)o" mas sim a @uantidade
de tare*as @ue realiGa# Com esta ideia em mente" devemos levar em considera?)o @ue uma
*un?)o deve *aGer apenas uma Znica tare*a# -esta *orma" @uando tivermos a necessidade de
realiGar mais de uma tare*a em um mItodo" cada tare*a estar% implementada dentro de um
mItodo separado e ser)o chamadas do mItodo @ue ir% eHecutar a rotina#
17
<Pensando nos #atores que poderiam levar a incrementar a di#iculdade de leitura do
c8digo, saberemos quando um c8digo est. limpo quando cada rotina que lemos #a$ o que
esper.vamos= EMartin" 200SF
Os nomes dos mItodos servem como documenta?)o para a tare*a @ue realiGam# 4)o
@ueremos @ue al(uIm se depare com uma opera?)o @ue n)o ima(inava ao ler sua
implementa?)o# Ao desenvolver um mItodo" devemos ter em mente @ue o leitor n)o ter% o
mesmo conhecimento @ue tivermos durante o desenvolvimento e" por isso" devemos nos
preocupar com nossas decisMes com a cria?)o do al(oritmo#
-evemos tam<Im nos preocupar com o pro(rama como um todo" <uscando um *luHo
normal esta<elecido" deiHando o cdi(o simples e tratamentos de erros separados#
...1 = !aman1o de m"todos
4o livro Clean Code EMartin" 200SF" a primeira preocupa?)o do autor I em rela?)o ao
tamanho de um mItodo# &e(undo o autor" ,o<ert Cecil Martin" os mItodos deveriam ser
sempre pe@uenos" apesar de citar n)o haver @ual@uer *undamenta?)o cientA*ica para essa
a*irma?)o" alIm de n)o podermos a*irmar o @ue I Jpe@uenoL e de*inir limites @uanto ao
nZmero de linhas# A proposta do autor I @ue cada mItodo seKa t)o pe@ueno" su*icientemente
para *acilitar sua leitura e compreens)o# -evemos ter em vista a di*iculdade de assimilar
(randes por?Mes de in*orma?Mes durante a leitura e o *ato de @ue nem sempre um al(oritmo I
claro#
A partir do conceito adotado" o mItodo ser% <loco pe@ueno de cdi(o @ue tra<alha com
poucas vari%veis e tem um nome auto=# -esta *orma" aconselha,se @ue nenhum mItodo supere
um total de vinte linhas" tendo (eralmente uma mIdia de cinco linhas# O<viamente" isso nem
sempre I possAvel# 5orIm" se a (rande maioria dos mItodos tenta se(uir esta re(ra"
provavelmente eHistiram poucos mItodos realmente (rande no cdi(o *onte#
JFunes deveriam ter uma %nica tare#a. (everiam #a$+,la bem. & #a$+,la somente.L
EMartin" 200SF# Ou seKa" @uando desenvolvemos um al(oritmo para ser sustent%vel e de *%cil
manuten?)o" devemos desenvolv>=lo em v%rios mItodos pe@uenos em @ue cada um *aG uma
das tare*as necess%rias para sua utiliGa?)o" de *orma @ue a leitura seKa e*iciente e uma
documenta?)o eHterna completamente redundante#
... = 4:/eis de abstrao
Outro detalhe a ser en*atiGado" s)o os nAveis de a<stra?)o e a simetria de opera?Mes dentro
de um mItodo# $m incremento de uma vari%vel de instWncia est% *undamentalmente em outro
nAvel de a<stra?)o do @ue a chamada de um mItodo# 4)o @ueremos um mItodo com essas
18
duas instru?Mes# 2sso possivelmente *aG com @ue o leitor n)o sai<a se uma opera?)o I um
detalhe de implementa?)o ou um conceito importante dentro da l(ica#
5ensando em outros *atores @ue podem levar a di*iculdades para o leitor do cdi(o"
sa<emos @ue estamos tra<alhando em um cdi(o limpo @uando cada rotina @ue lemos *aG o
@ue esper%vamos EMartin" 200SF# 4o conteHto de mItodos" como seus nomes s)o a
documenta?)o da tare*a @ue realiGam" n)o @ueremos @ue" ao olhar um deles" nos deparemos
com uma opera?)o @ue n)o ima(in%vamos#
Ao criar um mItodo" temos @ue considerar @ue os leitores n)o ter)o a mesma linha de
pensamento @ue temos na@uele momento e" diante disso" temos @ue ter uma crescente
preocupa?)o com todas as nossas decisMes#
...& = )'u9o de e9ecuo
]ueremos ter um *luHo de eHecu?)o <em esta<elecido" deiHando=o simples e o tratamento
de erros separado# -e *orma resumida" n)o @ueremos @ue o cdi(o *i@ue cheio de veri*ica?Mes
de erro misturadas com a l(ica do pro(rama#
]ueremos @ue o cdi(o seKa lido de cima para <aiHo" como uma narrativa# -eseKamos @ue
cada *un?)o seKa se(uida pelas outras no prHimo nAvel de a<stra?)o de modo @ue possamos
ler o pro(rama descendo um nAvel de a<stra?)o de cada veG con*orme percorremos a lista de
*un?Mes# -esta *orma" estamos de*inindo um *luHo de eHecu?)o# .m outras palavras" @ueremos
ler o pro(rama como se *osse uma sIrie de par%(ra*os" onde cada um descreve o nAvel atual de
a<stra?)o e *aGendo re*er>ncia aos par%(ra*os consecutivos no prHimo nAvel#
Con*orme mencionado por ,o<ert Cecil Martin EMartin" 200SF" aca<a sendo muito di*Acil
para os pro(ramadores aprenderem a se(uir essa re(ra e criar *un?Mes @ue *i@uem em apenas
um nAvel de a<stra?)o# Conse(uir escrever cdi(os utiliGando essa pr%tica I muito importante"
pois ele I o se(redo para manter as *un?Mes curtas e (arantir @ue *a?am apenas Juma coisaL#
FaGer com @ue a leitura do cdi(o possa ser *eita de cima para <aiHo como uma sIrie de
par%(ra*os I uma tIcnica e*iciente para manter os nAveis de a<stra?Mes consistentes EMartin"
200SF#
..& >ar?metros
<A quantidade ideal de par>metros para uma #uno / $ero. (epois vem um 2m?nade6,
seguido de dois 2d;ade6. 'empre que poss;vel devem,se evitar tr+s par>metros 2tr;ade6. Para
mais de tr+s deve,se ter um motivo muito especial 2pol;ade6 @ mesmo assim, con#orme 0obert
Cecil )artin, no devem ser utili$ados.= = EMartin" 200SF
19
5arWmetros tendem a ser complicados# .les re@uerem <astante conceito e s)o ainda piores
a partir de um ponto de vista de testes# 2ma(ine a di*iculdade de escrever todos os casos de
teste para se certi*icar de @ue todas as v%rias com<ina?Mes de parWmetros *uncionem
ade@uadamente# &e houver um" n)o I t)o di*Acil assim# Com dois" a situa?)o *ica um pouco
mais desa*iadora# Com mais de dois" pode ser desencoraKador testar cada com<ina?)o de
valores apropriados#
Os parWmetros de saAda s)o ainda mais di*Aceis de entender do @ue os de entrada# ]uando
lemos uma *un?)o" estamos acostumados U ideia de in*orma?Mes entrando na *un?)o atravIs de
parWmetros e saindo atravIs do valor retornado# Geralmente n)o esperamos dados saindo
atravIs de parWmetros# 5ortanto parWmetros de saAda costumam nos deiHar surpresos e *aGer
com @ue leiamos novamente# O<viamente eHistem casos em @ue s)o necess%rios" mais mesmo
nesses casos devem ser utiliGados com cuidado#
..&.1 >ar?metros m@nades
0% al(umas raGMes comuns para se passar um Znico parWmetro a uma *un?)o# 8oc> pode
estar *aGendo uma per(unta so<re o parWmetro" como em boolean #ile&1ists2<nome.t1t=6 ou
voc> pode tra<alhar na@uele parWmetro" trans*ormando=o em outra coisa e retornando=o essa
trans*orma?)o: Anput'tream #ileBpen2<nome.t1t6" ou seKa" lendo o ar@uivo e retornando a
strin( como um o<Keto &tream# .sses s)o os usos mais comuns @ue um leitor espera ver em
uma *un?)o#
..&. >ar?metros d:ades
$m mItodo com dois parWmetros (eralmente I mais di*Acil de entender durante a primeira
leitura do @ue uma com um Em^nadeF# 0% casos" I claro" em @ue dois parWmetros s)o
necess%rios como" por eHemplo" em Point C neD Point 2cordenadaE1, cordenadaEy6# Os
pontos de eiHos cartesianos naturalmente rece<em dois parWmetros# -e *ato" *icarAamos
surpresos se vAssemos neD Point 246# .ntretanto" os dois parWmetros neste caso s)o
componentes de um Znico valor#
Geralmente" mesmo *un?Mes dAades <vias podem ser pro<lem%ticas# 8%rias veGes os
pro(ramadores invertem os parWmetros e isso causa <u(s <vios" mais @ue podem causar
retra<alho# 5orIm" dAades n)o s)o ruins e certamente um pro(ramador ter% de us%=las#
.ntretanto" deve=se estar ciente de @ue haver% um pre?o a pa(ar e" portanto" deve=se pensar
em tirar proveito dos mecanismos disponAveis a voc> para convert>=los em m^nades#
0
..&.& >ar?metros tr:ades
.ssas *un?Mes tendem a ser mais complicadas de entender do @ue as dAades# A @uest)o de
ordena?)o (eralmente apresenta uma maior di*iculdade e muitas veGes o<ri(a uma releitura
EMartin" 200SF#
Considere o se(uinte eHemplo do mItodo Jassert&quals
;
L:
assert&quals27A lista va$ia deve ter 4 elementos7, 4, lista*a$ia.si$e266F
A *un?)o acima tem como o<Ketivo *acilitar testes unit%rios" realiGando compara?Mes de
dois valores# .la rece<e tr>s parWmetros: message, e1pected, e actual, onde _message`
representa a mensa(em passada como parWmetro" e1pected representa o valor esperado" e
actual representa o valor a ser avaliado# 4uma primeira leitura" temos a ideia de @ue message
seria o actual# 5orIm" ao reler a se(unda veG entendemos @ue messa(e seria a mensa(em
eHi<ida caso o actual possua o e1pected#
..&.4 >ar?metros '$gicos
5assar um <ooleano para uma *un?)o certamente I uma pr%tica horrAvel" pois ele complica
imediatamente a assinatura do mItodo" mostrando eHplicitamente @ue a *un?)o *aG mais de
uma coisa# .la *aG uma coisa se o valor *or verdadeiro e outra se o valor *or *also#
$tiliGando como eHemplo a prpria A52 Kava" o toolNit &:in(
!
possuAa o se(uinte mItodo:
set8isi<leE<oolean <F
P
@ue permite tornar uma Kanela visAvel ou invisAvel# 5ara representar essa
mesma opera?)o na nova A52 do Java" o toolNit JavaFB
Q
" *oram implementados dois mItodos:
sho:EF
R
e hideEF
S
" am<os sem parWmetros <ooleanos @ue internamente alteram uma propriedade
privada visi<le para che(ar a mesma conclus)o#
;
Assert.@uals I um mItodo do *rame:orN J$nit" e sua documenta?)o pode ser encontrada em:
http:TTpic#dhe#i<m#comTin*ocenterTrtrthelpTvSr0m0TindeH#Ksp\topicab2Fcom#i<m#rational#testrt#studio#doc
b2Fre*b2Frasserte@uals#htm
!
&:in( I um :id(et toolNit para uso com o Java# .le I compatAvel com o A<stract Yindo: ToolNit EAYTF"
mas tra<alha de uma maneira totalmente di*erente# A A52 &:in( procura renderiGarcdesenhar por conta
prpria todos os componentes" ao invIs de dele(ar essa tare*a ao sistema operacional" como a maioria das
outras A52s de inter*ace (r%*ica tra<alham#
P
A documenta?)o do mItodo set8isi<le pode ser encontrado em:
http:TTdocs#oracle#comTKavaseTRTdocsTapiTKavaTa:tTYindo:#htmldset8isi<leE<ooleanF
Q
JavaFB I uma plata*orma de so*t:are multimAdia desenvolvida pela Oracle <aseada em Kava para a cria?)o
e disponi<iliGa?)o de Aplica?)o ,ica para 2nternet @ue pode ser eHecutada em v%rios dispositivos di*erentes#
A vers)o atual EJavaFB 2##0F permite a cria?)o para desNtop" <ro:ser e tele*one celulares# T8s" video=
(ames" /lu=rays players e outras plata*ormas est)o sendo planeKadas para serem adicionadas no *uturo#
JavaFB esta totalmente inte(rado com o J,. = as aplica?Mes JavaFB rodar)o nos desNtops e nos <ro:sers
@ue rodarem J,. e nos celulares @ue rodarem o JavaM.#
R
A documenta?)o do mItodo sho: pode ser encontrado em:
http:TTdocs#oracle#comTKava*HT2TapiTKava*HTsta(eT&ta(e#htmldsho:EF
S
A documenta?)o do mItodo hideEF pode ser encontrado em:
http:TTdocs#oracle#comTKava*HT2TapiTKava*HTsta(eTYindo:#htmldhideEF
1
..&.* -b.etos como %ar?metros
]uando uma *un?)o parece precisar de mais de dois ou tr>s parWmetros" I prov%vel @ue
al(uns deles possam ser colocados em uma classe# Considere por eHemplo" a di*eren?a entre as
duas declara?Mes:
Circulo criarCirculo2double coordenadaE1, double coordenadaEy, double raio6F
Circulo criarCirculo2Coordenada coordenada, double raio6F
]uando (rupos de vari%veis s)o passados Kuntos" como coordenadaDH e coordenadaDy" I
mais prov%vel @ue seKam parte de um conceito @ue mere?a um nome s para ele#
..4 #'asses
.ntre os princApios propostos por ,o<ert Cecil Martin EMartin" 200SF est)o a proHimidade
da l(ica com os dados na @ual tra<alha e a preocupa?)o @uanto Us conse@u>ncias locais#
.sses conceitos" alIm de estarem inseridos na Kustiecativa para a ado?)o do paradi(ma da
orienta?)o a o<Ketos" tam<Im est)o intimamente relacionados com as classes @ue compMem o
sistema# ]uando se utiliGa o paradi(ma de orienta?)o a o<Ketos" (eralmente se @uer @ue as
classes encapsulem dados e opera?Mes e tenham uma inter*ace @ue permita um cdi(o cliente
com o mAnimo de depend>ncias" sempre visando a simplicidade do desi(n e do conteZdo das
classes#
-iante da concep?)o %(il de tomar <oas decisMes durante o desenvolvimento @ue
proporcionem melhorias imediatas" nessa se?)o ser)o discutidas al(umas preocupa?Mes @uanto
Us classes" <uscando *acilitar as mudan?as no sistema#
..4.1 #oeso
-o mesmo modo @ue consideramos importante limitar a @uantidade de in*orma?)o @ue o
leitor lida ao ler mItodos" tam<Im I importante @ue as classes seKam as menores possAvel# AlIm
de *acilitar a leitura e entendimento" pro(ramar <uscando minimiGar o tamanho das classes nos
auHilia a criar unidades coesas e a evitar duplica?Mes#
1o(icamente" se nossas classes s)o pe@uenas" teremos @ue reunir uma (rande @uantidade
delas" tornando nossos sistemas compostos de muitas classes pe@uenas# .m uma analo(ia
<astante simples" I mais *%cil encontrar um o<Keto em muitas (avetas pe@uenas do @ue em
poucas (avetas (randes e repletas#
..4. >rinc:%io da Res%onsabi'idade ;nica
A @uantidade de mItodos pode nos dar um <om indicativo das opera?Mes di*erentes @ue a
classe pode eHecutar# 4o entanto" podemos encontrar classes com poucos mItodos e @ue
possuem conteHtos totalmente di*erentes#

O<serve o dia(rama da *i(ura !# 5erce<a @ue esta classe est% assumindo responsa<ilidades
@ue n)o s)o suas# .la alIm de suas propriedades" ela possui os mItodos O<tem5or2d"
O<ter5or4ome e &alvar5roduto#
)igura 4 7 2iagrama da c'asse %roduto
A(ora veKa essa mesma classe re*atorada na *i(ura P# 5erce<a @ue com a re*atora?)o" estamos
em um cen%rio completamente di*erente e desacoplado# Temos uma classe .ntidade"
ima(inando @ue esteKamos se(uindo o -omain -riven -esi(n
C
" uma classe produto @ue herda
de entidade e possui propriedades comuns a todos os produtos# 5ara persistir no <anco de
dados" temos classes apropriadas @ue v)o pe(ar este o<Keto de ne(cio e salvar no <anco de
dados ou no repositrio destinado a armaGen%=lo#
C
-omain -riven -esi(n si(ni*ica 5roKeto Orientado a -omAnio# .le veio do tAtulo do livro escrito por .ric
.vans# O livro de .vans I um (rande cat%lo(o de 5adrMes" <aseados em eHperi>ncias do autor ao lon(o de
mais de 20 anos desenvolvendo so*t:are utiliGando tIcnicas de Orienta?)o a O<Ketos#
&
)igura * 7 2iagrama de entidades
)igura 6 7 2iagrama de %ersist,ncia
4
A *orma de medir o tamanho de uma classe proposto por ,o<ert Martin EMartin" 200SF
est% atrelado com a @uantidade de responsa<ilidades @ue a mesma possui" ou seKa" @uantas
coisas distintas uma classe ir% eHecutar# 5odemos pensar em uma responsa<ilidade como uma
raG)o para mudar# -esta *orma" podemos diGer @ue o princApio da responsa<ilidade Znica @uer
diGer: Jas classes deveriam ter uma %nica responsabilidade, ou se"a, ter uma %nica ra$o
para mudarL EMartin" 200SF#
..4.& A Lei de 2emeter
A 1ei de -emeter
0
EMartin" 200SF diG @ue um mItodo JML de uma classe JCL s deveria
chamar um mItodo:
f da prpria classe[
f de um o<Keto criado por M[
f de um o<Keto passado como ar(umento para M[
f de um o<Keto (uardado em uma vari%vel de instWncia de C#
O cumprimento dessa heurAstica visa evitar @ue uma classe conhe?a os detalhes de
implementa?)o dos o<Ketos @ue manipula" ou seKa" melhorar o encapsulamento# A invoca?)o de
mItodos da prpria classe n)o causa nenhum tipo de depend>ncia pela <via aus>ncia de al(o
so<re a @ual depender# Os outros tipos de chamadas especiecados na 1ei causam uma
depend>ncia" mas @ue se limita Us inter*aces dos o<Ketos manipulados# A classe deve conhecer
@uais os mItodos dos o<Ketos" os ar(umentos @ue aceitam e o tipo do valor de retorno" caso
houver#
Considere o se(uinte cdi(o da *i(ura R#
0
A 1ei de -emeter *oi descrita pela primeira veG na $niversidade 4ortheastern" em /oston" Massachusetts
em CSR# 4a verdade essa O1eiO *ornece um conKunto de orienta?Mes Zteis para o proKeto de so*t:are#
]uando estas re(ras s)o se(uidas reduGimos o acoplamento" descrevendo como os mItodos e propriedades
das classes devem se comunicar entre si# A lei I por veGes conhecida como o 5rincApio do MAnimo
Conhecimento# EOu ainda: *ale somente com seus ami(os mais prHimos#F
*
)igura 7 7 #'asse #arrin1o#om%ras sem uti'i0ar a Lei de 2emeter
5ara calcular o valor total das compras" I necess%rio o carrinho percorrer todos os itens
e solicitando a cada produto seu valor# A(ora" utiliGando os conceitos da 1ei de -emeter"
veri*i@ue o mesmo cdi(o reescrito na *i(ura S:
)igura 8 7 #'asse #arrin1o#om%ras uti'i0ando a Lei de 2emeter
6
A(ora I possAvel veri*icar @ue a classe 5roduto est% se(uindo a 1ei de -emeter" pois est%
se comunicando apenas com os o<Ketos @ue ela tem conhecimento E@ue neste caso I o item e
n)o o produtoF e por conta disto" diminuindo sua depend>ncia a outra classe#
2.3 89em%'o de Im%'ementao Ati'i0ando !"cnicas
de #$digo Lim%o
5ara demonstrar as tIcnicas de cdi(o limpo apresentadas anteriormente neste capAtulo"
*oi desenvolvido um prottipo de aplicativo utiliGando estas tIcnicas# O aplicativo se resume
em uma a(enda @ue permite cadastrar novos a(endamentos" <uscar a(endamentos na lista(em
de a(endamentos K% cadastrados e editar os a(endamentos#
)igura 9 7 !e'a de Listagem de Agendamentos
7
A *i(ura C representa a tela de lista(em de a(endamentos do aplicativo# 4ela I possAvel
realiGar as se(uintes opera?Mes:
# Ao clicar na lupa" I possAvel localiGar um a(endamento previamente cadastrado#
2# Ao clicar no Acone de mais" I possAvel cadastrar um novo a(endamento#
;# Ao clicar no <ot)o de atualiGar" I possAvel atualiGar a lista(em recarre(ando=a#
!# Ao clicar uma veG so<re um a(endamento da lista(em" I possAvel visualiGar e editar
suas propriedades#
)igura 10 7 !e'a de #adastro B 8dio
A *i(ura 0 representa a tela de cadastro e edi?)o de a(endamentos# 4ela I possAvel
in*ormar um nome" uma data em @ue o a(endamento acontecer% e a descri?)o do
a(endamento# Ao clicar no <ot)o de salvar Erepresentado pelo Acone de um dis@ueteF" o
8
aplicativo ir% realiGar a valida?)o de todos os campos de *orma autom%tica" sem precisar @ue
seKa realiGada @ual@uer preven?)o anteriormente#
.&.1 Ana'ise do a%'icati/o
O aplicativo *oi desenvolvido como uma aplica?)o nativa para Android

" desenvolvido
utiliGando a lin(ua(em de pro(rama?)o Java
2
e o am<iente de desenvolvido Android &tudio
;
#
A aplica?)o utiliGa o O,M
!
&u(arO,M" desenvolvido especi*icamente para Android#
AlIm disto" ela conta com um padr)o em camadas Model=8ie:=Controller
P
e utiliGa conceitos
de Active,ecords
Q
para persist>ncia em <anco de dados#
5ara uma melhor le(i<ilidade do cdi(o" *oi desenvolvido um prottipo de #rameDorG" @ue
*oi nomeado de JMinervaL" @ue serve como heran?a para as diversas classes desenvolvidas#
.sse *rame:orN encapsula os mItodos e o<Ketos mais utiliGados" disponi<iliGando *erramentas
para tornar o cdi(o mais claro# AlIm disto" ele torna transparente a utiliGa?)o do &u(arO,M
e dos conceitos de Active,ecords" *aGendo com @ue o desenvolvedor n)o precise se preocupar
com os mesmos# 5or Zltimo" ele aKuda o proKeto principal a manter o conceito de Model=8ie:=
Controller" *ornecendo *un?Mes K% implementadas para sua utiliGa?)o#
O aplicativo conta com as se(uintes estatAsticas" con*orme demonstrado na ta<ela :

Android I um sistema operacional <aseado no nZcleo do 1inuH para dispositivos mveis" desenvolvido pela
Open 0andset Alliance" liderada pela Goo(le 2nc# &e(undo a Goo(le" mais de milh)o e P00 mil aparelhos
com o sistema operacional s)o ativados todos os dias" S sendo utiliGado por (randes *a<ricantes de celulares"
como 0TC" &amsun(" &ony" Motorola e 1G#
2
Java I uma lin(ua(em de pro(rama?)o orientada a o<Keto desenvolvida na dIcada de C0 por uma e@uipe de
pro(ramadores che*iada por James Goslin(" na empresa &un Microsystems# -i*erentemente das lin(ua(ens
convencionais" @ue s)o compiladas para cdi(o nativo" a lin(ua(em Java I compilada para um <ytecode @ue
I eHecutado por uma m%@uina virtual# A lin(ua(em de pro(rama?)o Java I a lin(ua(em convencional da
5lata*orma Java" mas n)o sua Znica lin(ua(em#
;
Android &tudio I uma 2-. para desenvolvimento na plata*orma Android <aseado no 2nteliJ Community
8ersion# Com o mesmo o<Ketivo do .clipse X A-T EAndroid -eveloper ToolsF" ele prov> um am<iente de
desenvolvimento" de<u(" testes e pro*ile multiplata*orma para Android#
!
Mapeamento o<Keto=relacional Eou O,M" do in(l>s: O<Kect=relational mappin(F I uma tIcnica de
desenvolvimento utiliGada para reduGir a impedWncia da pro(rama?)o orientada aos o<Ketos utiliGando
<ancos de dados relacionais# As ta<elas do <anco de dados s)o representadas atravIs de classes e os re(istros
de cada ta<ela s)o representados como instWncias das classes correspondentes#
P
Model=vie:=controller EM8CF" em portu(u>s modelo=vis)o=controlador" I um modelo de ar@uitetura de
so*t:are @ue separa a representa?)o da in*orma?)o da intera?)o do usu%rio com ele# O modelo EmodelF
consiste nos dados da aplica?)o" re(ras de ne(cios" l(ica e *un?Mes# $ma vis)o Evie:F pode ser @ual@uer
saAda de representa?)o dos dados" como uma ta<ela ou um dia(rama# V possAvel ter v%rias visMes do mesmo
dado" como um (r%*ico de <arras para (erenciamento e uma vis)o ta<ular para contadores# O controlador
EcontrollerF *aG a media?)o da entrada" convertendo=a em comandos para o modelo ou vis)o# As ideias
centrais por tr%s do M8C s)o a reusa<ilidade de cdi(o e separa?)o de conceitos#
Q
Active record I uma a<orda(em para acesso de dados num <anco de dados# $ma ta<ela de <anco de dados
ou vis)oEvie:F I em<rulhadaE:rappedF em uma classe# 5ortanto" uma instWncia de um o<Keto I amarrada a
um Znico re(istoEtuplaF na ta<ela# Aps a cria?)o e (rava?)o de um o<Keto" um novo re(isto I adicionado U
ta<ela# ]ual@uer o<Keto carre(ado o<tIm suas in*orma?Mes a partir do <anco de dados# ]uando um o<Keto I
atualiGado" o re(istro correspondente na ta<ela tam<Im I atualiGado# A classe de em<rulho implementa os
mItodos de acessoEsetter e (etterF ou propriedades para cada coluna na ta<ela ou vis)o#
9
M'"% +!'sse C linhas
M'"% #*$) Q linhas
N9#e% )e "&s 0
N9#e% )e &% 0
N9#e%s )e &%/e'+0
!abe'a 1 7 An'ise do a%'icati/o de agendamento
&0
.&. !rec1os do #$digo )onte 2eta'1ado
)igura 11 7 #'asse de mode'o do agendamento
4a *i(ura I apresentada a classe de modelo do a(endamento E&chedulin( em in(l>sF# A
classe conta com @uatro atri<utos e com os mItodos de (etter e setter de seus atri<utos# AlIm
disto" a classe herda de MinervaModel as capacidades do &u(arO,M de persist>ncia"
permitindo assim utiliGar os mItodos &ave para persistir no <anco de dados e o mItodo Find
para recuperar um re(istro do <anco de dados#
&1
)igura 1 7 #'asse de %ersist,ncia do <iner/a<ode' CSugar-R<D
A *A(ura 2 apresenta a classe MinervaModel# .la *oi desenvolvida neste tra<alho para
encapsular a heran?a do &u(ar,ecord" sendo respons%vel pela camada Model
R
no mdulo
Model=8ie:=Controller# -esta *orma seria possAvel editar todos os modelos sem precisar *aGer
@ual@uer altera?)o interna no &u(arO,M# AlIm disto" caso *osse necess%rio alterar o O,M
utiliGado" seria possAvel sair do &u(arO,M e ir para outro O,M disponAvel para Android sem
realiGar outras altera?Mes no cdi(o *onte do aplicativo#
R
$m modelo EmodelF noti*ica suas visMes e controladores associados @uando h% uma mudan?a em seu
estado# .sta noti*ica?)o permite @ue as visMes produGam saAdas atualiGadas e @ue os controladores alterem o
conKunto de comandos disponAveis# $ma implementa?)o passiva do M8C monta estas noti*ica?Mes" devido a
aplica?)o n)o necessitar delas ou a plata*orma de so*t:are n)o suport%=las#
&
)igura 1& 7 #'asse de 'istagem de agendamentos C%arte 1D
)igura 14 7 #'asse de 'istagem de agendamentos C%arte D
&&
A *i(ura ; e *i(ura ! apresentam a classe de lista(em de a(endamento# .la I a
respons%vel pela Activity
S
de lista(em de a(endamentos# .ssa classe controla a intera?)o
inter*ace=modelo" sendo o Controller
C
no padr)o Model=8ie:=Controller#
S
Activity est% relacionado U tare*a @ue uma aplica?)o pode *aGer# .ssa tare*a pode ser" por eHemplo" uma tela
de <oas=vindas" um mapa" uma lista de itens" uma tela de op?Mes" en*im" al(o @ue possa ser apresent%vel
para o usu%rio# Activity I o componente chave do Android e para haver intera?)o com a inter*ace de usu%rio
uma classe deve herdar de uma activity#
C
$m controlador EcontrollerF pode enviar comandos para sua vis)o associada para alterar a apresenta?)o da
vis)o do modelo Epor eHemplo" percorrendo um documentoF# .le tam<Im pode enviar comandos para o
modelo para atualiGar o estado do modelo Epor eHemplo" editando um documentoF#
&4
)igura 1* 7 #'asse <iner/aActi/itE
A *i(ura P apresenta classe MinervaActivity# .la serve para encapsular mItodos muito
utiliGados pelas outras classes Activity" de modo a diminuir o nZmero de cdi(o duplicado#
&*
)igura 16 7 #'asse de cadastro de agendamento C%arte 1D
&6
)igura 17 7 #'asse de cadastro de agendamento C%arte D
A *i(ura Q e a *i(ura R apresentam a classe &chedulin(AddActivity# .la I respons%vel
pela tela de cadastro de novos a(endamentos# AlIm disto" ela I respons%vel por invocar o
mItodo saveEF do modelo do a(endamento" permitindo assim @ue o &u(arO,M realiGe a
persist>ncia no <anco de dados do aplicativo Android#
&7
)igura 18 = #'asse <et1od<a%
A *i(ura S apresenta a classe MethodMap# .la I uma classe muito Ztil para mapear um
conKunto de mItodos e permitir @ue seus eventos seKam eHecutados# Com ela I possAvel
adicionar diversos mItodos" re*erenciando um id @ue *icar% (uardado em uma lista#
5osteriormente" I possAvel invocar o mItodo eHecuteMethod/y2d @ue permite eHecutar o
mItodo apontado pelo id# 2sso *acilita a le(i<ilidade do cdi(o" evitando _i*s` desnecess%rios e
permitindo @ue *uturamente outros eventos seKam adicionados sem (randes altera?Mes no
cdi(o *onte[ uma veG @ue ser% necess%rio apenas adicionar o novo evento e o mItodo @ue
ser% disparado a lista(em#
&8
)igura 19 7 #'asse <essageFe'%er
A *A(ura C apresenta a classe Messa(e0elper# .la I respons%vel por eHi<ir mensa(ens
ao usu%rio a partir da inter*ace do disposAtivo Android# V possAvel com ela con*i(urar detalhes
como tempo" mensa(em e identi*icador#
&9
)igura 0 7 #'asse List5ieGFe'%er
A *A(ura 20 apresenta a classe 1ist8ie:0elper# .la I respons%vel por mapear uma
lista(em e carre(ar e manipular mais *acilmente o<Ketos 1ist8ie: da inter*ace do aplicativo @ue
se encontram na camada 8ie:
20
do Model=8ie:=Controller" recuperando seus dados para o
Controller#
20
A vis)o Evie:F solicita do modelo a in*orma?)o @ue ela necessita para (erar uma representa?)o de saAda#
40
)igura 1 7 #'asse List5ieG<a%
A *i(ura 2 apresenta a classe 1ist8ie:Map# .la serve como uma auHiliar a classe
1ist8ie:0elper" sendo o o<Keto aonde os dados da 1ist8ie: estar)o carre(ados durante a
eHecu?)o do o<Keto 1ist8ie:0elper#
41
& Ana'isador de #$digo Lim%o
Para poder considerar a si mesmo um pro#issional,
voc+ deve criar um c8digo limpo. o h. desculpa
racional para no dar o melhor de si.
Robert Cecil Martin
Con*orme proposto no proKeto" *oi desenvolvido um aplicativo simples de edi?)o de teHto
com capacidades para analisar o cdi(o *onte e diGer os pontos @ue est)o sem con*ormidade
com os conceitos de cdi(o limpo# 2nicialmente" s)o eHplicadas as tecnolo(ias utiliGadas para
seu desenvolvimento e posteriormente seu *uncionamento# Aps isto" s)o demonstradas @uais
re(ras o aplicativo contempla e sua utiliGa?)o#
3.1 !ecno'ogias uti'i0adas
&.1.1 FE%er!e9t <arHu% Language CFtm'D
0TM1 E&ilva" 202F I a lin(ua(em com @ue se escrevem as p%(inas :e<# As p%(inas :e<
podem ser vistas pelo usu%rio mediante um tipo de aplica?)o chamada nave(ador E<ro:serF#
5odemos diGer" portanto" @ue o 0TM1 I a lin(ua(em usada pelos nave(adores para mostrar as
p%(inas :e< ao usu%rio" sendo hoKe em dia a inter*ace mais eHtensa na rede#
.sta lin(ua(em nos permite a(lutinar teHtos" ima(ens e %udios" e com<in%=los a nosso
(osto# . I a@ui onde est% a sua vanta(em em rela?)o aos livros e revistas: o 0TM1 permite a
introdu?)o de re*er>ncias a outras p%(inas por meio dos linGs hiperteHtos#
O 0TM1 *oi criado inicialmente com o<Ketivo de divul(a?)o de in*orma?)o# 5orIm" n)o
se pensou @ue a :e< che(aria a ser uma %rea com car%ter multimAdia E&ilva" 202F#
.sta evolu?)o do 0TM1" trouHe toda uma sIrie de inconvenientes e de*ici>ncias @ue
tiveram @ue ser superadas com a introdu?)o de outras tecnolo(ias acessrias capaGes de
or(aniGar" otimiGar e automatiGar o *uncionamento do 0TM1# .Hemplos s)o as C&&" 1ess"
&ass" Java&cript" -art" Co**e&crip" entre v%rios outros#
&.1. #ascading StE'e S1eet C#SSD
Cascadin( &tyle &heet" ou C&&" E&ilva" 202F I a a<revia?)o para o termo em in(l>s
Cascadin( &tyle &heet" traduGido para o portu(u>s como *olhas de estilo em cascata# A
de*ini?)o mais precisa e simples para *olha de estilo encontra=se na p%(ina do C&& no site do
Y;C e diG: JFolha de estilo em cascata I um mecanismo simples para adicionar estilos Epor
eHemplo: *ontes" cores" espa?amentosF aos documentos :e<#L Ehttp:TT:::#:;#or(T&tyleTC&&T"
acessado em !T0!T20!F
4
As C&& t>m por *inalidade devolver U marca?)o 0TM1 o propsito inicial da
lin(ua(em# A 0TM1 *oi criada para ser uma lin(ua(em eHclusivamente de marca?)o e
estrutura?)o de conteZdos# 2sso si(ni*ica @ue" se(undo seus idealiGadores" n)o ca<e U 0TM1
*ornecer in*orma?Mes so<re a apresenta?)o dos elementos ao leitor# 5or eHemplo: cores de
*ontes" tamanhos de teHtos" posicionamentos e todo o aspecto visual de um documento n)o
devem ser *un?Mes da 0TM1 E&ilva" 202F#
&.1.& Ia/aScri%t
A lin(ua(em de marca?)o 0TM1 destina=se a estruturar uma p%(ina :e<" n)o se
devendo empre(%=la para adicionar estilos ou apresenta?)o visual aos elementos @ue
constituem a p%(ina" sendo tais tare*as *un?)o das *olhas de estilo em cascata# A 0TM1"
tam<Im n)o possui *uncionalidades @ue permitam adicionar interatividade avan?ada U p%(ina"
sendo tal tare*a *un?)o das lin(ua(ens de pro(rama?)o#
Java&cript E&ilva" 202F *oi criada pela 4etscape
2
em parceria com a &un
Microsystems" com a *inalidade de *ornecer um meio de adicionar interatividade a uma p%(ina
:e<# A primeira vers)o" denominada Java&cript #0 E&ilva" 202F" *oi implementada em mar?o
de CCQ no nave(ador 4etscape 4avi(ator 2#0 @uando o mercado era dominado pela
4etscape# 1o(o a se(uir" veio a Ipoca da chamada (uerra dos <ro:sers" cuKos e*eitos nocivos
se *aGem sentir atI os dias atuais# 5ara n)o *u(ir U re(ra" a Microso*t" em resposta U 4etscape"
criou a lin(ua(em J&cript <aseada em 8isual /asic
22
E&ilva" 202F cuKa primeira vers)o
denominada J&cript #0 *oi lan?ada com o nave(ador 2nternet .Hplorer ;#0#
A 0TM1 limita=se a criar os rtulos e campos de um *ormul%rio para serem
preenchidos pelo usu%rio e nada mais# Com 0TM1" n)o conse(uimos processar os dados nem
mesmo envi%=los ao servidor ou a outra m%@uina @ual@uer# 5ara cumprir essas tare*as" I
necess%rio utiliGar um pro(rama @ue consi(a manipular e processar os dados# .ntre as v%rias
lin(ua(ens de pro(rama?)o destinadas a adicionar e processar dados em p%(inas :e<"
destacam=se 505" Java" ,u<y" 5erl e 5ython E&ilva" Javascript" 202F# As lin(ua(ens de
pro(rama?)o como as citadas anteriormente *oram desenvolvidas para rodar no lado do
servidor" isto I" dependem de uma m%@uina remota onde est)o hospedadas as *uncionalidades
2
4etscape Communications Eanti(amente conhecida como 4etscape Communications Corporation e
conhecida simplesmente como 4etscapeF I uma empresa de servi?os de computadores nos .$A" mais
conhecido pelo seu nave(ador :e<# ]uando era uma empresa independente" a sua sede *oi em Mountain
8ie:" Cali*rnia# O nome do 4etscape *oi uma marca re(istrada da Cisco &ystems" @ue *oi concedido U
empresa#
22
O 8isual /asic Ea<reviado como 8/F I uma lin(ua(em de pro(rama?)o produGida pela empresa Microso*t"
e I parte inte(rante do pacote Microso*t 8isual &tudio# &ua vers)o mais recente *aG parte do pacote 8isual
&tudio #4.T" voltada para aplica?Mes #4et# &ua vers)o anterior *eG parte do Microso*t 8isual &tudio Q#0"
ainda muito utiliGado atualmente por aplica?Mes le(adas#
4&
capaGes de interpretar e *aGer *uncionar os pro(ramas# Java&cript I uma lin(ua(em
desenvolvida para rodar no lado do cliente" isto I" a interpreta?)o e o *uncionamento da
lin(ua(em dependem de *uncionalidades hospedadas no nave(ador do usu%rio#
&.1.4 .JuerE
K]uery E&ilva" 202F I uma <i<lioteca Java&cript criada por John ,esi( e
disponi<iliGada como so*t:are livre e a<erto" ou seKa" de empre(o e uso re(ido se(undo licen?a
con*orme as re(ras esta<elecidas pelo M2T + Massachusetts 2nstitute o* Technolo(y ou pelo
G51 + G4$ General 5u<lic 1icense# 2sso" resumidamente" si(ni*ica @ue pode=se utiliGar a
<i<lioteca (ratuitamente tanto em desenvolvimento de proKetos pessoais como comerciais#
&implicidade I a palavra=chave @ue resume e norteia o desenvolvimento com K]uery#
1inhas e mais linhas de pro(rama?)o Java&cript escritas para o<ter um determinado e*eito em
uma p%(ina s)o su<stituAdas por apenas uma deGena de linhas escritas com sintaHe K]uery#
2ntrincados e Us veGes con*usos cdi(os Java&cript destinados a selecionar um determinado
elemento 0TM1" componente da %rvore do documento s)o su<stituAdos por uma linha de
cdi(o#
&.1.* #1rome >acHaged A%%s
Chrome Apps I uma tecnolo(ia capaG de desenvolver aplicativos nativos" com as
mesmas tIcnicas @ue se I desenvolvido uma aplica?)o :e<# Os Chrome Apps s)o escritos
utiliGando 0tml" Javascript e Css# 5orIm" Chrome Apps parecem e se comportam como
aplicativos nativos" e mais do @ue isso" possuem capacidades muito superiores a uma simples
aplica?)o :e<#
Chrome Apps possuem acesso a todas as Chrome A52s e servi?os normalmente n)o
disponAveis para :e< apps# $m pro(ramador pode desenvolver poderosos aplicativos @ue
intera(em com dispositivos" ar@uivos de mAdia" :e<cams e todas as A52s nativas de um
computador ou dispositivo mvel#
3.2 2esen/o'/imento do Ana'isador
Conceitualmente" a aplica?)o @ue analisa o cdi(o *onte I uma aplica?)o simples @ue *aG
uso das tecnolo(ias :e< descritas anteriormente para veri*icar todo o cdi(o *onte" varrendo
uma %rvore sint%tica de *orma recursiva# Aps a aplica?)o das re(ras" ser% apresentada uma
tela @ue permite veri*icar os erros encontrados a partir das tIcnicas e conceitos de cdi(o
limpo vistas durante este tra<alho#
44
&..1 A#8 8ditor
5ara tornar mais ro<usto o editor" *oi utiliGada a <i<lioteca AceJs" escrita em Javascript
@ue permite utiliGar um editor ro<usto de escrita de cdi(o *onte" con*orme pode ser
o<servado na *i(ura 22# -esta *orma" as *un?Mes <%sicas K% estariam presentes" como synta1
highlight e auto complete#
)igura 7 Inter+ace do ana'isador uti'i0ando o recurso de Auto #om%'ete do AceIS
&.. Kr/ore Sinttica
$ma %rvore sint%tica I uma estrutura de dados em %rvore @ue representa a estrutura
sint%tica de uma cadeia de acordo com al(uma (ram%tica *ormal# .m uma %rvore sint%tica" os
ns internos s)o rotulados por sAm<olos n)o=terminais da (ram%tica" en@uanto os ns *olha s)o
rotulados por sAm<olos terminais da (ram%tica# $m pro(rama @ue produG tais %rvores I
denominado um analisador sint%tico# 9rvores sint%ticas podem ser (eradas para senten?as em
lin(ua(em natural como tam<Im durante o processamento de lin(ua(ens *ormais" tais como as
lin(ua(ens de pro(rama?)o#
5ara a cria?)o da arvore sint%tica no aplicativo proposto" *oi utiliGada a <i<lioteca
&sprima:s @ue permite mapear o cdi(o como uma %rvore sint%tica retornando como um
o<Keto especA*ico" con*orme demonstrado na *i(ura 2;:
4*
)igura & 7 Ar/ore sinttica criada %e'o 8s%rimaIS
&..& 8strutura 3sica
A partir da estrutura <%sica criada pela <i<lioteca &sprima:s" *oi desenvolvido um
mItodo recursivo capaG de mapear todo o o<Keto# .m cima disto" aplicar *un?Mes de call<acN"
ou seKa" um cdi(o eHecut%vel @ue I passado como parWmetro para outro mItodo" e assim cada
uma das re(ras I aplicada recursivamente so<re o o<Keto#
-urante cada itera?)o I chamada as *un?Mes dos o<Ketos:
# 8alidador/ooleano: ,espons%vel por validar as re(ras relacionadas a mItodos @ue
utiliGem parWmetros <ooleanos#
2# 8alidadorCondicional: ,espons%vel por validar as re(ras de cdi(o limpo
relacionadas a condicionais tern%rios aninhados#
AlIm disto *oi desenvolvido o o<Keto Analisador$tils" @ue possui mItodos @ue ser)o
utiliGados por am<as as classes#
46
&..4 5iso Lera' Sobre o Ana'isador
)igura 4 7 !e'a do Ana'isador de #$digo Lim%o
A *i(ura 2! representa a tela de edi?)o do analisador de cdi(o *onte# O sistema
apresenta um rico editor de cdi(o *onte @ue utiliGa a <i<lioteca AC. .ditor# AlIm disto" o
sistema apresenta a op?)o novo ar@uivo" respons%vel por (erar um novo ar@uivo Gerado e o
<ot)o eHecutar" capaG de eHecutar a an%lise de cdi(o *onte#
47
)igura * 7 89ecuo da An'ise de #$digo )onte
A *i(ura 2P demonstra a tela de an%lise do aplicativo# Ao clicar em eHecutar" ser%
eHi<ida uma Kanela em desta@ue no *ormato de modal" @ue eHi<e a linha" o nome da *un?)o
analisada e detalhes a respeito do erro encontrado no cdi(o *onte#
48
4 #onsidera(es )inais
O o<Ketivo deste tra<alho *oi estudar as pr%ticas de implementa?)o de cdi(o *onte
utiliGando <oas pr%ticas e tIcnicas de cdi(o limpo# O o<Ketivo *oi alcan?ado" utiliGando um
prottipo de aplicativo @ue permitiu a utiliGa?)o das tIcnicas previamente estudadas# Foi
implementado tam<Im um prottipo de um editor com a capacidade de analisar o cdi(o *onte
e veri*icar se o mesmo se(ue as re(ras de cdi(o limpo#
-urante o desenvolvimento do aplicativo" *oi possAvel melhorar as pr%ticas estudadas e
aplic%=las em uma aplica?)o real# 2nicialmente" mostrou=se di*Acil a tare*a de se(uir os padrMes
esta<elecidos" e p^de=se o<servar um consider%vel aumento do tempo de desenvolvimento#
5orIm" a lon(o praGo" o cdi(o se tornou mais le(Avel e *%cil de adicionar novos recursos sem
piorar a le(i<ilidade" possi<ilitando um processo de manuten?)o consideravelmente mais
e*iciente#
Apesar de se tratar apenas de um prottipo" o analisador *oi capaG de veri*icar diversas
re(ras envolvendo valores <ooleanos e al(umas condi?Mes i#s# Toda a parte de edi?)o de
cdi(o *uncionou e as *erramentas utiliGadas durante o desenvolvimento se inte(raram
corretamente#
-esta *orma" apesar de contar apenas com casos <%sicos de veri*ica?)o" o aplicativo *oi
satis*atrio" realiGando o @ue *oi proposto# 5ara tra<alhos *uturos seria relevante o aumento de
casos de veri*ica?)o do analisador e a implementa?)o de uma rotina de re*atora?)o de cdi(o
*onte" onde o cdi(o analisado seria veri*icado e corri(ido con*orme as re(ras propostas pelas
de*ini?Mes de cdi(o limpo#
* Re+er,ncias bib'iogr+icas
&218A" MaurAcio# :;8e%3 / A <"<!"$e+' ) .%-%'#')% ='v'S+%".$6
4ovatec 202#
&218A" MaurAcio# CSS> ? Desenv!v' '.!"+'@Aes 4e< .%&"ss"n'"s +# 8s
)s .)e%ss %e+8%ss )e es$"!"('@B )'s +ss>6 4ovatec 202#
&218A" MaurAcio# :'v's+%".$ ? G8"' ) .%-%'#')%6 4ovatec 202#
MA,T24" ,o<ert# C,)"- !"#. ? H'<"!")')es .%C$"+'s ) '-"!e s&$4'%e6
4ovatec 200S#
M'n"&es$ &% A-"!e S&$4'%e Deve!.#en$# -isponAvel em
http:TTa(ilemani*esto#or(# Acesso em: !T0CT20;# K;8e%3# -isponAvel em
http:TTK@uery#comT# Acesso em: !T0CT20;#
D> S+0!# -isponAvel em http:TT:::#:;schools#comT# Acesso em:
!T0CT20;#
ACE E)"$%# -isponAvel em http:TTace#cC#ioT# Acesso em: !T0CT20;#
Es.%"#':s# -isponAvel em http:TTesprima#or(T# Acesso em: !T0CT20;#

Você também pode gostar