Dieta

Sviluppare un'applicazione che consenta di gestire la dieta tramite il calcolo dei valori nutritivi.

L'applicazione deve permettere di definire le materie prime, di utilizzarle come ingredienti per delle ricette, di gestire prodotti confezionati e menù.

Tutte le classi devono trovarsi nel package "diet".

R1 - Materie Prime

Il sistema interagisce principalmente tramite la classe Food.

Per definire una materia prima, si utilizza il metodo defineRawMaterial() che riceve come parametri il nome, le kilo-calorie, le proteine, i carboidrati e i grassi, tutti riferiti a 100 grammi di materia prima. Si può assumere che il nome delle materie prima sia univoco.

Per avere informazioni sulle materie prime, si utilizza il metodo rawMaterials() che restituisce la collezione delle materie prime in ordine alfabetico. Per ottenere le informazioni su una specifica materia prima ci si avvale del metodo getRawMaterial() che riceve come parametro il nome e restituisce la materia prima corrispondente.

Gli elementi restituiti dai due metodi precedenti implementano l'interfaccia NutritionalElement che definisce i metodi getName(), getCalories(), getProteins(), getCarbs(), getFat(). Le calorie sono espresse in KCal, mentre proteine, carboidrati e grassi sono espressi in grammi.
Inoltre l'interfaccia definisce il metodo booleano per100g() che indica se il valori nutritivi sono espressi per 100 grammi di elemento oppure esprimono un valore assoluto.
Nel caso delle materie prime i valori nutritivi sono espressi sempre per 100 grammi.

R2 - Prodotti

È possibile considerare anche prodotti preconfezionati (ad esempio un cono gelato). I prodotti vengono definiti tramite il metodo defineProduct() della classe Food che riceve come parametri il nome, le kilo-calorie totali, le proteine, i carboidrati e i grassi che esprimono i valori complessivi per il prodotto (ovvero non per 100 g). Si può assumere che il nome del prodotto sia univoco.

Per avere informazioni sui prodotti si utilizza il metodo products() della classe Food che restituisce la collezione dei prodotti in ordine alfabetico. Per otterenere le informazioni su uno specifico prodotto ci si avvale del metodo getProduct() della classe Food che riceve come parametro il nome e restituisce il prodotto corrispondente.

Gli elementi restituiti dai due metodi precedenti implementano l'interfaccia NutritionalElement (descritta al punto precedente); i valori sono espressi per prodotto intero, perciò il metodo per100g(), in tal caso, restituisce false.

R3 - Ricette

Le materie prime possono essere combinate come ingredienti di ricette. Per definire una ricetta viene utilizzato il metodo createRecipe() che riceve come parametro il nome della ricetta, che può essere considerato unico.

Le ricette sono rappresentate da oggetti di classe Recipe che permettono di aggiungere ingredienti tramite il metodo addIngredient() che riceve come parametri il nome di una materia prima e la sua quantità in grammi.

La classe Recipe implementa l'interfaccia NutritionalElement e i valori nutrizionali sono espressi per 100 grammi.

Per avere informazioni sulle ricetta si utilizza il metodo recipes() della classe Food che restituisce la collezione delle ricetta in ordine alfabetico. Per ottenere le informazioni su una specifica ricetta ci si avvale del metodo getRecipe() che riceve come parametro il nome e restituisce la ricetta corrispondente. Entrambi i metodi restituiscono le ricette sotto forma di NutritionalElement.

Il metodo toString() della classe Recipe restituisce una stringa che riporta gli ingredienti uno per per riga, con il formato "Materiale : ###.#" dove Materiale è il nome del materiale e ###.# è la quantità. Le righe sono tutte terminate dal carattere '\n' e gli ingredienti devono comparire nell'ordine in cui sono stati aggiunti alla ricetta.

R4 - Menù

Il menù è composto sia da porzioni di ricette sia da prodotti preconfezionati.

Un nuovo menù è creato tramite il metodo createMenu() che accetta come parametro il nome (unico) del menù.

I menù sono rappresentati dalla classe Menu che permette di aggiungere una porzione di una ricetta tramite il metodo addRecipe() che riceve come parametro il nome di una ricetta e la dimensione della porzione in grammi. Per aggiungere un prodotto preconfezionato, la classe Menu offre il metodo addProduct() che riceve come parametro il nome del prodotto.

Inoltre la classe Menu implementa l'interfaccia NutritionalElement; in questo caso i valori restituiti si riferiscono al totale del menu.