SlideShare uma empresa Scribd logo
1 de 57
Baixar para ler offline
LIDANDO COM CÓDIGO
DUPLICADO
Evaldo Junior Bento

23/11/2013
CC BY-NC-SA
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
ESCREVI UM LIVRO DE PHP E MYSQL
CASA DO CÓDIGO
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
CÓDIGO DUPLICADO
Programando de boa na lagoa quando...
As vezes não sabemos que é um código
duplicado, apenas ficamos com a sensação de
Déjà vu
RELATIVAMENTE COMUM
Você não está sozinho
Duplicação é o número 1 dos "bad smells"
O QUE A DUPLICAÇÃO CAUSA?
TAMANHO DA BASE DE CÓDIGO AUMENTA;
COMPREENSÃO É PREJUDICADA;
MANUTENÇÃO É MAIS TRABALHOSA E MAIS PROPENSA À
FALHAS.
Alterar uma parte pode quebrar outras
A correção de uma parte não corrige outras
COMO O PROBLEMA É CRIADO?
MAIS DE UM PROGRAMADOR;
Equipe do eu sozinho também
FUNCIONALIDADES PARECIDAS NO MESMO SOFTWARE;
Copiar e colar
Preguiça de isolar
Desconhecimento de outras partes
FUNCIONALIDADES PARECIDAS EM SOFTWARES DIFERENTES
DO MESMO PROGRAMADOR/EMPRESA.
Copiar e colar
Poderia ser isolado
UM EXEMPLO DO PROBLEMA:
PÁGINA DE LOGIN
1 - BLOCO COM FORM DE LOGIN
2 - PÁGINA APENAS DE LOGIN
Login com e-mail e senha
EM COMUM:
Terão o mesmo formulário
As mesmas validações
O mesmo comportamento
COMO COSTUMA SER FEITO?
Uma das opções é criada e então é copiada
E OS PROBLEMAS...
Alterações ficam complicadas
E se a autenticação for por CPF ou e-mail?
E se entrar uma API para login via Twitter?
COMO IDENTIFICAR CÓDIGO DUPLICADO
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
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
USO DE FERRAMENTAS DE DETECÇÃO.
CPD (Copy/Paste
Detector)
UM EXEMPLO DO PHPCPD:
$ppp -pors apiain
hcd -rges plcto
Poesn fls
rcsig ie
28/28[+++++++++++++++++++++++]100%
6
6 +++++++++++++++++++++++> 0.0
Fud2 eatcoe wt 25dpiae lnsi 3 fls
on 2 xc lns ih 7 ulctd ie n 1 ie:
-apiainmdl/ot_eee.h:06
plcto/oesCnarcbrpp3-5
apiainmdl/ot_aa.h:06
plcto/oesCnapgrpp3-5
IDENTIFIQUEI! E AGORA?
DRY

Don't Repeat Yourself
DRY
Every piece of knowledge must have a single,
unambiguous, authoritative representation
within a system.
Andy Hunt e Dave Thomas - The Pragmatic Programmer
TÉCNICAS PROCEDURAIS
BIBLIOTECAS DE FUNÇÕES;
Helpers
Extraia as partes repetidas para uma função
UM EXEMPLO BÁSICO
eh '$ .nme_omt$mut 2 '' '';
co R'
ubrfra(aon, , ., ,)
eh '$ .nme_omt$mut 2 '' '';
co R'
ubrfra(aon, , ., ,)
eh '$ .nme_omt$mut 2 '' '';
co R'
ubrfra(aon, , ., ,)
eh '$ .nme_omt$mut 2 '' '';
co R'
ubrfra(aon, , ., ,)
PODE FICAR MELHOR ASSIM:
fnto crec_omt
ucin urnyfra(
$mut
aon,
$oe_ybl='$,
mnysmo
R'
$eias=2
dcml
,
$e =''
dc
,,
$huad ='' {
tosns
.)
rtr $oe_ybl.
eun mnysmo
nme_omt$mut $eias $e,$huad)
ubrfra(aon, dcml, dc tosns;
}
eh crec_omt$mut;
co urnyfra(aon)
OUTRO EXEMPLO
fnto smpssadpgscmet(pss $ae){
ucin u_ot_n_ae_omns$ot, pgs
$oa_omns=0
ttlcmet
;
frah(pssa $ot {
oec $ot s ps)
$oa_omns+ cut$ot>omns;
ttlcmet = on(ps-cmet)
}
frah(pgsa $ae {
oec $ae s pg)
$oa_omns+ cut$ae>omns;
ttlcmet = on(pg-cmet)
}
}

