SlideShare uma empresa Scribd logo
1 de 45
Baixar para ler offline
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

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
 

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

Último (8)

COI CENTRO DE OPERAÇÕES INDUSTRIAIS NAS USINAS
COI CENTRO DE OPERAÇÕES INDUSTRIAIS NAS USINASCOI CENTRO DE OPERAÇÕES INDUSTRIAIS NAS USINAS
COI CENTRO DE OPERAÇÕES INDUSTRIAIS NAS USINAS
 
ATIVIDADE 1 - GESTÃO DE PESSOAS E DESENVOLVIMENTO DE EQUIPES - 52_2024.docx
ATIVIDADE 1 - GESTÃO DE PESSOAS E DESENVOLVIMENTO DE EQUIPES - 52_2024.docxATIVIDADE 1 - GESTÃO DE PESSOAS E DESENVOLVIMENTO DE EQUIPES - 52_2024.docx
ATIVIDADE 1 - GESTÃO DE PESSOAS E DESENVOLVIMENTO DE EQUIPES - 52_2024.docx
 
EAD Curso - CIÊNCIA DE DADOS NA INDÚSTTRIA
EAD Curso - CIÊNCIA DE DADOS NA INDÚSTTRIAEAD Curso - CIÊNCIA DE DADOS NA INDÚSTTRIA
EAD Curso - CIÊNCIA DE DADOS NA INDÚSTTRIA
 
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docxATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
 
[ServiceNow] Upgrade de versão - 2ª edição (Revisada, atualizada e ampliada)
[ServiceNow] Upgrade de versão - 2ª edição (Revisada, atualizada e ampliada)[ServiceNow] Upgrade de versão - 2ª edição (Revisada, atualizada e ampliada)
[ServiceNow] Upgrade de versão - 2ª edição (Revisada, atualizada e ampliada)
 
ATIVIDADE 1 - CÁLCULO DIFERENCIAL E INTEGRAL II - 52_2024.docx
ATIVIDADE 1 - CÁLCULO DIFERENCIAL E INTEGRAL II - 52_2024.docxATIVIDADE 1 - CÁLCULO DIFERENCIAL E INTEGRAL II - 52_2024.docx
ATIVIDADE 1 - CÁLCULO DIFERENCIAL E INTEGRAL II - 52_2024.docx
 
Entrevistas, artigos, livros & citações de Paulo Pagliusi
Entrevistas, artigos, livros & citações de Paulo PagliusiEntrevistas, artigos, livros & citações de Paulo Pagliusi
Entrevistas, artigos, livros & citações de Paulo Pagliusi
 
Palestras sobre Cibersegurança em Eventos - Paulo Pagliusi
Palestras sobre Cibersegurança em Eventos - Paulo PagliusiPalestras sobre Cibersegurança em Eventos - Paulo Pagliusi
Palestras sobre Cibersegurança em Eventos - Paulo Pagliusi
 

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