OTAKU / O manifesto

Capítulo 01 — Núcleo rígido, bordas flexíveis

O Manifesto OTAKU

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.

O

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.

T

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.

A

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.

K

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.

U

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

  1. A complexidade ciclomática por método não pode exceder 5.
  2. Apenas um nível de indentação por método.
  3. Não use a palavra-chave ELSE (cláusulas de guarda ou retorno antecipado).
  4. Nunca use switch/case (polimorfismo, expressões match ou strategy).
  5. Evite números e strings mágicos (constantes ou enums).

OTamanho

  1. Máximo de 50 linhas por classe (apenas o código dentro do corpo da classe).
  2. Máximo de 20 linhas por método (apenas código executável).
  3. Máximo de 10 classes por namespace ou pacote.
  4. Nenhuma classe com mais de duas variáveis de instância.
  5. Métodos com no máximo dois parâmetros.
  6. Construtores com no máximo dois parâmetros.
  7. Interfaces com no máximo dois métodos.

ONomenclatura

  1. Não abrevie; use nomes completos e descritivos.
  2. Métodos booleanos começam com is, has, can ou should.
  3. Nomes de métodos começam com um verbo.
  4. Constantes em UPPER_SNAKE_CASE.
  5. Propriedades e métodos em camelCase.

TModularidade

  1. Coleções de primeira classe: envolva arrays em classes dedicadas.
  2. Um ponto por linha; evite encadeamento de chamadas.
  3. Métodos estáticos proibidos, exceto fábricas e funções puras.
  4. Comandos e consultas separados: sem efeitos colaterais em métodos que retornam valor.
  5. Funções puras quando possível: mesma entrada, mesma saída, sem efeitos colaterais.
  6. Sem estado global ou singletons; injete dependências explicitamente.
  7. Prefira funções pequenas e focadas; extraia quando um método fizer mais de uma coisa.

AProteção

  1. Sem getters, setters ou propriedades públicas; use métodos de comportamento.
  2. Propriedades privadas por padrão; protected apenas para herança de framework.
  3. Classes finais por padrão; a extensão acontece por interfaces.
  4. Herança proibida, exceto classes base de framework; prefira composição.
  5. Valide todas as entradas na fronteira: construtores e métodos públicos.
  6. Falhe rápido: lance exceção assim que uma pré-condição for violada.
  7. Nunca mute parâmetros de entrada; trate-os como imutáveis.

KEfeitos colaterais e falha

  1. Prefira imutabilidade: propriedades readonly, retorne novas instâncias.
  2. Métodos que retornam coleções retornam coleção vazia, nunca null.
  3. Métodos que podem falhar retornam Result/Either ou lançam exceção; nunca null.
  4. Explícito em vez de implícito: sem dependências ocultas, métodos mágicos ou conversões implícitas.
  5. Nunca vaze detalhes de infraestrutura (SQL, HTTP, caminhos de arquivo) no domínio.

UContratos

  1. Envolva todos os primitivos e strings em value objects.
  2. Sem tipos genéricos (mixed, array, object), exceto em métodos explícitos de serialização.
  3. Todo método público é declarado em uma interface.
  4. 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.