I 7 modelli di progettazione software più importanti

Per un approfondimento approfondito sull'argomento dei modelli di progettazione software, dai un'occhiata ai modelli di progettazione software: best practice per sviluppatori, creati da C.H. Afzal, un ingegnere informatico esperto di software con esperienza pluriennale in Netflix, Microsoft e Oracle. Gran parte del seguito è riassunto dal suo corso.

Perché progettare modelli?

I pattern di progettazione sono diventati oggetto di alcune controversie nel mondo della programmazione negli ultimi tempi, in gran parte a causa del loro "uso eccessivo" percepito che porta a un codice che può essere più difficile da capire e gestire.

È importante capire che i Design Pattern non sono mai stati pensati per essere hackerati insieme a scorciatoie da applicare in modo casuale, "a misura unica" al tuo codice. In definitiva, non esiste un sostituto per la reale capacità di problem solving nell'ingegneria del software.

Resta il fatto, tuttavia, che i motivi di design possono essere incredibilmente utili se utilizzati nelle giuste situazioni e per le giuste ragioni. Se usati strategicamente, possono rendere un programmatore significativamente più efficiente permettendo loro di evitare di reinventare la ruota proverbiale, usando invece metodi già perfezionati da altri. Forniscono inoltre un utile linguaggio comune per concettualizzare problemi e soluzioni ripetuti quando si discute con altri o si gestisce il codice in team più grandi.

Detto questo, un avvertimento importante è garantire che lo sviluppatore comprenda anche il come e il perché dietro ogni modello.

Senza ulteriori indugi (in ordine generale di importanza, dal più al meno):

I modelli di design più importanti

  1. Singleton

Il modello singleton viene utilizzato per limitare la creazione di una classe a un solo oggetto. Questo è utile quando è necessario un (e solo un) oggetto per coordinare le azioni attraverso il sistema. Esistono diversi esempi di casi in cui dovrebbe esistere un'unica istanza di una classe, inclusi cache, pool di thread e registri.

È banale avviare un oggetto di una classe, ma come possiamo garantire che venga creato un solo oggetto? La risposta è rendere il costruttore "privato" per la classe che intendiamo definire come singleton. In questo modo, solo i membri della classe possono accedere al costruttore privato e nessun altro.

Considerazione importante: è possibile sottoclassare un singleton rendendo protetto il costruttore anziché privato. Questo potrebbe essere adatto in alcune circostanze. Un approccio adottato in questi scenari è la creazione di un registro di singoli punti delle sottoclassi e il metodo getInstance può accettare un parametro o utilizzare una variabile di ambiente per restituire il singleton desiderato. Il registro mantiene quindi una mappatura dei nomi delle stringhe agli oggetti singleton, a cui è possibile accedere secondo necessità.

2. Metodo di fabbrica

Una normale fabbrica produce merci; una fabbrica di software produce oggetti. E non solo: lo fa senza specificare la classe esatta dell'oggetto da creare. A tale scopo, gli oggetti vengono creati chiamando un metodo factory anziché chiamare un costruttore.

Di solito, la creazione di oggetti in Java avviene in questo modo:

SomeClass someClassObject = new SomeClass ();

Il problema con l'approccio di cui sopra è che il codice che utilizza l'oggetto SomeClass, ora diventa improvvisamente dipendente dall'implementazione concreta di SomeClass. Non c'è niente di sbagliato nell'utilizzare new per creare oggetti, ma ha il bagaglio di abbinare strettamente il nostro codice alla classe di implementazione concreta, che a volte può essere problematica.

3. Strategia

Il modello di strategia consente di raggruppare algoritmi correlati in un'astrazione, che consente di cambiare un algoritmo o una politica per un altro senza modificare il client. Invece di implementare direttamente un singolo algoritmo, il codice riceve istruzioni di runtime che specificano quale gruppo di algoritmi eseguire.

4. Osservatore

Questo modello è una dipendenza uno-a-molti tra gli oggetti in modo tale che quando un oggetto cambia stato, vengono notificati tutti i suoi dipendenti. Questo in genere viene fatto chiamando uno dei loro metodi.

Per semplicità, pensa a cosa succede quando segui qualcuno su Twitter. Stai essenzialmente chiedendo a Twitter di inviare a te (l'osservatore) gli aggiornamenti di tweet della persona (l'oggetto) che hai seguito. Il modello è composto da due attori, l'osservatore interessato agli aggiornamenti e il soggetto che genera gli aggiornamenti.

Una materia può avere molti osservatori ed è una relazione da una a molte. Tuttavia, un osservatore è libero di iscriversi agli aggiornamenti anche da altri argomenti. Puoi iscriverti al feed di notizie da una pagina Facebook, che sarebbe l'oggetto e ogni volta che la pagina ha un nuovo post, l'abbonato vedrà il nuovo post.

Considerazione chiave: nel caso di molti soggetti e pochi osservatori, se ogni soggetto memorizza i propri osservatori separatamente, aumenterà i costi di archiviazione poiché alcuni soggetti memorizzeranno lo stesso osservatore più volte.

5. Costruttore

Come suggerisce il nome, un modello di generatore viene utilizzato per costruire oggetti. A volte, gli oggetti che creiamo possono essere complessi, costituiti da diversi oggetti secondari o richiedere un processo di costruzione elaborato. L'esercizio di creazione di tipi complessi può essere semplificato utilizzando il modello di creazione. Un oggetto composito o aggregato è ciò che generalmente costruisce un builder.

Considerazione chiave: il modello di generatore potrebbe sembrare simile al modello di "fabbrica astratta", ma una differenza è che il modello di generatore crea un oggetto passo dopo passo mentre il modello di fabbrica astratto restituisce l'oggetto in una volta sola.

6. Adattatore

Ciò consente alle classi incompatibili di lavorare insieme convertendo l'interfaccia di una classe in un'altra. Pensalo come una sorta di traduttore: quando due capi di stato che non parlano una lingua comune si incontrano, di solito un interprete si siede tra i due e traduce la conversazione, consentendo così la comunicazione.

Se hai due applicazioni, una delle quali sputa l'output come XML e l'altra richiede l'input JSON, allora avrai bisogno di un adattatore tra i due per farli funzionare senza problemi.

7. Stato

Il modello di stato incapsula i vari stati in cui può trovarsi una macchina e consente a un oggetto di modificarne il comportamento quando cambia il suo stato interno. La macchina o il contesto, come viene chiamato in modo ripetitivo, possono avere azioni intraprese su di esso che lo spingono in stati diversi. Senza l'uso del modello, il codice diventa inflessibile e disseminato di condizionali if-else.

Vuoi continuare ad imparare?

Con i modelli di progettazione del software: best practice per gli sviluppatori avrai la possibilità di fare di più che leggere semplicemente la teoria. Sarai in grado di immergerti in profondità in problemi reali e comprendere soluzioni pratiche con esempi di codice della vita reale.

Il corso si basa sul popolare libro della Gang of Four, ma presentato in un formato interattivo e facile da digerire. Imparerai in modo interattivo i 23 famosi modelli di design del libro in modo interattivo, imparerai le applicazioni appropriate dei 3 principali tipi di pattern di design (creazionale, strutturale e comportamentale) e imparerai a incorporare questi pattern di design nei tuoi progetti.

Controlla adesso.

Originariamente pubblicato su blog.educative.io il 7 novembre 2018.