lidando com código duplicado - php conference brasil 2013

57
LIDANDO COM CÓDIGO DUPLICADO Evaldo Junior Bento 29/11/2013 CC BY-NC-SA

Upload: evaldo-junior

Post on 14-Jun-2015

1.395 views

Category:

Technology


3 download

DESCRIPTION

Slides da minha palestra sobre código duplicado na PHP Conference Brasil 2013

TRANSCRIPT

Page 1: Lidando com Código Duplicado - PHP Conference Brasil 2013

LIDANDO COM CÓDIGODUPLICADO

Evaldo Junior Bento

29/11/2013

CC BY-NC-SA

Page 2: Lidando com Código Duplicado - PHP Conference Brasil 2013

EVALDO JUNIORTecnólogo em Processamento de DadosMBA em Gestão Estratégica de TIDesenvolvedor WebUso principalmente PHP

HTML, CSS, JavaScript, SQL...GNU/Linux - Python - VimDafitiUnimonte

Page 3: Lidando com Código Duplicado - PHP Conference Brasil 2013

ESCREVI UM LIVRO DE PHP E MYSQLCASA DO CÓDIGO

EVALDO10

Page 4: Lidando com Código Duplicado - PHP Conference Brasil 2013

CONTEÚDO DESTA APRESENTAÇÃODéjà vuOs problemas da duplicação de códigoManeiras de identificar código duplicadoTécnicas para corrigir a duplicação de código

Page 5: Lidando com Código Duplicado - PHP Conference Brasil 2013

CÓDIGO DUPLICADOProgramando de boa na lagoa quando...

Page 6: Lidando com Código Duplicado - PHP Conference Brasil 2013
Page 7: Lidando com Código Duplicado - PHP Conference Brasil 2013

As vezes não sabemos que é um códigoduplicado, apenas ficamos com a sensação de

Déjà vu

Page 8: Lidando com Código Duplicado - PHP Conference Brasil 2013

RELATIVAMENTE COMUMVocê não está sozinhoDuplicação é o número 1 dos "bad smells"

Page 9: Lidando com Código Duplicado - PHP Conference Brasil 2013

O QUE A DUPLICAÇÃO CAUSA?

Page 10: Lidando com Código Duplicado - PHP Conference Brasil 2013

TAMANHO DA BASE DE CÓDIGO AUMENTA;

Page 11: Lidando com Código Duplicado - PHP Conference Brasil 2013

COMPREENSÃO É PREJUDICADA;

Page 12: Lidando com Código Duplicado - PHP Conference Brasil 2013

MANUTENÇÃO É MAIS TRABALHOSA E MAIS PROPENSA ÀFALHAS.

Alterar uma parte pode quebrar outrasA correção de uma parte não corrige outras

Page 13: Lidando com Código Duplicado - PHP Conference Brasil 2013

COMO O PROBLEMA É CRIADO?

Page 14: Lidando com Código Duplicado - PHP Conference Brasil 2013

MAIS DE UM PROGRAMADOR;Equipe do eu sozinho também

Page 15: Lidando com Código Duplicado - PHP Conference Brasil 2013

FUNCIONALIDADES PARECIDAS NO MESMO SOFTWARE;Copiar e colarPreguiça de isolarDesconhecimento de outras partes

Page 16: Lidando com Código Duplicado - PHP Conference Brasil 2013

FUNCIONALIDADES PARECIDAS EM SOFTWARES DIFERENTESDO MESMO PROGRAMADOR/EMPRESA.

Copiar e colarPoderia ser isolado

Page 17: Lidando com Código Duplicado - PHP Conference Brasil 2013

UM EXEMPLO DO PROBLEMA:PÁGINA DE LOGIN

Page 18: Lidando com Código Duplicado - PHP Conference Brasil 2013

1 - BLOCO COM FORM DE LOGIN2 - PÁGINA APENAS DE LOGIN

Login com e-mail e senha

Page 19: Lidando com Código Duplicado - PHP Conference Brasil 2013

EM COMUM:Terão o mesmo formulárioAs mesmas validaçõesO mesmo comportamento

Page 20: Lidando com Código Duplicado - PHP Conference Brasil 2013

COMO COSTUMA SER FEITO?Uma das opções é criada e então é copiada

Page 21: Lidando com Código Duplicado - PHP Conference Brasil 2013

E OS PROBLEMAS...Alterações ficam complicadasE se a autenticação for por CPF ou e-mail?E se entrar uma API para login via Twitter?

Page 22: Lidando com Código Duplicado - PHP Conference Brasil 2013

COMO IDENTIFICAR CÓDIGO DUPLICADO

Page 23: Lidando com Código Duplicado - PHP Conference Brasil 2013

