Lidando com parâmetros obrigatórios em JavaScript
Introdução
É bem comum o desenvolvedor JavaScript precisar testar a obrigatoriedade de parâmetros das funções que cria. Vejamos um exemplo:
function moveFrame(from, to) { if(!from) throw new Error('Parâmetro "from" obrigatório'); if(!to) throw new Error('Parâmetro "to" obrigatório');
// realiza a lógica de mudança de frame
Excelente, mas se nossa função tiver cinco parâmetros obrigatórios, teremos que repetir cada instrução if
cinco vezes. A boa notícia é que podemos utilizar um recurso adicionado no ES2015 (ES6) já consolidado entre os navegadores para tornar nosso código menos verboso e elegante. Primeiro, vejamos que recurso é este:
Parâmetro padrão (default parameter)
Temos como exemplo a função temporizador
que executará uma função depois da quantidade de milissegundos definida pelo usuário:
function temporizador(fn, milissegundos) { setTimeout(fn, milissegundos); }
temporizador(() => console.log('Função executada!'), 3000);
Muito bom, mas o programador terá que passar toda vez, como último parâmetro, a quantidade de milissegundos. Que tal adotarmos um valor padrão caso o parâmetro não tenha sido definido?
Alterando nossa função temos:
function temporizador(fn, milissegundos) {
milissegundos = milissegundos || 1000;
setTimeout(fn, milissegundos); }
// não passamos mais o tempo temporizador(() => console.log('Função executada!'));
O valor de milissegundos
será 1000 caso seu valor seja avaliado como false
. Em JavaScript, undefined, null, ""
e 0
são avaliados como false
.
No entanto, podemos simplificar bastante nosso código atribuindo um valor padrão diretamente no parâmetro, novidade do ES2015 (ES6):
function temporizador(fn, milissegundos = 1000) {
setTimeout(fn, milissegundos); }
temporizador(() => console.log('Função executada!'));
Na própria declaração do parâmetro milissegundos
atribuímos seu valor padrão, que só será considerado caso ele tenha sido omitido. Muito mais enxuto, não?
Agora que já entendemos como valores padrões são definidos na linguagem JavaScript, podemos utilizar esse recurso para tornar parâmetros obrigatórios.
Parâmetros obrigatórios com ajuda de parâmetros padrão
Vamos voltar para a função moveFrame
, apresentada no início do artigo:
function moveFrame(from, to) { if(!from) throw new Error('Parâmetro "from" obrigatório'); if(!to) throw new Error('Parâmetro "to" obrigatório');
// realiza a lógica de mudança de frame }
Podemos simplificá-la bastante estruturando nosso código da seguinte maneira:
function obrigatorio(parametro) { throw new Error(\`O parâmetro ${parametro} é obrigatório.\`); }
function moveFrame(from=obrigatorio('from'), to=obrigatorio('to')) {
// realiza a lógica de mudança de frame }
Reparem que o valor padrão dos dois parâmetros da função moveFrame
é a chamada da função obrigatorio
, isto é, ela só será chamada se alguns dos parâmetros não forem definidos. A única responsabilidade de obrigatorio
será lançar uma exceção indicando a obrigatoriedade dos parâmetros. Inclusive, essa mesma função pode ser reutilizada por outras funções do sistema.
Conclusão
Combinar diferentes recursos para criar uma nova funcionalidade faz parte da arte da programação de todo Cangaceiro JavaScript! Aliás, a Alura possui cursos de front-end que podem ajudá-lo a ficar ainda melhor em JavaScript e outros tópicos.
Twitter: @flaviohalmeida