Indicazioni generali

Tra quelli visti, i pattern possibili per le soluzioni sono:

  • Factory Method
  • Abstract Factory
  • Singleton
  • Adapter
  • Composite
  • Decorator
  • Facade
  • Proxy
  • Strategy
  • Template Method

Aspirapolvere e accessori

Immaginate di dover gestire un software di assistenza dove l'utente può trovare informazioni e comprare ricambi per aspirapolvere.
Tutti i modelli di aspirapolvere hanno a disposizione 3 accessori, ma ognuno ha la sua versione dell'accessorio:

  • spazzola
  • filtro
  • sacchetti

La pagina del software deve mostrare i dettagli dell'aspirapolvere, la lista dei suoi accessori con i dettagli, ecc. Le informazioni sono sempre nello stesso formato.

Descrivere che pattern usereste per assicurarvi di mostrare sempre solo le informazioni relative al prodotto. Includendo una breve descrizione del ragionamento e una eventuale rappresentazione del risultato finale.


Ottimizzazione Thumbnail

Immaginate di avere un sito visitato da tanti utenti e ogni utente ha la sua immagine profilo.
Le immagini sono salvate nel loro formato originale in uno spazio di archiviazione in cloud (amazon S3 ad esempio) e vengono tornate quando richieste dall'utente.
Il vostro sito però è cresciuto molto e tornare queste immagini ogni volta comincia a costarvi una fortuna. Soprattutto perché le trasferite con la loro risoluzione originale ogni volta.
Decidete quindi di fare due ottimizzazioni:

  • salvate una versione ottimizzata (thumbnail) a risoluzione ridotta dell'immagine
  • l'immagine richiesta viene salvata in una cache, se per 20 minuti nessuno la richiede più viene rimossa dalla cache.
    Per i nuovi utenti la thumbnail viene salvata già al momento dell'upload, per tutti quelli già registrati prima della modifica viene generata e salvata appena arriva una richiesta dell'immagine profilo.
    Quindi ipoteticamente a un certo punto tutte le immagini profilo avranno una thumbnail e non sarà più necessario fare la conversione in tempo reale.

Abbiamo quindi i seguenti casi:

thumbnail_exercize.excalidraw.png

Descrivere che design pattern usereste per risolvere la situazione descritta sopra, e la soluzione ottenuta.
Indizi:

  • attualmente avete già il servizio che prende e torna un'immagine dallo store (parte più a destra del diagramma)
  • a un certo punto la conversione della thumbnail (parte centrale del diagramma) potrebbe non servire più. Da tenere separata come logica?
  • potrebbe essere necessario usare lo stesso pattern più di una volta
  • non è un decorator

Preventivatore

Dovete costruire un preventivatore. Questo preventivatore è diviso in diverse sezioni, ogni sezione può contenere settosezioni e/o elementi base (accessori, servizi, ecc):

  • macchina base e accessori (sezione)
    • configurazione base (sottosezione)
      • macchina (elemento)
      • accessorio1 (elemento)
      • accessorio2
      • accessorio3
    • accessori extra (sottosezione)
      • accessorio4
      • accessorio5
  • servizi aggiuntivi: (sezione)
    • garanzie aggiuntive (sottosezione)
      • garanzia estesa (elemento)
      • riparazione internazionale (elemento)
    • assistenza telefono h24 (elemento)
  • trasporto (sezione)
    • corriere1 (elemento)
    • imballaggio2 (elemento)

Ogni sezione/sottosezione/elemento può avere una quantità e uno sconto. Gli elementi base derivano da un listino e hanno un prezzo base di partenza.
Il software deve mostrare per ogni sezione/sottosezione il suo prezzo base e il prezzo applicato lo sconto.
Il prezzo base di una sezione/sottosezione è dato dalla somma dei prezzi base dei suoi elementi o sottosezioni. Il prezzo scontato è calcolato usando come base la somma dei prezzi scontati delle sue sottosezioni e elementi, sulla quale poi viene applicato lo sconto della sezione.
Il software mostra poi un costo totale con e senza sconti applicati

