SlideShare a Scribd company logo
D&D WebinarsD&D Webinars
Webinar:
I principi SOLID
Capire e padroneggiare i principi SOLID in Delphi
D&D WebinarsD&D Webinars
Marco Breveglieri
Software and Web Developer,
Teacher and Consultant
@ABLS Team - Reggio Emilia, ITALY
Homepage https://www.breveglieri.it
Blog tecnico https://www.compilaquindiva.com
Delphi Podcast https://www.delphipodcast.com
Twitter @mbreveglieri
D&D WebinarsD&D Webinars
Una premessa:
il codice “cattivo”
D&D WebinarsD&D Webinars
Cosa rende il codice “cattivo”?
● Classi che fanno troppe cose
● Metodi troppo lunghi e complessi
● Eccessiva dipendenza da altro codice
● Astrazioni esigenti e non fattorizzate
● Impossibilità di eseguire test automatici
● Gerarchie OOP ingiustificate
D&D WebinarsD&D Webinars
Coupling
“La misura in cui il tuo
codice dipende da altri
moduli, e viceversa”
D&D WebinarsD&D Webinars
High vs Loose Coupling
High Coupling
● Moduli difficilmente separabili
● Moduli difficilmente sostituibili
● Implementazioni intrecciate tra loro
● Modifiche a un punto del codice possono
produrre effetti devastanti in un altro
● Relazioni tra i moduli stessi meno
comprensibili
Loose Coupling
● Leggibilità più alta del codice
● Comprensione agevolata
● Riusabile perché connesso da strati più
sottili (es. interfacce)
● Manutenibile (perché le modifiche sono
isolate)
● Testabile!
D&D WebinarsD&D Webinars
Cohesion
“Il grado con cui gli
elementi di un modulo
possono stare assieme”
D&D WebinarsD&D Webinars
High Cohesion
Si raggiunge quando le singole parti del
sistema, sebbene diverse e con
caratteristiche e funzionalità
eterogenee, collaborano tra loro
realizzando qualcosa di utile (ad alto
valore per il cliente o per lo
sviluppatore).
D&D WebinarsD&D Webinars
...altrimenti...
D&D WebinarsD&D Webinars
Introduzione
D&D WebinarsD&D Webinars
S.O.L.I.D. è un acronimo
SRP Single Responsibility Principle
OCP Open/Closed Principle
LSP Liskov Substitution Principle
ISP Interface Segregation Principle
DIP Dependency Inversion Principle
D&D WebinarsD&D Webinars
Quando sono necessari?
Quando si percepisce la presenza di
“Code & Design Smell”...
● Codice troppo difficile da modificare
● Codice facile da “rompere” al minimo tocco
● Codice non riutilizzabile in altre situazioni
simili ma in contesti differenti
● Eccessivo sforzo nel far fare al codice il
proprio compito
● Codice inutilmente complicato per il
proprio scopo
D&D WebinarsD&D Webinars
Perché ne parliamo?
● Principi più importanti da seguire nella scrittura del codice
● Non sono così complessi come possono apparire a prima vista
● Consentono di apportare modifiche al software con minimi sforzi (in barba ai clienti)
● Rendono in molti casi la programmazione… più divertente
● Sono l’unico strumento che permette di scrivere codice “testabile”
● Aprono la strada a refactoring, buon design del codice e infinite serie di possibilità
D&D WebinarsD&D Webinars
Come applicarlo?
Tecnica SDD*
*Schwartz Driven Development
(usa lo Sforzo!)
D&D WebinarsD&D Webinars
I principi S.O.L.I.D.
D&D WebinarsD&D Webinars
Single Responsibility Principle
SRP
D&D WebinarsD&D Webinars
Single Responsibility Principle
“Ogni modulo software deve avere una e una
sola ragione per essere modificato”
1
D&D WebinarsD&D Webinars
Single Responsibility Principle
“Ogni classe deve svolgere
uno e un solo compito”
2
D&D WebinarsD&D Webinars
Demo
Vediamo un esempio “errato”...
D&D WebinarsD&D Webinars
Demo
Vediamo un esempio corretto...
D&D Webinars
Come si presenta il modello
D&D WebinarsD&D Webinars
● Cercare di individuare i possibili soggetti che possono richiedere modifiche a una classe
● Cercare di individuare i possibili motivi che possono richiedere modifiche a una classe
● Valutare costi e benefici prima di separare due implementazioni
● Tante classi piccole sono meglio di poche classi giganti (anche per l’IDE)
● Sfruttare la Dependency Injection per l’iniezione degli oggetti
Recap
D&D WebinarsD&D Webinars
Open/Closed Principle
OCP
D&D WebinarsD&D Webinars
Open Closed Principle
“Ogni classe deve essere aperta a estensioni
ma chiusa al cambiamento”
D&D Webinars
Lo scenario
D&D WebinarsD&D Webinars
Demo
Vediamo un esempio “errato”...
D&D Webinars
Applichiamo lo “Strategy Pattern”
D&D WebinarsD&D Webinars
Demo
Vediamo un esempio corretto...
D&D Webinars
Come evolve il modello
D&D WebinarsD&D Webinars
● Utilizzare interfacce o classi astratte per creare “punti di estensione”
● Sostituire i costrutti case...of con oggetti esterni sfruttando ereditarietà
● Non esagerare con l’espansione, ovvero non esternalizzare fino ai minimi dettagli
(valutare sempre prima i costi e i benefici)
● Se occorre referenziare una lista di oggetti esterni, utilizzare le classi “Container” con Generics
Recap
D&D WebinarsD&D Webinars
Liskov Substitution Principle
LSP
D&D WebinarsD&D Webinars
Liskov’s Substitution Principle
“Let q(x) be a property provable about
objects x of type T. Then q(y) should be provable
for objects y of type S where S is a subtype of T”
1
D&D WebinarsD&D Webinars
Liskov’s Substitution Principle
“I sottotipi dovrebbero essere sempre
sostituibili ai loro tipi di base”
2
D&D WebinarsD&D Webinars
Liskov’s Substitution Principle
“Un client dovrebbe consumare qualsiasi
implementazione di una interfaccia senza che
questo modifichi la correttezza del sistema”
3
D&D Webinars
LSP Violation: l’esempio classico
D&D WebinarsD&D Webinars
Demo
Vediamo un esempio “errato”...
D&D WebinarsD&D Webinars
Demo
Vediamo un esempio corretto...
D&D WebinarsD&D Webinars
● Evitare gerarchie di classi logicamente inconsistenti
● Non condizionare la logica al tipo di oggetto passato (es. if AObj is TSquare…)
● Forzare uniformità nei comportamenti
○ Non restituire nil se non previsto nella logica principale
○ Non sollevare eccezioni tranne quelle lecite per la business logic
Recap
D&D WebinarsD&D Webinars
Interface Segregation Principle
ISP
D&D WebinarsD&D Webinars
Interface Segregation Principle
“I client non devono essere forzati a dipendere
da metodi che non utilizzano”
1
D&D Webinars
ISP Violation: un esempio
D&D WebinarsD&D Webinars
Demo
Vediamo un esempio “errato”...
D&D WebinarsD&D Webinars
Demo
Vediamo un esempio corretto...
D&D Webinars
ISP Violation: un esempio
D&D WebinarsD&D Webinars
● Ricordare che ogni interfaccia (interface) rappresenta un contratto
● Non creare interfacce cosiddette “asfittiche” (copia astratta della classe)
● Non aggiungere metodi non necessari alle interfacce ma disegnarle opportunamente
● Non estendere (se possibile) le interfacce esistenti, ma crearne di nuove
Recap
D&D WebinarsD&D Webinars
Dependency Inversion Principle
DIP
D&D WebinarsD&D Webinars
Dependency Inversion Principle
“Occorre sempre dipendere da una interfaccia
e non da una implementazione”
1
D&D WebinarsD&D Webinars
Dependency Inversion Principle
A. Moduli di alto livello non devono dipendere
da moduli di basso livello, ed entrambi devono
dipendere da astrazioni.
B. Le astrazioni non devono dipendere dai dettagli.
I dettagli devono dipendere dalle astrazioni.
2
D&D Webinars
Consideriamo questo scenario iniziale.
D&D Webinars
Nessun cambiamento funzionale, ma effetto di design ben visibile:
il Reader diventa più astratto, più generico, ma usa un tipo di Book molto specifico (PdfBook).
D&D Webinars
Soluzione: introduciamo un’ulteriore astrazione (EBook) applicando il principio ISP.
D&D WebinarsD&D Webinars
Demo
D&D WebinarsD&D Webinars
● Applicare il DIP automaticamente consente di abilitare l’uso degli altri principi
● ti forza quasi a usare correttamente il principio Open/Closed;
○ ti permette di separare le responsabilità
○ incentiva l’implementazione corretta dei sottotipi
○ offre l’opportunità di segregare le interfacce
Recap
D&D WebinarsD&D Webinars
Conclusioni
D&D WebinarsD&D Webinars
S.O.L.I.D. non è così difficile...
● E’ sufficiente vedere i problemi esposti da una prospettiva differente nella stesura del codice
● Avremo come risultato codice ben scritto e facilmente manutenibile
● Non dobbiamo preoccuparci se avremo molte classi e interfacce: non c’è un limite
● Classi più piccole e mirate possono essere combinate più facilmente per creare sistemi complessi
● L’approccio semplifica il testing e la collaborazione tra sviluppatori
Non è male, no? 😉
D&D WebinarsD&D Webinars
A full demo
D&D WebinarsD&D Webinars
Domande?
Questions?
D&D WebinarsD&D Webinars
Riferimenti e fonti
Unsplash - Beautiful Free Images & Pictures (https://unsplash.com/)
Meme Generator (https://imgflip.com/memegenerator)
EnvatoTuts+ (https://code.tutsplus.com/series/the-solid-principles--cms-634)
Thanks! 😅

More Related Content

PDF
Pro php refactoring
PDF
Agile requirements - alla ricerca del filo rosso (iad 2013)
PDF
Un approccio Frameworkless per sviluppare la tua Single Page Application
PPTX
Effective Code Transformations in C++
PDF
Lezione 1: I metodi agili
ODP
La salute del software
PDF
Back to Agile - Codemotion 2013
PDF
Una fugace occhiata al Test Driven Development (2006)
Pro php refactoring
Agile requirements - alla ricerca del filo rosso (iad 2013)
Un approccio Frameworkless per sviluppare la tua Single Page Application
Effective Code Transformations in C++
Lezione 1: I metodi agili
La salute del software
Back to Agile - Codemotion 2013
Una fugace occhiata al Test Driven Development (2006)

Similar to Delphi & Dintorni Webinar - Padroneggiare i principi SOLID con Delphi (20)

PDF
Xe One Day - Adaptive Code
PDF
Lezione design patterns 2011 (Peron)
PDF
Come scrivere software SOLID(O)
PDF
Come scrivere software SOLID(O)
PDF
Object Oriented Design
PDF
AntiPatterns: i vizi del programmatore
PDF
Le 12 pratiche
PDF
Lezione 3: Sviluppo in Extreme Programming
PDF
L'illusione dell'ortogonalità
PPTX
Test Driven Development @ Xe.Net
PPTX
Inversion of Control @ CD2008
PDF
Delphi & Dintorni Webinar - Diventa un mago del Testing
PDF
Introduzione alla programmazione object oriented - Scheda corso LEN
PDF
Un plug-in Eclipse per il supporto all'Extract Class Refactoring
PPTX
presentazione utile a capire unity per cucinare
PPTX
Introduzione al Domain Driven Design (DDD)
PDF
OOP... Object Whaaat?
PDF
LEARNING OBJECT MODELLO DI RIFERIMENTO SCORM E AUTHORING APPLICATIONS
PDF
Le pratiche ingegneristiche di eXtreme Programming
PDF
Progettazione e realizzazione di un sistema software per il time logging
Xe One Day - Adaptive Code
Lezione design patterns 2011 (Peron)
Come scrivere software SOLID(O)
Come scrivere software SOLID(O)
Object Oriented Design
AntiPatterns: i vizi del programmatore
Le 12 pratiche
Lezione 3: Sviluppo in Extreme Programming
L'illusione dell'ortogonalità
Test Driven Development @ Xe.Net
Inversion of Control @ CD2008
Delphi & Dintorni Webinar - Diventa un mago del Testing
Introduzione alla programmazione object oriented - Scheda corso LEN
Un plug-in Eclipse per il supporto all'Extract Class Refactoring
presentazione utile a capire unity per cucinare
Introduzione al Domain Driven Design (DDD)
OOP... Object Whaaat?
LEARNING OBJECT MODELLO DI RIFERIMENTO SCORM E AUTHORING APPLICATIONS
Le pratiche ingegneristiche di eXtreme Programming
Progettazione e realizzazione di un sistema software per il time logging
Ad

More from Marco Breveglieri (10)

PPTX
Does The Delphi IDE Narrow You? Extend It! - ITDevConX European Delphi Confer...
PPTX
Creare un Information Radiator con Delphi
PPTX
"Non Aprite Quella Unit!" ovvero "Scrivere Clean Code in Delphi
PDF
REST API fantastiche e dove trovarle
PDF
Applicazioni Web ultra-performanti con Vue.js e Delphi
PDF
Create a Bot with Delphi and Telegram - ITDevCon 2016
PDF
Web Development with Delphi and React - ITDevCon 2016
PDF
Sviluppo Web con React e Delphi - Seminario Delphi Day 2016, Piacenza
PDF
Reportage Delphi Day 2012
PDF
Reportage "RAD Studio XE2 World Tour"
Does The Delphi IDE Narrow You? Extend It! - ITDevConX European Delphi Confer...
Creare un Information Radiator con Delphi
"Non Aprite Quella Unit!" ovvero "Scrivere Clean Code in Delphi
REST API fantastiche e dove trovarle
Applicazioni Web ultra-performanti con Vue.js e Delphi
Create a Bot with Delphi and Telegram - ITDevCon 2016
Web Development with Delphi and React - ITDevCon 2016
Sviluppo Web con React e Delphi - Seminario Delphi Day 2016, Piacenza
Reportage Delphi Day 2012
Reportage "RAD Studio XE2 World Tour"
Ad

Delphi & Dintorni Webinar - Padroneggiare i principi SOLID con Delphi