(Alcuni) Design Pattern e Tecniche di Riuso, Architettura Software e sue Qualità Progetto di Applicazioni Software



Documenti analoghi
Design Pattern in Java

Progettazione : Design Pattern Creazionali

Programmazione a Oggetti Lezione 10. Ereditarieta

Considera tutti i requisiti funzionali (use cases) NON deve necessariamente modellare i requisiti non funzionali

GESTIONE DEI PROCESSI

!"#$%&&'()#*%+%+!"#$"',,'()#*%+ -")%*&'&'+'$.)+-$$%&&) !"#$%&&'(%)'*+%",#-%"#.'%&'#/0)-+#12"+3,)4+56#7+#.')8'9

12 - Introduzione alla Programmazione Orientata agli Oggetti (Object Oriented Programming OOP)

Indice generale. OOA Analisi Orientata agli Oggetti. Introduzione. Analisi

Database. Si ringrazia Marco Bertini per le slides

Sistemi informativi secondo prospettive combinate

EXPLOit Content Management Data Base per documenti SGML/XML

Approccio stratificato

Software di sistema e software applicativo. I programmi che fanno funzionare il computer e quelli che gli permettono di svolgere attività specifiche

Tipi primitivi. Ad esempio, il codice seguente dichiara una variabile di tipo intero, le assegna il valore 5 e stampa a schermo il suo contenuto:

Piano di gestione della qualità

L ambizione dei design pattern (letteralmente schemi di programmazione) è quella di offrire soluzioni a problemi ricorrenti che facilitano lo

Progettaz. e sviluppo Data Base

Stefania Marrara - Esercitazioni di Tecnologie dei Sistemi Informativi. Integrazione di dati di sorgenti diverse

Oggetti Lezione 3. aspetti generali e definizione di classi I

Corso di Basi di Dati e Conoscenza

Scenario di Progettazione

Esercitazioni di PROGETTAZIONE DEL SOFTWARE A.A

BASI DI DATI per la gestione dell informazione. Angelo Chianese Vincenzo Moscato Antonio Picariello Lucio Sansone

Introduzione alle basi di dati. Gestione delle informazioni. Gestione delle informazioni. Sistema informatico

Ingegneria del Software. Presentazione del pattern Proxy

Programmazione Orientata agli Oggetti in Linguaggio Java

Lezione 1. Introduzione e Modellazione Concettuale

Telerilevamento e GIS Prof. Ing. Giuseppe Mussumeci

La gestione di un calcolatore. Sistemi Operativi primo modulo Introduzione. Sistema operativo (2) Sistema operativo (1)

Coordinazione Distribuita

Con il termine Sistema operativo si fa riferimento all insieme dei moduli software di un sistema di elaborazione dati dedicati alla sua gestione.

Modulo 4: Ereditarietà, interfacce e clonazione

Presentazione di Cedac Software

La Metodologia adottata nel Corso

Il modello di ottimizzazione SAM

Base di dati e sistemi informativi

Ciclo di vita dimensionale

Sistemi Operativi STRUTTURA DEI SISTEMI OPERATIVI 3.1. Sistemi Operativi. D. Talia - UNICAL

Organizzazione degli archivi

Tecnologia di un Database Server (centralizzato) Introduzione generale

Architetture Applicative

Network Monitoring. Introduzione all attività di Network Monitoring introduzione a Nagios come motore ideale

e-dva - eni-depth Velocity Analysis

Brochure Internet. Versione The Keyrules Company s.r.l. Pagina 2 di 8

Alcuni Design Pattern in Java

Definizione Parte del software che gestisce I programmi applicativi L interfaccia tra il calcolatore e i programmi applicativi Le funzionalità di base

Componenti Web: client-side e server-side

Corso di Informatica

Infrastruttura di produzione INFN-GRID

Object Oriented Programming

Progetto di Applicazioni Software

Il Software. Il software del PC. Il BIOS

Corso di Amministrazione di Reti A.A. 2002/2003

Progetto di Applicazioni Software

Programmazione a Oggetti Modulo B

Sistemi Informativi Distribuiti

Ingegneria del Software. Introduzione ai pattern

Introduzione alla Virtualizzazione

Distributed Object Computing

Progettaz. e sviluppo Data Base

Registratori di Cassa

Calcolatori Elettronici A a.a. 2008/2009

lem logic enterprise manager

Generazione Automatica di Asserzioni da Modelli di Specifica

Le fattispecie di riuso

Scheduling della CPU. Sistemi multiprocessori e real time Metodi di valutazione Esempi: Solaris 2 Windows 2000 Linux

Automazione Industriale 4- Ingegneria del Software

Sommario. Oracle Database 10g (laboratorio) Grid computing. Oracle Database 10g. Concetti. Installazione Oracle Database 10g

Introduzione Ai Data Bases. Prof. Francesco Accarino IIS Altiero Spinelli Via Leopardi 132 Sesto San giovanni

Mon Ami 3000 Varianti articolo Gestione di varianti articoli

Introduzione. Coordinazione Distribuita. Ordinamento degli eventi. Realizzazione di. Mutua Esclusione Distribuita (DME)

Concetti di base di ingegneria del software

RIFERIMENTI ATTORI GLOSSARIO. ERRORI COMUNI REV. REQUISITI INGEGNERIA DEL SOFTWARE Università degli Studi di Padova

ISTITUTO TECNICO ECONOMICO MOSSOTTI

I Thread. I Thread. I due processi dovrebbero lavorare sullo stesso testo

CORSO ACCESS PARTE II. Esistono diversi tipi di aiuto forniti con Access, generalmente accessibili tramite la barra dei menu (?)

Gestione in qualità degli strumenti di misura

Il Sistema Operativo. C. Marrocco. Università degli Studi di Cassino

