SlideShare uma empresa Scribd logo
Object Calisthenics:
9 regras para melhorar seu código
Olá!
Me chamo Jéssica
Programadora na RD, host do PodProgramar e mentora
Meus contatinhos em: jessicazanelato.dev
2
Object?
= Programação Orientada a Objetos
3
Calisthenics?
= origem na palavra grega 'exercício'
4
Origem
Jeff Bay em 2009
5
Por que é
importante?
Porque continuamos a escrever código difícil
de entender, testar e manter
6
Conceitos por trás do bom design de
código:
● Coesão
● Baixo acoplamento
● Sem redudância
● Encapsulamento
● Testabilidade
● Legibilidade
● Foco
7
Apenas um nível de
indentação por método
1
Problemas:
● Baixa coesão
● Menor legibilidade
● Dificuldade em dar manutenção
● Dificuldade em testar
9
class Customer {
public function getPromoCode(string $promoName) {
// 1
if ($this->promoCode) {
// 2
if (false === $this->promoCodeExpired()) {
// 3
if ($this->promoName == $promoName) {
return $this->promoCode;
} else {
throw new Exception('Promoção não existe mais');
}
} else {
throw new Exception('Promoção Expirada');
}
} else {
throw new Exception('Cliente sem código de promoção');
}
}
}
10
class Customer {
public function getPromoCode(string $promoName){
if ($this->promoCode) {
return $this->getValidPromoCode($promoName);
} else {
throw new Exception('Cliente sem código de promoção');
}
}
protected function getValidPromoCode(string $promoName) {
if (false === $this->promoCodeExpired()) {
return $this->getPromoExists($promoName);
} else {
throw new Exception('Promoção Expirada');
}
}
protected function getPromoExists(string $promoName) {
if ($this->promoName == $promoName) {
return $this->promoCode;
} else {
throw new Exception('Promoção não existe mais');
}
}
}
11
Não use Else
2
Problemas:
● Redundância
● Dificuldade em dar manutenção
13
protected function indexAction()
{
if ($this->security->isGranted('ADMIN')) {
$view = 'admin/index.html.twig';
} else {
$view = 'home/access_denied.html.twig';
}
return $this->render($view);
}
14
protected function indexAction()
{
// early return + defensive approach (pessimista)
if ($this->security->isGranted('ADMIN')) {
return $this->render('admin/index.html.twig');
}
return $this->render('home/access_denied.html.twig');
}
15
protected function indexAction()
{
// variável com valor padrão
$view = 'admin/index.html.twig';
// defensive approach (otimista)
if (false == $this->security->isGranted('ADMIN')) {
$view = 'home/access_denied.html.twig';
}
return $this->render($view);
}
16
foreach ($orders as $order) {
// early return + defensive approach (pessimista)
if ($order->paid()) {
$report[] = [$order->status => 'Paid'];
continue;
}
$report[] = [$order->status => 'Not Paid'];
}
17
Outras técnicas:
● Polimorfismo
● Null Object Pattern
● Strategy Pattern
● State Pattern
18
Encapsule os tipos
primitivos
3
Problemas:
● Menor legibilidade
● Difícil de testar
20
class Pedido
{
public function notificarComprador(String $email)
{
if (false == filter_var($email, FILTER_VALIDATE_EMAIL)) {
throw new InvalidEmailException;
}
return $this->repository->sendEmail($email);
}
}
21
class Email
{
public $email;
public function __construct(String $email)
{
if (filter_var($email, FILTER_VALIDATE_EMAIL) === false) {
throw new InvalidEmailException;
}
return $this->email = $email;
}
}
class Pedido
{
public function notificarComprador(Email $email)
{
return $this->repository->sendEmail(new Email($email));
}
}
22
Envolva suas coleções
em classes
4
Problemas:
● Baixa coesão
● Não cumprir o Princípio da Responsabilidade Única
24
“
Crie uma classe dedicada para a
sua coleção (collection).
25
Use apenas um ponto por
linha
5
Problemas:
● Seu objeto sabe demais
● Está violando o encapsulamento
27
“ Considere mover o
comportamento para um dos
outros objetos.
28
“ Somente fale com seus amigos
próximos, não fale com estranhos.
Lei de Deméter
29
// bad
$a->getB()->getC()->getD()->doIt();
// good
$a->doIt($b->doIt());
// exception
$builder->property1("value")->build();
30
Não abrevie
6
32
Dicas:
● Nome de classe, método ou variável com no máximo duas
palavras
● Evite repetir palavras:
33
// bad
$perfil->criarPerfil();
// good
$perfil->criar();
Mantenha todas as
entidades pequenas
7
35
50 linhas
por classe
10 arquivos
por pacote
Não tenha mais que duas
variáveis de instância por
classe
8
Problema:
● Baixa coesão
37
38
Player
Name
PlayerId
FirstName
LastName
String
String
Integer
Não use
Getters ou Setters
9
Problemas:
● Redundância
● Menor legibilidade
40
“ Enriqueça seu objeto com lógica e
métodos mais valiosos e
significativos.
41
class Game
{
private $score;
public function setScore($score) {
$this->score = $score;
}
public function getScore() {
return $score;
}
}
// Using
$game->setScore($game->getScore() + ENEMY_DESTROYED_SCORE);
42
class Game
{
public function addScore($delta) {
$this->score += $delta;
}
}
// Using
$game->addScore(ENEMY_DESTROYED_SCORE);
43
44
Quer treinar estes conceitos?
45
Obrigada!
Perguntas?
jessicazanelato.dev

