Trilhas
/
JavaScript
JavaScript
/
Exercícios
/
Mestre da lasanha
Mestre da lasanha

Mestre da lasanha

Exercício de aprendizagem

Introdução

Uma função é um bloco de código organizado e reutilizável usado para executar alguma ação. Existem várias maneiras de definir funções em JavaScript. Aqui vamos ver declarações de função e expressões de função. Outras possibilidades, como arrow functions, serão abordadas em outros conceitos.

Declaração de função

A forma padrão de definir uma função em JavaScript é a declaração de função, também chamada de definição de função ou instrução de função.

Ela consiste na palavra-chave function, no nome da função e em uma lista de parâmetros separados por vírgulas, entre parênteses redondos (()). Em seguida vem o corpo da função (conjunto de instruções que define o que a função faz), envolvido por chaves ({}).

function someName(param1, param2, param3) {
  // ...
}

Em JavaScript, uma função é invocada (chamada) ao escrever o nome da função seguido de parênteses que contêm os argumentos.

someName(arg1, arg2, arg3);

Parâmetros

Ao trabalhar com parâmetros dentro do corpo da função, fique atento a possíveis efeitos colaterais.

  • Valores de tipos de dados primitivos são imutáveis. O valor original nunca é afetado pelo que acontece com o argumento no corpo da função.
  • Para todos os outros valores (objetos, arrays, funções), uma reatribuição não afeta o valor original. Porém, se você modificar um argumento desses (por exemplo, adicionar uma chave a um objeto), isso também modifica o valor original que foi passado.

Por padrão, todos os parâmetros definidos na declaração da função são opcionais em JavaScript. Se você passar menos argumentos do que o número de parâmetros, os argumentos que faltarem serão undefined dentro da função; veja Null e Undefined. Em muitos casos, faz sentido atribuir um valor padrão mais adequado que undefined. Isso pode ser feito especificando parâmetros padrão diretamente na definição da função.

function someName(param1 = defaultValue1, param2 = defaultValue2) {
  // ...
}

Instrução return

Uma instrução return encerra a execução da função e especifica um valor a ser retornado para quem chamou a função. Uma função pode ter várias instruções return.

function checkNumber(num) {
  if (num === 0) {
    return 'You passed 0, please provide another number.';
  }

  return 'Thanks for passing such a nice number.';
}

O valor de retorno de uma função pode ser armazenado em uma variável.

function sum(x, y) {
  return x + y;
}

const total = sum(5, 10);
// => 15

O resultado de uma função que não retorna nenhum valor ou que não tem uma instrução return é undefined. Não existem return implícitos em JavaScript.

function nakedReturn(a) {
  a * 2;
  return;
}

nakedReturn(1);
// => undefined

function noReturn(a) {
  a * 2;
}

noReturn(1);
// => undefined

Em JavaScript, você só pode retornar exatamente um valor. Se você quiser passar mais informações, precisa primeiro combiná-las em uma única entidade, geralmente um objeto ou um array.

function divide(a, b) {
  return {
    quotient: Math.floor(a / b),
    remainder: a % b,
  };
}

Expressão de função

Uma declaração de função é uma instrução independente. Mas às vezes é útil definir uma função como parte de outra expressão, por exemplo, em uma atribuição, como parâmetro de uma função (callback) ou como valor em um objeto. Isso pode ser feito com uma expressão de função. Ela tem a mesma sintaxe de uma declaração de função, só que o nome da função pode ser omitido para criar uma função anônima.

const someFunction = function (param) {
  // ...
};

someOtherFunction(function (param) {
  // ...
});

const obj = {
  someFunction: function (param) {
    // ...
  },
};

Instruções

Neste exercício, você vai escrever mais um pouco de código relacionado a preparar e cozinhar sua lasanha incrível do seu livro de receitas favorito.

Você tem cinco tarefas. A primeira é relacionada ao cozimento em si, as outras quatro são sobre o preparo perfeito.

1. Determine se a lasanha está pronta

Quando você tem lasanha no forno, você quer saber se já pode tirá-la ou não. Para garantir que a lasanha não queime no forno, você normalmente define um timer. Mas às vezes você esquece disso.

Escreva uma função cookingStatus que recebe como parâmetro o tempo restante no timer em minutos. A função tem três resultados possíveis.

  • Se o timer mostrar 0, ela deve retornar 'Lasagna is done.'.
  • Se o timer mostrar qualquer outro número, o resultado deve ser 'Not done, please wait.'.
  • Se a função for chamada sem um valor de timer, o resultado deve ser 'You forgot to set the timer.'.

