SlideShare una empresa de Scribd logo
1 de 55
Descargar para leer sin conexión
Object Calisthenics:
relaxe e escreva
códigos simples
Goiânia, 23 de Março de 2013
Otávio Calaça Xavier
otaviocx@gmail.com
 Criado em dezembro de 2007;
 Lista de Discussão:
− Mais de 650 membros.
 Projetos:
− Encontros mensais;
− Softwares Livres em PHP;
− Networking.
 Eventos:
• FLISOL, FGSL, Latinoware, Conisli, CONSOFT, PHP
Conference Brasil, FISL, Join Community …
 Precisamos de Colaboradores!!!
Grupo de Desenvolvedores
PHP de Goiás
www.gophp.org.br
3
Object Calisthenics: relaxe e escreva códigos simples
Roteiro
• Motivação;
• Orientações;
• Aplicação.
4
Object Calisthenics: relaxe e escreva códigos simples
Por que meu código é ruim?
• Ele é legível?
• Ele é testável?
• Ele é de fácil manutenção?
• Ele é reusável?
5
Object Calisthenics: relaxe e escreva códigos simples
Object Calisthenics
• Calistenia = exercício de relaxamento;
ginástica rítimica;
• Uma variedade de exercícios simples e
rítimicos para alcançar melhor qualidade
de código e OO.
6
Object Calisthenics: relaxe e escreva códigos simples
Object Calisthenics
• Jeff Bay em The
ThoughtWorks Anthology
definiu o termo Object
Calisthenics para a
computação, como o
conjunto de exercícios
para a programação
Orientada a Objetos.
7
Object Calisthenics: relaxe e escreva códigos simples
Object Calisthenics
• Orientações:
– Nove (9) orientações simples e que
podem ser utilizadas em qualquer
linguagem orientada a objetos.
8
Object Calisthenics: relaxe e escreva códigos simples
ORIENTAÇÃO I
somente um nível de
identação/recuo por método.
9
Object Calisthenics: relaxe e escreva códigos simples
ORIENTAÇÃO I
somente um nível de identação/recuo por método
public function validarProdutos($produtos) {
$camposRequeridos = array(
'nome',
'preco',
'descricao',
'tipo'
);
$valido = true;
foreach($produtos as $produto) {
$campos = array_keys($produto);
foreach ($camposRequeridos as $campoRequerido) {
if(!in_array($campoRequerido, $campos)) {
$valido = false;
}
}
}
return $valido;
}
10
Object Calisthenics: relaxe e escreva códigos simples
ORIENTAÇÃO I
somente um nível de identação/recuo por método
public function validarProdutos($produtos) {
$camposRequeridos = array(
'nome',
'preco',
'descricao',
'tipo'
);
$valido = true;
foreach($produtos as $produto) {
$campos = array_keys($produto);
foreach ($camposRequeridos as $campoRequerido) {
if(!in_array($campoRequerido, $campos)) {
$valido = false;
}
}
}
return $valido;
}
11
Object Calisthenics: relaxe e escreva códigos simples
ORIENTAÇÃO I
somente um nível de identação/recuo por método
public function validarProdutos($produtos) {
$camposRequeridos = array(
'nome',
'preco',
'descricao',
'tipo'
);
$valido = true;
foreach($produtos as $produto) {
$campos = array_keys($produto);
foreach ($camposRequeridos as $campoRequerido) {
if(!in_array($campoRequerido, $campos)) {
$valido = false;
}
}
}
return $valido;
}
0
1
2
3
12
Object Calisthenics: relaxe e escreva códigos simples
ORIENTAÇÃO I
somente um nível de identação/recuo por método
public function validarProdutos($produtos) {
$camposRequeridos = array(
'nome',
'preco',
'descricao',
'tipo'
);
$valido = true;
foreach($produtos as $produto) {
$validacao = $this->validarProdutoIndividual($produto, $camposRequeridos);
if( ! $validacao) { $valido = false; }
}
return $valido;
}
public function validarProdutoIndividual($produto, $camposRequeridos) {
$valido = true;
$campos = array_keys($produto);
foreach ($camposRequeridos as $campoRequerido) {
if( ! in_array($campoRequerido, $campos)) {
$valido = false;
}
}
}
13
Object Calisthenics: relaxe e escreva códigos simples
ORIENTAÇÃO I
somente um nível de identação/recuo por método
public function validarProdutos($produtos) {
$camposRequeridos = array(
'nome',
'preco',
'descricao',
'tipo'
);
$valido = true;
foreach($produtos as $produto) {
$validacao = $this->validarProdutoIndividual($produto, $camposRequeridos);
if( ! $validacao) { $valido = false; }
}
return $valido;
}
public function validarProdutoIndividual($produto, $camposRequeridos) {
$valido = true;
$campos = array_keys($produto);
foreach ($camposRequeridos as $campoRequerido) {
if( ! in_array($campoRequerido, $campos)) {
$valido = false;
}
}
}
14
Object Calisthenics: relaxe e escreva códigos simples
ORIENTAÇÃO I
somente um nível de identação/recuo por método
public function validarProdutos($produtos) {
$camposRequeridos = array(
'nome',
'preco',
'descricao',
'tipo'
);
$valido = true;
foreach($produtos as $produto) {
$validacao = $this->validarProdutoIndividual($produto, $camposRequeridos);
if( ! $validacao) { $valido = false; }
}
return $valido;
}
public function validarProdutoIndividual($produto, $camposRequeridos) {
$valido = true;
$campos = array_keys($produto);
foreach ($camposRequeridos as $campoRequerido) {
if( ! in_array($campoRequerido, $campos)) {
$valido = false;
}
}
}
0
1
2
0
1
2
15
Object Calisthenics: relaxe e escreva códigos simples
ORIENTAÇÃO I
somente um nível de identação/recuo por método
public function validarProdutos($produtos) {
$camposRequeridos = array(
'nome',
'preco',
'descricao',
'tipo'
);
foreach($produtos as $produto) {
if( ! $this->validarProdutoIndividual($produto, $camposRequeridos)) {
return false;
}
}
return true;
}
public function validarProdutoIndividual($produto, $camposRequeridos) {
$campos = array_keys($produto);
$camposEsquecidos = array_diff($camposRequeridos, $campos);
return (count($camposEsquecidos) == 0);
}
16
Object Calisthenics: relaxe e escreva códigos simples
ORIENTAÇÃO I
somente um nível de identação/recuo por método
public function validarProdutos($produtos) {
$camposRequeridos = array(
'nome',
'preco',
'descricao',
'tipo'
);
foreach($produtos as $produto) {
if( ! $this->validarProdutoIndividual($produto, $camposRequeridos)) {
return false;
}
}
return true;
}
public function validarProdutoIndividual($produto, $camposRequeridos) {
$campos = array_keys($produto);
$camposEsquecidos = array_diff($camposRequeridos, $campos);
return (count($camposEsquecidos) == 0);
}
0
1
2
17
Object Calisthenics: relaxe e escreva códigos simples
ORIENTAÇÃO I
somente um nível de identação/recuo por método
public function validarProdutos($produtos) {
$produtosInvalidos = array_filter($produtos, 'verificaProdutoInvalido');
return (count($produtosInvalidos) === 0);
}
public function verificaProdutoInvalido($produto) {
$camposRequeridos = array(
'nome',
'preco',
'descricao',
'tipo'
);
$campos = array_keys($produto);
$camposEsquecidos = array_diff($camposRequeridos, $campos);
return (count($camposEsquecidos) > 0);
}
18
Object Calisthenics: relaxe e escreva códigos simples
ORIENTAÇÃO I
somente um nível de identação/recuo por método
class Board {
...
String board() {
StringBuffer buf = new StringBuffer();
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
buf.append(data[i][j]);
}
buf.append(“n”);
}
return buf.toString();
}
}
19
Object Calisthenics: relaxe e escreva códigos simples
ORIENTAÇÃO I
somente um nível de identação/recuo por método
class Board {
...
String board() {
StringBuffer buf = new StringBuffer();
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
buf.append(data[i][j]);
}
buf.append(“n”);
}
return buf.toString();
}
}
0
1
2
20
Object Calisthenics: relaxe e escreva códigos simples
ORIENTAÇÃO I
somente um nível de identação/recuo por método
class Board {
...
String board() {
StringBuffer buf = new StringBuffer();
collectRows(buf);
return buf.toString();
}
void collectRows(StringBuffer buf) {
for (int i = 0; i < 10; i++) {
collectRow(buf, i);
}
}
void collectRow(StringBuffer buf, int row) {
for (int i = 0; i < 10; i++) {
Buf.append(data[row][i]);
}
buf.append(“n”);
}
}
21
Object Calisthenics: relaxe e escreva códigos simples
ORIENTAÇÃO I
somente um nível de identação/recuo por método
• Benefícios:
– Maior coesão;
– Reduz a complexidade ciclomática;
– Métodos acabam fazendo apenas uma coisa, como deve
ser;
– Aumenta a reusabilidade.
22
Object Calisthenics: relaxe e escreva códigos simples
ORIENTAÇÃO II
não utilize a palavra-chave else.
23
Object Calisthenics: relaxe e escreva códigos simples
ORIENTAÇÃO II
não utilize a palavra-chave else
public function login() {
$usuario = $this->input()->post('usuario');
$senha = $this->input()->post('senha');
$referencia = $this->input()->post('referencia');
if($this->usuariosModel->verificaPermissao($usuario, $senha)) {
redirect($referencia);
} else {
$this->session->setFlashData('erro', 'Usuário ou senha inválidos.');
$this->session->setFlashData('referencia', $referencia);
redirect('login');
}
}
24
Object Calisthenics: relaxe e escreva códigos simples
ORIENTAÇÃO II
não utilize a palavra-chave else
public function login() {
$usuario = $this->input()->post('usuario');
$senha = $this->input()->post('senha');
$referencia = $this->input()->post('referencia');
if($this->usuariosModel->verificaPermissao($usuario, $senha)) {
redirect($referencia);
} else {
$this->session->setFlashData('erro', 'Usuário ou senha inválidos.');
$this->session->setFlashData('referencia', $referencia);
redirect('login');
}
}
25
Object Calisthenics: relaxe e escreva códigos simples
ORIENTAÇÃO II
não utilize a palavra-chave else
public function login() {
$usuario = $this->input()->post('usuario');
$senha = $this->input()->post('senha');
$referencia = $this->input()->post('referencia');
if( ! $this->usuariosModel->verificaPermissao($usuario, $senha)) {
$this->session->setFlashData('erro', 'Usuário ou senha inválidos.');
$this->session->setFlashData('referencia', $referencia);
$referencia = 'login';
}
redirect($referencia);
}
26
Object Calisthenics: relaxe e escreva códigos simples
ORIENTAÇÃO II
não utilize a palavra-chave else
• Benefícios:
– Ajuda a prevenir duplicação de código;
– Reduz a complexidade ciclomática;
– Faz o código ficar mais limpo, passando por um único
caminho.
27
Object Calisthenics: relaxe e escreva códigos simples
ORIENTAÇÃO III
encapsule todos os tipos
primitivos e strings.
28
Object Calisthenics: relaxe e escreva códigos simples
ORIENTAÇÃO III
encapsule todos os tipos primitivos e strings
class Aluno {
private int matricula;
private boolean ativo;
private long cpf;
//...
}
29
Object Calisthenics: relaxe e escreva códigos simples
ORIENTAÇÃO III
encapsule todos os tipos primitivos e strings
class Aluno {
private Integer matricula;
private Boolean ativo;
private Long cpf;
//...
}
30
Object Calisthenics: relaxe e escreva códigos simples
ORIENTAÇÃO III
(ajuste)
encapsule todos os tipos
primitivos e strings, se eles
possuírem comportamento.
31
Object Calisthenics: relaxe e escreva códigos simples
ORIENTAÇÃO III
encapsule os tipos primitivos e strings, se eles possuírem
comportamento
class UIComponent {
//...
public function repaint($animate = true) {
//...
}
}
//...
$component->repaint(false);
32
Object Calisthenics: relaxe e escreva códigos simples
ORIENTAÇÃO III
encapsule os tipos primitivos e strings, se eles possuírem
comportamento
class UIComponent {
//...
public function repaint(Animate $animate) {
//...
}
}
class Animate {
private $animate;
public function __construct($animate = true) {
$this->animate = true;
}
}
//...
$component->repaint( new Animate(false) );
33
Object Calisthenics: relaxe e escreva códigos simples
ORIENTAÇÃO III
encapsule os tipos primitivos e strings, se eles possuírem
comportamento
• Benefícios:
– Indução de Tipo;
– Encapsulamento de operações.
34
Object Calisthenics: relaxe e escreva códigos simples
ORIENTAÇÃO IV
somente um ponto (“arrow” para
o PHP) por linha.
35
Object Calisthenics: relaxe e escreva códigos simples
ORIENTAÇÃO IV
(ajuste)
somente um ponto (“arrow” para
o PHP) por linha, se não for
fluente.
36
Object Calisthenics: relaxe e escreva códigos simples
ORIENTAÇÃO IV
somente um ponto por linha, se não for fluente
$filterChain->addFilter(new Zend_Filter_Alpha())
->addFilter(new Zend_Filter_StringToLower());
listeners->addListener(new TimeListener())
->addListener(new RestfulListener());
Não utilize:
$user->getLocation()->getCountry()->getName();
user.getAddress().getPostalConde();
$this->getRestService()->getJson($representations->find($url->getPath()));
this.getUsers().find(userId).getAddress().
37
Object Calisthenics: relaxe e escreva códigos simples
ORIENTAÇÃO IV
somente um ponto por linha, se não for fluente
• Benefícios:
– Legibilidade;
– Construção de testes facilitada (mocks);
– Mais fácil para depurar;
38
Object Calisthenics: relaxe e escreva códigos simples
ORIENTAÇÃO V
não abrevie.
39
Object Calisthenics: relaxe e escreva códigos simples
ORIENTAÇÃO V
não abrevie
• Por que você abrevia?
– Preguiça de escrever o mesmo nome várias vezes...
• Talvez isso indique duplicidade de código!
– Preguiça de escrever o nome do método muito longo...
• Talvez isso indique que o seu método faz mais de
uma coisa. Isso deve ser separado em vários
métodos ou até classes!
40
Object Calisthenics: relaxe e escreva códigos simples
ORIENTAÇÃO V
não abrevie
• Benefícios:
– Comunicação mais clara;
– Facilita a busca por problemas ocultos.
41
Object Calisthenics: relaxe e escreva códigos simples
ORIENTAÇÃO VI
mantenha suas entidades
pequenas.
42
Object Calisthenics: relaxe e escreva códigos simples
ORIENTAÇÃO VI
mantenha suas entidades pequenas
• Regra original:
– 50 linhas por classe.
• Regra adaptada:
– 100 linhas por classe (para incluir os blocos de
documentação);
– 15 classes por pacote/namespace/pasta;
– De 15 a 20 linhas por método.
43
Object Calisthenics: relaxe e escreva códigos simples
ORIENTAÇÃO VI
mantenha suas entidades pequenas
• Benefícios:
– Responsabilidade única;
– Métodos objetivos;
– Pacotes/namespaces mais enxutos;
44
Object Calisthenics: relaxe e escreva códigos simples
ORIENTAÇÃO VII
não crie classes com mais de
duas variáveis de instância.
45
Object Calisthenics: relaxe e escreva códigos simples
ORIENTAÇÃO VII
(ajuste)
não crie classes com mais de
cinco variáveis de instância.
46
Object Calisthenics: relaxe e escreva códigos simples
ORIENTAÇÃO VII
não crie classes com mais de cinco variáveis de instância.
• Benefícios:
– Lista reduzida de dependências;
– Mais fácil para fazer Mocking para testes.
47
Object Calisthenics: relaxe e escreva códigos simples
ORIENTAÇÃO VIII
use coleções de primeiro nível.
48
Object Calisthenics: relaxe e escreva códigos simples
ORIENTAÇÃO VIII
use coleções de primeiro nível.
• Qualquer classe que contenha uma coleção (ou tenha esse
propósito), não deve conter outras propriedades;
• Encapsulamento de coleções primitivas (arrays);
• Utilização de Interfaces Orientadas a Objetos:
– Collections do Java;
– SPL do PHP.
49
Object Calisthenics: relaxe e escreva códigos simples
ORIENTAÇÃO VIII
use coleções de primeiro nível.
• Benefícios:
– É possível implementar operações em coleções;
– Utilizar métodos já existentes em interfaces pré-definidas;
50
Object Calisthenics: relaxe e escreva códigos simples
ORIENTAÇÃO IX
não crie métodos getter/setter
para propriedades.
51
Object Calisthenics: relaxe e escreva códigos simples
ORIENTAÇÃO IX
(removida)
não crie métodos getter/setter
para propriedades.
52
Object Calisthenics: relaxe e escreva códigos simples
ORIENTAÇÃO IX
crie métodos getter/setter para propriedades
• Muitos frameworks utilizam os métodos getters e setters para
inicializar variáveis, reduzindo código e evitando erros
desnecessários.
• Não coloque nenhum tipo de regra de negócio nos getters e
setters.
53
Object Calisthenics: relaxe e escreva códigos simples
ORIENTAÇÃO X
(bônus)
documente seu código.
54
Object Calisthenics: relaxe e escreva códigos simples
Referências
• Object Calisthenics aplicado ao PHP
– Guilherme Blanco
• You code sucks, let's fix it
– Rafael Dohms
• The ThoughtWorks Anthology
– Martin Fower
55
Object Calisthenics: relaxe e escreva códigos simples
FIM
Perguntas?
Obrigado!
Otávio Calaça Xavier
otaviocx@gmail.com
@otaviocx

