Pular para o conteúdo

Boas práticas e padrões · Princípios SOLID · 4 min de leitura

I — Princípio da segregação de interfaces (ISP)

Nenhum cliente deve depender de métodos que não usa: prefira várias interfaces pequenas a uma interface gorda.

Multifuncional → ImpressoraMultifuncional → ScannerMultifuncional → FaxTela de impressão → Impressora: só issosó issoApp de digitalizar → Scanner: só issosó issoMultifuncional — implementa tudoMultifuncionalimplementa tudoImpressora — imprimir()Impressoraimprimir()Scanner — digitalizar()Scannerdigitalizar()Fax — enviarFax()FaxenviarFax()Tela de impressãoTela de impressãoApp de digitalizarApp de digitalizar

Arraste para o lado para ver o diagrama inteiro.

Cada cliente enxerga apenas a fatia de que precisa; a impressora simples nem precisa saber que fax existe.

O problema

Uma interface com quinze métodos obriga implementações a escrever métodos vazios ou que lançam exceção, e acopla clientes a mudanças que não lhes dizem respeito (recompilar, re-testar, mocks enormes).

A solução

Divida por papel (role interfaces). Uma classe pode implementar várias; cada cliente pede apenas a que usa. Em Kotlin e TypeScript, interfaces pequenas também tornam os fakes de teste triviais.

No código: antes e depois

✗ AntesTypeScript
interface Dispositivo {
  imprimir(doc: Doc): void;
  digitalizar(): Imagem;
  enviarFax(numero: string, doc: Doc): void;
}
class ImpressoraSimples implements Dispositivo {
  imprimir(doc: Doc) { /* ok */ }
  digitalizar(): Imagem { throw new Error('não suportado'); }
  enviarFax() { throw new Error('não suportado'); }
}
✓ DepoisTypeScript
interface Impressora { imprimir(doc: Doc): void }
interface Scanner { digitalizar(): Imagem }

class ImpressoraSimples implements Impressora {
  imprimir(doc: Doc) { /* ok */ }
}
class Multifuncional implements Impressora, Scanner {
  imprimir(doc: Doc) { /* ... */ }
  digitalizar(): Imagem { /* ... */ return new Imagem(); }
}
// a tela de impressão depende só de Impressora
function telaImpressao(dev: Impressora) { /* ... */ }

Nenhuma classe precisa fingir que sabe fazer algo, e o teste da tela usa um fake de um método só.

Em resumo

Referências

Continue aprendendo

Todos os temas de boas práticas e padrões →