From bd8ccd8fd7b05f64a5d74db8009cd3b459a37ca2 Mon Sep 17 00:00:00 2001 From: Leonardo Ledda Date: Mon, 2 Dec 2024 15:50:55 +0100 Subject: [PATCH] Add Design Patterns exam simulation Signed-off-by: Leonardo Ledda --- .../design-pattern/shapes.png | Bin 0 -> 55176 bytes .../24-25/design-pattern/index.md | 7 ++ .../24-25/design-pattern/simulazione/fish.md | 77 ++++++++++++++ .../24-25/design-pattern/simulazione/index.md | 9 ++ .../design-pattern/simulazione/oracolo.md | 85 +++++++++++++++ .../24-25/design-pattern/simulazione/pizza.md | 90 ++++++++++++++++ .../design-pattern/simulazione/shapes.md | 97 ++++++++++++++++++ content/its-web-fullstack/24-25/index.md | 6 ++ 8 files changed, 371 insertions(+) create mode 100644 content/assets/its-web-fullstack/design-pattern/shapes.png create mode 100644 content/its-web-fullstack/24-25/design-pattern/index.md create mode 100644 content/its-web-fullstack/24-25/design-pattern/simulazione/fish.md create mode 100644 content/its-web-fullstack/24-25/design-pattern/simulazione/index.md create mode 100644 content/its-web-fullstack/24-25/design-pattern/simulazione/oracolo.md create mode 100644 content/its-web-fullstack/24-25/design-pattern/simulazione/pizza.md create mode 100644 content/its-web-fullstack/24-25/design-pattern/simulazione/shapes.md create mode 100644 content/its-web-fullstack/24-25/index.md diff --git a/content/assets/its-web-fullstack/design-pattern/shapes.png b/content/assets/its-web-fullstack/design-pattern/shapes.png new file mode 100644 index 0000000000000000000000000000000000000000..96f53afc775b84e0cb048e8877de1e31b3659746 GIT binary patch literal 55176 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 u6~gNN(UWn2aSsF|{$L=gor`q2@jtur51*^+jx{ +} + +abstract class Fish { + pos: Position + + constructor(pos: Position) { + this.pos = pos + } + + tryMove(newPos: Position): void { + if (this.canMoveTo(newPos)) { + this.move(newPos) + } + } + + abstract canMoveTo(pos: Position): boolean + + move(newPos: Position): void { + this.pos = newPos + } +} + +class BigFish extends Fish { + canMoveTo(pos: Position): boolean { + return !(pos.fish instanceof BigFish) + } + + move(pos: Position, ocean: Ocean): void { + if (pos.fish instanceof LittleFish) { + ocean.fishList.remove(pos.fish) + } + + this.pos = pos + } +} + +class LittleFish extends Fish { + canMoveTo(pos: Position, ocean: Ocean): boolean { + return !pos.fish || pos.fish instanceof LittleFish + } +} +``` diff --git a/content/its-web-fullstack/24-25/design-pattern/simulazione/index.md b/content/its-web-fullstack/24-25/design-pattern/simulazione/index.md new file mode 100644 index 0000000..5bbebb6 --- /dev/null +++ b/content/its-web-fullstack/24-25/design-pattern/simulazione/index.md @@ -0,0 +1,9 @@ +--- +title: Simulazione prova d'esame +tags: + - design-pattern + - its +date: 2024-12-02 +--- + +Il codice sorgente per i punti 1 e 2 è disponibile [qui](https://github.com/LeddaZ/design-pattern-code). diff --git a/content/its-web-fullstack/24-25/design-pattern/simulazione/oracolo.md b/content/its-web-fullstack/24-25/design-pattern/simulazione/oracolo.md new file mode 100644 index 0000000..b79cdc5 --- /dev/null +++ b/content/its-web-fullstack/24-25/design-pattern/simulazione/oracolo.md @@ -0,0 +1,85 @@ +--- +title: 1. Oracolo +tags: + - design-pattern + - decorator + - its +date: 2024-12-02 +--- + +Una classe Oracolo espone un metodo per restituire un numero casuale (`stampaNumero`). + +È richiesto di estendere il comportamento in modo da: + +- Stampare un messaggio di benvenuto prima di tornare il numero; +- Stampare un messaggio di saluto alla fine; +- Dare la possibilità di invertire i messaggi a runtime. + +Descrivere il design pattern utilizzato (nome e scopo generale) e la soluzione, includendo una breve descrizione del ragionamento e una eventuale rappresentazione del risultato finale. + +## Soluzione + +Si può risolvere questo problema con il pattern **Decorator**, che permette di estendere i comportamenti di un oggetto esistente creandone uno nuovo. In questo modo è possibile estendere le proprietà ed i comportamenti già implementati senza modificare l'oggetto originale. + +Il **Decorator** è strutturato in questo modo: + +- **Component**: l'interfaccia che definisce i metodi comuni a tutti gli oggetti; +- **Concrete Component**: l'implementazione del componente di base; +- **Base Decorator**: il decoratore di base ha l'oggetto da estendere tra le sue proprietà e implementa o estende il componente di base; +- **Concrete Decorator**: aggiunge comportamenti estendendo il decoratore di base; +- **Client**: si occupa di creare il componente di base e passarlo al decoratore. + +### Esempio di implementazione + +[`oracolo.ts`](https://github.com/LeddaZ/design-pattern-code/blob/master/src/oracolo.ts) + +```ts +interface IOracolo { + stampaNumero(): void +} + +class Oracolo implements IOracolo { + stampaNumero(): void { + console.log(Math.random()) + } +} + +abstract class OracoloDecorator implements IOracolo { + protected oracolo: IOracolo + + constructor(oracolo: IOracolo) { + this.oracolo = oracolo + } + + stampaNumero(): void { + this.oracolo.stampaNumero() + } +} + +class OracoloBenvenuto extends OracoloDecorator { + stampaNumero(): void { + console.log("Benvenuto!") + super.stampaNumero() + } +} + +class OracoloArrivederci extends OracoloDecorator { + stampaNumero(): void { + super.stampaNumero() + console.log("Arrivederci!") + } +} + +const oracolo = new Oracolo() +const oracoloBenvenuto = new OracoloBenvenuto(oracolo) +const oracoloArrivederci = new OracoloArrivederci(oracoloBenvenuto) +oracoloArrivederci.stampaNumero() +``` + +#### Output di esempio + +``` +Benvenuto! +0.07690864486562954 +Arrivederci! +``` diff --git a/content/its-web-fullstack/24-25/design-pattern/simulazione/pizza.md b/content/its-web-fullstack/24-25/design-pattern/simulazione/pizza.md new file mode 100644 index 0000000..06e86ba --- /dev/null +++ b/content/its-web-fullstack/24-25/design-pattern/simulazione/pizza.md @@ -0,0 +1,90 @@ +--- +title: 3. Pizza +tags: + - design-pattern + - adapter + - its +date: 2024-12-02 +--- + +Stai sviluppando un software per il menù di una pizzeria. Ogni pizza ha un prezzo base e una serie di aggiunte disponibili che l'utente può scegliere. Ogni aggiunta ha un prezzo opzionale diverso e le scelte sono molte e potenzialmente variabili nel tempo. + +Descrivi quale design pattern useresti per risolvere il problema motivando la risposta. Fornisci anche una rappresentazione in codice, pseudo-codice o diagramma delle classi della soluzione proposta. + +## Soluzione + +Come per l'[oracolo](./oracolo), si può risolvere questo problema usando il **Decorator**. In questo modo è possibile aggiungere un numero illimitato di ingredienti senza modificare la classe base `Pizza`. + +### Esempio di implementazione + +[`pizza.ts`](https://github.com/LeddaZ/design-pattern-code/blob/master/src/pizza.ts) + +```ts +interface IPizza { + name: string + price: number +} + +class Pizza implements IPizza { + name: string + price: number + + constructor(name: string, price: number) { + this.name = name + this.price = price + } +} + +abstract class PizzaDecorator implements IPizza { + protected pizza: IPizza + + constructor(pizza: IPizza) { + this.pizza = pizza + } + + get name(): string { + return this.pizza.name + } + + get price(): number { + return this.pizza.price + } +} + +class PizzaWithMushrooms extends PizzaDecorator { + get name(): string { + return `${this.pizza.name} + mushrooms` + } + + get price(): number { + return this.pizza.price + 1.5 + } +} + +class PizzaWithWholeWheat extends PizzaDecorator { + get name(): string { + return `${this.pizza.name} + whole wheat` + } + + get price(): number { + return this.pizza.price + 2 + } +} + +const pizza = new Pizza("Margherita", 5) +console.log("Base pizza: " + pizza.name + " - €" + pizza.price) + +const pizza2 = new PizzaWithMushrooms(pizza) +console.log("Pizza with additions: " + pizza2.name + " - €" + pizza2.price) + +const pizza3 = new PizzaWithWholeWheat(pizza2) +console.log("Pizza with additions: " + pizza3.name + " - €" + pizza3.price) +``` + +#### Output di esempio + +``` +Base pizza: Margherita - €5 +Pizza with additions: Margherita + mushrooms - €6.5 +Pizza with additions: Margherita + mushrooms + whole wheat - €8.5 +``` diff --git a/content/its-web-fullstack/24-25/design-pattern/simulazione/shapes.md b/content/its-web-fullstack/24-25/design-pattern/simulazione/shapes.md new file mode 100644 index 0000000..99ad6bd --- /dev/null +++ b/content/its-web-fullstack/24-25/design-pattern/simulazione/shapes.md @@ -0,0 +1,97 @@ +--- +title: 2. Shapes +tags: + - design-pattern + - adapter + - its +date: 2024-12-02 +--- + +![shapes](../../../../assets/its-web-fullstack/design-pattern/shapes.png) +Abbiamo: + +- Una classe astratta `Shape` con i metodi indicati; +- Due implementazioni specifiche (`Triangle` e `Rectangle`) che implementano il metodo `display()` per stampare la forma; +- Una classe `Circle` derivante da una libreria che ha solo il metodo `show()` per stampare la forma; +- Un client che già lavora con `Shape` di tipo triangolo e rettangolo, ci viene chiesto di aggiungere anche la possibilità di gestire cerchi, come procedete? + +```ts +class Position { + readonly x: number + readonly y: number + constructor(x: number, y: number) { + this.x = x + this.y = y + } +} + +abstract class Shape { + protected position: Position = new Position(0, 0) + getPosition(): Position { + return this.position + } + + setPosition(position: Position) { + this.position = position + } + + abstract display() +} + +class Triangle extends Shape { + display() { + // logica di stampa del triangolo + } +} + +class Rectangle extends Shape { + display() { + // logica di stampa del rettangolo + } +} + +class Circle { + show(x: number, y: number) { + //logica per stampa del cerchio + } +} + +// logica del client +const shapes: Shape[] = [] + +shapes.push(new Triangle()) +shapes.push(new Rectangle()) +// fare in modo di poter aggiungere anche cerchi + +shapes.forEach((shape) => shape.display()) +``` + +Descrivere il design pattern utilizzato (nome e scopo generale) e la soluzione, includendo una breve descrizione del ragionamento e una eventuale rappresentazione del risultato finale. + +## Soluzione + +Per risolvere il problema si può utilizzare il design pattern **Adapter**, che permette a oggetti incompatibili tra loro di comunicare. È strutturato in questo modo: + +- **Client**: la logica esistente; +- **Client Interface**: interfaccia che le classi devono usare per comunicare con il client; +- **Service**: la classe che non può essere utilizzata allo stato attuale e necessita un adattamento; +- **Adapter**: la classe che consente l'utilizzo del Service con la logica esistente. Riceve istruzioni dal client e le traduce in qualcosa che la classe incompatibile può gestire. + +Si può creare un nuovo oggetto che estende `Shape` e richiama il metodo `show()` di `Circle`, in modo da poterlo utilizzare allo stesso modo del metodo `display()` di `Triangle` e `Rectangle`. + +### Esempio di implementazione + +```ts +class CircleAdapter extends Shape { + private circle: Circle + + constructor(circle: Circle) { + super() + this.circle = circle + } + + display() { + circle.show(this.getPosition().x, this.getPosition().y) + } +} +``` diff --git a/content/its-web-fullstack/24-25/index.md b/content/its-web-fullstack/24-25/index.md new file mode 100644 index 0000000..0a0d39c --- /dev/null +++ b/content/its-web-fullstack/24-25/index.md @@ -0,0 +1,6 @@ +--- +title: 2° anno (2024-2025) +tags: + - its +date: 2024-12-02 +---