Más contenido relacionado

La actualidad más candente

Perl Moderno, dia3
Perl Moderno, dia3Perl Moderno, dia3
Perl Moderno, dia3garux
 
Introdução ao Respect\Validation (1.0)
Introdução ao Respect\Validation (1.0)Introdução ao Respect\Validation (1.0)
Introdução ao Respect\Validation (1.0)Henrique Moody
 
modernizando a arquitertura de sua aplicação
modernizando a arquitertura  de sua aplicaçãomodernizando a arquitertura  de sua aplicação
modernizando a arquitertura de sua aplicaçãoAntonio Spinelli
 
Criando APIs usando o micro-framework Respect
Criando APIs usando o micro-framework RespectCriando APIs usando o micro-framework Respect
Criando APIs usando o micro-framework RespectIvan Rosolen
 
J query javascript para seres humanos
J query   javascript para seres humanosJ query   javascript para seres humanos
J query javascript para seres humanosnobios
 
Refactoring sem complicação!
Refactoring sem complicação!Refactoring sem complicação!
Refactoring sem complicação!Thamara Hessel
 
Perl Moderno, dia5
Perl Moderno, dia5Perl Moderno, dia5
Perl Moderno, dia5garux
 
Crawling - Coleta de dados na Web com PHP
Crawling - Coleta de dados na Web com PHP Crawling - Coleta de dados na Web com PHP
Crawling - Coleta de dados na Web com PHP Luis Gustavo Almeida
 
