SlideShare a Scribd company logo
1 of 16
Download to read offline
Object Oriented Design 
Alessandro Ceseno 
contact me, my website is: www.alexceseno.it 
Add me on Linkedin: 
http://www.linkedin.com/in/alessandroceseno
I PRINCIPI SOLID 
Single Responsibility Principle - SRP 
Una classe dovrebbe avere una sola e una sola ragione al cambiamento. 
Ogni classe, ogni modulo sw dovrebbe avere una e una sola responsabilità. 
Responsabilità diverse implicano classi diverse. 
Questo principio è chiamato coesione.
È un semplice principio ma anche un principio difficile da attuare. 
Trovare e separare le responsabilità degli oggetti è l’obbiettivo del Design. 
Alcune volte si utilizzano i Design Pattern DAO, Facade, Proxy. 
Il Single Responsability Principle è uno dei più semplici principi di design da 
capire ma anche da attuare.
Open Close Principle 
Si dovrebbe essere in grado di estendere un comportamento senza 
modificare il comportamento esistente. 
Quindi si dovrebbe essere in grado di estendere una classe senza 
modificarla. 
Tutte le variabili di una classe dovrebbero essere private.
Dovrebbero esserci meno variabili globali possibili, ovvero limitare al 
massimo la visibilità delle variabili. 
Tutte le entità software devono essere: 
- aperte alla estensione 
- chiuse alle modifica delle stesse 
Spesso si riescono creare astrazioni che rappresentano le classi base e 
successive classi derivate che rappresentano il comportamento 
specializzato.
Liskov Substitution Principle 
Il principio di sostituzione di Liskov è una nozione basata sulla sostitubilità. 
Se S è un sottotipo di T allora un oggetto di tipo T può essere sostituito con 
un oggetto di tipo S senza alterare qualsiasi altra parte del programma. 
Questo principio tratta l’ astrazione dei dati e la gerarchia delle classi. 
Questo principio tratta più la relazione sintattica piuttosto che la relazione 
sintattica della classe, perchè garantisce l’ interoperatività semantica dei tipi 
della gerarchia.
Questo principio definisce una nozione di sostituibilità di oggetti mutabili. 
Il principio di Liskov impone alcuni requisiti standard sulla Signature dei 
metodi che sono state adottate nei linguaggi di programmazione Object 
Oriented: 
Controvarianza di argomenti del metodo nel sottotipo. 
Covarianza di tipi restituiti nel sottotipo. 
Nessuna nuova eccezione dovrebbe essere lanciata dai metodi dei 
sottotipo, ad eccetto di quelle eccezioni che sono già sottotipi lanciate dai 
metodi del supertipo.
Nota: 
Si ha covarianza se si conserva l'ordinamento di tipi, ovvero si ha un 
ordinamento dei tipi dai più tipi specifici a più generico. 
Si ha controvarianza se si inverte questo ordinamento.
Interface Segregation Principle 
Questo principio evidenzia lo svantaggio di avere interfacce che non sono 
interfacce specifiche per un singolo client. 
Sono chiamate interfacce “fat” ovvero le interfacce che non rispettono la 
coesione ed hanno un alto accoppiamento. Queste interfacce possono 
essere scomposte e ciascun componente può servire un diverso set di 
client. 
Le interfacce “fat” possono essere segregate in classi astratte che vanno a 
togliere il non voluto accoppiamento tra le classi.
Dependency Inversion Principle 
Moduli di alto livello non dovrebbero dipendere da moduli di basso livello. 
Entrambi dovrebbero dipendere dall’ astrazione. 
L’ astrazione non dovrebbe dipendere dai dettagli. 
I dettagli non dovrebbero dipendere dall’ astrazione.
Perchè la parola inversione? 
I metodi di sviluppo software più tradizionali come metodologie di analisi 
strutturata e design tradizionale tendono a creare design con un alta 
dipendenza dei moduli di alto livello con i moduli di basso livello e nelle 
quali le astrazioni dipendono anche dai dettagli. 
L’ obbiettivo di queste metodologie è definire gerarchie di sottoprogrammi 
che descrivono come i moduli di alto livello chiamano i moduli di basso 
livello. Si hanno strutture gerarchiche. 
Attraverso la DIP questo approccio è invertito rispettando la struttura delle 
dipendenze che normalmente risulta dalle metodologie tradizionali.
Quando si crea un cattivo Design? 
Rigidità 
È difficile effettuare una modifica al codice poichè ogni cambiamento ha 
impatto su molte altre parti del sistema.È l’ interdipendenza dei moduli 
all’interno del design. Un design è rigido se esso non può essere cambiato 
facilmente. 
Tale rigidità è dovuta al fatto che tale cambiamento ha una pesante 
interdipendenza software tra moduli che dovrebbero essere indipendenti.
Fragilità 
Quando cambi il codice e inaspettatamente parti del codice si rompono. 
La fragilità è la tendenza di un programma di rompersi in moti posti quando 
si fa un seplice cambiamento. 
Quando semplici cambiamenti di una parte dell’ applicazione crea problemi 
in altre parti dell’ applicazione apparentemente senza relazione.
Immobilità 
È difficile da riutilizzare il componente software in un’ altra applicazione 
perchè non può essere spostato ed avere la stessa efficacia. 
Un design è immobile quando parte del design ha un’ alta dipendenza dai 
dettagli.
BIBLIOGRAFIA/SITOGRAFIA: 
http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod
Object Oriented Design 
Alessandro Ceseno 
contact me, my website is: www.alexceseno.it 
Add me on Linkedin: 
http://www.linkedin.com/in/alessandroceseno

