Princípios SOLID

Separar razões para mudar, proteger contratos e escolher dependências que permitem evolução.

TLDR

Perguntar sobre esta página

ChatGPTClaudePerplexityGrokGeminiCopiar e abrirDeepSeekCopiar e abrir

Responsabilidades e extensão

  • SRP: uma razão para mudar. Pontos guarda a regra, PontuacoesFicheiro o formato e escrita, PontosVista a apresentação. Não é uma classe por método; sem variação independente, não separes.
  • OCP: o cliente estável não muda com a variação. Controlador chama Comando.executar(); a montagem regista alternativas. switch fechado e pequeno pode continuar mais claro.

Substituição e interfaces

LSP: o subtipo cumpre as promessas da base. Sem pré-condições mais fortes, sem pós-condições mais fracas, com invariantes e evolução preservados.

Se setLargura promete manter a altura, Quadrado mutável que muda ambas quebra o cliente. O cliente fixa largura 4 e altura 3 e espera área 12; com o quadrado, o segundo setter repõe ambos em 3 e a área obtida é 9. Relação matemática não autoriza herança de API mutável; Forma.area() sem setters resolve.

ISP: interfaces por cliente. Controlador de teclas depende de Entrada; desenho e som ficam em Vista e Audio. Um objeto pode implementar as três. Métodos vazios ou não suportados pedem investigação, não uma interface por operação.

Dependências da regra

DIP: a regra depende do contrato; detalhes implementam-no. Para guardar pontos, Pontuacoes.guardar(int) esconde CSV, SQL e caminhos. A montagem escolhe o adaptador.

interface Pontuacoes { void guardar(int valor); }

class FimDeJogo {
    private final Pontuacoes pontuacoes;
    FimDeJogo(Pontuacoes p) { pontuacoes = p; }
    void concluir(int valor) {
        if (valor < 0) throw new IllegalArgumentException("pontos negativos");
        pontuacoes.guardar(valor);
    }
}
FimDeJogo --> Pontuacoes <-- FicheiroPontuacoes
                         <-- PontuacoesMemoria

Setas de dependência de código; em execução, a chamada vai para o objeto montado. Passar o colaborador no construtor é injeção; escolher contratos adequados para a regra é inversão. Receber uma classe concreta no construtor injeta o colaborador, mas sem contrato não há inversão de dependências.

Coesão e acoplamento

  • Coesão: junta num módulo o que colabora na mesma responsabilidade.
  • Acoplamento: mede as dependências de um módulo em relação a outros; prefere dependências necessárias e explícitas.

Pacotes e reutilização

  • Agrupa o que se reutiliza e muda em conjunto; evita ciclos entre pacotes, que impedem alterar ou reutilizar um pacote isolado.
  • Pacotes com muitos clientes estendem-se por contrato; pacotes sem reutilização podem continuar concretos.

Antes de abstrair

Nomeia a mudança esperada, o cliente que deve ficar estável e o contrato comum das alternativas; compara a complexidade nova com a dependência removida.

Contratos e exemplos completos.

À tua maneira

Aparência

Modo de cor
Tema
Cor de destaque

Leitura

Fonte de leitura

Álgebra, lógica e uma ideia de cada vez.

Código

Fonte do código

Navegação

Cursor de leitura, sem edição. h, j, k, l movem; / pesquisa nesta página. v seleciona caracteres; V seleciona linhas; y copia. Tab permite destacar ou comentar. Espaço ou Enter abre blocos recolhíveis. Nos cartões, h, j, k, l mudam o foco.

CSS personalizado

Ativa uma sugestão ou guarda o teu CSS. Só muda este navegador.

Usa --page, --text e --accent para acompanhar o tema.

Seletores e recuperação

.site-header, .prose, .course-card, [data-reading-history], [data-playground] e .page-actions.

Abre a aparência com a tecla vírgula ou no rodapé. Se o CSS esconder os controlos, abre esta página sem CSS personalizado.

Pesquisar

Escreve para pesquisar em todo o site.

para escolher · Enter para abrir · Esc para fechar

Copiar fórmula

A cópia automática não está disponível. Copia o LaTeX abaixo.

Pesquisar nesta página

Enter procura · n / N repetem · Esc cancela. Ctrl / Cmd K pesquisa todo o site.

Atalhos de teclado

Clica numa tecla para a mudar. Esc cancela. Backspace desativa.

PesquisarCtrl / Cmd K

Os atalhos não interferem enquanto escreves. Tab e Enter funcionam sempre.