Comprendere le principali Architetture Software
Tipi di Architetture
“L’architettura software è l’organizzazione di base di un sistema, espressa dai suoi componenti, dalle relazioni tra di loro e con l’ambiente, e i principi che ne guidano il progetto e l’evoluzione.”
[IEEE/ANSI 1471–2000]
Informalmente, un’architettura software è la struttura del sistema, costituita dalle varie parti che lo compongono, con le relative relazioni. L’architettura di un sistema software viene definita nella prima fase di System Design (definizione dei sottosistemi).
Definire un’architettura software significa mappare funzionalità su moduli.
Es: Modulo di interfaccia utente, modulo di accesso a db, modulo di gestione della sicurezza, etc…
Anche la definizione delle architetture deve seguire i concetti di Alta Coesione e Basso Accoppiamento: ogni sottosezione dell’architettura dovrà fornire servizi altamente relati tra loro, cercando di limitare il numero di altri moduli con cui è legato.
La definizione dell’architettura viene di solito fatta da due punti di vista diversi, che portano alla soluzione finale:
Entrambe le scelte sono cruciali: è difficile modificarle quando lo sviluppo è partito, poiché molte interfacce dei sottosistemi dovrebbero essere cambiate.
La definizione dell’architettura logica di un sistema grande è di solito ottenuta decomponendolo in sottosistemi, usando layer e partizioni.
Sono due visioni ortogonali tra loro:
1. Un Layer è uno strato che fornisce servizi.
Es: Interfaccia Utente; Accesso al DB.
2. Una Partizione è un’organizzazione di moduli.
Es: Funzionalità Carrello di un sito di commercio.
Una decomposizione gerarchica di un sistema consiste di un insieme ordinato di layer (strati).
Un layer è un raggruppamento di sottosistemi che forniscono servizi correlati, eventualmente realizzati utilizzando servizi di altri layer.
Un layer può dipendere solo dai layer di livello più basso.
Un layer non ha conoscenza dei layer dei livelli più alti.
Architettura chiusa: ogni layer può accedere solo al layer immediatamente sotto di esso.
Architettura aperta: un layer può anche accedere ai layer di livello più basso.
Prima formalizzazione di architettura a layers.
Un sistema dovrebbe essere sviluppato da un insieme di macchine virtuali, ognuna costruita in termini di quelle al di sotto di essa.
Architettura Chiusa
Una macchina virtuale può solo chiamare le operazioni dello strato immediatamente sottostante.
Design goal: alta manutenibilità e portabilità. Ogni layer conosce solo i servizi offerti da quello immediatamente sottostante. Modifiche più in profondità non si riflettono sui layer sovrastanti.
Esempi: La Pila ISO/OSI, oppure l’architettura di Java, che attraverso la JVM scherma all’applicazione i servizi offerti dal sistema operativo.
Architettura Aperta
Una macchina virtuale può utilizzare i servizi delle macchine dei layer sottostanti, a vario livello.
Design goal: efficienza a runtime. In questo modo, ogni livello soprastante può comunicare direttamente con il fornitore di un dato servizio, senza passare attraverso layer intermediari.
Spesso utilizzata in videogames o in quelle applicazioni dove le performances sono fondamentali.
Un altro approccio per trattare con la complessità consiste nel suddividere (partitioning) il sistema in sottosistemi paritari (peer) fra loro, ognuno responsabile di differenti classi di servizi.
In generale una decomposizione in sottosistemi è il risultato di un’attività di partitioning e di layering.
Prima si suddivide il sistema in sottosistemi al top-level che sono responsabili di specifiche funzionalità (partitioning).
Poi, ogni sottosistema è organizzato in diversi layer, se il livello di complessità lo richiede, finché non sono semplici abbastanza da poter essere implementate da un singolo sviluppatore (layering).
Nell’ingegneria del sofware sono stati definiti vari stili architetturali che possono essere usati come base di architetture software:
Descrizione
I sottosistemi accedono ad una singola struttura dati, chiamata repository.
I sottosistemi sono “relativamente indipendenti” (interagiscono solo attraverso il repository).
Vantaggi
Modo efficiente di condividere grandi moli di dati: write once for all to read.
Un sottosistema non si deve preoccupare di come i dati sono prodotti/usati da ogni altro sottosistema.
Gestione centralizzata di backup, security, access control, recovery da errori…
Il modello di condivisione dati è pubblicato come repository schema → facile aggiungere nuovi sottosistemi.
Svantaggi
I sottosistemi devono concordare su un modello dati di compromesso→ minori performance.
Data evolution: la adozione di un nuovo modello dati è difficile e costosa: deve venir applicato a tutto il repository; tutti i sottosistemi devono essere aggiornati.
Diversi sottosistemi possono avere diversi requisiti su backup, security… non supportati.
Descrizione
E’ un’architettura distribuita dove dati ed elaborazione sono distribuiti su una rete di nodi di due tipi:
Schema generale
Il Server fornisce servizi ad istanze di altri sottosistemi, detti Client che sono responsabili dell’interazione con l’utente.
I Client chiamano il server che realizza alcuni servizi e restituisce il risultato.
I Client conoscono l’interfaccia del Server (i suoi servizi).
I Server non conoscono le interfacce dei Client.
La risposta è in generale immediata.
Gli utenti interagiscono solo con il Client.
Praticamente qualunque applicazione software può essere suddivisa logicamente in tre parti:
Di conseguenza, ogni applicazione può essere vista come composta da (almeno) tre layers.
Data questa osservazione, le architetture a 2 livelli risultano essere una forzatura, chiedendo di suddividere su 2 strati i 3 layer concettuali che compongono un’applicazione.
Vantaggi
E’ la più semplice architettura distribuita.
Svantaggi
Traffico di messaggi intenso (frontend comunica continuamente con server dati).
Logica di business non gestita in una componente separata dell’architettura: suddivisa tra frontend e backend:
Mancato riconoscimento dell’importanza della business logic.
Es: servizio accessibile da più device (telefonino, desktop) → stessa logica, interfaccia diversa.
Introdotte all’inizio degli anni ‘90.
Business logic trattata in modo esplicito:
Ogni livello ha obiettivi e vincoli di design propri
Nessun livello fa assunzioni sulla struttura o implementazione degli altri:
Non c’è comunicazione diretta tra livello 1 e livello 3:
I livelli operano senza assumere di essere parte di una specifica applicazione:
Flessibilità e modificabilità di sistemi formati da componenti separate:
Interconnettività:
Gestione di sistemi distribuiti:
Dimensioni delle applicazioni ed efficienza:
Problemi ad integrare Legacy software.
Molte imprese usano software vecchio (basato su modello monolitico) per gestire i propri dati →
Evoluzione delle 3-tier, su N livelli.
Permettono configurazioni diverse.
Elementi fondamentali
1. Interfaccia utente (UI):
2. Presentation logic:
3. Business logic:
4. Infrastructure services:
5. Data layer:
E’ una generalizzazione dell’Architettura Client/Server.
Ogni sottositema può agire sia come Client o come Server, nel senso che ogni sottosistema può richiedere e fornire servizi.
Il flusso di controllo di ogni sottosistema è indipendente dagli altri, eccetto per la sincronizzazione sulle richieste.
1. Introduzione all'Ingegneria del Software – La qualità del Software
2. Il Ciclo di vita del Software: i modelli di Processo
3. Concetti e strumenti di base per il Project Management
5. Introduzione ad UML: Gli Use Case Diagrams
6. Il documento dei Requisiti Software
7. UML: I Sequence Diagrams ed i Class Diagrams