rtr $oa_omns
eun ttlcmet;
OUTRO SEM REPETIR:
fnto smcmet(cmetbe){
ucin u_omns$omnals
$oa_omns=0
ttlcmet
;
frah(cmetbe a $omnal){
oec $omnals s cmetbe
$oa_omns+ cut$omnal-cmet)
ttlcmet = on(cmetbe>omns;
}
}

rtr $oa_omns
eun ttlcmet;

fnto smpssadpgscmet(pss $ae){
ucin u_ot_n_ae_omns$ot, pgs
$oa_omns=smcmet(pss;
ttlcmet
u_omns$ot)
$oa_omns+ smcmet(pgs;
ttlcmet = u_omns$ae)
}

rtr $oa_omns
eun ttlcmet;
CLASSES UTILITÁRIAS.
Helpers
Extraia as partes repetidas para um método
TÉCNICAS OO
EXTRACT METHOD;
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
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(;
}
/ ..
/ .
}
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(;
/ ..
/ .
}
EXTRACT CLASS;
EXTRACT CLASS;
Métodos parecidos/iguais em mais de uma classe
As classes não precisam ser relacionadas
Extraia para outra classe e use como um componente
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(;
}
}
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)
}
}
}
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)
}
}
}
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)
/ ..
/ .
}
PULL UP FIELD;
PULL UP FIELD;
Duas subclasses com o mesmo campo
Mova o campo para a super classe
FORM TEMPLATE METHOD;
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
FORM TEMPLATE METHOD;
DESIGN PATTERNS.
Foco em reuso
Vale muito a pena entender os conceitos
Form Template Method == Template Method
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
REFERÊNCIAS
ht:/hqtosog
tp/ppaol.r/
ht:/swkpdaogwk/%3Bdg_ulcd
tp/e.iiei.r/iiCC%3iodpiao
ht:/nwkpdaogwk/ulct_oe
tp/e.iiei.r/iiDpiaecd
ht:/nwkpdaogwk/o%7_eetyusl
tp/e.iiei.r/iiDn2trpa_oref
ht:/nwkpdaogwk/ito_ol_o_ttccd_nlss
tp/e.iiei.r/iiLs_ftosfrsai_oeaayi
ht:/nwkpdaogwk/epaemto_atr
tp/e.iiei.r/iiTmlt_ehdpten
ht:/nwkpdaogwk/ai%28%3apagrtm
tp/e.iiei.r/iiRbnE%09Kr_loih
hts/gtu.o/eatabrmn/hcd
tp:/ihbcmsbsineganppp
ht:/oreaigcmrfcoigbdsel-ncd
tp/sucmkn.o/eatrn/a-mlsi-oe
ht:/oreaigcmrfcoigdpiae-oe
tp/sucmkn.o/eatrn/ulctdcd
ht:/oreaigcmrfcoigetatmto
tp/sucmkn.o/eatrn/xrc-ehd
ht:/oreaigcmrfcoigpl-pfed
tp/sucmkn.o/eatrn/ulu-il
ht:/oreaigcmrfcoigfr-epaemto
tp/sucmkn.o/eatrn/omtmlt-ehd
ht:/oreaigcmrfcoigetatcas
tp/sucmkn.o/eatrn/xrc-ls
PERGUNTAS?
OBRIGADO!
CONTATOS

Site: evaldojunior.com.br
E-mail: evaldojuniorbento@gmail.com
twitter.com/InFog9

Mais conteúdo relacionado

Mais procurados

Algoritmos e Estrutura de Dados - Aula 04
Algoritmos e Estrutura de Dados - Aula 04Algoritmos e Estrutura de Dados - Aula 04
Algoritmos e Estrutura de Dados - Aula 04thomasdacosta
 
Introdução ao Shell Script (versão estendida)
Introdução ao Shell Script (versão estendida)Introdução ao Shell Script (versão estendida)
Introdução ao Shell Script (versão estendida)Hugo Maia Vieira
 
Minicurso Shell Script
Minicurso Shell ScriptMinicurso Shell Script
Minicurso Shell ScriptLuís Eduardo
 
