Refactoring like a boss

Preview:

DESCRIPTION

Sabe aquele arquivo com 5000000 linhas e que você tem que acender umas velas pra abrir ele? Então, aqui te daremos as armas corretas para exterminá-lo e para NUNCA MAIS criar monstros como ele! A equipe Meritt irá mostrar como trazer para o cotidiano as práticas de clean code e o desafio de implementação em um projeto que já está no ar.

Citation preview

like a BOSS!Refactoring

Luís Otávio Cobucci Oblonczyk - @lcobucci

Luís Otávio Cobucci Oblonczyk@lcobucci

http://about.me/lcobucci

Evangelista PHPDesenvolvedor desde 2003

Programar é fácil!

Qual o problema docódigo ruim?

““Como o código ruim destruiuComo o código ruim destruiuuma empresa”uma empresa”

2 anos de desenvolvimento

2 anos de desenvolvimento

+500.000 linhas de código

2 anos de desenvolvimento

Nenhuma preocupaçãoNenhuma preocupação

+500.000 linhas de código

com boas práticascom boas práticas

2 meses 4 meses 6 meses 1 ano 1 ano e 6 meses 2 anos0

20

40

60

80

100

120

Produtividade

Vamos colocar pressão Vamos colocar pressão no time!no time!

Precisamos de mais devs!Precisamos de mais devs!

2 meses4 meses

6 meses1 ano

1 ano e 6 meses2 anos

2 anos e 3 meses2 anos e 6 meses

0

20

40

60

80

100

120

Produtividade

2 meses4 meses

6 meses1 ano

1 ano e 6 meses2 anos

2 anos e 3 meses2 anos e 6 meses

0

20

40

60

80

100

120

Produtividade

Produtividade esperada

2 meses4 meses

6 meses1 ano

1 ano e 6 meses2 anos

2 anos e 3 meses2 anos e 6 meses

0

20

40

60

80

100

120

140

Produtividade

Produtividade esperada

Gastos

refazer tudorefazer tudo!!Temos queTemos que

Os melhores devsOs melhores devsforam selecionadosforam selecionados

Os outros trabalharãoOs outros trabalharãono sistema atualno sistema atual

Solução é refatorarSolução é refatorar

O que é refatorar?

Refatoração é basicamente o processo de alterar a estrutura dos elementos

do software sem mudar seus comportamentos

Para podermos refatorar um código é fundamental a

existência de testes automatizados

Técnicas de refatoração

Nomes sem Nomes sem sentidosentido

function divide($x, $y){ return $x / $y;}

RenameRename

function divide($dividend, $divisor){ return $dividend / $divisor;}

RenameRename

Chamadas ou Chamadas ou expressões duplicadasexpressões duplicadas

function sendEmail($name, $email, $message){ getSender()->prepare($name, $email);

return getSender()->send($message);}

Extract variableExtract variable

function sendEmail($name, $email, $message){ $sender = getSender(); $sender->prepare($name, $email);

return $sender->send($message);}

Extract variableExtract variable

Classes violandoClasses violandoo SRPo SRP

class Pessoa{ private $nome; private $logradouro; private $numero; private $complemento; private $bairro; private $cidade;}

Extract classExtract class

class Pessoa{ private $nome; private $endereco;}

Extract classExtract classclass Endereco{ private $logradouro; private $numero; private $complemento; private $bairro; private $cidade;}

Métodos violandoMétodos violandoo SRPo SRP

class LogParser{ const PATTERN = '([0-9]{4}-[0-9]{2}-[0-9]{2})'; public function getDayOfWeek($logLine) { preg_match(self::PATTERN, $logLine, $matches); $date = new DateTime($matches[0]);

return $date->format('l'); }}

Extract MethodExtract Method

class LogParser{ const PATTERN = '([0-9]{4}-[0-9]{2}-[0-9]{2})'; public function getDayOfWeek($logLine) { return $this->getDate($logLine)->format('l'); } protected function getDate($logLine) { preg_match(self::PATTERN, $logLine, $matches); return new DateTime($matches[0]); }}

Extract MethodExtract Method

Herança confusaHerança confusa

class Pessoa{ private $nome; private $linguagensProgramacao;}

Pull up / push downPull up / push down

class Programador extends Pessoa{}

class Pessoa{ private $nome;}

Pull up / push downPull up / push down

class Programador extends Pessoa{ private $linguagensProgramacao;}

Programar é fácil!direito não é tão fácil!

Object oriented programming

Design Patterns

Object oriented programming

Design Patterns

Object oriented programming

Clean code

S.O.L.I.D. Principles

Design Patterns

Object oriented programming

Clean code

S.O.L.I.D. Principles

Design Patterns

Object oriented programming

Clean code

Software metrics

S.O.L.I.D. Principles

Design Patterns

Domain driven design

Object oriented programming

Clean code

Software metrics

S.O.L.I.D. Principles

Design Patterns

Domain driven design

Object oriented programming

Clean code

Software metrics

Precisamos treinar,Precisamos treinar,treinar e treinar...treinar e treinar...

Considerando refatoraçãoConsiderando refatoraçãocomo como obrigaçãoobrigação

Lembrando que assinamosLembrando que assinamostudotudo o que fazemos o que fazemos

Luís Otávio Cobucci Oblonczyk

@lcobucci

http://about.me/lcobucci

Obrigado!

http://slideshare.net/lcobucci