O documento discute o problema do código duplicado em programação e apresenta técnicas para identificar e corrigir a duplicação, como usar bibliotecas de funções, extrair métodos, extrair classes, mover campos e usar padrões de projeto como Template Method.
2. EVALDO JUNIOR
Tecnólogo em Processamento de Dados
MBA em Gestão Estratégica de TI
Desenvolvedor Web
Uso principalmente PHP
HTML, CSS, JavaScript, SQL...
GNU/Linux - Python - Vim
Dafiti
Unimonte
4. CONTEÚDO DESTA APRESENTAÇÃO
Déjà vu
Os problemas da duplicação de código
Maneiras de identificar código duplicado
Técnicas para corrigir a duplicação de código
23. IDENTIFICAÇÃO MANUAL;
Complexa e não exata (além de trabalhosa)
Acontece quando sem querer se esbarra em duplicações
Pode ser encontrada quando se procura
24. USO DE FERRAMENTAS COMO DIFF, MELD ETC;
Bom, mas tem que saber o que quer
Exemplo:
Classes de clientes e funcionários que podem ser
semelhantes
29. DRY
Every piece of knowledge must have a single,
unambiguous, authoritative representation
within a system.
Andy Hunt e Dave Thomas - The Pragmatic Programmer
39. EXTRACT METHOD;
Métodos com trechos semelhantes
Extraia para apenas um método e use nos outros
Também pode ser usado para simplificar métodos grandes
40. EXTRACT METHOD
pbi fnto smAto(
ulc ucin oecin)
{
i ( $hs>eUe(-cnces'oeeto' 'di'){
f ! ti-gtsr)>aAcs(SmScin, Amn)
$hs>eiet'ntuhrzd)
ti-rdrc(/oatoie';
}
i (ti-ev>se(){
f $hs>n-iDv)
$hs>nberflr)
ti-ealPoie(;
}
/ ..
/ .
}
pbi fnto aohrcin)
ulc ucin nteAto(
{
i ( $hs>eUe(-cnces'oeeto' 'di'){
f ! ti-gtsr)>aAcs(SmScin, Amn)
$hs>eiet'ntuhrzd)
ti-rdrc(/oatoie';
}
i (ti-ev>se(){
f $hs>n-iDv)
$hs>nberflr)
ti-ealPoie(;
}
/ ..
/ .
}
41. EXTRACT METHOD
piaefnto cekemsindi(scin
rvt ucin hcPrisoAmn$eto)
{
i ( $hs>eUe(-cnces$eto,'di'){
f ! ti-gtsr)>aAcs(scin Amn)
$hs>eiet'ntuhrzd)
ti-rdrc(/oatoie';
}
}
piaefnto ealPoie(
rvt ucin nberflr)
{
i (ti-ev>se(){
f $hs>n-iDv)
$hs>nberflr)
ti-ealPoie(;
}
}
pbi fnto smAto(
ulc ucin oecin)
{
$hs>hcPrisoAmn'oeeto';
ti-cekemsindi(SmScin)
$hs>nberflr)
ti-ealPoie(;
/ ..
/ .
}
pbi fnto aohrcin)
ulc ucin nteAto(
{
$hs>hcPrisoAmn'oeeto';
ti-cekemsindi(SmScin)
$hs>nberflr)
ti-ealPoie(;
/ ..
/ .
}
44. EXTRACT CLASS
/ Rptd e vro cnrles
/ eeio m áis otolr
piaefnto cekemsindi(scin
rvt ucin hcPrisoAmn$eto)
{
i ( $hs>eUe(-cnces$eto,'di'){
f ! ti-gtsr)>aAcs(scin Amn)
$hs>eiet'ntuhrzd)
ti-rdrc(/oatoie';
}
}
/ Rptd e vro cnrles
/ eeio m áis otolr
piaefnto ealPoie(
rvt ucin nberflr)
{
i (ti-ev>se(){
f $hs>n-iDv)
$hs>nberflr)
ti-ealPoie(;
}
}
45. EXTRACT CLASS
casAl{
ls c
pbi fnto cekemsin$eto,$oe
ulc ucin hcPriso(scin rl)
{
$p =Ap:eIsac(;
ap
p:gtntne)
i ( $p-gtsr)>aAcs(scin $oe){
f ! ap>eUe(-cnces$eto, rl)
$p-rdrc(/oatoie';
ap>eiet'ntuhrzd)
}
}
}
46. EXTRACT CLASS
casPoie {
ls rflr
piaefnto ealPoie(
rvt ucin nberflr)
{
$p =Ap:eIsac(;
ap
p:gtntne)
i (ap>n-iDv) {
f $p-ev>se()
$p-ealPoie(;
ap>nberflr)
}
}
}
47. EXTRACT CLASS
pbi fnto _cntut)
ulc ucin _osrc(
{
$ =nwPoie(;
p
e rflr)
$-ealPoie(;
p>nberflr)
}
pbi fnto smAto(
ulc ucin oecin)
{
$c =nwAl)
al
e c(;
$c-cekemsin'oeeto' 'di';
al>hcPriso(SmScin, Amn)
/ ..
/ .
}
51. FORM TEMPLATE METHOD;
Métodos praticamente iguais em subclasses
Poucas variações
Não é possível simplesmente mover o método para a
superclasse
Separe as diferenças em métodos com a mesma assinatura
Use os novos métodos no método principal
53. DESIGN PATTERNS.
Foco em reuso
Vale muito a pena entender os conceitos
Form Template Method == Template Method
54. RESUMO
Duplicação é ruim
Causada por preguiça ou desconhecimento
Ferramentas de detecção ajudam
Mas não adianta apenas saber que existe duplicação
Técnicas podem ser usadas
Design Patterns importam