SISTEMI OPERATIVI DISTRIBUITI

Implementing a new ADT based on the HL7 version 3 RIM. Esempio

BASE DI DATI: introduzione. Informatica 5BSA Febbraio 2015

Il Sistema Operativo (1)

GenLApp Generazione Lista di Applicazioni. Design Patterns. Classi Essenziali. Modellazione Dati. Progettazione della Linea di Prodotti

In estrema sintesi, NEMO VirtualFarm vuol dire:

INFORMATICA. Il Sistema Operativo. di Roberta Molinari

Architetture software

Corso Analista Programmatore Web PHP Corso Online Analista Programmatore Web PHP

Java: Compilatore e Interprete

Configuration Management

Gestione delle transazioni. Database Management Systems 3ed, R. Ramakrishnan and J. Gehrke 1

Sistemi centralizzati e distribuiti

Multithreading in Java. Fondamenti di Sistemi Informativi

Parola chiave extends

Linguaggi Corso M-Z - Laurea in Ingegneria Informatica A.A Esercitazione. Programmazione Object Oriented in Java

Architettura MVC-2: i JavaBeans

La piattaforma di lettura targhe intelligente ed innovativa in grado di offrire servizi completi e personalizzati

Soluzione dell esercizio del 2 Febbraio 2004

Riepilogo delle modifiche di PA-DSS dalla versione 2.0 alla 3.0

Introduzione alla Programmazione Orientata agli Oggetti. Classi, Oggetti e Messaggi

EVOLUZIONE DEI LINGUAGGI DI ALTO LIVELLO

Transcript:

Il materiale presentato corrisponde a (passi scelti di): Go4: Design Patterns. Addison Wesley, 2002 S.J. Metsker: Design Pattern in Java. Addison Wesley, 2003 (Alcuni) Design Pattern e Tecniche di Riuso, Architettura Software e sue Qualità Progetto di Applicazioni Software

Pattern Il concetto di pattern nasce dall idea del prof. Alexander nel contesto dell architettura ma può essere applicato in molte altre discipline compresa la progettazione del software Alexander, nella sua lunga esperienza, aveva sviluppato una serie di best practice, cioè idee progettuali/realizzative che si erano dimostrate efficaci ed efficienti. Il messaggio di Alexander ai futuri esperti era: Se l idea che ha portato ad una soluzione del problema ha una valida generale e se il contesto ne permette l applicazione, perché non riutilizzarla? L idea è che non è necessario reinventare la ruota ogni volta: i pattern sono un sistema eccellente per catturare ed esprimere l esperienza maturata in un determinato mestiere I design pattern (letteralmente pattern di progettazione ) sono pattern (cioè nati per perseguire un intento: la soluzione di un problema) che utilizzano metodi e classi di un linguaggio OO. I design pattern sono ad un livello più elevato rispetto ai linguaggi di programmazione Object Oriented perché indipendenti dagli stessi I design pattern più importanti originariamente erano stati sviluppati per SmallTalk, un linguaggio Object Oriented che non si è mai diffuso Design Patterns & Architettura 2

Gli Elementi in Gioco I pattern originali di Alexander erano formulati nel modo seguente: SE ti trovi in CONTESTO come nel caso ESEMPI con questo PROBLEMA che implica REQUISITI ALLORA per queste MOTIVAZIONI applica FORMATI_PROGETTO AND/OR REGOLE_PROGETTO per realizzare SOLUZIONE che guida a NUOVO_CONTESTO AND NUOVI_PATTERN Ad ogni design pattern è stato associato un nome compatto che ne chiarisse l essenza Pattern user Ha Problema Opera Risolve Contesto Priorizza Risolve Forze Soluzione uno scenario che illustra il problema di progettazione e come le classi e gli oggetti del pattern lo risolvono. Devono essere descritte tutte quelle forze (problemi, vincoli e implicazioni varie) che influenzano la parte del progetto che il pattern deve affrontare, le Design Patterns & Architettura 3 interazioni e i conflitti

Singleton / 1 Questo design pattern è usato per assicurare che una classe abbia una sola istanza ed un unico punto di accesso globale. In molte situazioni c è la necessità di garantire l esistenza di un unico oggetto di una classe Ad esempio in un sistema ci possono essere tante stampanti ma solo una classe PrintSpooler Le classi Singleton vengono progettate con i costruttori privati per evitare la possibilità di istanziare un numero arbitrario di oggetti della stessa. Esiste un metodo statico con la responsabilità di assicurare che nessuna altra istanza venga creata oltre la prima, restituendo contemporaneamente un riferimento all unica esistente Design Patterns & Architettura 4

Singleton / 2 La classe mantiene all interno il riferimento all unica istanza Singleton della classe L istanza alla prima esecuzione del metodo statico (inizializzazione pigra) oppure contemporaneamente alla definizione della variabile di istanza riferimento all oggetto La classe contiene poi tutti i metodi, le proprietà e gli attributi tipici dell astrazione per cui è stata concepita L inizializzazione pigra viene spesso usata quando non si hanno abbastanza informazioni per istanziare l oggetto Singleton nel momento di dell inizializzazione statica. Un Singleton potrebbe richiedere valori calcolati più avanti Design Patterns & Architettura 5

