Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Seconda revisione capitolo Design Patterns #213

Draft
wants to merge 63 commits into
base: main
Choose a base branch
from
Draft
Changes from 52 commits
Commits
Show all changes
63 commits
Select commit Hold shift + click to select a range
558c4e9
docs: #79 Inizio capitolo Design Patterns
Livio74 Jan 24, 2024
06756f0
chore: rimosso piramide.png
Cadienvan Jan 27, 2024
ec08192
Merge remote-tracking branch 'upstream/main' into add/design-patterns
Cadienvan Jan 27, 2024
3a97905
chore: rimosso piramide.png
Cadienvan Jan 27, 2024
3e0c694
Merge remote-tracking branch 'origin/main' into add/design-patterns
Cadienvan Jan 27, 2024
55712b4
Merge remote-tracking branch 'upstream/add/design-patterns' into add/…
Cadienvan Jan 27, 2024
1018d73
chore: riviste alcune porzioni di contenuto + aggiunte note
Cadienvan Jan 27, 2024
0004e20
chore: completamento Inizio capitolo Design Patterns
Livio74 Feb 4, 2024
7514232
chore: dependency Injection
Livio74 Feb 4, 2024
f4e1515
chore: dependency Injection
Livio74 Feb 4, 2024
4df0fda
chore: dependency Injection
Livio74 Feb 4, 2024
2ff61e6
feat: aggiustamenti dei primi paragrafi
Cadienvan Feb 6, 2024
15abf4b
Correzione su uso UML
Livio74 Feb 15, 2024
03e4e46
sul sito Refactoring Guru
Livio74 Feb 15, 2024
d168957
correzione di forma
Livio74 Feb 15, 2024
4b70784
Correzione di forma
Livio74 Feb 15, 2024
ce6ba33
Correzione di forma
Livio74 Feb 15, 2024
ff72a87
Correzione di forma
Livio74 Feb 15, 2024
54135b1
Correzione sulla Facilità di riuso e test del software
Livio74 Feb 15, 2024
500655b
Correzione di forma
Livio74 Feb 15, 2024
6288a7f
Spesso design pattern e programmazione ad oggetti sono strettamente l…
Livio74 Mar 10, 2024
e0cc1b2
aggiorna frase sulle soluzioni provate e testate
Livio74 Mar 10, 2024
309181c
sintesi migliore sulla comprensione dei design pattern
Livio74 Mar 10, 2024
83649af
meglio utilizzarli o no?
Livio74 Mar 10, 2024
32a1056
È importante sottolineare che non ci sono dei vincoli stringenti che …
Livio74 Mar 10, 2024
3162d4a
è possibile applicarli singolarmente, oppure applicarne più di uno
Livio74 Mar 10, 2024
9b685e4
update Principi SOLID
Livio74 Mar 10, 2024
cbf6bfa
In questo libro li definiremo brevemente evitando di listarli in mani…
Livio74 Mar 16, 2024
9167432
Le altre tipologie definite dalla GOF ...
Livio74 Mar 16, 2024
e357818
Abstract Factory
Livio74 Mar 16, 2024
3311775
Builder
Livio74 Mar 16, 2024
e7d10a8
Prototype
Livio74 Mar 16, 2024
757b221
Singleton
Livio74 Mar 16, 2024
5066b74
Products and Factories
Livio74 Mar 16, 2024
e012542
In generale dato un problema non sempre è semplice attribuirgli un de…
Livio74 Mar 16, 2024
2a4628a
Chain of responsibility
Livio74 Mar 16, 2024
a128f06
Adapter
Livio74 Mar 16, 2024
53f7283
Iterator
Livio74 Mar 16, 2024
03e6c62
Come visibile compare una struttura davanti al nostro client ...
Livio74 Mar 16, 2024
144f366
Model-View-Controller
Livio74 Mar 16, 2024
4549c22
meglio utilizzare i pattern o no
Livio74 Mar 26, 2024
64c716c
scomposizione problemi
Livio74 Mar 26, 2024
e724574
Pattern comportamentali
Livio74 Mar 26, 2024
d5c61a5
Proxy ed esempi
Livio74 Mar 26, 2024
c3c1020
Flyweight ed esempi
Livio74 Mar 26, 2024
79157ec
Façade
Livio74 Mar 26, 2024
bc98a90
Decorator
Livio74 Mar 26, 2024
51f06c7
Pattern strutturali
Livio74 Mar 26, 2024
fd7fda2
Esempio generico di costruzione oggetto
Livio74 Mar 26, 2024
5734606
Builder
Livio74 Mar 26, 2024
2c21e2d
Prototype
Livio74 Mar 26, 2024
7ee5a44
Può portare ad aumentare la complessità del codice ...
Livio74 Apr 7, 2024
5640cff
Apply suggestions from code review
Cadienvan Jun 25, 2024
15b0649
Apply suggestions from code review
Cadienvan Jun 25, 2024
ae547b3
Apply suggestions from code review
Cadienvan Jun 25, 2024
06d7b0a
eliminata frase come concordato con Serena e Michael
Livio74 Aug 24, 2024
d20784e
Aggiunta esempio dal sito Refactoring Guru
Livio74 Aug 24, 2024
ec3e331
far sparire la lista degli appunti sotto
Livio74 Aug 24, 2024
5ca6ae6
frase di riassunto in fondo come da accordi con Michael
Livio74 Aug 24, 2024
f10e0a6
Facciamo riferimento al Sito Refactoring Guru
Livio74 Aug 24, 2024
48b128e
Introduzione all'argomento e riferimento a Refactoring Guru
Livio74 Sep 6, 2024
f54f474
Apply suggestions from code review
Cadienvan Sep 16, 2024
f82c60c
Merge branch 'main' into add/design-patterns
Cadienvan Sep 16, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
126 changes: 126 additions & 0 deletions docs/it/design-pattern.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@
## Design Patterns