Mais conteúdo relacionado

Semelhante a [TDC 2019] - Object Calisthenics: 9 regras para melhorar seu código

Relato Sobre a Migração de uma Aplicação Legada para Rails
Relato Sobre a Migração de uma Aplicação Legada para RailsRelato Sobre a Migração de uma Aplicação Legada para Rails
Relato Sobre a Migração de uma Aplicação Legada para Rails
Cássio Marques
 
DevTalk Zoox 04/2016
DevTalk Zoox 04/2016DevTalk Zoox 04/2016
DevTalk Zoox 04/2016
Leandro Silva
 
PHP robusto com Zend Framework
PHP robusto com Zend FrameworkPHP robusto com Zend Framework
PHP robusto com Zend Framework
Jaime Neto
 
Php03
Php03Php03
5 Maneiras de melhorar seu código PHP
5 Maneiras de melhorar seu código PHP5 Maneiras de melhorar seu código PHP
5 Maneiras de melhorar seu código PHP
Augusto das Neves
 
Design Patterns com PHP
Design Patterns com PHPDesign Patterns com PHP
Design Patterns com PHP
Pablo Dall'Oglio
 
Melhores apps rails
Melhores apps railsMelhores apps rails
Melhores apps rails
vinibaggio
 
Php04
Php04Php04
Poo
PooPoo
Removendo o cheiro ruim do seu código - SoLiSC 2011
Removendo o cheiro ruim do seu código - SoLiSC 2011Removendo o cheiro ruim do seu código - SoLiSC 2011
Removendo o cheiro ruim do seu código - SoLiSC 2011
Luís Cobucci
 
Ganhando tempo com casos de testes
Ganhando tempo com casos de testesGanhando tempo com casos de testes
Ganhando tempo com casos de testes
Michael Castillo Granados
 
Ecommerce, mais simples do que parece
Ecommerce, mais simples do que pareceEcommerce, mais simples do que parece
Ecommerce, mais simples do que parece
Michael Castillo Granados
 
Ecommerce, mais simples do que parece
Ecommerce, mais simples do que pareceEcommerce, mais simples do que parece
Ecommerce, mais simples do que parece
Impacta Eventos
 
Object Calisthenics: relaxe e escreva códigos simples
Object Calisthenics: relaxe e escreva códigos simplesObject Calisthenics: relaxe e escreva códigos simples
Object Calisthenics: relaxe e escreva códigos simples
Otávio Calaça Xavier
 
Palestra de PDO
Palestra de PDOPalestra de PDO
Palestra de PDO
Almir Mendes
 
Preparando-se para a prova da Certificação Zend PHP 5.3
Preparando-se para a prova da Certificação Zend PHP 5.3Preparando-se para a prova da Certificação Zend PHP 5.3
Preparando-se para a prova da Certificação Zend PHP 5.3
klaussilveira
 
Bread board
Bread boardBread board
Bread board
André Walker
 
