SOLID: Interface Segregation Principle (Parte 3)

·2 min de leitura

O “I” do SOLID

O Interface Segregation Principle (ISP) costuma ser resumido assim:

Ninguém deve ser forçado a depender de métodos que não usa.

Isso combina muito com o que vimos no LSP (Parte 2): contratos honestos evitam “implementações mentirosas”.

O sintoma mais comum: “DeusInterface”

Você cria uma interface gigante (um UserRepositoryInterface com CRUD completo, buscas específicas, exportação, auditoria, cache…) e tenta fazer o mundo inteiro implementar aquilo. O resultado é previsível: metade dos métodos vira throw new Exception('not implemented') ou implementação vazia.

Isso é cheiro forte de violação de ISP (e também de LSP, dependendo do caso).

Exemplo na prática: segregar contratos

Ruim: um contrato gigante

<?php

declare(strict_types=1);

interface UserModuleInterface
{
    public function authenticate(string $email, string $password): bool;

    public function register(array $data): int;

    public function exportCsv(): string;

    public function sendWelcomeEmail(int $userId): void;
}

Explicação: um componente que só autentica não deveria “enxergar” exportação CSV.

Melhor: interfaces coesas

<?php

declare(strict_types=1);

interface Authenticator
{
    public function authenticate(string $email, string $password): bool;
}

interface UserRegistrar
{
    public function register(UserDraft $draft): UserId;
}

interface UserExporter
{
    public function toCsv(): string;
}

interface Notifier
{
    public function sendWelcome(UserId $id): void;
}

Explicação: cada cliente depende só do que precisa. Você ainda pode ter uma classe concreta que implementa várias interfaces, mas o acoplamento fica no lugar certo.

ISP não é “1 método por interface”

Segregar demais também custa: explode arquivos, dificulta navegação e pode virar ruído.

Bom critério: coesão de uso, “quem chama isso junto?” e “quem precisa disso separado?”.

Relação com arquitetura

ISP aparece muito ao desenhar ports (Ports & Adapters): portas pequenas costumam envelhecer melhor do que “API única do sistema”.

Conclusão

ISP é sobre dependências mínimas e significativas. Menos força implementações a mentir; mais clareza sobre papéis.