Scegliere e descrivere un pattern che vi permetta di gestire i calcoli in modo semplice e scalabile, in modo da poter aggiungere e modificare le sezioni in futuro senza dover cambiare la logica di calcolo.


Azienda e ruoli

Una azienda è composta da Empoyee, ognuno dei quali vede le sue attività da fare su un portale web.
Un Engineer è un tipo di Employee che riceverà dei task di sviluppo.
Un AdministrativeManager è un Engineer che fa da capoufficio, amministra e alloca le risorse.
Un ProjectManager è un Engineer che fa da capoprogetto, verifica i progressi di un determinato progetto, assegna compiti e priorità.
In alcuni casi un Engineer può essere sia capoufficio che capoprogetto.

Nel software che fornisce le attività da fare per ognuna di queste figure vengono tornate le attività da svolgere durante la giornata.

Descrivere il design pattern utilizzato per gestire questo tipo di struttura (nome e scopo generale) e la soluzione, includendo una breve descrizione del ragionamento e una eventuale rappresentazione del risultato finale.


TypeORM

State sviluppando una libreria che consenta all'utente di definire la struttura di dei dati e salvarli in un database a scelta. E' possibile scegliere tra diversi database che già avete predisposto, inoltre un utente può anche decidere implementare la logica per usarne uno non ancora compatibile.
La libreria permette di configurare il database scelto, e per lo scopo di questo esercizio mette a disposizione solo due metodi:

  • find(params) permette di eseguire una query sul database usando dei parametri di ricerca
  • create(data) permette di salvare un nuovo dato

params e data sono nello stesso formato indipendentemente dal tipo di database scelto.

I requisiti della libreria sono:

  • esporre una interfaccia unica a prescindere dal tipo di database
  • poter passare da un tipo di database ad un altro cambiando solo la configurazione iniziale
  • dare la possibilità di integrare altri database in futuro, a prescindere che sia l'autore della libreria o l'utilizzatore a sviluppare l'integrazione

Possiamo immaginare quindi due parti di codice: una libreria base e più integrazioni, una per ogni tipo di database.

Descrivere quale o quali design pattern facilitano la creazione di questa libreria, spiegando brevemente le operazioni chiave del flusso di query e create e se sono di competenza della libreria base o dell'integrazione.


Ancora Preventivatore

E' passato un anno da quando avete sviluppato il preventivatore sopra.
Vi viene chiesto di andare ad aggiornare un unico file excel su Google Drive ogni volta che un ordine viene aggiunto, modificato o eliminato. Ad ogni ordine corrisponde una riga.
La libreria che vi permette di scrivere su Drive lavora a basso livello, per ogni dato che dovete andare a scrivere vi serve il link del file (sempre lo stesso), il nome del foglio (sempre lo stesso), le coordinate su cui lavorare, e infine i dati da scrivere.
Ogni ordine ha il suo codice univoco, e deve rimanere all'oscuro del fatto che lo state esportando su Drive.
Possiamo riassumere i passaggi delle 3 operazioni da svolgere:

  • Aggiunta ordine
    • trovare le coordinate della prima riga vuota del foglio
    • trasformare i dati dell'ordine in una rappresentazione a tabella
    • scrivere i dati nella riga
  • Modifica ordine
    • trovare le coordinate della riga che nella prima cella ha il codice dell'ordine modificato
    • trasformare i dati dell'ordine in una rappresentazione a tabella
    • scrivere i dati nella riga
  • Eliminazione ordine
    - trovare le coordinate della riga che nella prima cella ha il codice dell'ordine modificato
    - eliminare la riga
    Inoltre per ognuna di queste operazioni bisogna autenticarsi, richiedere l'accesso al file, gestire gli errori, ecc.

Bisogna tenere presente che ci sono diverse parti del software dove possono essere lanciate queste operazioni.
Quale design pattern vi viene in aiuto per implementare quanto descritto?