Interfaces ricas com Rails e React.JS @ Rubyconf 2015
Interfaces ricas com Rails e React.JS @ Rubyconf 2015Interfaces ricas com Rails e React.JS @ Rubyconf 2015
Interfaces ricas com Rails e React.JS @ Rubyconf 2015
Rodrigo Urubatan
 
ReactPHP && programacao assincrona em PHP
ReactPHP && programacao assincrona em PHPReactPHP && programacao assincrona em PHP
ReactPHP && programacao assincrona em PHP
Luis Gustavo Almeida
 

Semelhante a [TDC 2019] - Object Calisthenics: 9 regras para melhorar seu código (19)

Relato Sobre a Migração de uma Aplicação Legada para Rails
Relato Sobre a Migração de uma Aplicação Legada para RailsRelato Sobre a Migração de uma Aplicação Legada para Rails
Relato Sobre a Migração de uma Aplicação Legada para Rails
 
DevTalk Zoox 04/2016
DevTalk Zoox 04/2016DevTalk Zoox 04/2016
DevTalk Zoox 04/2016
 
PHP robusto com Zend Framework
PHP robusto com Zend FrameworkPHP robusto com Zend Framework
PHP robusto com Zend Framework
 
Php03
Php03Php03
Php03
 
5 Maneiras de melhorar seu código PHP
5 Maneiras de melhorar seu código PHP5 Maneiras de melhorar seu código PHP
5 Maneiras de melhorar seu código PHP
 
Design Patterns com PHP
Design Patterns com PHPDesign Patterns com PHP
Design Patterns com PHP
 
Melhores apps rails
Melhores apps railsMelhores apps rails
Melhores apps rails
 
Php04
Php04Php04
Php04
 
Poo
PooPoo
Poo
 
Removendo o cheiro ruim do seu código - SoLiSC 2011
Removendo o cheiro ruim do seu código - SoLiSC 2011Removendo o cheiro ruim do seu código - SoLiSC 2011
Removendo o cheiro ruim do seu código - SoLiSC 2011
 
Ganhando tempo com casos de testes
Ganhando tempo com casos de testesGanhando tempo com casos de testes
Ganhando tempo com casos de testes
 
Ecommerce, mais simples do que parece
Ecommerce, mais simples do que pareceEcommerce, mais simples do que parece
Ecommerce, mais simples do que parece
 
Ecommerce, mais simples do que parece
Ecommerce, mais simples do que pareceEcommerce, mais simples do que parece
Ecommerce, mais simples do que parece
 
Object Calisthenics: relaxe e escreva códigos simples
Object Calisthenics: relaxe e escreva códigos simplesObject Calisthenics: relaxe e escreva códigos simples
Object Calisthenics: relaxe e escreva códigos simples
 
Palestra de PDO
Palestra de PDOPalestra de PDO
Palestra de PDO
 
Preparando-se para a prova da Certificação Zend PHP 5.3
Preparando-se para a prova da Certificação Zend PHP 5.3Preparando-se para a prova da Certificação Zend PHP 5.3
Preparando-se para a prova da Certificação Zend PHP 5.3
 
Bread board
Bread boardBread board
Bread board
 
Interfaces ricas com Rails e React.JS @ Rubyconf 2015
Interfaces ricas com Rails e React.JS @ Rubyconf 2015Interfaces ricas com Rails e React.JS @ Rubyconf 2015
Interfaces ricas com Rails e React.JS @ Rubyconf 2015
 
ReactPHP && programacao assincrona em PHP
ReactPHP && programacao assincrona em PHPReactPHP && programacao assincrona em PHP
ReactPHP && programacao assincrona em PHP
 

Último

Manual-de-Credenciamento ANATER 2023.pdf
Manual-de-Credenciamento ANATER 2023.pdfManual-de-Credenciamento ANATER 2023.pdf
Manual-de-Credenciamento ANATER 2023.pdf
WELITONNOGUEIRA3
 
Certificado Jornada Python Da Hashtag.pdf
Certificado Jornada Python Da Hashtag.pdfCertificado Jornada Python Da Hashtag.pdf
Certificado Jornada Python Da Hashtag.pdf
joaovmp3
 