Aula 02 - Introdução ao PHP - Programação Web
Aula 02  - Introdução ao PHP - Programação WebAula 02  - Introdução ao PHP - Programação Web
Aula 02 - Introdução ao PHP - Programação WebDalton Martins
 
Curso PHP UNIFACS 2014.1 – 2ª aula
Curso PHP UNIFACS 2014.1 – 2ª aulaCurso PHP UNIFACS 2014.1 – 2ª aula
Curso PHP UNIFACS 2014.1 – 2ª aulaJonata Weber
 
Perl Moderno, dia4
Perl Moderno, dia4Perl Moderno, dia4
Perl Moderno, dia4garux
 
Mini Curso PHP Twig - PHP Conference 2017
Mini Curso PHP Twig - PHP Conference 2017 Mini Curso PHP Twig - PHP Conference 2017
Mini Curso PHP Twig - PHP Conference 2017 Luis Gustavo Almeida
 
Perl Moderno, dia2
Perl Moderno, dia2Perl Moderno, dia2
Perl Moderno, dia2garux
 

La actualidad más candente (20)

Perl Moderno, dia3
Perl Moderno, dia3Perl Moderno, dia3
Perl Moderno, dia3
 
Introdução ao Respect\Validation (1.0)
Introdução ao Respect\Validation (1.0)Introdução ao Respect\Validation (1.0)
Introdução ao Respect\Validation (1.0)
 
modernizando a arquitertura de sua aplicação
modernizando a arquitertura  de sua aplicaçãomodernizando a arquitertura  de sua aplicação
modernizando a arquitertura de sua aplicação
 