O timer nunca vai mostrar um valor abaixo de 0.

cookingStatus(12);
// => 'Not done, please wait.'

cookingStatus();
// => 'You forgot to set the timer.'

2. Estime o tempo de preparo

Para a próxima lasanha que você vai preparar, você quer garantir que tem tempo suficiente reservado para poder curtir o cozimento. Você já fez um plano com todas as camadas que sua lasanha vai ter. Agora você quer estimar quanto tempo o preparo vai levar com base nisso.

Implemente uma função preparationTime que recebe um array de camadas e o tempo médio de preparo por camada em minutos. A função deve retornar a estimativa do tempo total de preparo com base no número de camadas. Se a função for chamada sem fornecer o tempo médio de preparo, deve-se assumir 2 minutos.

const layers = ['sauce', 'noodles', 'sauce', 'meat', 'mozzarella', 'noodles'];
preparationTime(layers, 3);
// => 18

preparationTime(layers);
// => 12

3. Calcule as quantidades necessárias de macarrão e molho

Além de reservar o tempo, você também quer garantir que tem molho e macarrão suficientes para cozinhar a lasanha dos seus sonhos. Para cada camada de macarrão na sua lasanha, você vai precisar de 50 gramas de macarrão. Para cada camada de molho na sua lasanha, você vai precisar de 0,2 litro de molho.

Defina a função quantities que recebe um array de camadas como parâmetro. A função vai então determinar a quantidade de macarrão e molho necessária para fazer sua refeição. O resultado deve ser retornado como um objeto com as chaves noodles e sauce.

quantities(['sauce', 'noodles', 'sauce', 'meat', 'mozzarella', 'noodles']);
// => { noodles: 100, sauce: 0.4 }

4. Adicione o ingrediente secreto

Um tempo atrás, você visitou um amigo e comeu lasanha lá. Estava incrível e tinha algo especial. O amigo te mandou a lista de ingredientes e disse que o último item da lista é o "ingrediente secreto" que deixou a refeição tão especial. Agora você quer adicionar esse ingrediente secreto à sua receita também.

Escreva uma função addSecretIngredient que recebe dois arrays de ingredientes como parâmetros. O primeiro parâmetro é a lista que seu amigo te mandou e o segundo é a lista de ingredientes da sua própria receita. A função deve adicionar o último item da lista do seu amigo ao final da sua lista. O array que representa sua receita deve ser modificado diretamente e a função não deve retornar nada. No entanto, o primeiro argumento não deve ser modificado.

const friendsList = ['noodles', 'sauce', 'mozzarella', 'kampot pepper'];
const myList = ['noodles', 'meat', 'sauce', 'mozzarella'];

addSecretIngredient(friendsList, myList);
// => undefined

console.log(myList);
// => ['noodles', 'meat', 'sauce', 'mozzarella', 'kampot pepper']

5. Ajuste a receita

As quantidades listadas no seu livro de receitas só rendem lasanha suficiente para duas porções. Como você quer cozinhar para mais pessoas na próxima vez, você quer calcular as quantidades para diferentes números de porções.

Implemente uma função scaleRecipe que recebe dois parâmetros.

  • Um objeto de receita que contém as quantidades necessárias para 2 porções. O formato do objeto pode ser visto no exemplo abaixo.
  • O número de porções que você quer cozinhar.

A função deve retornar um objeto de receita com as quantidades necessárias para o número desejado de porções. No entanto, você quer manter a receita original. Isso significa que, nesta tarefa, o argumento da receita não deve ser modificado.

const recipe = {
  noodles: 200,
  sauce: 0.5,
  mozzarella: 1,
  meat: 100,
};

scaleRecipe(recipe, 4);
// =>
// {
//   noodles: 400,
//   sauce: 1,
//   mozzarella: 2,
//   meat: 200,
// };

console.log(recipe);
// =>
// {
//   noodles: 200,
//   sauce: 0.5,
//   mozzarella: 1,
//   meat: 100,
// };
Editar via GitHub O link abre em uma nova janela ou aba
JavaScript Exercism

Tudo pronto para começar Mestre da lasanha?

Crie sua conta no Exercism para aprender e dominar JavaScript com 37 conceitos159 exercícios e mentoria humana de verdade, tudo de graça.