IDENTIFICAÇÃO MANUAL;Complexa e não exata (além de trabalhosa)Acontece quando sem querer se esbarra em duplicaçõesPode ser encontrada quando se procura

Page 24: Lidando com Código Duplicado - PHP Conference Brasil 2013

USO DE FERRAMENTAS COMO DIFF, MELD ETC;Bom, mas tem que saber o que querExemplo:

Classes de clientes e funcionários que podem sersemelhantes

Page 25: Lidando com Código Duplicado - PHP Conference Brasil 2013

USO DE FERRAMENTAS DE DETECÇÃO.CPD (Copy/PasteDetector)

Page 26: Lidando com Código Duplicado - PHP Conference Brasil 2013

UM EXEMPLO DO PHPCPD:$ phpcpd --progress application

Processing files268 / 268 [++++++++++++++++++++++++++++++++++++++++++++++>] 100.00%

Found 22 exact clones with 275 duplicated lines in 31 files:- application/models/Conta_receber.php:30-65 application/models/Conta_pagar.php:30-65

Page 27: Lidando com Código Duplicado - PHP Conference Brasil 2013

IDENTIFIQUEI! E AGORA?

Page 28: Lidando com Código Duplicado - PHP Conference Brasil 2013

DRYDon't Repeat Yourself

Page 29: Lidando com Código Duplicado - PHP Conference Brasil 2013

DRYEvery piece of knowledge must have a single,unambiguous, authoritative representation

within a system.

Andy Hunt e Dave Thomas - The Pragmatic Programmer

Page 30: Lidando com Código Duplicado - PHP Conference Brasil 2013

TÉCNICAS PROCEDURAIS

Page 31: Lidando com Código Duplicado - PHP Conference Brasil 2013

BIBLIOTECAS DE FUNÇÕES;HelpersExtraia as partes repetidas para uma função

Page 32: Lidando com Código Duplicado - PHP Conference Brasil 2013

UM EXEMPLO BÁSICO echo 'R$' . number_format($amount, 2, '.', ',');

echo 'R$' . number_format($amount, 2, '.', ',');

echo 'R$' . number_format($amount, 2, '.', ',');

echo 'R$' . number_format($amount, 2, '.', ',');

Page 33: Lidando com Código Duplicado - PHP Conference Brasil 2013

PODE FICAR MELHOR ASSIM: function currency_format( $amount, $money_symbol = 'R$', $decimals = 2, $dec = ',', $thousands = '.') { return $money_symbol . number_format($amount, $decimals, $dec, $thousands);}

echo currency_format($amount);

Page 34: Lidando com Código Duplicado - PHP Conference Brasil 2013

OUTRO EXEMPLO function sum_posts_and_pages_comments($posts, $pages) { $total_comments = 0;

foreach ($posts as $post) { $total_comments += count($post->comments); }

foreach ($pages as $page) { $total_comments += count($page->comments); }

return $total_comments;}

Page 35: Lidando com Código Duplicado - PHP Conference Brasil 2013

OUTRO SEM REPETIR: function sum_comments($commentables) { $total_comments = 0;

foreach ($commentables as $commentable) { $total_comments += count($commentable->comments); }

return $total_comments;}

function sum_posts_and_pages_comments($posts, $pages) { $total_comments = sum_comments($posts); $total_comments += sum_comments($pages);

return $total_comments;}

Page 36: Lidando com Código Duplicado - PHP Conference Brasil 2013

CLASSES UTILITÁRIAS.HelpersExtraia as partes repetidas para um método

Page 37: Lidando com Código Duplicado - PHP Conference Brasil 2013

TÉCNICAS OO

Page 38: Lidando com Código Duplicado - PHP Conference Brasil 2013

EXTRACT METHOD;

Page 39: Lidando com Código Duplicado - PHP Conference Brasil 2013

EXTRACT METHOD;Métodos com trechos semelhantesExtraia para apenas um método e use nos outrosTambém pode ser usado para simplificar métodos grandes

Page 40: Lidando com Código Duplicado - PHP Conference Brasil 2013

