principi s.o.l.i.d.

Principi S.O.L.I.D.

“Cosa sono i principi SOLID? Riesci a spiegarmeli in maniera semplice?”

Questa domanda mi è stata posta alcuni giorni fa da uno programmatore con “esperienza”,che da alcuni anni sviluppa in .NET.

Bella domanda!

Tendenzialmente i programmatori (me compreso!) sono orientati alla scrittura di codice, non a pensare a cosa/come lo stanno scrivendo.
Questo tipo di approccio è un pò quello che arriva dal mondo della scuola, dove vengono insegnati i linguaggi di programmazione come Javascript, C# e Angular, ma non vengono affrontati i principi della buona programmazione.

Introdurre i principi SOLID ad un nuovo sviluppatore può essere un’operazione banale, ma è sicuramente uno degli aspetti fondamentali per la scrittura di buon codice.

Riprendo quindi i principi SOLID già affrontati in post precedenti, cercando di descriverli con un approccio più semplice e immediato.

Single Responsability Principle

Definisce un concetto molto semplice: il codice di una procedura deve fare una cosa e farla bene.
Scrivendo procedure “mono”-funzionalità è più semplice avere codice leggibile e soprattutto mantenibile.

Open-Closed Principle

Il codice dovrebbe essere scritto in modo da poter essere “esteso” senza dover modificarne la struttura interna.
Considerando, ad esempio, le varibiabili di tipo string in .NET: sono presenti funzioni che consentono di effettuare le operazioni principali, come ottenere la lunghezza, effettuare lo split e molte altre.
Se abbiamo la necessità di scrivere una nuova funzione, non è necessario modificare il codice del framework (operazione che non sarebbe di facile attuazione), ma abbiamo la possibilità di utilizzare gli Extension Method che consentono di estendere le funzionalità di un oggetto, senza modificarne realmente il “core”.
Ecco soddisfatto l’ Open-Closed Principle.

Liskov Substitution Principle

Questo principio indica la possibilità di sostituire una classe con una sua sottoclasse, mantenendo il codice perfettamente funzionante.
Considerando, ad esempio, una classe per la scrittura di log. Le modalità di scrittura del log possono essere differenti: su filesystem, su un database, a video, ecc…
All’interno della procedura dove verrà richiamato il metodo di log, non sarà presente una funzione differenti per ogni singolo log, ma avrà sempre lo stesso nome.
In aiuto dei programmatori, per soddisfare questo principio, c’è l’ereditarietà che consente di impostare classi e sottoclassi.

Interface Segregation Principle

La scrittura buon codice passa sicuramente dall’utilizzo di interfacce. Nelle interfacce vengono definiti i metodi che dovranno essere implementati nelle singole classi.
La scrittura di interfacce complesse (in termini di numero di operazioni che dovranno essere implementate dalla classi), può portare alla scrittura di codice di difficile lettura,
e soprattutto le classi potrebbero avere la necessità di implementare metodi e funzionalità non richieste.
Questo principio afferma proprio questo: è meglio scrivere interfacce semplici e far implementare alle classi solo le interfacce di cui hanno realmente bisogno.
Quindi, per soddisfare il princio è necessario scrivere interfacce “specializzate”, in modo da essere utilizzate solo per implementare funzionalità strettamente necessarie.

Dependency Inversion Principle

Questo principio è alla basate dei modelli framework di programmazione. Consente di separare la dipendenza tra classi.
In pratica viene creato un vero e proprio disaccopiamento tra le classi, semplificando l’utilizzo di classi dipendenti tramite l’utilizzo dell’astrazione.
L’astrazione viene raggiunta utilizzando le interfacce. In pratica, all’interno di una classe, non viene indicata direttamente il suo tipo, ma la sua interfaccia.
In questo caso è molto più semplice sostituire un’instanza di una classe con un’altra (che ovviamente dovrà implementare la stessa intefaccia).
Questo tipo di approccio viene spesso utilizzato con strumenti che consentonon l’inject delle classi in maniera automatica.
ASP.NET Core consente, ad esempio, di definire ii tipo di visibilità e la modalità di creazione dell’istanza di una classe, impostando opportunamente la configurazione all’interno del file Startup.cs.

Pubblicato da

Andrea Merlin

Laureato in informatica, diversi corsi di specializzazione legati allo Sviluppo Software e alla Computer forensics. Appassionato di nuove tecnologie, amo la programmazione, la Business Intelligence e tematiche legate alla Privacy.Sempre alla ricerca di nuove idee, stimoli … e progetti da seguire!Amo trascorrere il tempo libero in Val Borbera, un piccolo angolo del Piemonte, in provincia di Alessandria.