OTAKU é um acrônimo, e cada letra é uma restrição. Quarenta regras a tornam mensurável; uma métrica decide se um método é complexo demais para existir.
A filosofia tem núcleo rígido e bordas flexíveis. O núcleo — os cinco pilares e os limites que os operacionalizam — não negocia. As bordas — linguagem, framework, estilo, ferramentas — são livres.
Os cinco pilares têm ordem intencional. Disciplina vem primeiro porque nada sobrevive sem ela. Contratos vêm por último porque são a única coisa que o mundo externo pode ver.
Domine sua Disciplina
Seja rígido consigo mesmo.
Restrição é o único caminho para a liberdade. Complexidade, tamanho e nomes são medidos, não debatidos.
Ferramentas para Composição
Componha como o Unix.
Partes pequenas com entradas e saídas claras. A aplicação é um data pipe e os efeitos colaterais ficam nas bordas.
Blinde o Núcleo
Proteja o coração do negócio.
Dependências apontam apenas para dentro. Entidades e casos de uso nunca conhecem o nome de um framework.
Mantenha a Infraestrutura Silenciosa
Infraestrutura é só um detalhe.
A persistência se comporta como coleção em memória. A falha é explícita; o estado é imutável por padrão.
Linguagem Universal e Contratos
Fale a língua do usuário.
Linguagem ubíqua explícita em contratos design-first. Primitivos são encapsulados; todo método público tem contrato.
A métrica principal
A complexidade ciclomática — a contagem de caminhos independentes de um método, de Thomas J. McCabe — é o instrumento principal da filosofia. Um método com complexidade acima de 5 é rejeitado, por mais legível que pareça. Cinco caminhos já são cinco raciocínios que o leitor precisa sustentar ao mesmo tempo.
Todo o resto da seção de disciplina serve para manter esse número baixo: um nível de indentação, sem ELSE, sem switch/case, cláusulas de guarda, extração. A métrica é mensurável em todas as linguagens deste livro, e cada ecossistema tem uma ferramenta que a reporta.
As quarenta regras
Toda regra tem um limite mensurável. Em caso de dúvida, escolha a opção mais restritiva.
40 regras · 7 grupos · 5 pilares
OComplexidade
- A complexidade ciclomática por método não pode exceder 5.
- Apenas um nível de indentação por método.
- Não use a palavra-chave ELSE (cláusulas de guarda ou retorno antecipado).
- Nunca use switch/case (polimorfismo, expressões match ou strategy).
- Evite números e strings mágicos (constantes ou enums).
OTamanho
- Máximo de 50 linhas por classe (apenas o código dentro do corpo da classe).
- Máximo de 20 linhas por método (apenas código executável).
- Máximo de 10 classes por namespace ou pacote.
- Nenhuma classe com mais de duas variáveis de instância.
- Métodos com no máximo dois parâmetros.
- Construtores com no máximo dois parâmetros.
- Interfaces com no máximo dois métodos.
ONomenclatura
- Não abrevie; use nomes completos e descritivos.
- Métodos booleanos começam com is, has, can ou should.
- Nomes de métodos começam com um verbo.
- Constantes em UPPER_SNAKE_CASE.
- Propriedades e métodos em camelCase.
TModularidade
- Coleções de primeira classe: envolva arrays em classes dedicadas.
- Um ponto por linha; evite encadeamento de chamadas.
- Métodos estáticos proibidos, exceto fábricas e funções puras.
- Comandos e consultas separados: sem efeitos colaterais em métodos que retornam valor.
- Funções puras quando possível: mesma entrada, mesma saída, sem efeitos colaterais.
- Sem estado global ou singletons; injete dependências explicitamente.
- Prefira funções pequenas e focadas; extraia quando um método fizer mais de uma coisa.
AProteção
- Sem getters, setters ou propriedades públicas; use métodos de comportamento.
- Propriedades privadas por padrão; protected apenas para herança de framework.
- Classes finais por padrão; a extensão acontece por interfaces.
- Herança proibida, exceto classes base de framework; prefira composição.
- Valide todas as entradas na fronteira: construtores e métodos públicos.
- Falhe rápido: lance exceção assim que uma pré-condição for violada.
- Nunca mute parâmetros de entrada; trate-os como imutáveis.
KEfeitos colaterais e falha
- Prefira imutabilidade: propriedades readonly, retorne novas instâncias.
- Métodos que retornam coleções retornam coleção vazia, nunca null.
- Métodos que podem falhar retornam Result/Either ou lançam exceção; nunca null.
- Explícito em vez de implícito: sem dependências ocultas, métodos mágicos ou conversões implícitas.
- Nunca vaze detalhes de infraestrutura (SQL, HTTP, caminhos de arquivo) no domínio.
UContratos
- Envolva todos os primitivos e strings em value objects.
- Sem tipos genéricos (mixed, array, object), exceto em métodos explícitos de serialização.
- Todo método público é declarado em uma interface.
- Comentários explicam o porquê e pertencem aos contratos, não às implementações.
Como os pilares se sustentam
Disciplina torna a composição possível: uma classe de 300 linhas não pode ser substituída. Composição torna o núcleo defensável: um monólito não consegue esconder suas dependências. Um núcleo protegido torna a infraestrutura realmente opcional. Contratos são a única razão pela qual tudo isso pode ser verificado de fora.
Remova um pilar e os outros viram cerimônia. Mantenha os cinco e o sistema fica entediante — do jeito que pontes são entediantes.