EXTRACT METHOD public function someAction(){ if (! $this->getUser()->canAccess('SomeSection', 'Admin')) { $this->redirect('/notauthorized'); } if ($this->env->isDev()) { $this->enableProfiler(); } // ...}

public function anotherAction(){ if (! $this->getUser()->canAccess('SomeSection', 'Admin')) { $this->redirect('/notauthorized'); } if ($this->env->isDev()) { $this->enableProfiler(); } // ...}

Page 41: Lidando com Código Duplicado - PHP Conference Brasil 2013

EXTRACT METHOD private function checkPermissionAdmin($section){ if (! $this->getUser()->canAccess($section, 'Admin')) { $this->redirect('/notauthorized'); }}private function enableProfiler(){ if ($this->env->isDev()) { $this->enableProfiler(); }}public function someAction(){ $this->checkPermissionAdmin('SomeSection'); $this->enableProfiler(); // ...}

public function anotherAction(){ $this->checkPermissionAdmin('SomeSection'); $this->enableProfiler(); // ...}

Page 42: Lidando com Código Duplicado - PHP Conference Brasil 2013

EXTRACT CLASS;

Page 43: Lidando com Código Duplicado - PHP Conference Brasil 2013

EXTRACT CLASS;Métodos parecidos/iguais em mais de uma classeAs classes não precisam ser relacionadasExtraia para outra classe e use como um componente

Page 44: Lidando com Código Duplicado - PHP Conference Brasil 2013

EXTRACT CLASS // Repetido em vários controllersprivate function checkPermissionAdmin($section){ if (! $this->getUser()->canAccess($section, 'Admin')) { $this->redirect('/notauthorized'); }}// Repetido em vários controllersprivate function enableProfiler(){ if ($this->env->isDev()) { $this->enableProfiler(); }}

Page 45: Lidando com Código Duplicado - PHP Conference Brasil 2013

EXTRACT CLASS class Acl { public function checkPermission($section, $role) { $app = App::getInstance(); if (! $app->getUser()->canAccess($section, $role)) { $app->redirect('/notauthorized'); } }}

Page 46: Lidando com Código Duplicado - PHP Conference Brasil 2013

EXTRACT CLASS class Profiler { private function enableProfiler() { $app = App::getInstance(); if ($app->env->isDev()) { $app->enableProfiler(); } }}

Page 47: Lidando com Código Duplicado - PHP Conference Brasil 2013

EXTRACT CLASS public function __construct(){ $p = new Profiler(); $p->enableProfiler();}public function someAction(){ $acl = new Acl(); $acl->checkPermission('SomeSection', 'Admin'); // ...}

Page 48: Lidando com Código Duplicado - PHP Conference Brasil 2013

PULL UP FIELD;

Page 49: Lidando com Código Duplicado - PHP Conference Brasil 2013

PULL UP FIELD;Duas subclasses com o mesmo campoMova o campo para a super classe

Page 50: Lidando com Código Duplicado - PHP Conference Brasil 2013

FORM TEMPLATE METHOD;

Page 51: Lidando com Código Duplicado - PHP Conference Brasil 2013

FORM TEMPLATE METHOD;Métodos praticamente iguais em subclassesPoucas variaçõesNão é possível simplesmente mover o método para asuperclasseSepare as diferenças em métodos com a mesma assinaturaUse os novos métodos no método principal

Page 52: Lidando com Código Duplicado - PHP Conference Brasil 2013

FORM TEMPLATE METHOD;

Page 53: Lidando com Código Duplicado - PHP Conference Brasil 2013

DESIGN PATTERNS.Foco em reusoVale muito a pena entender os conceitosForm Template Method == Template Method

Page 54: Lidando com Código Duplicado - PHP Conference Brasil 2013

RESUMODuplicação é ruim

Causada por preguiça ou desconhecimentoFerramentas de detecção ajudam

Mas não adianta apenas saber que existe duplicaçãoTécnicas podem ser usadasDesign Patterns importam

Page 55: Lidando com Código Duplicado - PHP Conference Brasil 2013

REFERÊNCIAShttp://phpqatools.org/http://es.wikipedia.org/wiki/C%C3%B3digo_duplicadohttp://en.wikipedia.org/wiki/Duplicate_codehttp://en.wikipedia.org/wiki/Don%27t_repeat_yourselfhttp://en.wikipedia.org/wiki/List_of_tools_for_static_code_analysishttp://en.wikipedia.org/wiki/Template_method_patternhttp://en.wikipedia.org/wiki/Rabin%E2%80%93Karp_algorithmhttps://github.com/sebastianbergmann/phpcpdhttp://sourcemaking.com/refactoring/bad-smells-in-codehttp://sourcemaking.com/refactoring/duplicated-codehttp://sourcemaking.com/refactoring/extract-methodhttp://sourcemaking.com/refactoring/pull-up-fieldhttp://sourcemaking.com/refactoring/form-template-methodhttp://sourcemaking.com/refactoring/extract-class

Page 56: Lidando com Código Duplicado - PHP Conference Brasil 2013

PERGUNTAS?

Page 57: Lidando com Código Duplicado - PHP Conference Brasil 2013

OBRIGADO!CONTATOS

Site: evaldojunior.com.brE-mail: [email protected]/evaldojuniortwitter.com/InFog9