Il concetto di Design Patterns è definito su [Wikipedia](https://it.wikipedia.org/wiki/Design_pattern) come:

> Una soluzione progettuale generale ad un problema ricorrente.

Questo concetto, derivante da quello similare esistente in architettura, è comparso per la prima volta nel libro [Design Patterns - Elementi per il riuso di software ad oggetti](https://it.wikipedia.org/wiki/Design_Patterns) i cui autori, detti [Gang of Four](<https://it.wikipedia.org/wiki/Gang_of_Four_(scrittori)>), sono 4 importanti figure del panorama informatico internazionale: Erich Gamma, Richard Helm, Ralph Johnson e John Vlissides.

Per capire meglio il concetto possiamo dire che ogni design pattern identifica un problema generalizzato da risolvere e associa ad esso una soluzione; questo generalmente viene rappresentato tramite uno schema UML, di supporto per comprendere meglio quanto proposto.

Spesso design pattern e programmazione ad oggetti sono strettamente legati poiché i primi vengono descritti e spiegati utilizzando gli oggetti.
Questo non vuol dire che, ad esempio, nella programmazione funzionale non vengano utilizzati, ma naturalmente necessitano di strutture differenti; in alcuni casi, a dire il vero, alcuni Design Patterns sono più facilmente implementabili con quest'ultimo paradigma.

Internet ha molte risorse valide sull'argomento, fra queste possiamo citare:

- [Refactoring Guru](https://refactoring.guru/design-patterns/) un sito molto dettagliato e che spiega i diversi Design Pattern evidenziando per ognuno vantaggi e svantaggi e confrontandoli con gli altri. Sono presenti esempi in codice acquistabili separatamente in tutti i linguaggi.
- [Il canale Youtube di Christopher Okhravi](https://www.youtube.com/@ChristopherOkhravi)
- [Design Patterns su Wikipedia Italiano](https://it.wikipedia.org/wiki/Design_pattern)
- [Design Patterns su Wikipedia Inglese](https://en.wikipedia.org/wiki/Design_pattern)

Il libro della Gang of Four identifica un elenco iniziale di design pattern, ognuno dei quali ha un nome che identifica la soluzione al problema generico che andrà a risolvere.
Generalmente chi sta sviluppando una certa porzione di codice per implementare una o più funzionalità potrebbe "riconoscere" un design pattern durante l'analisi di un problema specifico che si sta cercando di risolvere e decidere di applicarlo, ottenendo una serie di vantaggi, tra cui:
Cadienvan marked this conversation as resolved.
Show resolved Hide resolved

- **Facilità di riuso e test del software**: ogni design pattern è stato studiato e catalogato di modo da essere una soluzione (quasi) universale ad ogni problema analogo a quello descritto; di conseguenza è possibile utilizzare un'implementazione simile in diverse porzioni di codice. All'interno della letteratura, questi pattern sono solitamente accompagnati da suggerimenti e metodologie per eseguire del testing, il che rende il processo di scrittura dei test automatizzati più semplice ed efficace.
- **Miglior comprensione del codice**: essendo conosciuti e avendo un nome inequivocabile, è possibile riconoscere i design pattern e creare un linguaggio comune quando si documenta e sviluppa il software.
- **Soluzioni provate e testate**: essendo frutto dell'esperienza congiunta di più persone che sviluppano, e avvalorati da diversi casi d'uso nel corso degli anni, i design pattern difficilmente nascondono delle sorprese, e la loro adozione può garantire una soluzione _battle-tested_ e dimostrata rispetto ad un problema specifico.

Naturalmente, come ogni cosa nel mondo del software, i design pattern comportano degli svantaggi, tra cui:

1. Può portare ad aumentare la complessità del codice, per cui andrebbero utilizzati con parsimonia per non creare sovrastrutture non necessarie.
2. Per essere applicati nel modo migliore, i design pattern necessitano la conoscenza di alcune assunzioni, che però si maturano spesso tramite l'esperienza e la letteratura.
3. Le prestazioni spesso non coincidono con l'adozione di design pattern, in quanto lo scopo di questi ultimi è di risolvere un problema, non necessariamente in maniera ottimizzata.

**Come sempre, alla domanda se sia meglio utilizzarli o no, risponderemo con un cauto: _dipende_.**

In generale, non è sempre facile attribuire ad un problema esistente un dato design pattern e applicarlo; a volte la soglia tra l'applicazione di un pattern e un altro può essere molto sottile. Per questa ragione, è consigliato scomporre un problema complesso in altri più piccoli, utilizzando la metodologia nota come _divide et impera_, che rende più semplice individuare dei pattern specifici per i singoli problemi scomposti.
A volte invece questa scomposizione non è possibile e, nel caso, si può comunque fare il refactoring scegliendo quello più simile o anche quello più conveniente.
Cadienvan marked this conversation as resolved.
Show resolved Hide resolved

**È importante sottolineare che non ci sono dei vincoli stringenti che ne impongono l'utilizzo;** \
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Questa frase, seppur sensata, non mi convince. Non so se sia per il fatto che, a tutti gli effetti, è un riassunto di quanto sopra, ma non mi convince del tutto.. Cioè più che altro direi che come molti altri aspetti della programmazione, anche i design pattern sono una best practise, e non una imposizione..

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  • Concordo per la prima parte sulla tua frase "Non sempre, però, è possibile scomporre ..."
  • Per la frase che non ti convince sono d'accordo , prova a proporre la modifica , per me ci siamo

Cadienvan marked this conversation as resolved.
Show resolved Hide resolved
è possibile applicarli singolarmente, oppure applicarne più di uno; chiaramente una aderenza maggiore implica la facilità nel riconoscerli da parte di altri/e dev che conoscono l'argomento.

Generalmente dopo un refactoring, la nostra applicazione sarà più aderente ai [principi di sviluppo software SOLID](https://it.wikipedia.org/wiki/SOLID) il che implica il riuso e la facilità di test, come accennato in precedenza.\
Come viene definito nel design pattern possiamo definire il design pattern vero e proprio che ne demarca i suoi confini ed il client che definisce tutta la parte esterna ad esso che vi interagisce.\
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Frase non chiara. Cosa intendevi?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

provo a spiegarlo meglio , magari puoi darmi anche qualche spunto.
la riga 40,41 indica che non è obbligatorio applicarli ma generalmente se vengono applicati la nostra applicazione aderirà meglio ai principi SOLID ad esempio al Principio di singola responsabilità e quindi una classe avrà una sola responsabilità sul cosa fa oppure al Principio aperto/chiuso e la nostra classe sarà aperta per essere estensa, ma chiusa alle modifiche proprio per modificare il comportamento del software.
La riga 43 indica possiamo suddividere la parte che ci interessa dove identifichiamo un pattern in client , cioè quella parte che interagisce con quella che ci interessa e il pattern vero e proprio che riusciamo ad identificare con le classi che lo compongono eccetto appunto il client che viene considerato ma è esterno. In generale si cerca di non modificarlo

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Questa non l'ho capita nemmeno io, neanche dopo la spiegazione ahahahah intendi che c'è una separazione tra l'applicazione del pattern e il modo con cui vi si interagisce? Se sì, credo forse che sia una finezza non necessaria, seppur vera. Nel caso la si voglia mantenere, la frase va rivista ma non saprei come..

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

E' proprio una separazione logica strutturale , prendete ad esempio la spiegazione del pattern builder su Refactoring guru (https://refactoring.guru/design-patterns/builder) , andate sul capitolo structure la classe denominata client è la parte "esterna" che con le 4 righe sopra non dovrebbe subire cambiamenti. Il client è la parte che interagisce col nostro pattern. Spero di essere stato più chiaro

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Continua a sembrarmi una frase molto contorta.. Per spiegarne il significato sarebbe necessario andare troppo nel dettaglio, personalmente farei che toglierla.. @serenasensini ?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Concordo con Michael. Forse la toglierei, per non aggiungere complessità ad un argomento già abbastanza astratto!

Il vantaggio principale dell'utilizzo implica che le modifiche apportate tendono a non cambiare sensibilmente il client.

In questo libro li definiremo brevemente evitando di listarli in maniera accademica; questo capitolo sarà infatti un modo per approcciarsi al tema e approfondire successivamente, grazie anche all'esistenza di numerose risorse, che li dettagliano in maniera più puntuale.

Oltre al libro sui Design Patterns in questione ne sono stati introdotti altri che vedremo successivamente.\
Cadienvan marked this conversation as resolved.
Show resolved Hide resolved
Il libro della Gang of Four (GOF) suddivide i Design Pattern in 3 categorie:

1. Patterns creazionali
2. Patterns strutturali
3. Patterns comportamentali

## Patterns creazionali

I Patterns creazionali definiscono uno schema progettuale che in particolare si concentra sulla creazione degli oggetti che concorrono a risolvere un determinato problema.
In questo contesto indichiamo come _prodotti_ gli oggetti creati utilizzando un oggetto generalmente denominato Factory (tradotto in _fabbrica_) che, al suo interno, ne definisce la logica di costruzione, la quale risulta isolata dall'esterno.
Le altre tipologie definite dalla GOF, che sono la strutturale e la comportamentale, si distiguono da questa perché presuppogono già l'esistenza di tutti gli oggetti coinvolti.

I pattern creazionali definiti dalla GOF sono:

- Factory Method : definisce, nella classe Factory, uno o più metodi detti appunto factory methods che creano i nostri oggetti prodotto.
- Abstract Factory : serve a creare famiglie (possibilmente) fisse di oggetti "prodotto" sempre utilizzando una interfaccia/classe chiamata appunto Abstract factory dove anche gli oggetti "prodotto" sono generici (anch'essi utilizzano un'interfaccia o classe astratta).
- Builder : definisce una particolare classe factory che consente di costruire oggetti complessi step-by-step. È quindi possibile produrre diverse tipologie e rappresentazioni di un oggetto componendolo in base alle proprie necessità.
- Prototype : permette di costruire oggetti clonando oggetti già esistenti. Per esempio, JavaScript utilizza proprio il concetto di _prototype_ per estendere gli oggetti. Nota a margine: parliamo proprio degli oggetti e non delle classi che sono state introdotte successivamente.
- Singleton : permette di costruire un oggetto garantendo che ne verrà creata una sola istanza

Come già detto i confini non sono ben definiti per cui, ad esempio, un oggetto complesso potrebbe essere creato tramite un builder e, se una parte dovesse richiedere una clonazione con un successivo raffinamento, sarà necessario utilizzare anche un Prototype che si occuperà della parte di clonazione.
Se non ci fosse la possibilità di effettuare una separazione netta si potrebbe utilizzare il Builder o il Prototype.
Cadienvan marked this conversation as resolved.
Show resolved Hide resolved

## Patterns strutturali

I Pattern strutturali definiscono uno schema progettuale atto a risolvere problematiche inerenti alla struttura degli oggetti, di modo da renderli flessibili ed efficienti; capiremo meglio questo concetto andando a vedere brevemente tutti i design pattern appartenenti a questa categoria.

I pattern strutturali definiti dalla GOF sono:

- Adapter: è un pattern che traduce le chiamate eseguite da una interfaccia in chiamate per la comunicazione con un'altra. Fornisce una soluzione astratta al problema della interoperabilità fra interfacce. Nella vita reale abbiamo ad esempi gli adattatori delle spine.
Cadienvan marked this conversation as resolved.
Show resolved Hide resolved
- Bridge: è un design pattern che separa una astrazione dalla sua separazione. Questo avviene separando l'interfaccia dalla sua implementazione potendo ad esempio cambiare facilmente l'implementazione. Un esempio molto utilizzato è il JDBC o in generale i driver dei database.
Cadienvan marked this conversation as resolved.
Show resolved Hide resolved
- Decorator: è un pattern che permette di aggiungere funzionalità attraverso il wrapping, cioè incapsulando un oggetto esistente.
Di conseguenza il nuovo oggetto avrà sia le funzionalità dell'oggetto originale che le nuove funzionalità aggiunte tramite decoratore.
- Façade: è un pattern che permette la semplificazione di un insieme complesso di classi o parti di un sistema, tramite la creazione di classi _di facciata_ che espongano solo le funzionalità più utili.
- Flyweight: è un pattern che permette di ottimizzare l'utilizzo della memoria di un sistema tramite il riutilizzo di membri comuni tra molti oggetti, senza doverne istanziare costantemente di nuovi. Ad esempio, se ho la necessità di realizzare 1.000 oggetti della classe _Dog_ che, tramite un metodo _Move_, modificano la propria posizione, è molto più sensato separare la classe _Dog_ in due classi, _Dog_ e _MovingDog_, collezionando nella prima le informazioni _statiche_, come razza e nome, mentre nella seconda le informazioni di _stato_ o _dinamiche_, come la posizione.
- Proxy: si interpone tra un oggetto (di solito di servizio) e il mondo esterno con cui comunica, utilizzando la stessa interfaccia, ma alterandone il comportamento. Un esempio sono i Proxy server che agiscono da intermezzo tra la propria macchina e il web, alterando e verificando ogni chiamata in ingresso e in uscita da essi, garantendo anonimato e un buon grado di sicurezza.

Come visibile (dove?), compare una struttura davanti al nostro client che può variare in ogni design pattern. Ad esempio, nell'adapter la struttura cambia l'interfaccia (in quanto struttura della classe), nel Bridge cambia l'implementazione, nel Facade cambia ancora l'interfaccia che risulta più semplice.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Non ho capito benissimo la frase, puoi rispiegarla?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Probabilmente l'idea era creare uno schema o prenderne uno già fatto e farci riferimento per spiegare meglio ma poi mi sono dimenticato , Non so se per ora meglio toglierlo e rimetterlo una volta aggiunto questo schema

Cadienvan marked this conversation as resolved.
Show resolved Hide resolved

## Patterns comportamentali

I Pattern comportamentali definiscono uno schema progettuale che in particolare risolve problematiche di comportamento degli oggetti definiti nel pattern. Generalmente questo comportamento si riflette in particolare sugli algoritmi e sulle responsabilità degli oggetti stessi.

I pattern comportamentali definiti dalla GOF sono:

- Chain of responsibility: questo pattern permette di separare gli oggetti che invocano richieste dagli oggetti che le gestiscono. In pratica viene definita una catena di oggetti dove la richiesta viene propagata finchè uno di quelli implementati non decide di gestirla. Ogni elemento della catena viene chiamato _handler_.
- Command: permette di isolare il codice che esegue una azione più o meno complessa dal client che la esegue oppure prendere una richiesta, memorizzarla in modo che possa essere eseguita in un secondo momento ad esempio dopo un certo evento.
- Iterator: permette di visitare tutti gli elementi di un altro oggetto, detto contenitore, senza dipendere dalla struttura interna di esso.
Un esempio tipico può essere il cursore per la lettura di una datasource.
- Mediator: incapsula l'interazione fra i vari oggetti di un loro insieme facendo in modo che la comunicazione col client venga gestita sempre da una unica entità favorendo il disaccoppiamento fra gli oggetti stessi.
- Memento: si occupa di memorizzare lo stato corrente di un altro oggetto detto Originator cercando di non violare l'incapsulamento. Può essere utile nei casi in cui si possa avere uno storico dell'oggetto stesso richiedendo al Memento il ripristino di uno stato precedente. (Il cosiddetto Undo/Redo)
- Observer: è una struttura formata da un Observer che osserva un cambiamento di stato di un Soggetto che possiamo definire Observable (Osservabile o Osservato) che fa appunto accadere quando lo stato all'interno di esso cambia. Esistono Librerie con RxJS si basano principalmente su questo pattern. Quando l'Observable cambia stato tutti gli Observer registrati ricevono l'informazione del cambiamento.
Cadienvan marked this conversation as resolved.
Show resolved Hide resolved
- State: è di fatto riconducibile ad un diagramma a stati finiti; consente ad un oggetto di modificare il proprio comportamento al cambiamento (ed in base) al suo stato interno.
- Strategy: permette di scegliere più comportamenti di un algoritmo (generalmente una variante di esso) a runtime associandolo (incapsulandolo) in una singola classe che lo implementa
- Template method: E' generalmente un metodo che implementa lo scheletro di un algorirmo e al suo interno possono essere chiamate parti (generalmente step) utilizzando la sovrascrittura dei passi senza dover cambiare la struttura del client chiamante.
Cadienvan marked this conversation as resolved.
Show resolved Hide resolved
- Visitor: in esso si separa una struttura dati dalla logica di attraversamento (visita) dell'algoritmo di visita e quindi dalle operazioni fatte su di essa. Gli algoritmi di visita possono cambiare senza cambiare la struttura del client.

## Altri pattern

Come già detto la Gang of four ha iniziato a definirli e successivamente sulla loro falsa riga ne sono stati individuati altri che descriveremo brevemente di seguito.
Cadienvan marked this conversation as resolved.
Show resolved Hide resolved

- Client/Server: è un pattern cosiddetto architetturale poichè può essere ad esempio l'architettura del prodotto che si vuole sviluppare. Esistono due "componenti" il client che effettua richieste ed il server che le riceve e risponde ad uno o più client.\
Esempio classico sono quasi tutti i server di database che ad ogni richiesta, ad esempio di esecuzione di una query, rispondono con i risultati.
- Model-View-Controller: è un pattern dove definiamo due entità separate, una per il considdetto _model_, ossia l'entità che vogliamo rappresentare e che contiene i suoi dati, contestualmente al View, che definisce come mostrarla all'utente esterno e ne permette l'interazione; infine esiste il Controller che serve a descrivere le interazioni fra i due.
- Dependency Injection: è un pattern che permette di iniettare una dipendenza in una classe attraverso l'Inversion of control. Questo viene fatto iniettando un'interfaccia o una classe astratta in modo da poter cambiare la sua implementazione in qualsiasi momento.\
Abbiamo 3 tipi di iniezioni:

- Injection nel costruttore
- Injection tramite setter
- Injection tramite interfaccia

# Note e appunti (Da eliminare a fine stesura)

- Spingere di più sul concetto che i Design Pattern siano delle soluzioni _tipo_ a problemi _tipo_ ma che non sempre la situazione sarà così lineare da permetterci in primis di comprendere il problema che stiamo affrontando e inoltre non è detto che la soluzione sia ottimale in termini di, ma non solo: performance, tempi di sviluppo, armonia con altre scelte architetturali, esperienza del team.
- In linea con quanto sopra: non tutti i/le dev di un team potrebbero essere in grado di adottare i design pattern nella maniera corretta e, come ogni standard, se non rispettato può portare più problemi che benefici.
- Importante delineare il fatto che spesso i Design Pattern, come altri concetti e best practice del software, siano astrazioni applicative e molti dei concetti rappresentati dai pattern possano essere ritrovati sia a livelli di astrazione più alti (architettura e addirittura Infrastruttura) o più bassi (singole righe di codice o singole funzioni).
- (Già citato in una frase) Come linea generale eviteremo di listare i design pattern in maniera accademica in quanto il libro sarà un incipit a un futuro approfondimento, ma ci concentreremo sui perché della loro nascita e del loro utilizzo, le principali dinamiche e i principali concetti attorno ad essi, e i pro e i contro generali.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Frase non necessaria, in quanto già specificato

Copy link
Contributor Author

@Livio74 Livio74 Feb 15, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Questi qui sotto sono appunti sul come fare il capitolo , una volta completato vanno rimossi.
Non so se c'è un modo migliore per associarli al file

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

in effetti la riga 125 l'avevo già esplicitata in una frase , potremmo toglierla

- I concetti SOLID sono una parte a sé stante di una certa importanza nella programmazione, bisogna capire se parlarne qui o in altre parti per poi farne riferimento.