Concetto: Innalzamento del livello di astrazione
Questo principio descrive come ridurre la complessità innalzando il livello di astrazione.
Descrizione principale

Introduzione

La complessità è una questione centrale nello sviluppo di software. Aumentare il livello di astrazione aiuta a ridurre la complessità oltre alla quantità di documentazione richiesta dal progetto. Ciò si ottiene mediante il riutilizzo, l'uso di tool di modellazione di alto livello e stabilizzando presto l'architettura.

          
Vantaggi
  • Produttività
  • Complessità ridotta.
Pattern
  1. Riutilizzare le risorse esistenti
  2. Utilizzare dei tool e dei linguaggi di livello superiore per ridurre la quantità di documentazione prodotta
  3. Concentrare l'attenzione prima sull'architettura
  4. Creare un'architettura tenendo presente l'elasticità, la qualità, la comprensibilità, il controllo della complessità.
Anti-pattern
  • Passare direttamente da vaghi requisiti di alto livello al codice personalizzato:
    • Poiché vengono utilizzate poche astrazioni, molte delle discussioni vengono effettuate a livello del codice, piuttosto che ad un livello più concettuale, che, fra le altre cose, perde molte opportunità di riutilizzo.
    • Requisiti catturati informalmente ed altre informazioni richiedono ripetute revisioni delle decisioni e delle specifiche
    • Un limitata enfasi sull'architettura comporta una significativa rilavorazione successivamente nel progetto.

Discussione 

Uno dei problemi principali da affrontare nello sviluppo di software è la complessità. E' noto che la riduzione della complessità ha un forte impatto sulla produttività. Lavorare ad un livello superiore di astrazione riduce la complessità e facilita la comunicazione.

Un approccio efficace per la riduzione della complessità è il riutilizzo delle risorse esistenti, come i componenti riutilizzabili, sistemi preesistenti, processi di business esistenti, pattern o software 'open source'. Due grossi esempi di riutilizzo che hanno avuto un forte impatto sull'industria software nell'ultimo decennio sono:

  • Il riutilizzo del middleware, ad esempio i database, i server web ed i portali, e più recentemente
  • Il software open source, che fornisce moti componenti più grandi e più piccoli che possono essere potenziati.

Andando avanti i servizi Web avranno un maggiore impatto sul riutilizzo, poiché forniscono dei modi semplici per riutilizzare delle grosse parti di funzionalità in piattaforme disparate e con un accoppiamento libero di un servizio fra consumer e provider. Questo significa che è possibile potenziare facilmente differenti combinazioni di servizi per risolvere le esigenze di business. Il riutilizzo è facilitato anche dagli standard aperti (open standard), come RAS, UDDI, SOAP, WSDL, XML e UML.

Diagramma che illustra il riutilizzo di risorse esistenti nelle architetture orientate sui servizi
Riutilizzo di risorse esistenti nelle architetture orientate sui servizi.
Uno dei problemi con il riutilizzo è che due componenti devono conoscere l'esistenza dell'altro al momento dello sviluppo. Le architetture orientate sui servizi alleviano il problema fornendo quella che viene definito un 'accoppiamento libero' (loose coupling): un consumer di un servizio può individuare dinamicamente un provider di un servizio. E' quindi possibile abbinare dei componenti o dei sistemi preesistenti ai servizi, consentendo ad altri componenti o applicazioni di accedere dinamicamente alle loro capacità mediante un'interfaccia basata sugli standard, indipendente dalla piattaforma e dalla tecnologia di implementazione.

Un altro approccio per ridurre la complessità e migliorare la comunicazione consiste nel potenziare tool, framework e linguaggi di livello superiore:

  • Linguaggi standard, come UML (Unified Modeling Language), e linguaggi di applicazione rapidi, come EGL, forniscono la possibilità di esprimere dei costrutti di alto livello, come i processi di business e i componenti di servizi, che facilitano la collaborazione presente intorno ai costrutti ad alto livello, nascondendo i dettagli non necessari.
  • I tool di progettazione e costruzione possono automatizzarsi passando da costrutti ad alto livello a codice operativo:
    • Forniscono delle procedure guidate che automatizzano le attività di progettazione, costruzione e test generando del codice e consentendo l'utilizzo di frammenti di codice,
    • Convertono l'integrazione e la verifica in attività di sviluppo senza interruzioni attraverso lo sviluppo integrato, la build e gli ambienti di test.
  • Tool di gestione portfolio, che abilitano la gestione  finanziaria ed altri aspetti di più progetti come un'unica entità, di contro ad un insieme di entità separate.

In breve, i tool di livello superiore catturano graficamente le informazioni chiave sulla modellazione, che è un modo potente e attraente di riepilogare e presentare le informazioni. I vantaggi della modellazione visiva vengono esplorati con maggiori dettagli in Materiale di supporto: Modellazione visiva.

Un terzo approccio per la gestione della complessità è di focalizzare l'attenzione sull'architettura, per definire un business o sviluppare un sistema o un'applicazione. Nello sviluppo di software si tende a progettare, implementare e testare l'architettura nella fase iniziale di un progetto. Questo significa che, all'inizio del progetto, l'attenzione si concentra sui seguenti obiettivi:

  • Definire dei blocchi di costruzione ad alto livello ed i componenti più importanti, le loro responsabilità e le relative interfacce.
  • Progettare ed implementare i meccanismi strutturali, vale a dire, soluzioni già pronte per problemi comuni, ad esempio come gestire la persistenza e la raccolta di dati obsoleti.

Creando l'architettura all'inizio, si fornisce al sistema una struttura di base, rendendo più facile la gestione della complessità quando si aggiungono persone, componenti, capacità e codice al progetto. Si identificano anche quali risorse riutilizzabili potenziare e quali aspetti del sistema devono essere creati in modo personalizzato.