Php
PhpPhp
Php
 
Criando APIs usando o micro-framework Respect
Criando APIs usando o micro-framework RespectCriando APIs usando o micro-framework Respect
Criando APIs usando o micro-framework Respect
 
Php curl - Coleta de dados na web
Php curl - Coleta de dados na webPhp curl - Coleta de dados na web
Php curl - Coleta de dados na web
 
J query javascript para seres humanos
J query   javascript para seres humanosJ query   javascript para seres humanos
J query javascript para seres humanos
 
Refactoring sem complicação!
Refactoring sem complicação!Refactoring sem complicação!
Refactoring sem complicação!
 
Palestra de PDO
Palestra de PDOPalestra de PDO
Palestra de PDO
 
Curso PHP: Básico JavaScript
Curso PHP: Básico JavaScriptCurso PHP: Básico JavaScript
Curso PHP: Básico JavaScript
 
PHP GERAL
PHP GERALPHP GERAL
PHP GERAL
 
Perl Moderno, dia5
Perl Moderno, dia5Perl Moderno, dia5
Perl Moderno, dia5
 
Crawling - Coleta de dados na Web com PHP
Crawling - Coleta de dados na Web com PHP Crawling - Coleta de dados na Web com PHP
Crawling - Coleta de dados na Web com PHP
 
Aula 02 - Introdução ao PHP - Programação Web
Aula 02  - Introdução ao PHP - Programação WebAula 02  - Introdução ao PHP - Programação Web
Aula 02 - Introdução ao PHP - Programação Web
 
Curso PHP UNIFACS 2014.1 – 2ª aula
Curso PHP UNIFACS 2014.1 – 2ª aulaCurso PHP UNIFACS 2014.1 – 2ª aula
Curso PHP UNIFACS 2014.1 – 2ª aula
 
Java script aula 08 - formulários
Java script   aula 08 - formuláriosJava script   aula 08 - formulários
Java script aula 08 - formulários
 
Clean Code Matters!
Clean Code Matters!Clean Code Matters!
Clean Code Matters!
 
Perl Moderno, dia4
Perl Moderno, dia4Perl Moderno, dia4
Perl Moderno, dia4
 
Mini Curso PHP Twig - PHP Conference 2017
Mini Curso PHP Twig - PHP Conference 2017 Mini Curso PHP Twig - PHP Conference 2017
Mini Curso PHP Twig - PHP Conference 2017
 
Perl Moderno, dia2
Perl Moderno, dia2Perl Moderno, dia2
Perl Moderno, dia2
 

Destacado

Deep learning: a ficção em IA tem se tornado realizade
Deep learning: a ficção em IA tem se tornado realizadeDeep learning: a ficção em IA tem se tornado realizade
Deep learning: a ficção em IA tem se tornado realizadeOtávio Calaça Xavier
 
Fuzzy RDF in the Semantic Web: Deduction and Induction
Fuzzy RDF in the Semantic Web: Deduction and InductionFuzzy RDF in the Semantic Web: Deduction and Induction
Fuzzy RDF in the Semantic Web: Deduction and InductionOtávio Calaça Xavier
 
Web Semântica, a terceira geração da Web
Web Semântica, a terceira geração da WebWeb Semântica, a terceira geração da Web
Web Semântica, a terceira geração da WebOtávio Calaça Xavier
 
Arquitetura de Software para a Entrega Continua
Arquitetura de Software para a Entrega ContinuaArquitetura de Software para a Entrega Continua
Arquitetura de Software para a Entrega ContinuaOtávio Calaça Xavier
 
Web Semântica, a terceira geração da Web
Web Semântica, a terceira geração da WebWeb Semântica, a terceira geração da Web
Web Semântica, a terceira geração da WebOtávio Calaça Xavier
 
Integrando a Web Social e a Web Semântica com PHP
Integrando a Web Social e a Web Semântica com PHPIntegrando a Web Social e a Web Semântica com PHP
Integrando a Web Social e a Web Semântica com PHPOtávio Calaça Xavier
 
DevOps: princípios e práticas para a Entrega Contínua
DevOps: princípios e práticas para a Entrega ContínuaDevOps: princípios e práticas para a Entrega Contínua
DevOps: princípios e práticas para a Entrega ContínuaOtávio Calaça Xavier
 
Introdução ao PHP Orientado a Objetos com Ajax
Introdução ao PHP Orientado a Objetos com AjaxIntrodução ao PHP Orientado a Objetos com Ajax
Introdução ao PHP Orientado a Objetos com AjaxOtávio Calaça Xavier
 
Internet das coisas (IoT) com Raspberry, Python e Node.js
Internet das coisas (IoT) com Raspberry, Python e Node.jsInternet das coisas (IoT) com Raspberry, Python e Node.js
Internet das coisas (IoT) com Raspberry, Python e Node.jsOtávio Calaça Xavier
 
Web Semântica e bancos de dados NoSQL
Web Semântica e bancos de dados NoSQLWeb Semântica e bancos de dados NoSQL
Web Semântica e bancos de dados NoSQLOtávio Calaça Xavier
 
Desenvolvimento em três camadas com PHP 5, MVC e AJAX
Desenvolvimento em três camadas com PHP 5, MVC e AJAXDesenvolvimento em três camadas com PHP 5, MVC e AJAX
Desenvolvimento em três camadas com PHP 5, MVC e AJAXOtávio Calaça Xavier
 
10+ Deploys Per Day: Dev and Ops Cooperation at Flickr
10+ Deploys Per Day: Dev and Ops Cooperation at Flickr10+ Deploys Per Day: Dev and Ops Cooperation at Flickr
10+ Deploys Per Day: Dev and Ops Cooperation at FlickrJohn Allspaw
 

Destacado (16)

Deep learning: a ficção em IA tem se tornado realizade
Deep learning: a ficção em IA tem se tornado realizadeDeep learning: a ficção em IA tem se tornado realizade
Deep learning: a ficção em IA tem se tornado realizade
 
Fuzzy RDF in the Semantic Web: Deduction and Induction
Fuzzy RDF in the Semantic Web: Deduction and InductionFuzzy RDF in the Semantic Web: Deduction and Induction
Fuzzy RDF in the Semantic Web: Deduction and Induction
 
Web Semântica, a terceira geração da Web
Web Semântica, a terceira geração da WebWeb Semântica, a terceira geração da Web
Web Semântica, a terceira geração da Web
 
Arquitetura de Software para a Entrega Continua
Arquitetura de Software para a Entrega ContinuaArquitetura de Software para a Entrega Continua
Arquitetura de Software para a Entrega Continua
 
Web Semântica, a terceira geração da Web
Web Semântica, a terceira geração da WebWeb Semântica, a terceira geração da Web
Web Semântica, a terceira geração da Web
 
Padrões de Projeto Web e o MVC
Padrões de Projeto Web e o MVCPadrões de Projeto Web e o MVC
Padrões de Projeto Web e o MVC
 
