Pular para o conteúdo

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

O — Princípio aberto/fechado (OCP)

Aberto para extensão, fechado para modificação: acrescente comportamento com código novo, sem mexer no que já funciona.

CalculoFrete → Transportadora: usausaCorreios → Transportadora: implementaimplementaJadlog → Transportadora: implementaimplementaNova: Drone → Transportadora: implementaimplementaCalculoFrete — não mudaCalculoFretenão mudaTransportadora — interfaceTransportadorainterfaceCorreiosCorreiosJadlogJadlogNova: Drone — só código novoNova: Dronesó código novo

Arraste para o lado para ver o diagrama inteiro.

CalculoFrete conversa só com a interface. Uma transportadora nova é uma classe nova — o cálculo continua intocado.

A ideia

Bertrand Meyer formulou o princípio em 1988; Martin o popularizou com polimorfismo: em vez de um when que cresce a cada caso novo, o código depende de uma abstração, e cada variação é uma implementação.

Sinais de violação

  • Um when/switch sobre "tipo" repetido em vários lugares.
  • Cada recurso novo exige editar uma classe central testada e estável.

Sem exagero

Não dá para prever todas as extensões. Aplique quando a segunda ou terceira variação aparecer (regra de três): antes disso, um if simples é mais honesto que uma hierarquia imaginária.

No código: antes e depois

✗ AntesKotlin
fun frete(tipo: String, kg: Double): Double = when (tipo) {
  "correios" -> 20 + kg * 2.5
  "jadlog" -> 15 + kg * 3.0
  // cada transportadora nova = editar esta função (e seus testes)
  else -> error("desconhecida")
}
✓ DepoisKotlin
fun interface Transportadora { fun frete(kg: Double): Double }

val correios = Transportadora { kg -> 20 + kg * 2.5 }
val jadlog = Transportadora { kg -> 15 + kg * 3.0 }
val drone = Transportadora { kg -> if (kg <= 2) 30.0 else Double.MAX_VALUE } // novo

class CalculoFrete(private val opcoes: List<Transportadora>) {
  fun maisBarato(kg: Double) = opcoes.minOf { it.frete(kg) }
}

Para incluir o drone, nada que já existia foi editado: só uma nova implementação registrada na lista.

Em resumo

Referências

Continue aprendendo

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