Este repositório apresenta os princípios de Object Calisthenics, um conjunto de boas práticas de programação orientada a objetos proposto por Jeff Bay. Aqui você encontrará explicações e exemplos em PHP para cada uma das 9 regras.
Object Calisthenics são "exercícios" que ajudam a escrever código orientado a objetos mais limpo, coeso e fácil de manter. São 9 regras que incentivam um estilo de codificação mais disciplinado.
Evite estruturas aninhadas e extraia lógica para métodos auxiliares.
✅ Bom:
if ($usuario->estaAtivo()) {
$this->processarPagamento($usuario);
}❌ Ruim:
if ($usuario !== null) {
if ($usuario->estaAtivo()) {
$this->processarPagamento($usuario);
}
}Evite else. Prefira retornos antecipados ou métodos separados.
✅ Bom:
if (!$usuario->temPermissao()) {
return;
}
$this->executarAcao();❌ Ruim:
if ($usuario->temPermissao()) {
$this->executarAcao();
} else {
$this->negarAcesso();
}Evite passar strings e números soltos. Use objetos com significado.
✅ Bom:
class Cpf {
public function __construct(private string $numero) {}
}❌ Ruim:
$cpf = "123.456.789-00";Não exponha arrays diretamente. Encapsule em objetos que expressam intenção.
✅ Bom:
class Carrinho {
private array $itens = [];
public function adicionar(Item $item): void {
$this->itens[] = $item;
}
}❌ Ruim:
$itens = [];
$itens[] = $item;Evite acessar objetos internos de outros objetos. Exponha métodos de alto nível.
✅ Bom:
$cidade = $cliente->cidade();❌ Ruim:
$cidade = $cliente->getEndereco()->getCidade();Evite abreviações. Nomes devem ser claros e descritivos.
✅ Bom:
class RelatorioDeVendas {}❌ Ruim:
class RelVend {}Classes e métodos devem ser pequenos e com responsabilidades únicas.
✅ Bom:
class CalculadoraDeFrete {}
class ValidadorDeEndereco {}❌ Ruim:
class Pedido {
public function calcularFrete() { ... }
public function validarEndereco() { ... }
public function gerarNotaFiscal() { ... }
}Evite expor o estado interno dos objetos. Use métodos que expressem comportamentos.
✅ Bom:
$total = $pedido->valorTotal();❌ Ruim:
$itens = $pedido->getItens();
$total = array_sum(array_map(fn($item) => $item->getPreco(), $itens));Mantenha métodos de alto nível separados dos detalhes de implementação.
✅ Bom:
class GeradorDeRelatorio {
public function gerar(): void {
$dados = $this->coletarDados();
$this->gerarArquivo($dados);
}
}❌ Ruim:
class GeradorDeRelatorio {
public function gerar(): void {
$conexao = new PDO(...);
$stmt = $conexao->query("SELECT * FROM dados");
...
}
}Veja a pasta /exemplos para implementações completas de cada regra em projetos PHP.
Jeff Bay – Object Calisthenics, no livro The ThoughtWorks Anthology
Artigo: Object Calisthenics – William Durand
Contribuições são bem-vindas! Sinta-se à vontade para abrir issues ou enviar pull requests.