Shell Tips and Tricks for sysadmin
Shell Tips and Tricks for sysadminShell Tips and Tricks for sysadmin
Shell Tips and Tricks for sysadminMagno Torres
 
Algoritmos e Técnicas de Programação - Aula 04
Algoritmos e Técnicas de Programação - Aula 04Algoritmos e Técnicas de Programação - Aula 04
Algoritmos e Técnicas de Programação - Aula 04thomasdacosta
 
PHPSP TestFest 2009
PHPSP TestFest 2009PHPSP TestFest 2009
PHPSP TestFest 2009Rafael Dohms
 
Programação Concorrente - Aula 04
Programação Concorrente - Aula 04Programação Concorrente - Aula 04
Programação Concorrente - Aula 04thomasdacosta
 
PHP e AJAX: do Request ao Framework
PHP e AJAX: do Request ao FrameworkPHP e AJAX: do Request ao Framework
PHP e AJAX: do Request ao FrameworkRafael Dohms
 
Desenvolvimento de web sites com php
Desenvolvimento de web sites com phpDesenvolvimento de web sites com php
Desenvolvimento de web sites com phpbrenod123
 
Estrutura de Dados - Aula 08
Estrutura de Dados - Aula 08Estrutura de Dados - Aula 08
Estrutura de Dados - Aula 08thomasdacosta
 
12 aula - shell script-2015
12   aula - shell script-201512   aula - shell script-2015
12 aula - shell script-2015Flávia Santos
 
Por que voce deveria documentar seu codigo?
Por que voce deveria documentar seu codigo?Por que voce deveria documentar seu codigo?
Por que voce deveria documentar seu codigo?Lennon Manchester
 

Mais procurados (20)

Algoritmos e Estrutura de Dados - Aula 04
Algoritmos e Estrutura de Dados - Aula 04Algoritmos e Estrutura de Dados - Aula 04
Algoritmos e Estrutura de Dados - Aula 04
 
Introdução ao Shell Script (versão estendida)
Introdução ao Shell Script (versão estendida)Introdução ao Shell Script (versão estendida)
Introdução ao Shell Script (versão estendida)
 
Minicurso Shell Script
Minicurso Shell ScriptMinicurso Shell Script
Minicurso Shell Script
 
Shell Tips and Tricks for sysadmin
Shell Tips and Tricks for sysadminShell Tips and Tricks for sysadmin
Shell Tips and Tricks for sysadmin
 
Algoritmos e Técnicas de Programação - Aula 04
Algoritmos e Técnicas de Programação - Aula 04Algoritmos e Técnicas de Programação - Aula 04
Algoritmos e Técnicas de Programação - Aula 04
 
Curso Gratuito de Shell Script
Curso Gratuito de Shell ScriptCurso Gratuito de Shell Script
Curso Gratuito de Shell Script
 
Tutorial Shell Script
Tutorial Shell ScriptTutorial Shell Script
Tutorial Shell Script
 
PHPSP TestFest 2009
PHPSP TestFest 2009PHPSP TestFest 2009
PHPSP TestFest 2009
 
Programação Concorrente - Aula 04
Programação Concorrente - Aula 04Programação Concorrente - Aula 04
Programação Concorrente - Aula 04
 
PHP e AJAX: do Request ao Framework
PHP e AJAX: do Request ao FrameworkPHP e AJAX: do Request ao Framework
PHP e AJAX: do Request ao Framework
 
Sapo Sessions PHP
Sapo Sessions PHPSapo Sessions PHP
Sapo Sessions PHP
 
Shell script
Shell scriptShell script
Shell script
 
Curso shell
Curso shellCurso shell
Curso shell
 
JasperReports
JasperReportsJasperReports
JasperReports
 
Desenvolvimento de web sites com php
Desenvolvimento de web sites com phpDesenvolvimento de web sites com php
Desenvolvimento de web sites com php
 
Estrutura de Dados - Aula 08
Estrutura de Dados - Aula 08Estrutura de Dados - Aula 08
Estrutura de Dados - Aula 08
 
12 aula - shell script-2015
12   aula - shell script-201512   aula - shell script-2015
12 aula - shell script-2015
 
Php FrameWARks - sem CakePHP
Php FrameWARks - sem CakePHPPhp FrameWARks - sem CakePHP
Php FrameWARks - sem CakePHP
 
Por que voce deveria documentar seu codigo?
Por que voce deveria documentar seu codigo?Por que voce deveria documentar seu codigo?
Por que voce deveria documentar seu codigo?
 
