Lidando com parâmetros obrigatórios em JavaScript

Lidando com parâmetros obrigatórios em JavaScript
Flavio Henrique de Souza Almeida
Flavio Henrique de Souza Almeida

Compartilhe

Introdução

Imagem de destaque #cover

É 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:

Banner promocional da Alura, com um design futurista em tons de azul, apresentando o texto

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

Flavio Henrique de Souza Almeida
Flavio Henrique de Souza Almeida

Flávio é desenvolvedor e instrutor, focado no desenvolvimento com Angular e procurando conciliar o frontend com o backend. Palestrou em conferências como QCON e MobileConf. É autor do best-seller "Cangaceiro JavaScript". Além da sua graduação e MBA em TI, também é graduado em Psicologia, aplicando os aprendizados desta área no desenvolvimento de software e de aplicações web.

Veja outros artigos sobre Front-end