Integrando a Web Social e a Web Semântica com PHP
Integrando a Web Social e a Web Semântica com PHPIntegrando a Web Social e a Web Semântica com PHP
Integrando a Web Social e a Web Semântica com PHP
 
Redes Neurais com PHP
Redes Neurais com PHPRedes Neurais com PHP
Redes Neurais com PHP
 
Introdução ao Framework CakePHP
Introdução ao Framework CakePHPIntrodução ao Framework CakePHP
Introdução ao Framework CakePHP
 
DevOps: princípios e práticas para a Entrega Contínua
DevOps: princípios e práticas para a Entrega ContínuaDevOps: princípios e práticas para a Entrega Contínua
DevOps: princípios e práticas para a Entrega Contínua
 
Introdução à Google Maps API
Introdução à Google Maps APIIntrodução à Google Maps API
Introdução à Google Maps API
 
Introdução ao PHP Orientado a Objetos com Ajax
Introdução ao PHP Orientado a Objetos com AjaxIntrodução ao PHP Orientado a Objetos com Ajax
Introdução ao PHP Orientado a Objetos com Ajax
 
Internet das coisas (IoT) com Raspberry, Python e Node.js
Internet das coisas (IoT) com Raspberry, Python e Node.jsInternet das coisas (IoT) com Raspberry, Python e Node.js
Internet das coisas (IoT) com Raspberry, Python e Node.js
 
Web Semântica e bancos de dados NoSQL
Web Semântica e bancos de dados NoSQLWeb Semântica e bancos de dados NoSQL
Web Semântica e bancos de dados NoSQL
 
Desenvolvimento em três camadas com PHP 5, MVC e AJAX
Desenvolvimento em três camadas com PHP 5, MVC e AJAXDesenvolvimento em três camadas com PHP 5, MVC e AJAX
Desenvolvimento em três camadas com PHP 5, MVC e AJAX
 
10+ Deploys Per Day: Dev and Ops Cooperation at Flickr
10+ Deploys Per Day: Dev and Ops Cooperation at Flickr10+ Deploys Per Day: Dev and Ops Cooperation at Flickr
10+ Deploys Per Day: Dev and Ops Cooperation at Flickr
 

Similar a Object Calisthenics: relaxe e escreva códigos simples

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
 
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 2011Luís Cobucci
 
Testes unitários como ferramentas de design de código
Testes unitários como ferramentas de design de códigoTestes unitários como ferramentas de design de código
Testes unitários como ferramentas de design de códigoPaula Grangeiro
 
Clean Code e Object Calisthenics - Aplicados no PHP
Clean Code e Object Calisthenics - Aplicados no PHPClean Code e Object Calisthenics - Aplicados no PHP
Clean Code e Object Calisthenics - Aplicados no PHPRafael Neris
 
PHP: Linguagem + Mysql + MVC + AJAX
PHP: Linguagem + Mysql + MVC + AJAX PHP: Linguagem + Mysql + MVC + AJAX
PHP: Linguagem + Mysql + MVC + AJAX Sérgio Souza Costa
 
Javascript para CSharpers 4 - POO
Javascript para CSharpers 4 - POOJavascript para CSharpers 4 - POO
Javascript para CSharpers 4 - POOWesley Lemos
 
Removendo o cheiro ruim do seu código - PHPSC Conf 2011
Removendo o cheiro ruim do seu código - PHPSC Conf 2011Removendo o cheiro ruim do seu código - PHPSC Conf 2011
Removendo o cheiro ruim do seu código - PHPSC Conf 2011Luís Cobucci
 
Domain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BHDomain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BHGiovanni Bassi
 
Introdução a JavaScript
Introdução a JavaScriptIntrodução a JavaScript
Introdução a JavaScriptBruno Catão
 
Ecommerce, mais simples do que parece
Ecommerce, mais simples do que pareceEcommerce, mais simples do que parece
Ecommerce, mais simples do que pareceImpacta Eventos
 
Introdução à MEAN Stack
Introdução à MEAN StackIntrodução à MEAN Stack
Introdução à MEAN StackBruno Catão
 
Objects calisthenics - Os 10 mandamentos do rei do código
Objects calisthenics - Os 10 mandamentos do rei do códigoObjects calisthenics - Os 10 mandamentos do rei do código
Objects calisthenics - Os 10 mandamentos do rei do códigoBonoBee
 
TDC2016 Boas Práticas SQL em Banco Relacional para Desenvolvedores
TDC2016 Boas Práticas SQL em Banco Relacional para DesenvolvedoresTDC2016 Boas Práticas SQL em Banco Relacional para Desenvolvedores
TDC2016 Boas Práticas SQL em Banco Relacional para DesenvolvedoresFernando Franquini
 

Similar a Object Calisthenics: relaxe e escreva códigos simples (20)

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
 
Solid
SolidSolid
Solid
 
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
 
Testes unitários como ferramentas de design de código
Testes unitários como ferramentas de design de códigoTestes unitários como ferramentas de design de código
Testes unitários como ferramentas de design de código
 
Clean Code e Object Calisthenics - Aplicados no PHP
Clean Code e Object Calisthenics - Aplicados no PHPClean Code e Object Calisthenics - Aplicados no PHP
Clean Code e Object Calisthenics - Aplicados no PHP
 
PHP: Linguagem + Mysql + MVC + AJAX
PHP: Linguagem + Mysql + MVC + AJAX PHP: Linguagem + Mysql + MVC + AJAX
PHP: Linguagem + Mysql + MVC + AJAX
 
Javascript para CSharpers 4 - POO
Javascript para CSharpers 4 - POOJavascript para CSharpers 4 - POO
Javascript para CSharpers 4 - POO
 
Removendo o cheiro ruim do seu código - PHPSC Conf 2011
Removendo o cheiro ruim do seu código - PHPSC Conf 2011Removendo o cheiro ruim do seu código - PHPSC Conf 2011
Removendo o cheiro ruim do seu código - PHPSC Conf 2011
 
Domain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BHDomain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BH
 
Introdução a JavaScript
Introdução a JavaScriptIntrodução a JavaScript
Introdução a JavaScript
 
Testes de software de A a Z
Testes de software de A a ZTestes de software de A a Z
Testes de software de A a Z
 
C# 4.0
C# 4.0C# 4.0
C# 4.0
 
DDD > Experiências
DDD > ExperiênciasDDD > Experiências
DDD > Experiências
 
Ecommerce, mais simples do que parece
Ecommerce, mais simples do que pareceEcommerce, mais simples do que parece
Ecommerce, mais simples do que parece
 
Introdução à MEAN Stack
Introdução à MEAN StackIntrodução à MEAN Stack
Introdução à MEAN Stack
 
JavaScript - A Linguagem
JavaScript - A LinguagemJavaScript - A Linguagem
JavaScript - A Linguagem
 
Objects calisthenics - Os 10 mandamentos do rei do código
Objects calisthenics - Os 10 mandamentos do rei do códigoObjects calisthenics - Os 10 mandamentos do rei do código
Objects calisthenics - Os 10 mandamentos do rei do código
 