Java hidden features
Java hidden featuresJava hidden features
Java hidden features
 

Destaque

Net lit bodhiradh
Net lit bodhiradhNet lit bodhiradh
Net lit bodhiradhBodhiradh
 
Determinacion de contenido de vitamina c en pimiento verde y rojo y amarillo
Determinacion de contenido de vitamina c en pimiento verde y rojo y amarilloDeterminacion de contenido de vitamina c en pimiento verde y rojo y amarillo
Determinacion de contenido de vitamina c en pimiento verde y rojo y amarillomodeltop
 
Power point
Power pointPower point
Power pointM A
 
Blogg instruksjon
Blogg instruksjonBlogg instruksjon
Blogg instruksjonTom Forsmo
 
MNIM BENCH
MNIM BENCHMNIM BENCH
MNIM BENCHctajada
 
введен.фгос
введен.фгосвведен.фгос
введен.фгосmechta3772
 
Review proreviewed
Review proreviewedReview proreviewed
Review proreviewedBodhiradh
 
требов к фгос
требов к фгостребов к фгос
требов к фгосmechta3772
 
Designhotelsc.com
Designhotelsc.comDesignhotelsc.com
Designhotelsc.comBodhiradh
 

Destaque (20)

Img009
Img009Img009
Img009
 
Net lit bodhiradh
Net lit bodhiradhNet lit bodhiradh
Net lit bodhiradh
 
Triangle productions
Triangle productionsTriangle productions
Triangle productions
 
Fly over europe
Fly over europeFly over europe
Fly over europe
 
Determinacion de contenido de vitamina c en pimiento verde y rojo y amarillo
Determinacion de contenido de vitamina c en pimiento verde y rojo y amarilloDeterminacion de contenido de vitamina c en pimiento verde y rojo y amarillo
Determinacion de contenido de vitamina c en pimiento verde y rojo y amarillo
 
22 июня
22 июня22 июня
22 июня
 
Subsidi bbm
Subsidi bbmSubsidi bbm
Subsidi bbm
 
Power point
Power pointPower point
Power point
 
Blogg instruksjon
Blogg instruksjonBlogg instruksjon
Blogg instruksjon
 
I robot
I robotI robot
I robot
 
Amazing sculpture
Amazing sculptureAmazing sculpture
Amazing sculpture
 
MNIM BENCH
MNIM BENCHMNIM BENCH
MNIM BENCH
 
введен.фгос
введен.фгосвведен.фгос
введен.фгос
 
Presentation1
Presentation1Presentation1
Presentation1
 
Review proreviewed
Review proreviewedReview proreviewed
Review proreviewed
 
Musium di Lubang Buaya
Musium di Lubang BuayaMusium di Lubang Buaya
Musium di Lubang Buaya
 
Pullman
PullmanPullman
Pullman
 
花之露珠
花之露珠花之露珠
花之露珠
 
требов к фгос
требов к фгостребов к фгос
требов к фгос
 
Designhotelsc.com
Designhotelsc.comDesignhotelsc.com
Designhotelsc.com
 

Semelhante a Lidando com código duplicado

Pog Nunca Mais - Técnicas e Macetes para o Desenvolvimento em PHP
Pog Nunca Mais - Técnicas e Macetes para o Desenvolvimento em PHPPog Nunca Mais - Técnicas e Macetes para o Desenvolvimento em PHP
Pog Nunca Mais - Técnicas e Macetes para o Desenvolvimento em PHPPaulino Michelazzo
 
Código legado - PHP Conference Brasil - 2014
Código legado - PHP Conference Brasil - 2014Código legado - PHP Conference Brasil - 2014
Código legado - PHP Conference Brasil - 2014Michael Castillo Granados
 
AMD, BDD, e o Javali
AMD, BDD, e o JavaliAMD, BDD, e o Javali
AMD, BDD, e o JavaliRafael Lyra
 
Otimização e Escalabilidade
Otimização e EscalabilidadeOtimização e Escalabilidade
Otimização e Escalabilidademetzen
 
Vamos falar de Clean Code, Refatoração e TDD
Vamos falar de Clean Code, Refatoração e TDDVamos falar de Clean Code, Refatoração e TDD
Vamos falar de Clean Code, Refatoração e TDDDomingos Teruel
 