More Related Content

Similar to Object Oriented Design

Come scrivere software SOLID(O)
Come scrivere software SOLID(O)Come scrivere software SOLID(O)
Come scrivere software SOLID(O)Alex Pagnoni
 
Corso introduttivo di Design Pattern in Java per Elis - 1
Corso introduttivo di Design Pattern in Java per Elis - 1Corso introduttivo di Design Pattern in Java per Elis - 1
Corso introduttivo di Design Pattern in Java per Elis - 1Antonio Musarra
 
Approccio Pratico al Domain Driven Design
Approccio Pratico al Domain Driven DesignApproccio Pratico al Domain Driven Design
Approccio Pratico al Domain Driven DesignLuca Milan
 
Repository pattern slides v1.1
Repository pattern slides v1.1Repository pattern slides v1.1
Repository pattern slides v1.1Christian Nastasi
 
Java Programming Language
Java Programming LanguageJava Programming Language
Java Programming LanguagePasquale Paola
 
Workshop Ideare e creare Web Applications, Introduzione ad AngularJS
Workshop Ideare e creare Web Applications, Introduzione ad AngularJSWorkshop Ideare e creare Web Applications, Introduzione ad AngularJS
Workshop Ideare e creare Web Applications, Introduzione ad AngularJSGiovanni Buffa
 
Detailed Model Capture
Detailed Model CaptureDetailed Model Capture
Detailed Model Capturefcospito
 
Detailed Model Capture
Detailed Model CaptureDetailed Model Capture
Detailed Model Capturefcospito
 
Idiomatic Domain Driven Design
Idiomatic Domain Driven DesignIdiomatic Domain Driven Design
Idiomatic Domain Driven DesignAndrea Saltarello
 
Le 7 sfide da affrontare nella migrazione da monolite a miniservizi
Le 7 sfide da affrontare nella migrazione da monolite a miniserviziLe 7 sfide da affrontare nella migrazione da monolite a miniservizi
Le 7 sfide da affrontare nella migrazione da monolite a miniserviziLuca Acquaviva
 
