Diminuindo a complexidade de múltiplos condicionais com um dicionário de estratégia
Quando você está numa estrada sem qualquer bifurcação, a chance de você errar o caminho é zero. Na medida em que a estrada ganha bifurcações, menores são as chances de você chegar ao seu destino sem se perder pelo caminho.
Uma situação muito parecida acontece enquanto programamos. Quanto mais bifurcações inserimos no código, maior é a chance de ele pegar o caminho errado e causar efeitos indesejados. Uma função que não contém bifurcações é portanto melhor do que uma que contém.
Repare na seguinte função (que pode aparecer na forma de switch/case também):
function getCustomFormControl(type){
if(type == 'time') {
return Timepicker;
} else if(['single_option', 'multiple_option'].includes(type)) {
return Select;
} else if(type === 'phone') {
return PhoneInput;
} else if(type === 'date') {
return Datepicker;
} else if(type === 'zip') {
return ZipInput;
} else {
return Input;
}
}
São seis os possíveis caminhos que o código pode pegar. Se a tarefa já fica mais difícil para o código, ficará certamente mais difícil para o programador que precisar ler essa sequência de condicionais enquanto busca o exato local do código onde deve acomodar sua alteração.
É numa situação exatamente como essa que um objeto plano pode remover as bifurcações e reduzir significativamente a complexidade da função. Veja:
function getCustomFormControl(type){
return {
'time': Timepicker,
'single_choice': Select,
'multiple_choice': Select,
'phone': PhoneInput,
'date': Datepicker,
'zip': ZipInput,
}[type] || Input;
}
O que a segunda versão da função fez foi substituir uma sequência de condições por um dicionário de estratégias indexadas pelo nome de cada uma delas. O resultado é uma relação simples e direta entre variação e estratégia, diminuindo drasticamente o esforço cognitivo necessário para conectá-las.
Saiba mais: Se você gostou dessa dica, certamente vai se interessar em saber como tratar dados em JavaScript de maneira similar ao operador pipe da linha de comando.