ORM - TDC Porto Alegre 2014 Trilha .NET
ORM - TDC Porto Alegre 2014 Trilha .NETORM - TDC Porto Alegre 2014 Trilha .NET
ORM - TDC Porto Alegre 2014 Trilha .NETJorge Maia
 
Python No Terra (2006-12-21)
Python No Terra  (2006-12-21)Python No Terra  (2006-12-21)
Python No Terra (2006-12-21)Rudá Moura
 
Joomla! Otimizando performance
Joomla! Otimizando performanceJoomla! Otimizando performance
Joomla! Otimizando performanceMarcio Mota
 
10 Boas Práticas de Programação
10 Boas Práticas de Programação10 Boas Práticas de Programação
10 Boas Práticas de ProgramaçãoCarlos Schults
 
PHP Day - PHP para iniciantes
PHP Day - PHP para iniciantesPHP Day - PHP para iniciantes
PHP Day - PHP para iniciantesAlmir Mendes
 
Memcached, Gearman e Sphinx
Memcached, Gearman e SphinxMemcached, Gearman e Sphinx
Memcached, Gearman e SphinxElton Minetto
 
Do legado ao DDD
Do legado ao DDDDo legado ao DDD
Do legado ao DDDLeonn Leite
 
Sapo sessions linux power tools
Sapo sessions linux power toolsSapo sessions linux power tools
Sapo sessions linux power toolsArmando Reis
 
Desenvolvimento ágil com Kohana framework
Desenvolvimento ágil com Kohana frameworkDesenvolvimento ágil com Kohana framework
Desenvolvimento ágil com Kohana frameworkMarcelo Rodrigo
 
Da argila ao forte: como desenvolver uma loja com PagSeguro
Da argila ao forte: como desenvolver uma loja com PagSeguroDa argila ao forte: como desenvolver uma loja com PagSeguro
Da argila ao forte: como desenvolver uma loja com PagSeguroMichael Castillo Granados
 

Semelhante a Lidando com código duplicado (20)

POG nunca mais - SOLISC
POG nunca mais - SOLISCPOG nunca mais - SOLISC
POG nunca mais - SOLISC
 
Pep 8
Pep 8Pep 8
Pep 8
 
Hello SAFE World!!!
Hello SAFE World!!!Hello SAFE World!!!
Hello SAFE World!!!
 
Pog Nunca Mais - Técnicas e Macetes para o Desenvolvimento em PHP
Pog Nunca Mais - Técnicas e Macetes para o Desenvolvimento em PHPPog Nunca Mais - Técnicas e Macetes para o Desenvolvimento em PHP
Pog Nunca Mais - Técnicas e Macetes para o Desenvolvimento em PHP
 
Código legado - PHP Conference Brasil - 2014
Código legado - PHP Conference Brasil - 2014Código legado - PHP Conference Brasil - 2014
Código legado - PHP Conference Brasil - 2014
 
AMD, BDD, e o Javali
AMD, BDD, e o JavaliAMD, BDD, e o Javali
AMD, BDD, e o Javali
 
Otimização e Escalabilidade
Otimização e EscalabilidadeOtimização e Escalabilidade
Otimização e Escalabilidade
 
Vamos falar de Clean Code, Refatoração e TDD
Vamos falar de Clean Code, Refatoração e TDDVamos falar de Clean Code, Refatoração e TDD
Vamos falar de Clean Code, Refatoração e TDD
 
ORM - TDC Porto Alegre 2014 Trilha .NET
ORM - TDC Porto Alegre 2014 Trilha .NETORM - TDC Porto Alegre 2014 Trilha .NET
ORM - TDC Porto Alegre 2014 Trilha .NET
 
Python No Terra (2006-12-21)
Python No Terra  (2006-12-21)Python No Terra  (2006-12-21)
Python No Terra (2006-12-21)
 
Joomla! Otimizando performance
Joomla! Otimizando performanceJoomla! Otimizando performance
Joomla! Otimizando performance
 
10 Boas Práticas de Programação
10 Boas Práticas de Programação10 Boas Práticas de Programação
10 Boas Práticas de Programação
 
PHP Day - PHP para iniciantes
PHP Day - PHP para iniciantesPHP Day - PHP para iniciantes
PHP Day - PHP para iniciantes
 
Memcached, Gearman e Sphinx
Memcached, Gearman e SphinxMemcached, Gearman e Sphinx
Memcached, Gearman e Sphinx
 