Il tuo team "agile" scrive codice "flaccido"? Forse scrum non basta
Il tuo team "agile" scrive codice "flaccido"? Forse scrum non bastaIl tuo team "agile" scrive codice "flaccido"? Forse scrum non basta
Il tuo team "agile" scrive codice "flaccido"? Forse scrum non bastaStefano Muro
 
Usare i Design System - Un approccio Frameworkless per la tua Web Application
Usare i Design System - Un approccio Frameworkless per la tua Web ApplicationUsare i Design System - Un approccio Frameworkless per la tua Web Application
Usare i Design System - Un approccio Frameworkless per la tua Web Applicationextrategy
 
Delphi & Dintorni Webinar - Padroneggiare i principi SOLID con Delphi
Delphi & Dintorni Webinar - Padroneggiare i principi SOLID con DelphiDelphi & Dintorni Webinar - Padroneggiare i principi SOLID con Delphi
Delphi & Dintorni Webinar - Padroneggiare i principi SOLID con DelphiMarco Breveglieri
 
9. Principi e linee guida per il design
9. Principi e linee guida per il design9. Principi e linee guida per il design
9. Principi e linee guida per il designRoberto Polillo
 
Una fugace occhiata al Test Driven Development (2006)
Una fugace occhiata al Test Driven Development  (2006)Una fugace occhiata al Test Driven Development  (2006)
Una fugace occhiata al Test Driven Development (2006)Roberto Bettazzoni
 

Similar to Object Oriented Design (20)

Come scrivere software SOLID(O)
Come scrivere software SOLID(O)Come scrivere software SOLID(O)
Come scrivere software SOLID(O)
 
Corso introduttivo di Design Pattern in Java per Elis - 1
Corso introduttivo di Design Pattern in Java per Elis - 1Corso introduttivo di Design Pattern in Java per Elis - 1
Corso introduttivo di Design Pattern in Java per Elis - 1
 
Approccio Pratico al Domain Driven Design
Approccio Pratico al Domain Driven DesignApproccio Pratico al Domain Driven Design
Approccio Pratico al Domain Driven Design
 
Repository pattern slides v1.1
Repository pattern slides v1.1Repository pattern slides v1.1
Repository pattern slides v1.1
 
Design patterns
Design patternsDesign patterns
Design patterns
 
Java Programming Language
Java Programming LanguageJava Programming Language
Java Programming Language
 
Microservices
MicroservicesMicroservices
Microservices
 
Workshop Ideare e creare Web Applications, Introduzione ad AngularJS
Workshop Ideare e creare Web Applications, Introduzione ad AngularJSWorkshop Ideare e creare Web Applications, Introduzione ad AngularJS
Workshop Ideare e creare Web Applications, Introduzione ad AngularJS
 
Detailed Model Capture
Detailed Model CaptureDetailed Model Capture
Detailed Model Capture
 
Detailed Model Capture
Detailed Model CaptureDetailed Model Capture
Detailed Model Capture
 
Che cosa sono i microservizi?
Che cosa sono i microservizi?Che cosa sono i microservizi?
Che cosa sono i microservizi?
 
Idiomatic Domain Driven Design
Idiomatic Domain Driven DesignIdiomatic Domain Driven Design
Idiomatic Domain Driven Design
 
Approcci al design
Approcci al designApprocci al design
Approcci al design
 
Le 7 sfide da affrontare nella migrazione da monolite a miniservizi
Le 7 sfide da affrontare nella migrazione da monolite a miniserviziLe 7 sfide da affrontare nella migrazione da monolite a miniservizi
Le 7 sfide da affrontare nella migrazione da monolite a miniservizi
 
Il tuo team "agile" scrive codice "flaccido"? Forse scrum non basta
Il tuo team "agile" scrive codice "flaccido"? Forse scrum non bastaIl tuo team "agile" scrive codice "flaccido"? Forse scrum non basta
Il tuo team "agile" scrive codice "flaccido"? Forse scrum non basta
 
Anti pattern
Anti patternAnti pattern
Anti pattern
 
