SlideShare uma empresa Scribd logo
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

Mais conteúdo relacionado

Mais procurados

Perl Moderno, dia3
Perl Moderno, dia3Perl Moderno, dia3
Perl Moderno, dia3
garux
 
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ção
Antonio Spinelli
 
Php
PhpPhp
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
Ivan Rosolen
 
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
Luis Gustavo Almeida
 
J query javascript para seres humanos
J query   javascript para seres humanosJ query   javascript para seres humanos
J query javascript para seres humanos
nobios
 
Refactoring sem complicação!
Refactoring sem complicação!Refactoring sem complicação!
Refactoring sem complicação!
Thamara Hessel
 
Palestra de PDO
Palestra de PDOPalestra de PDO
Palestra de PDO
Almir Mendes
 
Curso PHP: Básico JavaScript
Curso PHP: Básico JavaScriptCurso PHP: Básico JavaScript
Curso PHP: Básico JavaScript
Wellington Oliveira
 
PHP GERAL
PHP GERALPHP GERAL
PHP GERAL
Lucas Batistussi
 
Perl Moderno, dia5
Perl Moderno, dia5Perl Moderno, dia5
Perl Moderno, dia5
garux
 
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 Web
Dalton 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ª aula
Jonata Weber
 
Java script aula 08 - formulários
Java script   aula 08 - formuláriosJava script   aula 08 - formulários
Java script aula 08 - formulários
Cristiano Pires Martins
 
Clean Code Matters!
Clean Code Matters!Clean Code Matters!
Clean Code Matters!
Kewerson Hugo
 
Perl Moderno, dia4
Perl Moderno, dia4Perl Moderno, dia4
Perl Moderno, dia4
garux
 
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, dia2
garux
 

Mais procurados (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
 

Destaque

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
Otá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 Induction
Otá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 Web
Otá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 Continua
Otá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 Web
Otávio Calaça Xavier
 
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
Otá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 PHP
Otávio Calaça Xavier
 
Redes Neurais com PHP
Redes Neurais com PHPRedes Neurais com PHP
Redes Neurais com PHP
Otávio Calaça Xavier
 
Introdução ao Framework CakePHP
Introdução ao Framework CakePHPIntrodução ao Framework CakePHP
Introdução ao Framework CakePHP
Otá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ínua
Otávio Calaça Xavier
 
Introdução à Google Maps API
Introdução à Google Maps APIIntrodução à Google Maps API
Introdução à Google Maps API
Otá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 Ajax
Otá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.js
Otá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 NoSQL
Otá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 AJAX
Otá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 Flickr
John Allspaw
 

Destaque (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
 

Semelhante 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 - 2014
Michael Castillo Granados
 
Solid
SolidSolid
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
 
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
Paula 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 PHP
Rafael 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
 
Conteúdo teórico sobre funções e cookies
Conteúdo teórico sobre funções e cookiesConteúdo teórico sobre funções e cookies
Conteúdo teórico sobre funções e cookies
suellencarolinerosa
 
Javascript para CSharpers 4 - POO
Javascript para CSharpers 4 - POOJavascript para CSharpers 4 - POO
Javascript para CSharpers 4 - POO
Wesley 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 2011
Luís Cobucci
 
Domain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BHDomain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BH
Giovanni Bassi
 
Introdução a JavaScript
Introdução a JavaScriptIntrodução a JavaScript
Introdução a JavaScript
Bruno Catão
 
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
Camilo Porto ► Software Engineer
 
C# 4.0
C# 4.0C# 4.0
DDD > Experiências
DDD > ExperiênciasDDD > Experiências
DDD > Experiências
Giovanni Bassi
 
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
 
Introdução à MEAN Stack
Introdução à MEAN StackIntrodução à MEAN Stack
Introdução à MEAN Stack
Bruno Catão
 
JavaScript - A Linguagem
JavaScript - A LinguagemJavaScript - A Linguagem
JavaScript - A Linguagem
Sérgio Souza Costa
 
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
BonoBee
 
Javascript
JavascriptJavascript
Javascript
Fernando Simeone
 
Dev Ext PHP
Dev Ext PHPDev Ext PHP
Dev Ext PHP
Andre Golvea
 

Semelhante 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
 
Conteúdo teórico sobre funções e cookies
Conteúdo teórico sobre funções e cookiesConteúdo teórico sobre funções e cookies
Conteúdo teórico sobre funções e cookies
 
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
 

Mais 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 Networks
Otá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ão
Otá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 Doctrine
Otávio Calaça Xavier
 
PHP: Atualidade e Tendências
PHP: Atualidade e TendênciasPHP: Atualidade e Tendências
PHP: Atualidade e Tendências
Otá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 PHP
Otá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 Moodle
Otávio Calaça Xavier
 

Mais 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
 

Último

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
 
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
 
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
 
Certificado Jornada Python Da Hashtag.pdf
Certificado Jornada Python Da Hashtag.pdfCertificado Jornada Python Da Hashtag.pdf
Certificado Jornada Python Da Hashtag.pdf
joaovmp3
 
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
 
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
 
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
 
ATIVIDADE 1 - ADSIS - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ADSIS - ESTRUTURA DE DADOS II - 52_2024.docxATIVIDADE 1 - ADSIS - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ADSIS - ESTRUTURA DE DADOS II - 52_2024.docx
2m Assessoria
 
DESENVOLVIMENTO DE SOFTWARE I_aula1-2.pdf
DESENVOLVIMENTO DE SOFTWARE I_aula1-2.pdfDESENVOLVIMENTO DE SOFTWARE I_aula1-2.pdf
DESENVOLVIMENTO DE SOFTWARE I_aula1-2.pdf
Momento da Informática
 
Manual-de-Credenciamento ANATER 2023.pdf
Manual-de-Credenciamento ANATER 2023.pdfManual-de-Credenciamento ANATER 2023.pdf
Manual-de-Credenciamento ANATER 2023.pdf
WELITONNOGUEIRA3
 

Último (10)

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
 
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
 
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
 
Certificado Jornada Python Da Hashtag.pdf
Certificado Jornada Python Da Hashtag.pdfCertificado Jornada Python Da Hashtag.pdf
Certificado Jornada Python Da Hashtag.pdf
 
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...
 
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
 
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
 
ATIVIDADE 1 - ADSIS - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ADSIS - ESTRUTURA DE DADOS II - 52_2024.docxATIVIDADE 1 - ADSIS - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ADSIS - ESTRUTURA DE DADOS II - 52_2024.docx
 
DESENVOLVIMENTO DE SOFTWARE I_aula1-2.pdf
DESENVOLVIMENTO DE SOFTWARE I_aula1-2.pdfDESENVOLVIMENTO DE SOFTWARE I_aula1-2.pdf
DESENVOLVIMENTO DE SOFTWARE I_aula1-2.pdf
 
Manual-de-Credenciamento ANATER 2023.pdf
Manual-de-Credenciamento ANATER 2023.pdfManual-de-Credenciamento ANATER 2023.pdf
Manual-de-Credenciamento ANATER 2023.pdf
 

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