Javascript
JavascriptJavascript
Javascript
 
Dev Ext PHP
Dev Ext PHPDev Ext PHP
Dev Ext PHP
 
TDC2016 Boas Práticas SQL em Banco Relacional para Desenvolvedores
TDC2016 Boas Práticas SQL em Banco Relacional para DesenvolvedoresTDC2016 Boas Práticas SQL em Banco Relacional para Desenvolvedores
TDC2016 Boas Práticas SQL em Banco Relacional para Desenvolvedores
 

Más de Otávio Calaça Xavier

Implementing Semantic Queries in Online Social Networks
Implementing Semantic Queries in Online Social NetworksImplementing Semantic Queries in Online Social Networks
Implementing Semantic Queries in Online Social NetworksOtávio Calaça Xavier
 
Lógica Fuzzy aplicada à Sistemas de Apoio a Decisão
Lógica Fuzzy aplicada à  Sistemas de Apoio a DecisãoLógica Fuzzy aplicada à  Sistemas de Apoio a Decisão
Lógica Fuzzy aplicada à Sistemas de Apoio a DecisãoOtávio Calaça Xavier
 
Abstração do banco de dados com PHP Doctrine
Abstração do banco de dados com PHP DoctrineAbstração do banco de dados com PHP Doctrine
Abstração do banco de dados com PHP DoctrineOtávio Calaça Xavier
 
Introdução às Redes Neurais com PHP
Introdução às Redes Neurais com PHPIntrodução às Redes Neurais com PHP
Introdução às Redes Neurais com PHPOtávio Calaça Xavier
 
Classe V: Educação à distância com Videoconferência no Moodle
Classe V: Educação à distância com Videoconferência no MoodleClasse V: Educação à distância com Videoconferência no Moodle
Classe V: Educação à distância com Videoconferência no MoodleOtávio Calaça Xavier
 

Más de Otávio Calaça Xavier (6)

Implementing Semantic Queries in Online Social Networks
Implementing Semantic Queries in Online Social NetworksImplementing Semantic Queries in Online Social Networks
Implementing Semantic Queries in Online Social Networks
 
Lógica Fuzzy aplicada à Sistemas de Apoio a Decisão
Lógica Fuzzy aplicada à  Sistemas de Apoio a DecisãoLógica Fuzzy aplicada à  Sistemas de Apoio a Decisão
Lógica Fuzzy aplicada à Sistemas de Apoio a Decisão
 
Abstração do banco de dados com PHP Doctrine
Abstração do banco de dados com PHP DoctrineAbstração do banco de dados com PHP Doctrine
Abstração do banco de dados com PHP Doctrine
 
PHP: Atualidade e Tendências
PHP: Atualidade e TendênciasPHP: Atualidade e Tendências
PHP: Atualidade e Tendências
 
Introdução às Redes Neurais com PHP
Introdução às Redes Neurais com PHPIntrodução às Redes Neurais com PHP
Introdução às Redes Neurais com PHP
 
Classe V: Educação à distância com Videoconferência no Moodle
Classe V: Educação à distância com Videoconferência no MoodleClasse V: Educação à distância com Videoconferência no Moodle
Classe V: Educação à distância com Videoconferência no Moodle
 

