Opgave: WoodPellets (Part 1)


Dette er den første opgave i opgave-serien WoodPelletsShop.


Baggrunds historie:

Pga Putins invasion i Ukraine er energi priserne på himmelflugt, herunder priserne på træpiller. En lille gruppe investore har opkøbt en større mængde træpiller fra de oversøiske lande og de er på vej til Danmark med fragtskibe. Derfor ønsker investorene hjælp fra os til hurtigt, at lave en hjemmeside til salg af disse træpiller. Siden skal være simpel, men indeholde alle relevente oplysninger om træpiller og lagerstatus. Det skal desuden være muligt at kunne oprette sig som kunde på siden samt oprette en ordre på en palle træpiller. Det er ikke nødvendigt at kunne købe flere typer træpiller på samme ordre.

Efter den første "brainstorm" og diskusion med Produkt Owner (investorerne) er vi blevet enige om at starte implementeringen af første prototype med følgende klassediagram:







Step 1 (Project: WoodPelletsShop)
Opret et nyt projekt i Visual Studio af typen "Console" med navnet: "WoodPelletsShop"

 

Step 2 (Class WoodPellet)
Tilføj en ny klasse: WoodPellet, med de i klassediagrammet viste Properties og det statiske class-field: nextId.
Der skal også oprettes en constructor til initialisering af alle alle Properties (undtaget Id der skal initialiseres med nextId++ - så nextId og Id automatisk optælles ved oprettelse hvert nyt WoodPellet objekt) samt en overdefinering af ToString( ) metoden så objekterne kan udskrives til consolen.

 

Step 3 (Class Program)
Afprøv at der kan oprettes og udskrives et WoodPellet objekt til konsollen (main-metoden i class Program).

Hint: using WoodPelletsShop


Step 4 (Class Address)
Tilføj klassen: Address, så den både kan benyttes som type til property DeleveryAddress i class Order og property Address i class Customer
Husk constructor og ToString( ) metoderne!

Overvej: Skal class Address have et Id og nextId? - hvis ikke, hvorfor er det ikke nødvendigt?


Step 5 (Class Customer)
Tilføj klassen: Customer.
Husk at tilføje den statiske nextId , propertyen Address af typen Address samt construktor og ToString( ) metoder.

 

Step 6 (Class Program)
Afprøv at der kan oprettes og udskrives et Customer objekt til konsollen (main-metoden i class Program).

 

Step 7 (Class Order)
Tilføj klassen Order.
Bemærk: Associeringerne (relationerne) mellem klasserne Order og WoodPellet (WoodPellet) og mellem Order og Customer (Customer) samt mellem Order og Address (DeleveryAddress) implementeres som properties af de respektive typer.

Bemærk: Properties OrderDate og DeleveryDate er ef typerne DateOnly - et alternativ vil være typen DateTime (men så var der også tid med: year, month, day, hours, minutes, seconds) eller mere simpelt bare en string. Fordelen ved DateOnly og DateTime er, at de indeholder metoder så man kan "regne" med dem og fx bestemme antal dage mellem OderDate og DeleveryDate.

 

Step 8 (Class Program)
Afprøv at der kan oprettes og udskrives et Order objekt (main-metoden i class Program).
Bemærk: Hvis der oprettes en ordre på en palle træpiller vil lagerbeholdningen ikke nedskrives automatisk - det gør vi senere i class OrderRegister.


Nu har vi styr på de simple "model-klasser" og skal nu tilføre noget funktionalitet via Register-klasserne, der kommer til at indeholde objekterne af WoodPellet, Customer og Order

 

Step 9 (Class WoodPelletsRegister)
Tilføj klassen WoodPelletRegister.

a) Tilføj den "composite" relation der er mellem WoodPelletsRegister og WoodPellet. Det gøres med et class-field (static) woodPelletsList af typen List<WoodPellet>

private static List<WoodPellet> woodPelletsList = new List<WoodPellet>();

b) Tilføj den statiske metode AddWoodPellet(WoodPellet woodPellet). Metoden skal tage et WoodPellet objekt som argument og tilføje (Add) til listen woodPelletsList:

public static void AddWoodPellet(WoodPellet woodPellet)
{
woodPelletsList.Add(woodPellet);
}