História da Rádio- 1936-1970 século XIX .2.pptx
História da Rádio- 1936-1970 século XIX   .2.pptxHistória da Rádio- 1936-1970 século XIX   .2.pptx
História da Rádio- 1936-1970 século XIX .2.pptx
TomasSousa7
 
PRODUÇÃO E CONSUMO DE ENERGIA DA PRÉ-HISTÓRIA À ERA CONTEMPORÂNEA E SUA EVOLU...
PRODUÇÃO E CONSUMO DE ENERGIA DA PRÉ-HISTÓRIA À ERA CONTEMPORÂNEA E SUA EVOLU...PRODUÇÃO E CONSUMO DE ENERGIA DA PRÉ-HISTÓRIA À ERA CONTEMPORÂNEA E SUA EVOLU...
PRODUÇÃO E CONSUMO DE ENERGIA DA PRÉ-HISTÓRIA À ERA CONTEMPORÂNEA E SUA EVOLU...
Faga1939
 
Escola Virtual - Fundação Bradesco - ITIL - Gabriel Faustino.pdf
Escola Virtual - Fundação Bradesco - ITIL - Gabriel Faustino.pdfEscola Virtual - Fundação Bradesco - ITIL - Gabriel Faustino.pdf
Escola Virtual - Fundação Bradesco - ITIL - Gabriel Faustino.pdf
Gabriel de Mattos Faustino
 
Segurança Digital Pessoal e Boas Práticas
Segurança Digital Pessoal e Boas PráticasSegurança Digital Pessoal e Boas Práticas
Segurança Digital Pessoal e Boas Práticas
Danilo Pinotti
 
Logica de Progamacao - Aula (1) (1).pptx
Logica de Progamacao - Aula (1) (1).pptxLogica de Progamacao - Aula (1) (1).pptx
Logica de Progamacao - Aula (1) (1).pptx
Momento da Informática
 
TOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdf
TOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdfTOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdf
TOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdf
Momento da Informática
 

Último (8)

Manual-de-Credenciamento ANATER 2023.pdf
Manual-de-Credenciamento ANATER 2023.pdfManual-de-Credenciamento ANATER 2023.pdf
Manual-de-Credenciamento ANATER 2023.pdf
 
Certificado Jornada Python Da Hashtag.pdf
Certificado Jornada Python Da Hashtag.pdfCertificado Jornada Python Da Hashtag.pdf
Certificado Jornada Python Da Hashtag.pdf
 
História da Rádio- 1936-1970 século XIX .2.pptx
História da Rádio- 1936-1970 século XIX   .2.pptxHistória da Rádio- 1936-1970 século XIX   .2.pptx
História da Rádio- 1936-1970 século XIX .2.pptx
 
PRODUÇÃO E CONSUMO DE ENERGIA DA PRÉ-HISTÓRIA À ERA CONTEMPORÂNEA E SUA EVOLU...
PRODUÇÃO E CONSUMO DE ENERGIA DA PRÉ-HISTÓRIA À ERA CONTEMPORÂNEA E SUA EVOLU...PRODUÇÃO E CONSUMO DE ENERGIA DA PRÉ-HISTÓRIA À ERA CONTEMPORÂNEA E SUA EVOLU...
PRODUÇÃO E CONSUMO DE ENERGIA DA PRÉ-HISTÓRIA À ERA CONTEMPORÂNEA E SUA EVOLU...
 
Escola Virtual - Fundação Bradesco - ITIL - Gabriel Faustino.pdf
Escola Virtual - Fundação Bradesco - ITIL - Gabriel Faustino.pdfEscola Virtual - Fundação Bradesco - ITIL - Gabriel Faustino.pdf
Escola Virtual - Fundação Bradesco - ITIL - Gabriel Faustino.pdf
 
Segurança Digital Pessoal e Boas Práticas
Segurança Digital Pessoal e Boas PráticasSegurança Digital Pessoal e Boas Práticas
Segurança Digital Pessoal e Boas Práticas
 
Logica de Progamacao - Aula (1) (1).pptx
Logica de Progamacao - Aula (1) (1).pptxLogica de Progamacao - Aula (1) (1).pptx
Logica de Progamacao - Aula (1) (1).pptx
 
TOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdf
TOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdfTOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdf
TOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdf
 

[TDC 2019] - Object Calisthenics: 9 regras para melhorar seu código