Track
/
JavaScript
JavaScript
/
Esercizi
/
Maestro di lasagna
Maestro di lasagna

Maestro di lasagna

Esercizio di apprendimento

Introduzione

Una funzione è un blocco di codice organizzato e riutilizzabile che serve a eseguire un'azione. In JavaScript ci sono diversi modi per definire le funzioni. Qui vedremo le dichiarazioni di funzione e le espressioni di funzione. Altre possibilità, come le funzioni freccia, saranno trattate in altri concetti.

Dichiarazione di funzione

Il modo standard per definire una funzione in JavaScript è la dichiarazione di funzione, chiamata anche definizione di funzione o istruzione di funzione.

È composta dalla parola chiave function, dal nome della funzione e da un elenco di parametri separati da virgole tra parentesi tonde (()). Segue il corpo della funzione (l'insieme di istruzioni che definisce cosa fa la funzione) racchiuso tra parentesi graffe ({}).

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

In JavaScript, per chiamare una funzione si scrive il nome della funzione seguito da una coppia di parentesi che contengono gli argomenti.

someName(arg1, arg2, arg3);

Parametri

Quando lavori con i parametri all'interno del corpo della funzione, tieni presente i possibili effetti collaterali.

  • I valori dei tipi di dati primitivi sono immutabili. Il valore originale non viene mai modificato da ciò che accade all'argomento nel corpo della funzione.
  • Per tutti gli altri valori (oggetti, array, funzioni), una riassegnazione non modifica il valore originale. Se però modifichi un argomento di questo tipo (ad esempio aggiungi una chiave a un oggetto), modifichi anche il valore originale che è stato passato.

Per impostazione predefinita, in JavaScript tutti i parametri definiti nella dichiarazione di funzione sono opzionali. Se fornisci meno argomenti di quanti sono i parametri, gli argomenti mancanti saranno undefined all'interno della funzione, vedi Null e Undefined. In molti casi ha senso assegnare un valore predefinito più adatto di undefined. Puoi farlo specificando i parametri predefiniti direttamente nella definizione della funzione.

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

L'istruzione return

Un'istruzione return termina l'esecuzione della funzione e specifica un valore da restituire a chi ha chiamato la funzione. Una funzione può avere più istruzioni return.

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

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

Il valore restituito da una funzione può essere memorizzato in una variabile.

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

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

Il risultato di una funzione che non restituisce alcun valore o che non ha un'istruzione return è undefined. In JavaScript non esistono return impliciti.

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

nakedReturn(1);
// => undefined

function noReturn(a) {
  a * 2;
}

noReturn(1);
// => undefined

In JavaScript puoi restituire esattamente un solo valore. Se vuoi passare più informazioni, devi prima combinarle in un'unica entità, di solito in un oggetto o in un array.

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

Espressione di funzione

Una dichiarazione di funzione è un'istruzione a sé stante. A volte però è utile definire una funzione come parte di un'altra espressione, ad esempio in un'assegnazione, come parametro di una funzione (callback) o come valore in un oggetto. Questo si può fare con un'espressione di funzione. Ha la stessa sintassi di una dichiarazione di funzione, con la sola differenza che il nome della funzione può essere omesso per creare una funzione anonima.

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

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

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

Istruzioni

In questo esercizio scriverai ancora un po' di codice per preparare e cucinare la tua splendida lasagna, tratta dal tuo ricettario preferito.

Hai cinque attività. La prima riguarda la cottura vera e propria, le altre quattro riguardano la preparazione perfetta.

1. Stabilire se la lasagna è pronta

Quando hai una lasagna nel forno, vuoi sapere se puoi già tirarla fuori oppure no. Per essere sicuro che la lasagna non bruci nel forno, di solito imposti un timer. A volte però te ne dimentichi.

Scrivi una funzione cookingStatus che accetta come parametro il tempo rimanente sul timer, in minuti. La funzione ha tre possibili risultati.

  • Se il timer mostra 0, dovrebbe restituire 'Lasagna is done.'.
  • Se il timer mostra qualsiasi altro numero, il risultato dovrebbe essere 'Not done, please wait.'.
  • Se la funzione viene chiamata senza un valore per il timer, il risultato dovrebbe essere 'You forgot to set the timer.'.

Il timer non mostrerà mai un valore inferiore a 0.

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

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

2. Stimare il tempo di preparazione

Per la prossima lasagna che preparerai, vuoi essere sicuro di riservare abbastanza tempo per goderti la cucina. Hai già fatto un piano con tutti gli strati che avrà la tua lasagna. Ora vuoi stimare quanto tempo richiederà la preparazione, in base a quel piano.

Implementa una funzione preparationTime che accetta un array di strati e il tempo medio di preparazione per strato, in minuti. La funzione dovrebbe restituire la stima del tempo totale di preparazione in base al numero di strati. Se la funzione viene chiamata senza indicare il tempo medio di preparazione, si dovrebbe assumere 2 minuti.

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

preparationTime(layers);
// => 12

3. Calcolare le quantità di sfoglie e sugo necessarie

Oltre a riservare il tempo, vuoi anche essere sicuro di avere abbastanza sugo e sfoglie per cucinare la lasagna dei tuoi sogni. Per ogni strato di sfoglie della tua lasagna ti serviranno 50 grammi di sfoglie. Per ogni strato di sugo ti serviranno 0,2 litri di sugo.

Definisci la funzione quantities che prende un array di strati come parametro. La funzione determinerà poi la quantità di sfoglie e sugo necessaria per preparare il tuo pasto. Il risultato dovrebbe essere restituito come un oggetto con le chiavi noodles e sauce.

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

4. Aggiungere l'ingrediente segreto

Un po' di tempo fa hai fatto visita a un amico e hai mangiato la lasagna da lui. Era fantastica e aveva qualcosa di speciale. L'amico ti ha mandato la lista degli ingredienti e ti ha detto che l'ultimo elemento della lista è l'«ingrediente segreto» che ha reso il pasto così speciale. Ora vuoi aggiungere anche tu quell'ingrediente segreto alla tua ricetta.

Scrivi una funzione addSecretIngredient che accetta due array di ingredienti come parametri. Il primo parametro è la lista che ti ha mandato il tuo amico, il secondo è la lista di ingredienti della tua ricetta. La funzione dovrebbe aggiungere l'ultimo elemento della lista del tuo amico in fondo alla tua lista. L'array che rappresenta la tua ricetta dovrebbe essere modificato direttamente e la funzione non dovrebbe restituire nulla. Il primo argomento, però, non dovrebbe essere modificato.

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. Ridimensionare la ricetta

Le quantità elencate nel tuo ricettario bastano solo per due porzioni. Dato che la prossima volta vuoi cucinare per più persone, vuoi calcolare le quantità per numeri diversi di porzioni.

Implementa una funzione scaleRecipe che prende due parametri.

  • Un oggetto ricetta che contiene le quantità necessarie per 2 porzioni. Il formato dell'oggetto si vede nell'esempio qui sotto.
  • Il numero di porzioni che vuoi cucinare.

La funzione dovrebbe restituire un oggetto ricetta con le quantità necessarie per il numero di porzioni desiderato. Vuoi però mantenere la ricetta originale. Questo significa che, in questa attività, l'argomento ricetta non dovrebbe essere modificato.

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,
// };
Modifica tramite GitHub Il link si apre in una nuova finestra o scheda
JavaScript Exercism

Vuoi iniziare Maestro di lasagna?

Iscriviti a Exercism per imparare e padroneggiare JavaScript con 37 concetti159 esercizi e il mentoring di persone reali, tutto gratis.