c) Tilføj den overdefinerede statiske metode AddWoodPellet(string brand, string quality, string size, double price, string energy, string humidity, int stock, string info) der opretter et nyt WoodPellet objekt og initialisere det med værdierne givet ved argumenterne til metoden, samt tilføjer (Add'er) objektet til listen:

public static void AddWoodPellet(string brand, string quality, string size, double price, string energy, string humidity, int stock, string info)
{
woodPelletsList.Add(new WoodPellet(brand, quality, size, price, energy, humidity, stock, info));
}

d) Tilføj den statiske metode RemoveWoodPelletById(int id). Metoden skal fjerne WoodPellet objektet med det givne Id fra listen:

public static WoodPellet RemoveWoodPelletById(int id)
{
foreach (WoodPellet woodPellet in woodPelletsList)
{
if (woodPellet.Id == id)
{
woodPelletsList.Remove(woodPellet);
return woodPellet;
}
}

return null;
}

Bemærk: Metoden returnerer det slettede WoodPellet objekt eller null, hvis der ikke findes et objekt med det givne Id - (Overvej: hvorfor?)
Bemærk: Metoden kunne alternativt være void eller returnere en boolean (true, hvis objektet er slettet og false, hvis der ikke er slettet et objekt).
Bemærk: Hvis der ikke er et return lige efter Remove(woodPellet) skal der være et break! - (Overvej hvorfor? - Hint: hvad sker der med listen når et element slettes?!)

 

e) Tilføj den statiske metode GetWoodPellets( ) der returnere listen woodPelletsList af WoodPellet objekter.


f) Tilføj den statiske metode GetWoodPelletById(int id) der returnere WoodPellet objektet med det givne Id eller null, hvis det ikke findes.


g) Ekstra (svært) Tilføj metoden GetAllWoodPelletsByBrand(string brand), metoden skal returnere en ny liste med alle objekter af det givne Brand
Hint:
Opret en ny lokal tom liste tempList af WoodPellet objekter. Brug en foreach løkke til at gennemløbe woodPelletsList og tilføj alle objekter der er af det givne Brand til tempList. Efter gennemløbet returneres den temporære (midlertidige) liste.


h) Ekstra (Svært) Tilføj metoden RemoveWoodPelletsByBrand(string brand), metoden skal slette alle objekter af det givne Brand fra listen woodPelletsList.
Hint: Opret en ny lokal tom liste tempList af WoodPellet objekter. Brug en foreach løkke til at gennemløbe woodPelletsList og tilføj alle objekter der ikke er af det givne Brand til tempList. Efter gennemløbet assignes (tildeles, sættes lig med) woodPelletsList til tempList (Overvej: hvorfor? - hvad sker der med den gamle liste?)

 

Step 9 (Class Program)
Afprøv alle metoderne i class WoodPelletsRegister.

 

Step 10 (Class OrderRegister)
Tilføj klassen OrderRegister.

a) Tilføj den "composite" relation der er mellem OrderRegister og Order. Det gøres med et class-field (static) orderList af typen List<Order>

private static List<Order> orderlist = new List<Order>();

b) Tilføj den statiske metode GetOrders( ) der returnere listen orderList af Order objekter.

 

c) Tilføj den statiske metode AddOrder(WoodPellet woodPellet, Customer custumer, int amount, DateOnly orderDate, DateOnly deleveryDate, Address deleveryAddress). Metoden skal oprette et nyt Order objekt, hvis der er træpiller nok på lager og nedskrive lageret med det antal der indgår i ordren. Metoden skal returnere true, hvis ordren er oprettet og false, hvis der ikke var paller nok på lager.

public static Boolean AddOrder(WoodPellet woodPellet, Customer custumer, int amount, DateOnly orderDate, DateOnly deleveryDate, Address deleveryAddress)
{
if (woodPellet.Stock >= amount) {
woodPellet.Stock -= amount;
orderlist.Add(new Order(woodPellet, custumer, amount, orderDate, deleveryDate, deleveryAddress));
return true;
}
return false;
}


Step 11 (Class Program)
Afprøv metoderne i class OrderRegister.



Ekstra Ekstra:

Step 12 (Class OrderRegister)
Tilføj metoderne fra klassediagrammet til klassen OrderRegister.

Step 13 (Class Program)
Afprøv de nye metoder.

Step 14 (Class CustomerRegister)
Tilføj klassen CustomerRegister med alle metoderne vist i diagrammet.

Step 15 (Class Program)
Afprøv de metoderne i class CustomerRegister.

Step 16 - ?
Find selv på flere udvidelser, fx metoder til at tilføje paller til lager af en givet træpille (eller en egentlig klasse lager med lokation osv) ......


God fornøjelse!
Henrik Høltzer