Usare i Design System - Un approccio Frameworkless per la tua Web Application
Usare i Design System - Un approccio Frameworkless per la tua Web ApplicationUsare i Design System - Un approccio Frameworkless per la tua Web Application
Usare i Design System - Un approccio Frameworkless per la tua Web Application
 
Delphi & Dintorni Webinar - Padroneggiare i principi SOLID con Delphi
Delphi & Dintorni Webinar - Padroneggiare i principi SOLID con DelphiDelphi & Dintorni Webinar - Padroneggiare i principi SOLID con Delphi
Delphi & Dintorni Webinar - Padroneggiare i principi SOLID con Delphi
 
9. Principi e linee guida per il design
9. Principi e linee guida per il design9. Principi e linee guida per il design
9. Principi e linee guida per il design
 
Una fugace occhiata al Test Driven Development (2006)
Una fugace occhiata al Test Driven Development  (2006)Una fugace occhiata al Test Driven Development  (2006)
Una fugace occhiata al Test Driven Development (2006)
 

More from Alessandro Ceseno

Test Driven Development for iOS
Test Driven Development for iOSTest Driven Development for iOS
Test Driven Development for iOSAlessandro Ceseno
 
TDD patterns and TDD strategies
TDD patterns and TDD strategiesTDD patterns and TDD strategies
TDD patterns and TDD strategiesAlessandro Ceseno
 
TDD - Test Driven Development - Come scrivere un software migliore
TDD - Test Driven Development - Come scrivere un software miglioreTDD - Test Driven Development - Come scrivere un software migliore
TDD - Test Driven Development - Come scrivere un software miglioreAlessandro Ceseno
 

More from Alessandro Ceseno (6)

Test Driven Development for iOS
Test Driven Development for iOSTest Driven Development for iOS
Test Driven Development for iOS
 
TDD patterns and TDD strategies
TDD patterns and TDD strategiesTDD patterns and TDD strategies
TDD patterns and TDD strategies
 
Software Craftsmanship
Software CraftsmanshipSoftware Craftsmanship
Software Craftsmanship
 
Extreme Programming
Extreme ProgrammingExtreme Programming
Extreme Programming
 
Continuos Integration
Continuos IntegrationContinuos Integration
Continuos Integration
 
TDD - Test Driven Development - Come scrivere un software migliore
TDD - Test Driven Development - Come scrivere un software miglioreTDD - Test Driven Development - Come scrivere un software migliore
TDD - Test Driven Development - Come scrivere un software migliore
 