Object Calisthenics: relaxe e escreva códigos simples

  • 1. Object Calisthenics: relaxe e escreva códigos simples Goiânia, 23 de Março de 2013 Otávio Calaça Xavier otaviocx@gmail.com
  • 2.  Criado em dezembro de 2007;  Lista de Discussão: − Mais de 650 membros.  Projetos: − Encontros mensais; − Softwares Livres em PHP; − Networking.  Eventos: • FLISOL, FGSL, Latinoware, Conisli, CONSOFT, PHP Conference Brasil, FISL, Join Community …  Precisamos de Colaboradores!!! Grupo de Desenvolvedores PHP de Goiás www.gophp.org.br
  • 3. 3 Object Calisthenics: relaxe e escreva códigos simples Roteiro • Motivação; • Orientações; • Aplicação.
  • 4. 4 Object Calisthenics: relaxe e escreva códigos simples Por que meu código é ruim? • Ele é legível? • Ele é testável? • Ele é de fácil manutenção? • Ele é reusável?
  • 5. 5 Object Calisthenics: relaxe e escreva códigos simples Object Calisthenics • Calistenia = exercício de relaxamento; ginástica rítimica; • Uma variedade de exercícios simples e rítimicos para alcançar melhor qualidade de código e OO.
  • 6. 6 Object Calisthenics: relaxe e escreva códigos simples Object Calisthenics • Jeff Bay em The ThoughtWorks Anthology definiu o termo Object Calisthenics para a computação, como o conjunto de exercícios para a programação Orientada a Objetos.
  • 7. 7 Object Calisthenics: relaxe e escreva códigos simples Object Calisthenics • Orientações: – Nove (9) orientações simples e que podem ser utilizadas em qualquer linguagem orientada a objetos.
  • 8. 8 Object Calisthenics: relaxe e escreva códigos simples ORIENTAÇÃO I somente um nível de identação/recuo por método.
  • 9. 9 Object Calisthenics: relaxe e escreva códigos simples ORIENTAÇÃO I somente um nível de identação/recuo por método public function validarProdutos($produtos) { $camposRequeridos = array( 'nome', 'preco', 'descricao', 'tipo' ); $valido = true; foreach($produtos as $produto) { $campos = array_keys($produto); foreach ($camposRequeridos as $campoRequerido) { if(!in_array($campoRequerido, $campos)) { $valido = false; } } } return $valido; }
  • 10. 10 Object Calisthenics: relaxe e escreva códigos simples ORIENTAÇÃO I somente um nível de identação/recuo por método public function validarProdutos($produtos) { $camposRequeridos = array( 'nome', 'preco', 'descricao', 'tipo' ); $valido = true; foreach($produtos as $produto) { $campos = array_keys($produto); foreach ($camposRequeridos as $campoRequerido) { if(!in_array($campoRequerido, $campos)) { $valido = false; } } } return $valido; }
  • 11. 11 Object Calisthenics: relaxe e escreva códigos simples ORIENTAÇÃO I somente um nível de identação/recuo por método public function validarProdutos($produtos) { $camposRequeridos = array( 'nome', 'preco', 'descricao', 'tipo' ); $valido = true; foreach($produtos as $produto) { $campos = array_keys($produto); foreach ($camposRequeridos as $campoRequerido) { if(!in_array($campoRequerido, $campos)) { $valido = false; } } } return $valido; } 0 1 2 3
  • 12. 12 Object Calisthenics: relaxe e escreva códigos simples ORIENTAÇÃO I somente um nível de identação/recuo por método public function validarProdutos($produtos) { $camposRequeridos = array( 'nome', 'preco', 'descricao', 'tipo' ); $valido = true; foreach($produtos as $produto) { $validacao = $this->validarProdutoIndividual($produto, $camposRequeridos); if( ! $validacao) { $valido = false; } } return $valido; } public function validarProdutoIndividual($produto, $camposRequeridos) { $valido = true; $campos = array_keys($produto); foreach ($camposRequeridos as $campoRequerido) { if( ! in_array($campoRequerido, $campos)) { $valido = false; } } }
  • 13. 13 Object Calisthenics: relaxe e escreva códigos simples ORIENTAÇÃO I somente um nível de identação/recuo por método public function validarProdutos($produtos) { $camposRequeridos = array( 'nome', 'preco', 'descricao', 'tipo' ); $valido = true; foreach($produtos as $produto) { $validacao = $this->validarProdutoIndividual($produto, $camposRequeridos); if( ! $validacao) { $valido = false; } } return $valido; } public function validarProdutoIndividual($produto, $camposRequeridos) { $valido = true; $campos = array_keys($produto); foreach ($camposRequeridos as $campoRequerido) { if( ! in_array($campoRequerido, $campos)) { $valido = false; } } }
  • 14. 14 Object Calisthenics: relaxe e escreva códigos simples ORIENTAÇÃO I somente um nível de identação/recuo por método public function validarProdutos($produtos) { $camposRequeridos = array( 'nome', 'preco', 'descricao', 'tipo' ); $valido = true; foreach($produtos as $produto) { $validacao = $this->validarProdutoIndividual($produto, $camposRequeridos); if( ! $validacao) { $valido = false; } } return $valido; } public function validarProdutoIndividual($produto, $camposRequeridos) { $valido = true; $campos = array_keys($produto); foreach ($camposRequeridos as $campoRequerido) { if( ! in_array($campoRequerido, $campos)) { $valido = false; } } } 0 1 2 0 1 2
  • 15. 15 Object Calisthenics: relaxe e escreva códigos simples ORIENTAÇÃO I somente um nível de identação/recuo por método public function validarProdutos($produtos) { $camposRequeridos = array( 'nome', 'preco', 'descricao', 'tipo' ); foreach($produtos as $produto) { if( ! $this->validarProdutoIndividual($produto, $camposRequeridos)) { return false; } } return true; } public function validarProdutoIndividual($produto, $camposRequeridos) { $campos = array_keys($produto); $camposEsquecidos = array_diff($camposRequeridos, $campos); return (count($camposEsquecidos) == 0); }
  • 16. 16 Object Calisthenics: relaxe e escreva códigos simples ORIENTAÇÃO I somente um nível de identação/recuo por método public function validarProdutos($produtos) { $camposRequeridos = array( 'nome', 'preco', 'descricao', 'tipo' ); foreach($produtos as $produto) { if( ! $this->validarProdutoIndividual($produto, $camposRequeridos)) { return false; } } return true; } public function validarProdutoIndividual($produto, $camposRequeridos) { $campos = array_keys($produto); $camposEsquecidos = array_diff($camposRequeridos, $campos); return (count($camposEsquecidos) == 0); } 0 1 2
  • 17. 17 Object Calisthenics: relaxe e escreva códigos simples ORIENTAÇÃO I somente um nível de identação/recuo por método public function validarProdutos($produtos) { $produtosInvalidos = array_filter($produtos, 'verificaProdutoInvalido'); return (count($produtosInvalidos) === 0); } public function verificaProdutoInvalido($produto) { $camposRequeridos = array( 'nome', 'preco', 'descricao', 'tipo' ); $campos = array_keys($produto); $camposEsquecidos = array_diff($camposRequeridos, $campos); return (count($camposEsquecidos) > 0); }
  • 18. 18 Object Calisthenics: relaxe e escreva códigos simples ORIENTAÇÃO I somente um nível de identação/recuo por método class Board { ... String board() { StringBuffer buf = new StringBuffer(); for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { buf.append(data[i][j]); } buf.append(“n”); } return buf.toString(); } }
  • 19. 19 Object Calisthenics: relaxe e escreva códigos simples ORIENTAÇÃO I somente um nível de identação/recuo por método class Board { ... String board() { StringBuffer buf = new StringBuffer(); for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { buf.append(data[i][j]); } buf.append(“n”); } return buf.toString(); } } 0 1 2
  • 20. 20 Object Calisthenics: relaxe e escreva códigos simples ORIENTAÇÃO I somente um nível de identação/recuo por método class Board { ... String board() { StringBuffer buf = new StringBuffer(); collectRows(buf); return buf.toString(); } void collectRows(StringBuffer buf) { for (int i = 0; i < 10; i++) { collectRow(buf, i); } } void collectRow(StringBuffer buf, int row) { for (int i = 0; i < 10; i++) { Buf.append(data[row][i]); } buf.append(“n”); } }
  • 21. 21 Object Calisthenics: relaxe e escreva códigos simples ORIENTAÇÃO I somente um nível de identação/recuo por método • Benefícios: – Maior coesão; – Reduz a complexidade ciclomática; – Métodos acabam fazendo apenas uma coisa, como deve ser; – Aumenta a reusabilidade.
  • 22. 22 Object Calisthenics: relaxe e escreva códigos simples ORIENTAÇÃO II não utilize a palavra-chave else.
  • 23. 23 Object Calisthenics: relaxe e escreva códigos simples ORIENTAÇÃO II não utilize a palavra-chave else public function login() { $usuario = $this->input()->post('usuario'); $senha = $this->input()->post('senha'); $referencia = $this->input()->post('referencia'); if($this->usuariosModel->verificaPermissao($usuario, $senha)) { redirect($referencia); } else { $this->session->setFlashData('erro', 'Usuário ou senha inválidos.'); $this->session->setFlashData('referencia', $referencia); redirect('login'); } }
  • 24. 24 Object Calisthenics: relaxe e escreva códigos simples ORIENTAÇÃO II não utilize a palavra-chave else public function login() { $usuario = $this->input()->post('usuario'); $senha = $this->input()->post('senha'); $referencia = $this->input()->post('referencia'); if($this->usuariosModel->verificaPermissao($usuario, $senha)) { redirect($referencia); } else { $this->session->setFlashData('erro', 'Usuário ou senha inválidos.'); $this->session->setFlashData('referencia', $referencia); redirect('login'); } }
  • 25. 25 Object Calisthenics: relaxe e escreva códigos simples ORIENTAÇÃO II não utilize a palavra-chave else public function login() { $usuario = $this->input()->post('usuario'); $senha = $this->input()->post('senha'); $referencia = $this->input()->post('referencia'); if( ! $this->usuariosModel->verificaPermissao($usuario, $senha)) { $this->session->setFlashData('erro', 'Usuário ou senha inválidos.'); $this->session->setFlashData('referencia', $referencia); $referencia = 'login'; } redirect($referencia); }
  • 26. 26 Object Calisthenics: relaxe e escreva códigos simples ORIENTAÇÃO II não utilize a palavra-chave else • Benefícios: – Ajuda a prevenir duplicação de código; – Reduz a complexidade ciclomática; – Faz o código ficar mais limpo, passando por um único caminho.
  • 27. 27 Object Calisthenics: relaxe e escreva códigos simples ORIENTAÇÃO III encapsule todos os tipos primitivos e strings.
  • 28. 28 Object Calisthenics: relaxe e escreva códigos simples ORIENTAÇÃO III encapsule todos os tipos primitivos e strings class Aluno { private int matricula; private boolean ativo; private long cpf; //... }
  • 29. 29 Object Calisthenics: relaxe e escreva códigos simples ORIENTAÇÃO III encapsule todos os tipos primitivos e strings class Aluno { private Integer matricula; private Boolean ativo; private Long cpf; //... }
  • 30. 30 Object Calisthenics: relaxe e escreva códigos simples ORIENTAÇÃO III (ajuste) encapsule todos os tipos primitivos e strings, se eles possuírem comportamento.
  • 31. 31 Object Calisthenics: relaxe e escreva códigos simples ORIENTAÇÃO III encapsule os tipos primitivos e strings, se eles possuírem comportamento class UIComponent { //... public function repaint($animate = true) { //... } } //... $component->repaint(false);
  • 32. 32 Object Calisthenics: relaxe e escreva códigos simples ORIENTAÇÃO III encapsule os tipos primitivos e strings, se eles possuírem comportamento class UIComponent { //... public function repaint(Animate $animate) { //... } } class Animate { private $animate; public function __construct($animate = true) { $this->animate = true; } } //... $component->repaint( new Animate(false) );
  • 33. 33 Object Calisthenics: relaxe e escreva códigos simples ORIENTAÇÃO III encapsule os tipos primitivos e strings, se eles possuírem comportamento • Benefícios: – Indução de Tipo; – Encapsulamento de operações.
  • 34. 34 Object Calisthenics: relaxe e escreva códigos simples ORIENTAÇÃO IV somente um ponto (“arrow” para o PHP) por linha.
  • 35. 35 Object Calisthenics: relaxe e escreva códigos simples ORIENTAÇÃO IV (ajuste) somente um ponto (“arrow” para o PHP) por linha, se não for fluente.
  • 36. 36 Object Calisthenics: relaxe e escreva códigos simples ORIENTAÇÃO IV somente um ponto por linha, se não for fluente $filterChain->addFilter(new Zend_Filter_Alpha()) ->addFilter(new Zend_Filter_StringToLower()); listeners->addListener(new TimeListener()) ->addListener(new RestfulListener()); Não utilize: $user->getLocation()->getCountry()->getName(); user.getAddress().getPostalConde(); $this->getRestService()->getJson($representations->find($url->getPath())); this.getUsers().find(userId).getAddress().
  • 37. 37 Object Calisthenics: relaxe e escreva códigos simples ORIENTAÇÃO IV somente um ponto por linha, se não for fluente • Benefícios: – Legibilidade; – Construção de testes facilitada (mocks); – Mais fácil para depurar;
  • 38. 38 Object Calisthenics: relaxe e escreva códigos simples ORIENTAÇÃO V não abrevie.
  • 39. 39 Object Calisthenics: relaxe e escreva códigos simples ORIENTAÇÃO V não abrevie • Por que você abrevia? – Preguiça de escrever o mesmo nome várias vezes... • Talvez isso indique duplicidade de código! – Preguiça de escrever o nome do método muito longo... • Talvez isso indique que o seu método faz mais de uma coisa. Isso deve ser separado em vários métodos ou até classes!
  • 40. 40 Object Calisthenics: relaxe e escreva códigos simples ORIENTAÇÃO V não abrevie • Benefícios: – Comunicação mais clara; – Facilita a busca por problemas ocultos.
  • 41. 41 Object Calisthenics: relaxe e escreva códigos simples ORIENTAÇÃO VI mantenha suas entidades pequenas.
  • 42. 42 Object Calisthenics: relaxe e escreva códigos simples ORIENTAÇÃO VI mantenha suas entidades pequenas • Regra original: – 50 linhas por classe. • Regra adaptada: – 100 linhas por classe (para incluir os blocos de documentação); – 15 classes por pacote/namespace/pasta; – De 15 a 20 linhas por método.
  • 43. 43 Object Calisthenics: relaxe e escreva códigos simples ORIENTAÇÃO VI mantenha suas entidades pequenas • Benefícios: – Responsabilidade única; – Métodos objetivos; – Pacotes/namespaces mais enxutos;
  • 44. 44 Object Calisthenics: relaxe e escreva códigos simples ORIENTAÇÃO VII não crie classes com mais de duas variáveis de instância.
  • 45. 45 Object Calisthenics: relaxe e escreva códigos simples ORIENTAÇÃO VII (ajuste) não crie classes com mais de cinco variáveis de instância.
  • 46. 46 Object Calisthenics: relaxe e escreva códigos simples ORIENTAÇÃO VII não crie classes com mais de cinco variáveis de instância. • Benefícios: – Lista reduzida de dependências; – Mais fácil para fazer Mocking para testes.
  • 47. 47 Object Calisthenics: relaxe e escreva códigos simples ORIENTAÇÃO VIII use coleções de primeiro nível.
  • 48. 48 Object Calisthenics: relaxe e escreva códigos simples ORIENTAÇÃO VIII use coleções de primeiro nível. • Qualquer classe que contenha uma coleção (ou tenha esse propósito), não deve conter outras propriedades; • Encapsulamento de coleções primitivas (arrays); • Utilização de Interfaces Orientadas a Objetos: – Collections do Java; – SPL do PHP.
  • 49. 49 Object Calisthenics: relaxe e escreva códigos simples ORIENTAÇÃO VIII use coleções de primeiro nível. • Benefícios: – É possível implementar operações em coleções; – Utilizar métodos já existentes em interfaces pré-definidas;
  • 50. 50 Object Calisthenics: relaxe e escreva códigos simples ORIENTAÇÃO IX não crie métodos getter/setter para propriedades.
  • 51. 51 Object Calisthenics: relaxe e escreva códigos simples ORIENTAÇÃO IX (removida) não crie métodos getter/setter para propriedades.
  • 52. 52 Object Calisthenics: relaxe e escreva códigos simples ORIENTAÇÃO IX crie métodos getter/setter para propriedades • Muitos frameworks utilizam os métodos getters e setters para inicializar variáveis, reduzindo código e evitando erros desnecessários. • Não coloque nenhum tipo de regra de negócio nos getters e setters.
  • 53. 53 Object Calisthenics: relaxe e escreva códigos simples ORIENTAÇÃO X (bônus) documente seu código.
  • 54. 54 Object Calisthenics: relaxe e escreva códigos simples Referências • Object Calisthenics aplicado ao PHP – Guilherme Blanco • You code sucks, let's fix it – Rafael Dohms • The ThoughtWorks Anthology – Martin Fower
  • 55. 55 Object Calisthenics: relaxe e escreva códigos simples FIM Perguntas? Obrigado! Otávio Calaça Xavier otaviocx@gmail.com @otaviocx