Esempio Singleton public class Singleton { // istanza allocata in modo pigro private static Singleton instance = null; // specifica delle proprieta' caratteristiche // dell'oggetto //... // costruttore definito come privato in modo // da proibire ai client di creare oggetti private Singleton() {} public static Singleton getinstance() { if ( instance == null ) instance = new Singleton(); return instance; } } public class Application { public static void main(string args[]) { Singleton obj=singleton.getinstance(); Singleton obj2=singleton.getinstance(); } } Variazioni per il singleton non pigro: private static Singleton instance = new Singleton(); private Singleton() {} public getinstance() { return (instance); } System.out.println( Primo oggetto: +obj); System.out.println( Secondo oggetto: +obj2); if (obj==obj2) System.out.println( Sono lo STESSO oggetto ); Design Patterns & Architettura 6

Observer / 1 L intento del pattern Observer è definire una dipendenza uno-a-molti tale che quando un oggetto cambia stato tutti quelli che ne dipendono vengono automaticamente notificati del fatto ed aggiornati di conseguenza L oggetto osservato è chiamato Subject (soggetto) mentre gli oggetti osservatori sono noti come Observer In risposta alla notifica, ogni osservatore richiederà al soggetto le informazioni necessarie per sincronizzare il proprio stato con il nuovo stato del soggetto Design Patterns & Architettura 7

Observer / 2 Gli ascoltatori delle Swing sono un esempio di pattern Observer. Infatti il componente che scatena l evento è il subject mentre gli ascoltatori formano una lista di Observer Noto anche come Publish/Subscribe Il soggetto pubblica le modifiche al proprio stato La pubblicazione agli osservatori è fatta chiamando il metodo notify che internamente chiama il metodo update di tutti gli Observer registrati Gli osservatori si sottoscrivono per ottenere gli aggiornamenti La sottoscrizione di un Observer x è realizzata da x invocando sul subject il metodo add(x) Design Patterns & Architettura 8

Implementaz. Observer/1 public interface Observer { void Update(); } public class ConcreteObserver implements Observer { private ConcreteSubject subject; } public ConcreteObserver(ConcreteSubject asubject) { subject = asubject; subject.add(this); } public void Update() { System.out.println("Io sono l'observer " + this + " ed il nuovo stato del mio subject e' " + subject.getstate()); } Design Patterns & Architettura 9

Implementaz. Observer/2 public interface Subject { void add(observer anobserver); void remove(observer anobserver); void notify(); } public class ConcreteSubject implements Subject { private int state; // la lista degli osservatori private LinkedList observers; public ConcreteSubject(int initialstate){ state = initialstate; } public int getstate() { return state; } public void setstate(int astate) { state = astate; } Design Patterns & Architettura 10

Implementaz. Observer/3 public void Notify() { Iterator iter=observers.iterator(); Observer obs; while(iter.hasnext()) { obs=(observer)iter.next(); obs.update(); } } public void add(observer anobserver) { observers.add(anobserver); } public void remove(observer anobserver) { observers.remove(anobserver); } Design Patterns & Architettura 11

Implementaz. Observer/4 public static void main(string[] args) { int concreteobservers[3]; int initialstate = 10; ConcreteSubject mysubject = new ConcreteSubject(initialState); System.out.println("E' stato creato un subject con stato " + mysubject.getstate()); for (int i = 0; i < 3; i++) { concreteobservers[i] = new ConcreteObserver(mySubject); } System.out.println("..."); mysubject.setstate(17); mysubject.notify(); System.out.println("..."); mysubject.setstate(06); mysubject.notify(); } Un possibile output è il seguente: E' stato creato un subject con stato 10... Io sono l'observer ConcreteObserver@288051 ed il nuovo stato del mio subject e' 17 Io sono l'observer ConcreteObserver@45eb ed il nuovo stato del mio subject e' 17 Io sono l'observer ConcreteObserver@ee7a14 ed il nuovo stato del mio subject e' 17... Io sono l'observer ConcreteObserver@288051 ed il nuovo stato del mio subject e' 6 Io sono l'observer ConcreteObserver@45eb ed il nuovo stato del mio subject e' 6 Io sono l'observer ConcreteObserver@ee7a14 ed il nuovo stato del mio subject e' 6 Design Patterns & Architettura 12

Implementazione Java Java fornisce già implementate le classi per realizzare il pattern Observer Gli osservatori devono implementare l interfaccia java.util.observer la quale definisce il metodo public void update(observable o,object arg) Il subject per essere tale deve estendere la classe java.util.observable che tra gli altri fornisce i seguenti metodi: public void addobserver(observer o) public void removeobserver(observer o) public void notifyobserver([object arg]) protected void setchanged() Il subject notifica il cambiamento dello stato invocando notifyobserver il quale chiama i metodi update degli osservatori installati quando vengono chiamati in sequenza Si intende che il subject cambia stato quando viene chiamato il metodo setchanged Design Patterns & Architettura 13

Esempio / 1 Si vuole realizzare una finestra grafica con una JSlider. La modifica del valore aggiorna una JLabel e un istogramma contenuto in un pannello Presentation Layer Application Layer Design Patterns & Architettura 14

Esempio / 2 class Valore extends java.util.observable { private int stato; private static Valore val=new Valore(); private Valore() {} public static Valore getistance() { return(val); } public void setstate(int unostato) { stato=unostato; this.setchanged(); this.notifyobservers(); } Notifica agli ascoltatori la modifica dello stato del subject } public int getstate() { return(stato); } Design Patterns & Architettura 15

Esempio / 3 class Etichetta extends JLabel implements java.util.observer { public Etichetta(java.util.Observable obs) { Si registra come obs.addobserver(this); osservatore del subject } passato come param } public void update(java.util.observable obs,object arg) { if (obs instanceof Valore) { } } int state = ( (Valore) obs).getstate(); this.settext("il valore è "+state); Aggiorna i contenuto dell etichetta quando viene notificato l aggiornamento dello stato del subject class Listener implements ChangeListener { public void statechanged(changeevent ce) { JSlider obj=(jslider)ce.getsource(); Valore.getIstance().setState(obj.getValue()); } } ChangeListener si occupa di gestire gli eventi di modifica del valore scelto nella JSlider. Dichiara il metodo statechanged, invocato allo scatenarsi dell evento. Design Patterns & Architettura 16

Esempio / 4 class Pannello extends JPanel implements java.util.observer { int state; public void paintcomponent(graphics g) { super.paintcomponent(g); Color c; if (state<100) c=color.green; else if (state<200) c=color.yellow; else c=color.red; Graphics2D g2=(graphics2d)g; g2.setcolor(c); g2.fillrect(30,0,70,state); g2.setcolor(color.blue); g2.drawstring(string.valueof(state),60,20); } public void update(java.util.observable obs,object arg) { if (obs instanceof Valore) { state=valore.getistance().getstate(); repaint(); } } public Pannello(java.util.Observable obs) { obs.addobserver(this); this.setpreferredsize(new Dimension(100,300)); } } Design Patterns & Architettura 17

Esempio / 5 public class MyFrame extends JFrame { JSlider sudslider = new JSlider(0,300); JPanel centropnl = new JPanel(); Etichetta et; Listener ascoltatore=new Listener(); Pannello pannello; public MyFrame() { super("observer"); et=new Etichetta(Valore.getIstance()); pannello=new Pannello(Valore.getIstance()); this.getcontentpane().add(sudslider, BorderLayout.SOUTH); this.getcontentpane().add(centropnl, BorderLayout.CENTER); centropnl.add(et); centropnl.add(pannello); sudslider.addchangelistener(ascoltatore); sudslider.setvalue(0);... } } Design Patterns & Architettura 18

Data Transfer Object / 1 Quando l invocazione tra oggetti è remota, è più conveniente permettere al client di gestire molti valori in un unica operazione piuttosto che avere invocazioni distinte Infatti quello che pesa nell invocazione remota non sono tanto i dati trasportati, ma l invocazione stessa Analogamente permettere al client di gestire più oggetti con una singola invocazione piuttosto che singolarmente Design Patterns & Architettura 19

Data Transfer Object / 2 DataTransferObject creazione & consumo BusinessObject +getdatatransferobject() : DataTransferObject +setdatatransferobject(in adto : DataTransferObject) : void creazione & consumo Client Oggetto1 Client Oggetto transiente getdatatransferobject() << new >> DTO return DTO DataTransferObject (DTO): contiene un sottoinsieme dei dati disponibili nel BusinessObject, ma più di uno. Le istanze sono transienti, create all occorrenza per il solo scopo di muovere I dati tra Client e BusinessObject. Non presenta metodi comportamentali e (se in Java) permette accesso diretto agli attributi, senza metodi get/set Design Patterns & Architettura 20

Data Transfer Object / 3 BusinessObject: i dati vengono acceduti in gruppi, attraverso metodi get/set. Ad ogni richiesta del client viene tipicamente creato una nuova istanza di DataTransferObject Client: è remoto rispetto al BusinessObject. Se fosse locale il pattern avrebbe poco senso In caso di client diversi con esigenze differenti, ci possono essere diversi DTO a fronte dello stesso BusinessObject Design Patterns & Architettura 21

Data Transfer Object / 4 Omogeneità nei dati del DTO Eventualmente pensare più DTO in base a differenti esigenze di accesso Solo dati, nessun comportamento Spesso coincide con una transazione del BusinessObject (modifica coerente del livello di persistenza) In molti casi il DTO è realizzato in XML definizione del DTO è un XSD un istanza passata come parametro è un documento XML Design Patterns & Architettura 22

Adapter / 1 Convertire l interfaccia di una classe in un altra richiesta dal client Convertire l interfaccia di (una porzione di software di) un legacy system in quella progettata Consente a classi diverse di operare insieme quando ciò non sarebbe altrimenti possibile a causa di interfacce incompatibili Design Patterns & Architettura 23

Adapter / 2 L Adapter implementa l interfaccia, estende la classe esistente e ridefinisce il metodo chiamando quello esistente Client «interfaccia» ThoughtfulInterface service() ExistingClass usefulmethod() Adapter service() Design Patterns & Architettura 24

Adapter / 3 (Adapter Object) Client «interfaccia» ThoughtfulInterface service() Adapter service() ExistingClass usefulmethod() Se la classe esistente non può essere specializzata (ovvero l adapter è costretto a specializzare una classe astratta che definisce l interfaccia), allora si realizza tramite un meccanismo di class composition e forwarding Design Patterns & Architettura 25

Template Method / 1 Definire la struttura di un algoritmo all interno di un metodo, delegando alcuni passi dell algoritmo alle sottoclassi Le sottoclassi ridefiniscono alcuni passi dell algoritmo senza dover implementare di nuovo la struttura dell algoritmo stesso Operazioni hook Principio Hollywood: don t call me, I ll call you La classe padre chiama le operazioni ridefinite nei figli e non viceversa Design Patterns & Architettura 26

Template Method / 2 AbstractClass templatemethod() primitiveop1() primitiveop2()... if (...) then primitiveop1() else primitive Op2()... ConcreteClass primitiveop1() primitiveop2() Design Patterns & Architettura 27

Riuso e le Relative Tecniche

Riuso (1) Il riuso Cut&Paste produce benefici solo sul 20% del lavoro Migliori risultati importando componenti generici (codice, sorgenti, design patterns, GUI look&feel, ) Principio Open-Closed: ogni componente deve essere aperto all estensione ma chiuso alle modifiche Design Patterns & Architettura 29

Riuso (2) Generalize Certify Applications Select and Specialize Due cicli: Product development Asset develpment We may need a and it could also do Library Enhance Importanza della documentazione Commitment Design Patterns & Architettura 30

Riuso del codice (1) Un componente riusabile deve: essere generico per catturare le cose in comune tra differenti contesti offrire meccanismi per essere specializzato Plug-points per la composizione con altri componenti per costruire qualcosa di più grande per inserire parti che lo specializzano Design Patterns & Architettura 31

Riuso del codice (2) Upper Interfaces - l uso normale connessione diretta e visibile di parti che forniscono servizi ben definiti Interfaccia pubblica di una classe, API di un DBMS, window manager, e insieme dei servizi offerti da un componente Video Store System Per costruire questo componente Membership Manager Design Patterns & Architettura Stock Manager usiamo questi componenti 32

Riuso del codice (3) Lower Interfaces - customizzazione plug-in per specializzare il comportamento di un componente Web browser, word processor e spreadsheet utilizzano tecnologie di linking dinamico per estendere le loro funzionalità Video Store System Per costruire questo componente Generic Membership Manager Account class Design Patterns & Architettura Class Member usiamo questo componente provvedendo dei plug-in per customizzarlo 33

Riuso del codice (4) Un OOP Framework è un insieme di classi astratte e concrete che collaborano per offrire lo scheletro dell implementazione di un applicazione E adattabile, componendo ad-hoc sottoclassi selezionate, ovvero definendo nuove sottoclassi ed implementando metodi che fanno il plug-in o l override delle superclassi Lo scheletro del comportamento comune è: un metodo interno specificato su un interfaccia che deve essere implementata da una classe specializzata un metodo template nella superclasse con parti varianti delegate alla sottoclasse Design Patterns & Architettura 34

Riuso del codice (5) Esempio - Progetto ed implementazione di un programma per manipolare forme. Differenti forme sono visualizzate differentemente. Quando una forma è visualizzata, essa mostra un rendering del suo bordo ed una stampa testuale della sua locazione nel font più grande che può essere contenuto nella forma Class Library Framework style (template) (slide 36 ) (slide 37) Design Patterns & Architettura 35

aclient : Shape display( ) : Oval computefont() printlocation() Design Patterns & Architettura render( ) innerbox( ) Class Shape { // called from subclass protected Font computefont (BoundingBox b, String s) { } protected void printlocation (GraphicsContext g, Font f, Point location) { } public abstract void display (GraphicsContext g); } Class Oval extends Shape { private LocationInfo ovaldata; private BoundingBox innerbox() { } private void render (GraphicsContext g) { } public void display (GraphicsContext surface) { render(); BoundingBox box = innerbox(); Font font = super.computefont(box, ovaldata.location).asstring()); super.printlocation(surface, font, ovaldata.location; } } 36

aclient : Shape : Oval display( ) render() innerbox() location() computefont( ) printlocation( ) Class Shape { public void display(graphicscontext surface) { // delegate to subclass to fill in the // pieces render(surface); // plug-point BoundingBox box = innerbox(); // plug-point Point location = location(); // plug-point // then do the rest based on those bits Font font = computefont(box, location); surface.printlocation (location, font); } } Class Oval extends Shape { // implement 3 specific plug-ins for // the plug-points in Shape protected void render (GraphicsContext g) { } protected BoundingBox innerbox() { } protected Point location () {return center;} private Point center; private int majoraxis, minoraxis, angle; } Design Patterns & Architettura 37

Riuso del codice (6) I vari comportamenti sono differenti; si cerca di fattorizzare le parti comuni Condivisione delle operazioni low-level. Logica high-level duplicata Le chiamate vanno dall applicazione alla base condivisa Definire un interfaccia che l applicazione può usare per chiamare le parti riusabili I comportamenti sono essenzialmente gli stessi, identificare le differenze da delegare alle sottoclassi Condivisione dello skeleton applicativo; ogni applicazione plug-in le parti richieste per completarlo Le chiamate vanno dal framework alle applicazioni; Don t call me - I ll call you Definire un interfaccia per i plug-point (chiamate dello skeleton riusabile alle applicazioni) Design Patterns & Architettura 38

Riuso del codice (7) L applicazione contiene il codice più recente; la base contiene codice più vecchio; il codice più recente chiama quello esistente L applicazione implementa regole e policy (l architettura) L applicazioni contiene il codice più recente; la base (codice più vecchio) chiama il codice più recente Il framework implementa l architettura ed impone regole e policy sull applicazione Application Calls Base (skeletal code with plug-point) Base Application (with plug-in) Design Patterns & Architettura 39

Concetto di Architettura e sue Qualità

Architettura / Architetture Architettura è oramai una buzzword system architecture: the structure of the pieces that make up a complete sw installation, including the responsibilities of these pieces, their interconnection, and possibly the appropriate technology component architecture: a set of application-level components *, their structural relationships, and their behavioral dependecies (*) component/componente non indica qui una particolare tecnologia, ma un modulo software con obiettivi ben definiti ed omogenei, relazioni strutturali con altri moduli/componenti, offre un insieme ben definito di servizi agli altri componenti (server) e può utilizzare servizi di altri componenti (client) Design Patterns & Architettura 41

System Architecture (Architettura di Sistema) Dà la forma finale del sistema installato, e come varie tecnologie vengono assemblate per formarlo Si considereranno prevalentemente N-tier distributed architecture http Active/Java Server Pages iiop/rmi/ soap/com+ Component object Component object Component object Component object Component object sql Database Design Patterns & Architettura 42

System Architecture (Architettura di Sistema) Design Patterns & Architettura 43

System Architecture (Architettura di Sistema) Identificare differenti livelli nei quali i componenti vengono utilizzati User Interface la presentazione dell informazione agli utenti (anche altri sistemi) a la cattura dei loro input crea cosa l utente vede; tratta la UI logic User Dialog management dello user s dialog in una sessione stato transiente corrisponde al dialogo Design Patterns & Architettura 44

System Architecture (Architettura di Sistema) System Services (Servizi di Sistema) la rappresentazione esterna del sistema, che fornisce accesso ai suoi servizi é una facade per il layer sottostante, fornendo un contesto nel quale i business service più generali sono utilizzati per un particolare sistema nessun stato dialog- o client-related operazioni = nuove transazioni Business Services (Servizi di Business) l implementazione delle core business information, regole e trasformazioni operazioni possono essere combinate con altre in transazioni tipicamente database associato Design Patterns & Architettura 45

System Architecture (Architettura di Sistema) User Interface JSP che mostra il dialogo reserve car User Dialog Java Bean che mantiene lo stato del dialogo reserve car System Services Classe Java / session EJB che supporta auto rental interface Business Services Classe Java / entity EJB che rappresenta un car rental contract Application (system + UI) System (riusabile rispetto a diverse UI) Design Patterns & Architettura 46

Component Architecture (Architettura a Componenti) Nella component architecture ci si concentra sui component, le loro relazioni strutturali e dipendenze comportamentali Relazioni strutturali: associazioni e inheritance tra specifications e interfaces, e composizione tra components Dipendenze comportamentali: dipendenze tra components, tra components e interfacce, tra interfacce stesse Design Patterns & Architettura 47

Component Architecture (Architettura a Componenti) Component Specification Architecture any dependency emanating from a CSA is part of the definition of that component specification and must be adhered to by all implementations Component Implementation Architecture Dipendenze che esistono tra particolari implementazioni; in genere l implementazione aggiunge vincoli ulteriori a quelli della specification Design Patterns & Architettura 48

Forme The specification of a component providing services. It defines interfaces (1..*) and behaviour of the component. The specification is realized as a component implementation The realization of a component; it can be installed component specification 1 * realization component implementation Design Patterns & Architettura 49

Forme component implementation An installed copy of a component implementation; it is deployed by registering it with the environment, thus enabling the environment to identify it to use when creating an instance A run-time concept: an object with its own state and a unique identity, the thing that performs the implemented bahavior. A deployed component may have multiple instances 1 installation deployed component Design Patterns & Architettura 50 * 1 instantiation * component instance

Incapsulamento La specifica di un componente deve descrivere le interfacce che un utilizzatore può sfruttare per accedere al componente Le interfacce dovrebbero essere il più possibile separate dall implementazione Autocontenute Indipendenti da un particolare linguaggio di programmazione Le interfacce dovrebbero essere bidirezionali Descrivere anche i servizi attesi dal componente Design Patterns & Architettura 51

Composizione Per realizzare il collegamento tra componenti è necessario fornire dei meccanismi per: selezionare i componenti da utilizzare definire la tipologia di interazione Questi meccanismi sono generalmente forniti dagli standard infrastrutturali Design Patterns & Architettura 52

Component Architecture (Architettura a Componenti) Component Object Architecture Utile soprattutto quando faccio riuso di components <<comp spec>> OrderMgr <<comp spec>> StockControl <<comp spec>> ProductMgr Voglio specificare l intenzione di riusare, da parte di entrambi, un componente Design Patterns & Architettura 53

Component Architecture (Architettura a Componenti) : OrderMgr : StockControl Quale delle due è quella desiderata? : ProductMgr : OrderMgr : StockControl a : ProductMgr b : ProductMgr Design Patterns & Architettura 54

Design by Contract (Progettazione per Contratto) (nel mondo reale) un contratto descrive (specifica) i dettagli di un accordo (per la fornitura di un servizio) in modo non ambiguo Responsabilità delle parti: cosa ogni parte fa ammesso che le altri parti facciano cosa hanno detto che faranno Asserisce anche cosa avviene se le parti non fanno quello che si sono impegnate a fare (falliscono nel fornire il servizio) Design Patterns & Architettura 55

Design by Contract (Progettazione per Contratto) Nel software design Usage contract: contratto tra l interfaccia di un component ed i suoi client Realization contract: contratto tra un component specification e le sue implementation Specification usage Client realization Implementation Design Patterns & Architettura 56

Design by Contract (Progettazione per Contratto) Design Patterns & Architettura 57

Usage Contract (Contratto d Utilizzo) Descrive la relazione tra un component object ed i suoi client run-time contract E specificato come un interfaccia Operazioni: lista delle operazioni fornite, complete di segnatura e definizioni Information model: definizione astratta di qualsiasi informazione/stato che viene mantenuto tra le richieste del client un oggetto che supporta l interfaccia, e vincoli su quell informazione Design Patterns & Architettura 58

Usage Contract (Contratto d Utilizzo) Un operazione è un mini-contratto a sua volta (parametri) input / output precondizione (situazione in cui è possibile richiedere l operazione), postcondizione (effetto dell operazione sui parametri e l information model) Operazioni aggregate in interfacce per motivi pragmatici: in genere il loro uso è omogeneo e correlato In linea teorica il client assicura il soddisfacimento della precondizione... Se la precondizione non è vera, il risultato dell operazione è indefinito Design Patterns & Architettura 59

Realization Contract (Contratto di Realizzazione) Descrive come un implementatore deve realizzare una component implementation design-time contract E specificato attraverso L insieme di interfacce (comportamento complessivo di ogni oggetto) Come un implementazione interagisce con altri componenti Collaborazioni e vincoli sugli information model Come interfacce si corrispondono Design Patterns & Architettura 60

Confronto Interface Specification Lista di operazioni Sottostante information model Contratto con il client Specifica come le operazioni agiscono sull information model Effetti locali Lista di interfacce supportate Relazioni tra gli information model di differenti interfacce Contratto con l implementatore Definisce l unità di implementazione/run-time Specifica come le operazioni vengono realizzate in termini di uso di altre interfacce Design Patterns & Architettura 61

Qualità Architetturali Per contribuire in maniera adeguata alla soluzione del problema applicativo, l architettura deve possedere delle qualità In base alla situazione potrebbe essere necessario privilegiare delle caratteristiche di qualità a scapito di altre E fondamentale identificare quali caratteristiche sono prioritarie, per guidare le decisioni di progetto sin dalle fasi iniziali Design Patterns & Architettura 62

Qualità architetturali Performance Scalabilità Sicurezza Disponibilità Affidabilità efficienza robustezza Design Patterns & Architettura 63

Qualità architetturali Performance: il sistema deve reagire adeguatamente rispetto al carico di lavoro atteso Scalabilità: capacità del sistema di adattarsi a situazioni di carico superiori a quelle previste inizialmente quantità dati, numero utenti, frequenza richieste Design Patterns & Architettura 64

Qualità architetturali Sicurezza: il sistema deve prevenire accessi non autorizzati o utilizzi non previsti Meccanismi: autenticazione: assicurare che l identità della sorgente di una richiesta sia effettivamente quella dichiarata autorizzazione: assicurare che la sorgente di una richiesta, una volta autenticata, sia autorizzata ad eseguire l operazione La sicurezza può essere dichiarata a diversi livelli di criticità all interno del sistema, corrispondenti a diversi meccanismi di implementazione Design Patterns & Architettura 65

Qualità architetturali Disponibilità: percentuale del tempo di esecuzione in cui il sistema appare come funzionante rispetto agli utenti Affidabilità: capacità del sistema di reagire autonomamente a situazioni di guasto Misurano la tolleranza del sistema a situazioni di guasto Design Patterns & Architettura 66

Qualità architetturali Ogni qualità architetturale si esprime in una serie di requisiti che investono il sistema a diversi livelli Hardware Progetto della rete Progetto del software Infrastruttura middleware Nel progetto dell architettura sarà necessario identificare se un requisito dovrà richiedere il progetto di un componente opportuno oppure se è possibile sfruttare l infrastruttura middleware Design Patterns & Architettura 67

Disponibilità Fondamentale in applicazioni mission-critical, che devono fornire un servizio continuativo es. applicazioni web di e-commerce In questi casi i guasti del sistema potrebbero portare problemi e perdite i cui effetti si possono protrarre anche a lungo termine es. perdita clienti Design Patterns & Architettura 68

Disponibilità: linee guida Progettare per aumentare la disponibilità significa introdurre tecniche e linee guida metodologiche per anticipare, rilevare e risolvere automaticamente i guasti hardware e software L obiettivo è ridurre il downtime non solo ridurre le possibilità di guasto, ma anche i tempi di riparazione Tecniche: replicazione hardware e software Metodologie: utilizzo di processi di progetto e sviluppo collaudati e con forte accento sul testing Design Patterns & Architettura 69

Disponibilità: linee guida Utilizzare tecniche di clustering Cluster: insieme di sistemi che offrono lo stesso servizio ma sono distribuiti su nodi fisici diversi, pur essendo logicamente e fisicamente connessi tra loro Diversi sistemi indipendenti in uno stesso cluster appaiono all esterno come un sistema singolo In presenza di guasti, il carico di lavoro viene automaticamente spostato da un sistema all altro i client vengono spostati automaticamente (failover) il guasto è trasparente: viene percepito semplicemente un ritardo Il clustering permette anche di aumentare la scalabilità dell applicazione Design Patterns & Architettura 70

Disponibilità: linee guida Clustering (cont.) Il clustering permette di ridurre il downtime dovuto a guasti ridurre il downtime dovuto a manutenzione scalare l applicazione in maniera economica Design Patterns & Architettura 71

Disponibilità: linee guida Clustering (cont.) Implementare soluzioni di clustering non è semplice, a causa dei meccanismi necessari redirezione automatica delle richieste mantenimento della consistenza Esistono soluzioni già pronte Molti server J2EE Microsoft Cluster Server Design Patterns & Architettura 72

Disponibilità: linee guida Prevedere meccanismi di monitoring Per tollerare i guasti è prima di tutto necessario rilevare i guasti Il rilevamento di guasti di componenti si basa generalmente su timeout E possibile utilizzare due modalità di rilevamento On-line: rilevamento durante le esecuzioni di richieste Off-line: monitoring periodico a prescindere dalle richieste Monitoring significa inoltre utilizzare dei log per controllare l andamento delle risorse e individuare i punti soggetti a guasti Design Patterns & Architettura 73

Disponibilità: linee guida Isolare applicazioni mission-critical E possibile che più applicazioni condividano risorse hardware e software Nel caso di applicazioni mission-critical, è opportuno ridurre il più possibile il contatto con altre applicazioni, sia con tecniche hardware che software Reti e DBMS dedicati Middleware ad alte prestazioni Design Patterns & Architettura 74

Disponibilità: linee guida Prevedere un piano di test e di recupero adeguati Il test per la disponibilità deve essere il più possibile rigoroso e completo Lo scopo è provare le procedure di recupero in tutte le situazioni di guasto più estreme Staccare la spina o il cavo di rete Togliere l alimentazione generale Design Patterns & Architettura 75

Disponibilità: linee guida Piano di recupero (cont.) Il piano di recupero deve fornire istruzioni dettagliate sulle operazioni da eseguire in circostanze critiche Operazioni richieste su ogni server per ripristinare l operatività Inventario delle parti Materiale cartaceo Design Patterns & Architettura 76

Affidabilità L architettura deve essere progettata in modo da limitare le possibilità di malfunzionamento dell applicazione Non confondere con disponibilità capacità di recuperare dai guasti Anche in questo caso investe diversi aspetti del progetto: tecnologia: hardware e software robusti metodologia di progetto: test accurati e completi Design Patterns & Architettura 77

Affidabilità: linee guida Gestire gli errori all interno dell applicazione Una architettura affidabile è in grado di prevenire e adeguarsi alle situazioni di errore automaticamente E necessario in fase di test prevedere tutte le possibili situazioni di errore a tutti i livelli e scrivere del codice di gestione adeguato errori nel middleware errori nel DBMS Design Patterns & Architettura 78

Affidabilità: linee guida Gestire con cura i cambiamenti Aggiungere o modificare un componente può essere causa di guasti nell architettura errori del nuovo componente errori di integrazione I cambiamenti devono essere coordinati e controllati Design Patterns & Architettura 79

Performance Dal punto di vista dell utente, le performance vengono percepite come i tempi di risposta alle richieste Questo viene determinato da diversi aspetti dell architettura hardware piattaforme middleware basi di dati progetto software Non confondere con la scalabilità performance a carichi crescenti Design Patterns & Architettura 80

Performance: linee guida Si possono identificare all interno dell architettura delle operazioni o dei pattern inevitabilmente costosi E necessario progettare l architettura in modo da identificare i possibili colli di bottiglia e limitarne l impatto Esempi mancanza di concorrenza sincronizzazione tra componenti remoti accesso frequente al DB apertura connessioni creazione thread Design Patterns & Architettura 81

Performance: linee guida Utilizzare tecniche di pooling Pooling significa attivare un insieme di risorse dello stesso tipo (pool) prima delle effettive richieste di utilizzo Quando un utilizzatore richiede una risorsa, viene reperita una istanza già attiva dal pool Tecniche di pooling permettono di accelerare l accesso a risorse il cui tempo di attivazione diventa non trascurabile su applicazioni di larga scala thread componenti connessioni a DB Design Patterns & Architettura 82

Performance: linee guida Pooling (cont.) Pooling di thread spesso utilizzato per accelerare l esecuzione di pagine web dinamiche Pooling di connessioni riduce notevolmente i tempi di accesso al DB Pooling di componenti dipende dalla tipologia di stato del componente Se un componente contiene dello stato questo deve essere inizializzato al momento dell attivazione e rilasciato Design Patterns & Architettura 83

Performance: linee guida Prevedere meccanismi di caching Caching: replicazione di dati o servizi in prossimità del loro utilizzo Il caching può essere applicato in diversi casi nell architettura pagine web dinamiche dati Nel realizzare una soluzione di caching è necessario gestire le problematiche di consistenza tipiche di questo genere di problemi Design Patterns & Architettura 84

Performance: linee guida Caching (cont.) Nel caso in cui le operazioni sui dati sono prevalentemente letture, il caching dei dati può ridurre notevolmente il numero di accessi al DBMS Soluzioni per il caching dati locale: risparmia la latenza di rete memorizzando i dati su una replica del DBMS in locale in RAM: massima velocità di accesso ma necessaria una tecnologia specifica per la memorizzazione e l interrogazione Design Patterns & Architettura 85

Performance: linee guida Ottimizzare gli accessi remoti Le invocazioni remote via middleware vanno utilizzate quando strettamente necessario introducono un overhead sulle prestazioni dovuto alla sola connessione Inoltre, è necessario progettare i componenti di business in modo da limitare/ottimizzare gli accessi più parametri nella stessa invocazione Design Patterns & Architettura 86

Performance: linee guida Ottimizzare le transazioni Le transazioni distribuite introducono un overhead notevole e vanno usate solo quando necessario Ottimizzare i meccanismi di sicurezza Una connessione sicura (e.g. SSH) è notevolmente più costosa di una in chiaro Gli accessi sicuri non vanno necessariamente considerati nell intera applicazione E possibile strutturare l architettura in modo da inserire protezioni hardware, più efficienti Design Patterns & Architettura 87

Scalabilità In una architettura scalabile, l incremento di risorse comporta un aumento idealmente lineare nella capacità del servizio Carico addizionale viene gestito aggiungendo risorse senza modifiche sostanziali al progetto Anche se la performance è parte della scalabilità, non è tutto La scalabilità è una parte integrante del progetto che va considerata a partire dalle prime fasi Ottenuta attraverso un bilanciamento accurato di elementi hardware e software Design Patterns & Architettura 88

Scalabilità: linee guida Utilizzare tecniche di clustering Il bilanciamento del carico su più macchine permette di ottenere risultati migliori che aumentando le risorse di una singola macchina e spesso è più economico L applicazione deve essere progettata in maniera indipendente dalla locazione Inoltre sono necessari meccanismi per la gestione del cluster Design Patterns & Architettura 89

Scalabilità: linee guida Limitare le attese Operazioni molto costose rischiano di creare lunghe code di attesa quando ci sono molti processi richiedenti E opportuno in questi casi sfruttare il più possibile modalità asincrone di interazione Es. validazione carta di credito Questo principio, in casi estremi, potrebbe portare alla revisione dell intero processo di business Design Patterns & Architettura 90

Scalabilità: linee guida Limitare i conflitti per le risorse L utilizzo concorrente di risorse limitate è una delle principali cause di mancanza di scalabilità Applicato a dischi, memoria, CPU, rete Principio: acquisire le risorse il più tardi possibile e rilasciarle il prima possibile Principio: utilizzare dopo le risorse critiche Se la transazione viene abortita prima ne ho limitato l utilizzo Design Patterns & Architettura 91

Scalabilità: linee guida Curare il progetto dei componenti Limitare componenti stateful Rispetto agli stateless, consumano più risorse e non sono condivisibili Separare i metodi transazionali da quelli non transazionali Design Patterns & Architettura 92

Sicurezza Si ottiene attraverso il controllo degli accessi applicato a vari tipi di risorse dell applicazione Dati, componenti, hardware La sicurezza ruota intorno a quattro concetti principali Autenticazione Autorizzazione Protezione dati Auditing Viene affrontata in dettaglio in altri corsi Design Patterns & Architettura 93