speaker: Luca Minuti - Maurizio Del Magno

Slides:



Advertisements
Presentazioni simili
L.Lista Design P atterns Luca Lista. L.Lista Design Patterns Elementi di software OO riutilizzabile Piccoli insiemi di classi che collaborano implementando.
Advertisements

© CEFRIEL Ricettario dei principali pattern GoF Docente: Gabriele Lombardi
Introduzione alla programmazione Object Oriented
ANALYSIS & DESIGN I DESIGN PATTERNS GoF 1. I Design Patterns GoF …un momento importante durante il corso del design!
L.Lista, V. Innocente Design P atterns Luca Lista, Vincenzo Innocente.
Due slides sui Design Patterns Luciano Pandola INFN-LNGS Corso INFN su C++, ROOT e Geant4.
Giuditta Cantoni, 4 E S.I.A I DATABASE. Definizione databese In informatica, il termine database, banca dati o base di dati (a volte abbreviato con il.
1 14 marzo 2006 sommaruga andrea Fondazione Ordine Ingegneri di Milano VPN: Reti Private Virtuali VPN: RETI PRIVATE VIRTUALI LE POSSIBILITA' DI ACCESSO.
Corso gratuito di Linux. Linux User Group Mantova
POLITECNICO DI MILANO FACOLTA’ DI INGEGNERIA SEDE DI CREMONA TESI DI DIPLOMA IN INGEGNERIA INFORMATICA RELATOREAUTORI Prof. Vittorio TrecordiDemicheli.
Gestione delle configurazioni Configuration management (CM) E` un processo che controlla le modifiche fatte a un sistema e gestisce le diverse versioni.
PGDay 2009 FSGateway Ing. Torello Querci Resp. Architetture SW - Negens S.r.l. 4 Dicembre 2009, Pisa.
CONTROLLO DELLA CONCORRENZA
Basi di dati - Fondamenti
Piattaforma per la gestione di forniture basata su servizi web
CONFLITTI E DINAMICHE DI GRUPPO
Corso per Webmaster base
1 Metodologia per l’innovazione di prodotto nell’ottica del Design for All Metodologia per l’innovazione di prodotto nell’ottica del Design for All.
Vulnerability Assessment
Università degli Studi di Modena e Reggio Emilia
Sanità 2.0 Negli ultimi dieci anni è cresciuta in modo esponenziale anche in Italia la percentuale di chi cerca in rete informazioni di tipo sanitario.
Piattaforma per industrie stampaggio
Sistema di Autenticazione unica (Single-Sign-On) (azione #8)
Design patterns in pillole: factory method pattern
EasyGraph Dynamic web-based dashboard
Generazione di codice dinamico per la realizzazione di catene di servizi componibili Matteo Fazi – matr
Studente/i Relatore Correlatore Committente Christian Ortega
Universita’ di Milano Bicocca Corso di Basi di dati 1 in eLearning C
REX - Istruzioni tipo IKEA
Programmazione per la Musica | Adriano Baratè
Gruppo WebTools CCR – 14 Marzo 2007 Dael Maselli.
ORACLE Corso Base Copyright © Maggio 2008 Assi Loris Versione : 1
Terza Lezione → Navigare nel file System → parte 2
Microcontrollori e microprocessori
Raccolta ed Analisi dei Requisiti nella Progettazione
DIRIGERE L’INNOVAZIONE
IL CONCETTO DI ALGORITMO
GridFlex: gestione di software
Il Binding Nicolò Sordoni.
Basi di Dati: Introduzione
Paradigma MVC Ing. Buttolo Marco.
CONFLITTI E DINAMICHE DI GRUPPO
Blackbelt keypunchers
Universita’ di Milano Bicocca Corso di Basi di dati 1 in eLearning C
Job Application Monitoring (JAM)
LA GESTIONE DEI PACCHETTI
* Il Sistema Operativo GNU/Linux * Sistema Operativo e Applicazioni
UML Creato da: Enrico Tarantino Alessandro Vilucchi Roberta Barcella.
PROGRAMMAZIONE BASH – ISTRUZIONE IF
Tecniche di Problem-Solving
Programmazione ad Oggetti per la Fisica
analizzatore di protocollo
Sviluppo di un'applicazione web per l'utilizzo del framework SparkER
Corso di Ingegneria del Web A A Domenico Rosaci 1
Informatica per Scienze Geologiche LT a.a
Introduzione alle basi di dati
OBJECT ORIENTED DATABASE
Basi di dati - Fondamenti
Programmare.
Partizionamento/accorpamento di concetti
© 2007 SEI-Società Editrice Internazionale, Apogeo
ADO Per gestire i database con tecnologia ASP si utilizzano strumenti ADO (ActiveX Data Objects): un'architettura che fornisce oggetti.
Parti interne del computer
Strategie di progetto Si possono utilizzare le strategie tipiche dello sviluppo di un processo di ingegnerizzazione (es. ingegneria del software). Strategie.
Interfacce in Java Superare il meccanismo dell’ereditarietà singola
Unità 1 Programmi base.
UML Diagramma statico di una classe
Linguaggio di Modellazione Unificato
La programmazione strutturata
Il questionario: progettazione e redazione II Modulo
Transcript della presentazione:

speaker: Luca Minuti - Maurizio Del Magno Modern Architecture speaker: Luca Minuti - Maurizio Del Magno

Modern Architecture Luca Minuti FreeLance WiRL OpenSSL github.com/delphi-blocks/WiRL OpenSSL github.com/lminuti/Delphi-OpenSSL luca.minuti@gmail.com Modern Architecture facebook.com/lithian

Modern Architecture Maurizio Del Magno Developer i-ORM DJSON levante software i-ORM DJSON github.com/mauriziodm/iORM github.com/mauriziodm/DJSON mauriziodm@levantesw.it mauriziodelmagno@gmail.com facebook.com/maurizio.delmagno Modern Architecture iORM + DJSON (group)

Problema I requisiti cambiano… Il mio codice è facilmente manutenibile/estendibile/riutilizzabile? oppure… Rigidità resistenza cambiamento ogni modifica causa una cascata di ulteriori modifiche Fragilità tendenza a “rompersi” in diversi punti ad ogni modifica (anche senza una relazione concettuale con l’area che è cambiata) Immobilità impossibilità di riutilizzo di codice da altri progetti o anche all’interno dello stesso

Di chi è la colpa? La colpa è dei requisiti che cambiano!!! E se poniamo come primo requisito/specifica il fatto che i requisiti cambieranno? Allora è il nostro DESIGN ad essere SBAGLIATO… …perché non è in grado di adattarsi ai costanti cambiamenti di specifiche/requisiti che già sappiamo avverranno 1) Responsiveness 2) Speed ..

Di chi è la colpa? La colpa è delle DIPENDENZE Dipendenze improprie tra i diversi moduli/strati della nostra applicazione sono la principale causa dei nostri problemi Il degrado dell’architettura delle dipendenze può causare l’impossibilità di mantenere il nostro software 1) Responsiveness 2) Speed ..

Gestione delle dipendenze Le dipendenze vanno gestite Creazione di “firewalls” per dipendenze I firewalls impediscono la diffusione delle dipendenze tra i vari moduli/strati dell’applicazione Firewalls = interfacce 1) Responsiveness 2) Speed ..

Cos’è una dipendenza? Dependency Injection TInvoice Soft dependency TCalc ... Function Calculate: Integer; Uses FCalc: TCalc; FCalc: ICalc; Dependency constructor TInvoice.Create(ACalc:ICalc); begin FCalc := ACalc; end; Implements ICalc Function Calculate: Integer; Uses constructor TInvoice.Create; begin FCalc := TCalc.Create; end; External injection (Constructor injection) (Property/setter injection) (Creational Pattern) (D.I. Container/Service Locator) Implements OR TOtherCalc ... Function Calculate: Integer; constructor TInvoice.Create; begin FCalc := DIC.Locate<ICalc>; end; 1) Responsiveness 2) Speed ..

S O L I D Bastano? Principles Le interfacce sono nostre amiche Serve anche una buona architettura/design Pizza (images) Phonebook objects (HasMany, ereditarietà) Esempi di interrogazioni da codice Esistono dei principi e/o delle tecniche a cui ispirarsi?

Object Oriented Design ingle Responsibility Principle (SRP) O pen Closed Principle (OCP) L iskov Substitution Principle (LSP) I nterface Segregation Principle (ISP) D ependency Inversion Principle (DIP)

S ingle Responsibility Principle (SRP) Non ci dovrebbe mai essere più di una ragione per dover modificare una classe Ogni responsabilità è un possibile motivo di cambiamento Se una classe assume più di una responsabilità allora queste responsabilità sono “accoppiate” (coupled) Questo tipo di accoppiamento porta a modelli fragili che si rompono in modi inaspettati quando vengono cambiati 1) Responsiveness 2) Speed ..

O pen Closed Principle (OCP) E’ il più importante Un modulo deve essere aperto alle estensioni ma chiuso alle modifiche Come dire che vogliamo essere in grado di cambiare quello che un modulo fa, senza cambiare il codice sorgente del modulo stesso Esistono diverse tecniche, tutte basate sul concetto di “astrazione” Aggiungere nuove funzionalità unicamente aggiungendo codice nuovo, senza toccare quello già esistente … così eviteremo di “rompere” ciò che é già funzionante e testato in precedenza 1) Responsiveness 2) Speed ..

L iskov Substitution Principle (LSP) Ogni classe deve poter essere sostituita da qualunque sua derivata senza che il codice utilizzatore cambi il suo comportamento o cessi di funzionare Se una classe non è conforme il codice utilizzatore è costretto a “conoscere” (e quindi discernere) anche tutte le sue derivate Questo causa anche la violazione del “Open Close Principle” il codice utilizzatore deve essere modificato ogni volta che una nuova classe derivata viene creata 1) Responsiveness 2) Speed ..

Code sample … e quando dovremo aggiungere un altro poligono? function DrawShape(Shape: TShape) begin if Shape is TSquare then DrawSquare(TSquare(Shape)) else if Shape is TCircle then DrawCircle(TCircle(Shape)); end; … e quando dovremo aggiungere un altro poligono?

I nterface Segregation Principle (ISP) Più interfacce piccole e specifiche sono meglio di una sola grande generale interfaccia Ciascun client non dovrebbe dipendere da metodi e funzionalità che non usa effettivamente Un oggetto dovrebbe implementare numerose interfacce, una per ciascun ruolo che l'oggetto stesso gioca in diversi contesti e relazioni con altri oggetti 1) Responsiveness 2) Speed ..

D ependency Inversion Principle (DIP) Dipendi dalla astrazioni e non dalle implementazioni Di solito i moduli di alto livello* realizzano le proprie funzioni facendo uso di componenti di più basso livello I moduli di alto livello non devo dipendere da quelli di basso livello, entrambi devono dipendere solo da astrazioni Il riferimento alle astrazioni però è diverso nei due casi I moduli di altro livello “usano” tali astrazioni Quelli di basso livello le “implementano"

D ependency Inversion Principle (DIP)

Object Oriented Design Progettare software O.O. non è facile, farlo in modo che sia riusabile è ancora più difficile Responsabilità, granularità, ereditarietà ecc. Il sistema dovrebbe: essere specifico per il problema di oggi ma sufficientemente generale per adattarsi anche ad esigenze future avere un’architettura tale da minimizzare, o almeno centralizzare, eventuali redesign E’ difficile progettare architetture abbastanza riusabili e flessibili al primo tentativo Prima di raggiungere un buon risultato si reitera spesso sulle scelte progettuali All’inizio si fa confusione fra tutte le opzioni disponibili “utilizzo un’interfaccia oppure una classe astratta?” “riutilizzo tramite ereditarietà oppure per composizione?” “come assegno e/o divido le responsabilità?” 1) Responsiveness 2) Speed ..

Object Oriented Design Non cercare di reinventare la ruota Molte persone hanno già affrontato lo stesso problema Usa soluzioni che si sono già dimostrate efficaci in precedenza I “Design Patterns” sono una libreria di soluzioni architetturali che hanno già dimostrato di essere valide 1) Responsiveness 2) Speed ..

Design Pattern? Pizza (images) Phonebook objects (HasMany, ereditarietà) Esempi di interrogazioni da codice

Cosa Sono? generale ricorrente Una soluzione generale a un problema ricorrente Non sono una libreria di codice o un componente riutilizzabile Uno schema architetturale per risolvere un problema Categorie: Pattern creazionali (abstract factory, builder, singleton…) Pattern strutturali (adapter, proxy, facade…) Pattern comportamentali (command, observer, iterator…) Pattern architetturali (client-server, MVC, MVVM…) Altri… 1) Responsiveness 2) Speed ..

Singleton Scopo: Quando: Come: Assicurare che per una determinata classe esista una unica istanza attiva, fornendo un unico punto di accesso globale per accedervi Quando: utile quando si ha la necessità di centralizzare informazioni e/o comportamenti in un’unica entità condivisa da tutti i suoi utilizzatori Come: la soluzione più adatta a risolvere le esigenze di questo pattern (unicità dell’istanza) consiste nell’associare alla classe stessa la responsabilità di creare la sua istanza in questo modo è la classe stessa che assicura che nessun’altra istanza possa essere creata, intercettando e gestendo in modo centralizzato le richieste di solito è presente un metodo “getter” statico che restituisce l’istanza della classe (sempre la stessa), creandola preventivamente o alla prima chiamata (lazy initializzation) 1) Responsiveness 2) Speed ..

Singleton Pizza (images) Phonebook objects (HasMany, ereditarietà) Esempi di interrogazioni da codice

Abstract Factory Scopo: Quando si vuole… Come: Vantaggi: Fornire un’interfaccia astratta per la creazione di famiglie di oggetti tra loro correlati (o dipendenti) limitando l’accoppiamento derivante dall’uso diretto delle classi concrete Quando si vuole… un sistema indipendente da come gli oggetti vengono creati, composti e rappresentati permettere la configurazione del sistema come scelta fra diverse famiglie di oggetti che gli oggetti, che sono organizzati in famiglie, siano vincolati ad essere utilizzati con altri della stessa famiglia fornire una libreria di classe mostrando solo le interfacce e nascondendo le implementazioni Come: di solito si crea una sola istanza “concreta” a run-time una istanza gestisce la creazione di una sola famiglia di oggetti con una implementazione specifica per creare oggetti di un’altra famiglia bisogna istanziare un’altra factory “concreta” Vantaggi: consente di cambiare in modo semplice la famiglia di oggetti utilizzata (anche a run-time) promuove la coerenza perché consente di creare solo oggetti di una stessa famiglia

Abstract Factory Pizza (images) Phonebook objects (HasMany, ereditarietà) Esempi di interrogazioni da codice

Demo time… Dubbi ??? Pizza (images) Phonebook objects (HasMany, ereditarietà) Esempi di interrogazioni da codice

Code sample Questo è OOP ? Quindi se uso un DB non posso usare la OOP? procedure TForm1.Button1Click(Sender: Tobject); var Tot: Currency; begin DS.Open; Tot := 0; While not DS.eof do Tot := Tot + DS.FieldByName[‘Qta’].AsInteger * DS.FieldByName[‘Prezzo’].AsCurrency; DS.Next; end; DS.Close; ShowMessage(‘Totale: ’ + CurrToStr(Tot)); Quindi se uso un DB non posso usare la OOP? Questo è OOP ? dove è il comportamento? dove sono i dati? dove è incapsulata la business logic?

Programma Applicativo Insieme organizzato di 3 strati funzionali Presentation layer (user interface) Domain logic layer (business logic) Persistence layer (data access logic) 1) Responsiveness 2) Speed ..

Presentation Layer User Interface Si occupa dell’interazione con l’utente Riceve i dati che l’utente fornisce come input Presenta, come output, i risultati dell’esecuzione del programma Cattura le intenzioni dell’utente e le esaudisce eseguendo uno o più comandi

Domain Logic Layer Business Logic Sottosistema di logica applicativa Definisce, in forma di classi, le informazioni e gli specifici algoritmi di manipolazione e validazione che caratterizzano l’applicazione Es. per gestione ordini: TCliente, TOrdine, TRigaOrdine, TArticolo ecc. 1) Responsiveness 2) Speed ..

Persistence Layer Data Access Logic Sottosistema di gestione della persistenza Si occupa dell’organizzazione dei dati, della loro memorizzazione e del loro successivo reperimento 1) Responsiveness 2) Speed ..

Programma Applicativo Insieme organizzato di 3 strati funzionali Presentation Domain Note: Come disponiamo le logiche che compongono la nostra applicazione e come provvediamo alla loro reciproca separazione è di rilevante importanza. Influenza la manutenibilità, testabilità e in generale la qualità del nostro lavoro. Data access In questo differiscono tra loro i pattern architetturali più conosciuti (MVC, MVP, PM, MVVM). 1) Responsiveness 2) Speed ..

Demo time… Dubbi ??? Pizza (images) Phonebook objects (HasMany, ereditarietà) Esempi di interrogazioni da codice

Pizza (images) Phonebook objects (HasMany, ereditarietà) Esempi di interrogazioni da codice

RUNTIME PACKAGES Un package non è nient'altro che un particolare tipo di libreria (dll) Sono usati dall'IDE ma anche dalla applicazioni Possono essere caricati staticamente o dinamicamente Possono contenere più unit (ma non hanno un entry point) Possono far riferimento ad altri package tramite la keyword require Attenzione: non possono contenere riferimenti circolari Attenzione: una unit non può far parte di due package (usati contemporaneamente)

Demo time… Dubbi ??? Pizza (images) Phonebook objects (HasMany, ereditarietà) Esempi di interrogazioni da codice

Ancora dubbi ??? Fai una domanda… Pizza (images) Phonebook objects (HasMany, ereditarietà) Esempi di interrogazioni da codice

Grazie ! Maurizio Del Magno Luca Minuti Developer FreeLance i-ORM DJSON github.com/mauriziodm/iORM WiRL github.com/delphi-blocks/WiRL github.com/mauriziodm/DJSON OpenSSL github.com/lminuti/Delphi-OpenSSL mauriziodm@levantesw.it luca.minuti@gmail.com mauriziodelmagno@gmail.com facebook.com/maurizio.delmagno facebook.com/lithian iORM + DJSON (group)

1) Responsiveness 2) Speed ..

1) Responsiveness 2) Speed ..

1) Responsiveness 2) Speed ..

1) Responsiveness 2) Speed ..

Pizza (images) Phonebook objects (HasMany, ereditarietà) Esempi di interrogazioni da codice