Object Oriented Design

  • 1. Object Oriented Design Alessandro Ceseno contact me, my website is: www.alexceseno.it Add me on Linkedin: http://www.linkedin.com/in/alessandroceseno
  • 2. I PRINCIPI SOLID Single Responsibility Principle - SRP Una classe dovrebbe avere una sola e una sola ragione al cambiamento. Ogni classe, ogni modulo sw dovrebbe avere una e una sola responsabilità. Responsabilità diverse implicano classi diverse. Questo principio è chiamato coesione.
  • 3. È un semplice principio ma anche un principio difficile da attuare. Trovare e separare le responsabilità degli oggetti è l’obbiettivo del Design. Alcune volte si utilizzano i Design Pattern DAO, Facade, Proxy. Il Single Responsability Principle è uno dei più semplici principi di design da capire ma anche da attuare.
  • 4. Open Close Principle Si dovrebbe essere in grado di estendere un comportamento senza modificare il comportamento esistente. Quindi si dovrebbe essere in grado di estendere una classe senza modificarla. Tutte le variabili di una classe dovrebbero essere private.
  • 5. Dovrebbero esserci meno variabili globali possibili, ovvero limitare al massimo la visibilità delle variabili. Tutte le entità software devono essere: - aperte alla estensione - chiuse alle modifica delle stesse Spesso si riescono creare astrazioni che rappresentano le classi base e successive classi derivate che rappresentano il comportamento specializzato.
  • 6. Liskov Substitution Principle Il principio di sostituzione di Liskov è una nozione basata sulla sostitubilità. Se S è un sottotipo di T allora un oggetto di tipo T può essere sostituito con un oggetto di tipo S senza alterare qualsiasi altra parte del programma. Questo principio tratta l’ astrazione dei dati e la gerarchia delle classi. Questo principio tratta più la relazione sintattica piuttosto che la relazione sintattica della classe, perchè garantisce l’ interoperatività semantica dei tipi della gerarchia.
  • 7. Questo principio definisce una nozione di sostituibilità di oggetti mutabili. Il principio di Liskov impone alcuni requisiti standard sulla Signature dei metodi che sono state adottate nei linguaggi di programmazione Object Oriented: Controvarianza di argomenti del metodo nel sottotipo. Covarianza di tipi restituiti nel sottotipo. Nessuna nuova eccezione dovrebbe essere lanciata dai metodi dei sottotipo, ad eccetto di quelle eccezioni che sono già sottotipi lanciate dai metodi del supertipo.
  • 8. Nota: Si ha covarianza se si conserva l'ordinamento di tipi, ovvero si ha un ordinamento dei tipi dai più tipi specifici a più generico. Si ha controvarianza se si inverte questo ordinamento.
  • 9. Interface Segregation Principle Questo principio evidenzia lo svantaggio di avere interfacce che non sono interfacce specifiche per un singolo client. Sono chiamate interfacce “fat” ovvero le interfacce che non rispettono la coesione ed hanno un alto accoppiamento. Queste interfacce possono essere scomposte e ciascun componente può servire un diverso set di client. Le interfacce “fat” possono essere segregate in classi astratte che vanno a togliere il non voluto accoppiamento tra le classi.
  • 10. Dependency Inversion Principle Moduli di alto livello non dovrebbero dipendere da moduli di basso livello. Entrambi dovrebbero dipendere dall’ astrazione. L’ astrazione non dovrebbe dipendere dai dettagli. I dettagli non dovrebbero dipendere dall’ astrazione.
  • 11. Perchè la parola inversione? I metodi di sviluppo software più tradizionali come metodologie di analisi strutturata e design tradizionale tendono a creare design con un alta dipendenza dei moduli di alto livello con i moduli di basso livello e nelle quali le astrazioni dipendono anche dai dettagli. L’ obbiettivo di queste metodologie è definire gerarchie di sottoprogrammi che descrivono come i moduli di alto livello chiamano i moduli di basso livello. Si hanno strutture gerarchiche. Attraverso la DIP questo approccio è invertito rispettando la struttura delle dipendenze che normalmente risulta dalle metodologie tradizionali.
  • 12. Quando si crea un cattivo Design? Rigidità È difficile effettuare una modifica al codice poichè ogni cambiamento ha impatto su molte altre parti del sistema.È l’ interdipendenza dei moduli all’interno del design. Un design è rigido se esso non può essere cambiato facilmente. Tale rigidità è dovuta al fatto che tale cambiamento ha una pesante interdipendenza software tra moduli che dovrebbero essere indipendenti.
  • 13. Fragilità Quando cambi il codice e inaspettatamente parti del codice si rompono. La fragilità è la tendenza di un programma di rompersi in moti posti quando si fa un seplice cambiamento. Quando semplici cambiamenti di una parte dell’ applicazione crea problemi in altre parti dell’ applicazione apparentemente senza relazione.
  • 14. Immobilità È difficile da riutilizzare il componente software in un’ altra applicazione perchè non può essere spostato ed avere la stessa efficacia. Un design è immobile quando parte del design ha un’ alta dipendenza dai dettagli.
  • 16. Object Oriented Design Alessandro Ceseno contact me, my website is: www.alexceseno.it Add me on Linkedin: http://www.linkedin.com/in/alessandroceseno