Do legado ao DDD
Do legado ao DDDDo legado ao DDD
Do legado ao DDD
 
Php 07 Cakephp
Php 07 CakephpPhp 07 Cakephp
Php 07 Cakephp
 
Zend Framework
Zend FrameworkZend Framework
Zend Framework
 
Sapo sessions linux power tools
Sapo sessions linux power toolsSapo sessions linux power tools
Sapo sessions linux power tools
 
Desenvolvimento ágil com Kohana framework
Desenvolvimento ágil com Kohana frameworkDesenvolvimento ágil com Kohana framework
Desenvolvimento ágil com Kohana framework
 
Da argila ao forte: como desenvolver uma loja com PagSeguro
Da argila ao forte: como desenvolver uma loja com PagSeguroDa argila ao forte: como desenvolver uma loja com PagSeguro
Da argila ao forte: como desenvolver uma loja com PagSeguro
 

Mais de Evaldo Junior

Dafiti Tech Conference - PHP Levado a Sério
Dafiti Tech Conference - PHP Levado a SérioDafiti Tech Conference - PHP Levado a Sério
Dafiti Tech Conference - PHP Levado a SérioEvaldo Junior
 
A Evolução do PHP - A Linguagem Número 1 da Web - PHP Conference Brasil 2013
A Evolução do PHP - A Linguagem Número 1 da Web - PHP Conference Brasil 2013A Evolução do PHP - A Linguagem Número 1 da Web - PHP Conference Brasil 2013
A Evolução do PHP - A Linguagem Número 1 da Web - PHP Conference Brasil 2013Evaldo Junior
 
Ambiente livre para desenvolvimento web
Ambiente livre para desenvolvimento webAmbiente livre para desenvolvimento web
Ambiente livre para desenvolvimento webEvaldo Junior
 
A Evolução do PHP - 4º Dev In Santos
A Evolução do PHP - 4º Dev In SantosA Evolução do PHP - 4º Dev In Santos
A Evolução do PHP - 4º Dev In SantosEvaldo Junior
 
PHP Turbinado com CodeIgniter - Conisli 2011
PHP Turbinado com CodeIgniter - Conisli 2011PHP Turbinado com CodeIgniter - Conisli 2011
PHP Turbinado com CodeIgniter - Conisli 2011Evaldo Junior
 
Sustentabilidade de Projetos Livres
Sustentabilidade de Projetos LivresSustentabilidade de Projetos Livres
Sustentabilidade de Projetos LivresEvaldo Junior
 
Controle de Versões com Git
Controle de Versões com GitControle de Versões com Git
Controle de Versões com GitEvaldo Junior
 

Mais de Evaldo Junior (9)

Dafiti Tech Conference - PHP Levado a Sério
Dafiti Tech Conference - PHP Levado a SérioDafiti Tech Conference - PHP Levado a Sério
Dafiti Tech Conference - PHP Levado a Sério
 
A Evolução do PHP - A Linguagem Número 1 da Web - PHP Conference Brasil 2013
A Evolução do PHP - A Linguagem Número 1 da Web - PHP Conference Brasil 2013A Evolução do PHP - A Linguagem Número 1 da Web - PHP Conference Brasil 2013
A Evolução do PHP - A Linguagem Número 1 da Web - PHP Conference Brasil 2013
 
Ambiente livre para desenvolvimento web
Ambiente livre para desenvolvimento webAmbiente livre para desenvolvimento web
Ambiente livre para desenvolvimento web
 
Evolucao php2
Evolucao php2Evolucao php2
Evolucao php2
 
A Evolução do PHP - 4º Dev In Santos
A Evolução do PHP - 4º Dev In SantosA Evolução do PHP - 4º Dev In Santos
A Evolução do PHP - 4º Dev In Santos
 
Python para devs
Python para devsPython para devs
Python para devs
 
PHP Turbinado com CodeIgniter - Conisli 2011
PHP Turbinado com CodeIgniter - Conisli 2011PHP Turbinado com CodeIgniter - Conisli 2011
PHP Turbinado com CodeIgniter - Conisli 2011
 
Sustentabilidade de Projetos Livres
Sustentabilidade de Projetos LivresSustentabilidade de Projetos Livres
Sustentabilidade de Projetos Livres
 
Controle de Versões com Git
Controle de Versões com GitControle de Versões com Git
Controle de Versões com Git
 

Lidando com código duplicado