Professional Documents
Culture Documents
Architectural Patterns
schemi di progetto per architetture software
Patterns
Soluzioni possibili a problemi ricorrenti Soluzioni half-baked Basati sulla esperienza Non teoria ma pratica
supporto teorico formalizzazione
Patterns
Idiomi
Basso livello Una classe o poche classi Dipendente dal linguaggio
scala
Esempio: Singleton
dettaglio
Assicurare lesistenza di una e una sola classe di un certo tipo a run-time Istanza della classe globalmente accessibile In smalltalk molto diverso: Limplementazione pu essere totalmente diversa utilizzando overriding del metodo new class Singleton linguaggi diversi
new self error errore getInstance TheInstance isNil ifTrue: [TheInstance := super new] ^ TheInstance
public static Singleton getInstance() { if(instance == null) instance = new Singleton(); return instance; } }
Patterns
scala
An architectural pattern expresses a fundamental structural organization schema for software systems
Specifica i sottosistemi Specifica le responsabilit Specifica le relazioni tra i sottosistemi
Smalltalk 76:
Interfacce grafiche semplici hanno struttura intrinsecamente modulare (insiemi di componenti text, menu, button, pixelmaps) Paradigmi di interazione riconducibili a tipologie di base (editing, browsing, inspecting) Presenza di un modello di dati significativo e specifico per il contesto applicativo
Smalltalk-80 [Kras88]:
Componenti grafici di base riutilizzabili per composizione Sensori (e.g. InputSensor) per rappresentare e gestire linterazione dellutente. Possibilit di delegare lazione di controllo Modello di dati che mantiene la lista dei componenti dipendenti dal modello.
Contesto:
Applicazioni interattive Applicazioni con componenti di web-presentation In generale: Applicazioni in cui opportuna la separazione tra interfaccia e modello
Necessit di viste diverse sul modello Diverso grado di stabilit delle componenti modello e interfaccia Riuso di componenti
Documento strutturato
document, section, subsection, paragraph Metainformazione di strutturazione inserita nel testo
Problema:
Visualizzazione dei dati contenuti nel documento con rappresentazioni diverse sulla interfaccia Modifica sui dati del documento interagendo con la applicazione tramite viste diverse Allineamento delle viste allinformazione presente nel documento Aggiunta di viste sul documento anche a run-time (e.g. preview frame) Sostituibilit di componenti di interfaccia e controllo senza modifiche al nucleo funzionale della applicazione
Soluzioni possibili?
Ogni vista contiene alcuni dati del documento? :-( Riferimenti incrociati tra i componenti vista? :-(
Section Figure
Section Figure
Section Figure
Occorre aggiornare i dati del documento su ogni componente Componenti di interfaccia strettamente connessi (chi sono i componenti attivi? Quali le interfacce delle classi?) Difficile introdurre nuovi componenti di interfaccia Flusso di controllo delle azioni sulla interfaccia frammentato distribuito tra i componenti
Soluzioni possibili?
Model Model
View View
Controller Controller
MVC: Modello
Collaborazioni
Il modello modificato dai componenti Controller Mantiene riferimenti alle Viste che mostrano i dati del modello Invia notifiche alle Viste al cambiamento dei dati
Collaborators
View Controller
Implementa il nucleo
funzionale della applicazione Registra le viste dipendenti dal modello Notifica i cambiamenti ai componenti dipendenti
MVC: View
Controller Controller
Collaborazioni
La vista associata al modello
Riceve dal modello notifiche di cambiamento dei dati Accede al modello per ottenere i dati da visualizzare
3: Aggiorna
Collaboration Diagram
Comportamento dinamico del sistema
MVC: Controller
Controller Controller
Collaborazioni
Il controllore associato ad una vista (relazione 1 a 1) Il controllore invoca le funzionalit sul modello e pu modificarne i dati
Collaboration Diagram
1: Input
3: Notifica
4: Aggiorna
Classi MVC di base: Model, View, Controller public class StructuredTreeView { Classi derivate (rif. esempioTeXDocument theModel; private Editor)
implements View
public class Model private TreeController theController; Model: TeXDocument { publicprivateTreeController implements Controller class Vector setOfViews; [..] { View: ObjectView, StructuredTreeView [..] // Inizializzazione private TeXDocument theModel; StructuredTreeView theView; Controller: TreeController, ObjectController private Aggiunge una nuova vista public void init (Model model) // { [..] public void attach(View aView) public class TeXDocument extends Model [..] { viewList.addElement(aView); } { theModel = model; // Inizializzazionevista // Rimuove la privateview, Model model) Vector sectionList; theController = createController(); public void void detach (View aView) (View public init private Vector figureList; [..] { { viewList.removeElement(aView); } } theView = view; [] theModel = model; cambiamento alle viste registrate // Notifica il // Crea i controllore [..]public void // Funzione che modifica il dati notify() public void addSection() public void createController() } { { { Iterator iterator = viewList.listIterator(); [..] //function body theController = /* Gestisce gli eventi e.g. aggiornamento di una new TreeController(); while(iterator.hasNext()) theController.init(this, theModel); notify(); sezione */ ((View)iterator.next()).update(); } public void handleEvent(Event e) } } } { } /* Effettua laggiornamento leggendo i dati dal [..]//Es. Aggiornamento del nome di una sezione modello */ theModel.updateSection(section, Pattern MVC); public void update() [..] { } Section[] sections = theModel.getSections(); } // Aggiorna la vista con i dati ottenuti [..] } }
Modalit di comunicazione
tra componenti: meccanismo Change Propagation
1. Registrazione delle viste sul modello 2. Il modello modificato dai controllori 3. Il modello notifica cambiamenti a tutte le viste registrate 4. Le viste richiedono al modello i dati necessari allaggiornamento della visualizzazione
Change-Propagation MVC
Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically. [GHJV95]
Partecipanti
Subject (Observable)
Ha riferimenti agli osservatori che dipendono dal suo stato Fornisce metodi di interfaccia per aggiungere e rimuovere osservatori
Observer
Interfaccia che presenta un metodo di aggiornamento. Le classi che implementano linterfaccia sono notificati al variare dello stato del Subject. Limplementazione dellaggiornamento mantiene lo stato coerente con quello del Subject.
Class Diagram:
Subject equivale al Model MVC Observer equivale a View MVC
Collaborazioni
ConcreteSubject notifica il cambiamento di stato ConcreteObserver pu richiedere informazioni per laggiornamento per sincronizzarsi
Viste multiple sullo stesso modello Meccanismo efficiente di sincronizzazione delle viste
(Change-propagation) Semplicit di sostituzione/aggiunta/modifica di viste e controllori
Preview
TextView
Vantaggio
Oggetti foglia e composizioni hanno la stessa interfaccia (View) Definizione di viste di base combinabili in viste complesse
successor
ComboCtrl
Complessit
La terna MVC pu essere usata per ogni componente di interfaccia ma non necessaria per quelli pi semplici (e.g. semplici campi di testo)
Inefficienza
Eccessivo numero di updates a seguito della richiesta di una sola funzione sul modello Non tutti i cambiamenti del modello interessano tutte le viste La vista pu essere in uno stato inattivo (e.g. ridotta a icona)
Esempio: JButton
Modello UIDelegate
Controllers
Document/View
View/Controller strettamente connessi Accoppiamento lasco col modello Pi viste sincronizzate Difficile cambiare il controllo
Document View
Framework MFC
Spesso la vista si occupa della rappresentazione nella interfaccia e della gestione del controllo Possibile delegare la gestione dei messaggi a componenti di controllo separati (:CCmdTarget)
Publish&Subscribe
Architettura CART
Cooperazione per eventi (EDA): modalit asincrona per scambio di messaggi Il NAL svolge funzione di publisher/subscriber per i SIL che fanno riferimento ad esso
Subscribers Publisher
NAL a NAL a
Publish&Subscribe
Modello Pull
Il publisher notifica lavvenuto cambiamento di stato Invia solo un set minimale di informazioni I sottoscrittori richiedono i dati necessari + flessibile: i subscribers scelgono i dati ad essi necessari (e solo quelli) - richiede molti scambi di messaggi - i subscribers devono capire cosa cambiato
Modello Push
Il publisher invia con la notifica i dati modificati + Nessuna interazione tra le parti (eccetto la notifica) + Pi adatto ad una architettura distribuita - Meno flessibile: i subscribers accettano passivamente i dati inviati - Inefficienza: invio di grosse quantit di dati talvolta non richiesti
Event Channel
NAL b NAL b Gestore Gestore Eventi Eventi (CRIC) (CRIC) NAL c NAL c NAL d NAL d
SIL SIL
NAL a NAL a
Event Channel
Struttura
Introduzione di un intermediario: Event Channel
Collaborazioni
I subscriber si registrano sul Channel Event Channel sorgente e destinazione dei messaggi
Event Channel
Collaboration Diagram
Registrazione dei subscribers Dispatching dei messaggi Funzioni aggiuntive di Event Channel: filtraggio, storage, autenticazione
public MySubscriber() { [] { [] public MyPublisher() /* Crea context, la ConnectionFactory, Connection, { Session */ /* Ricerca della factory per creare le connessioni col subscriber = session.createSubscriber(dest); message server */ new TextListener(); jndiContext Publisher listener == new InitialContext(); subscriber.setMessageListener(listener); connectionFactory = (ConnectionFactory) connection.start(); jndiContext.lookup("jms/TopicConnectionFactory"); } Topic //} Ricerca della destinazione (il Topic dei messaggi) Topic -------------destination = (Topic) jndiContext.lookup("MyTopic");
Message Server
Subscriber
public class TextListener implements MessageListener []{ //Metodo di callback per la public void sendATextMessage() ricezione dei messaggi public void onMessage(Message message) { { connection = connectionFactory.createConnection(); TextMessage msg = null; session = connection.createSession(); Administered Objects: incapsulano le specifiche if (message instanceof TextMessage) { implementazioni vendor-dependent dei provider JMS /* Creazione del proxy per la comunicazione */ msg publisher= =(TextMessage) message; session.createPublisher(destination); (Destination,content = msg.getText(); ConnectionFactory) String message = session.createTextMessage(); [] Oggetti producer/consumer per linvio e la ricezione dei message.setText(Hello!); } publisher.publish(message); messaggi (TopicPublisher, TopicSubscriber, MessageListener) } connection.close(); } } }
Publisher
Subscriber
Broker
NAL b NAL b NAL a NAL a Broker/ Broker/ Orchestrator Orchestrator NAL c NAL c NAL d NAL d
SIL SIL
Architettura CART
Previsto un modello di comunicazione basato su richieste di servizio Presenza di un coordinatore di servizio (Broker/Orchestrator)
La componente presente sul CRIC mantiene un registry dei servizi e fornisce API per la registrazione dei servizi
CRIC CRIC
WebServices Orchestrator
registry
NAL a NAL a
Proxy applic.
NAL b NAL b
Proxy applic.
SIL a1 SIL a1
SIL a2 SIL a2
SIL b1 SIL b1
SIL b2 SIL b2
Architettura SOA ben rappresentata dal pattern Broker The Broker architectural pattern can be used to structure
distributed software systems with decoupled components that interact by remote services invocations. A broker is responsible for coordinating communication. Forwarding request, transmitting results [] [POSA01]
Contesto e Problematiche
Ambiente distribuito Sistemi indipendenti tra loro (il client non conosce la locazione del provider di servizio) Sistemi eterogenei (indipendenza dalla implementazione)
Soluzioni
Introduzione del broker Invocazione dei servizi sotto forma di messaggi di chiamata indirizzati al broker
Coordinatore: Broker
Offre una interfaccia di registrazione per i servizi Mantiene le informazioni in un registro dei servizi Trasmette richieste, risposte ed eccezioni nei due sensi
Proxy
Rappresentano loggetto server sul lato client e il client sul server. Mascherano la distribuzione dei servizi Intermediari della comunicazione tra Client/Server e Broker Lato client: chiamate a procedure messaggi al broker Lato server: messaggi del broker invocazioni di servizio Sono generati dal compilatore IDL
Collaboration diagram
Registrazione del servizio Invocazione da parte di un client
Vantaggi
Client e Server disaccoppiati (localizzazione, comunicazione, distribuzione trasparente) Client e Server eterogenei (indipendenza dalla implementazione)
Svantaggi
Efficienza schemi alternativi in comunicazione diretta Criticit dei malfunzionamenti del Broker
Riferimenti