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.
Arraste para o lado para ver o diagrama inteiro.
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/switchsobre "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
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")
} 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
- Dependa de abstrações nos pontos que variam.
- Variações novas = classes novas.
- Elimina switch sobre tipo espalhado pelo código.
- Aplique quando a variação for real, não hipotética.