L'astrazione nella progettazione
Cosa è l'astrazione?
La parola astrazione deriva dal latino abstrahere che significa trascinare via. Nell'ambito della programmazione significa trascinare un concetto, un'idea, un principio da una realtà concreta. In ambito scientifico significa cambiare la realtà del problema. Si astrae principalmente per concentrarsi su aspetti rilevanti dimenticando gli incidentali. Non si tratta di omettere parti della rappresentazione di un problema ma di riformulare lo stesso concentrando l'attenzione su idee generali piuttosto che su manifestazioni specifiche di quelle idee tenendo conto della prospettiva di un osservatore. (Problema di trovare il percorso migliore per un viaggiatore. Se migliore significa più breve si tralasciano i fattori come la presenza di traffico e qualità della viabilità). L'astrazione si focalizza sulle caratteristiche essenziali di un oggetto, rispetto alla prospettiva di colui che osserva.
Astrazione: processo e entità
Il termine astrazione sottintende: un processo, cioè l'estrazione delle informazioni essenziali e rilevanti per un particolare scopo ignorando il resto dell'informazione; un'entità, cioè una descrizione semplificata di un sistema che enfatizzi alcuni dei dettagli o proprietà trascurandone altri. Nel quotidiano questo principio è costantemente applicato ogni qualvolta utilizziamo uno strumento senza per questo sapere come è realizzato. (Es. forno a microonde).
Astrazione e software
Nella programmazione l'astrazione allude alla distinzione che si fa tra:
- Cosa fa un pezzo di codice
- Come la fa, cioè come esso è implementato
Per l'utente del codice l'essenziale è cosa fa il codice mentre non è interessato ai dettagli dell'implementazione. Dato che i sistemi software diventano sempre più complessi, per governarne la complessità è necessario concentrarsi solo su pochi aspetti che più interessano in un certo contesto ed ignorare i restanti. Questo permette di risolvere problemi complessi in modo organizzato e gestibile.
Astrazione funzionale
L'astrazione funzionale si riferisce alla progettazione del software e consiste nella possibilità di specificare un modulo software che trasforma dei dati di input in dati di output e di nascondere i dettagli algoritmici della trasformazione. Cioè:
- Il modulo software deve trasformare un input in un output, cioè deve calcolare una funzione
- I dettagli della trasformazione, cioè del calcolo, non sono visibili al consumatore del modulo
- Il consumatore conosce solo le corrette convenzioni di chiamata (specifica sintattica) e cosa fa il modulo (specifica semantica)
- Il consumatore si fida del risultato
La specifica sintattica indica il nome del modulo, il tipo di dato in input, il tipo di dato in output in modo da permettere la corretta chiamata del modulo; la specifica semantica invece indica la trasformazione operata, cioè la funzione calcolata. Come la trasformazione è calcolata o realizzata non è noto al fruitore del modulo.
Specifiche semantiche
Come si specifica la semantica del modulo? Precondizione e postcondizione per legare i dati di ingresso ai dati di uscita; se la precondizione è vera sui dati di ingresso, allora la postcondizione è vera sui dati di uscita. Queste specifiche semantiche sono dette assiomatiche. L'astrazione funzionale si è affermata pienamente negli anni '70 quando emerse una metodologia che mirava a costruire programmi progredendo dal generale al particolare (Stepwise refinement o top-down programming). L'astrazione funzionale è di supporto a questa metodologia.
StepWise Refinement o Top-Down Programming
Secondo questa metodologia per risolvere un problema P si procede come segue:
- Si decompone P in sottocompiti P1, P2, P3... Pn
- Si ipotizza di disporre dei moduli M1, M2, M3... Mn che effettuano le trasformazioni richieste rispettivamente dai sottocompiti
- Componi un modulo M che assolve al compito di P mediante i moduli M1, M2, M3... Mn
- Applica ricorsivamente la metodologia ai sottocompiti di P, P1, P2, P3... Pn fino a quando non si ottengono sottocompiti elementari non più decomponibili
In questa metodologia il programmatore può assumere l'esistenza di qualsiasi modulo che si può applicare a quel specifico sottocompito e di cui fornisce una specifica. Tipicamente la dipendenza tra i moduli è indicata con un albero.
Limiti dell'astrazione funzionale
I dettagli relativi alla rappresentazione dei dati di input e output devono essere conosciuti da chi andrà a realizzare il modulo. (Es. modulo che rimuove i duplicati da un elenco deve sapere che tipo di elenco è). Inoltre la rappresentazione può essere condivisa fra diversi moduli quindi i cambiamenti apportati alla rappresentazione dei dati su un modulo si possono ripercuotere su altri dati. Quindi l'astrazione funzionale non permette di sviluppare soluzioni invarianti al cambiamento nei dati, il che rende difficoltosa la manutenzione delle soluzioni progettate. Infatti essa è inappropriata per lo sviluppo di soluzioni a problemi complessi.
Astrazione dati
Alla base dell'astrazione dati c'è il principio che non si può accedere direttamente alla rappresentazione di un dato, qualunque esso sia, ma solo attraverso un insieme di operazioni dette lecite. Questo permette che un cambiamento nella rappresentazione del dato si ripercuoterà solo sulle operazioni lecite che potrebbero subire modifiche, mentre non inficerà il codice che utilizza il dato astratto. In generale un principio di astrazione suggerisce di occultare l'informazione (information hiding) sulla rappresentazione di un'informazione sia perché il fruitore non necessita dell'entità astratta sia perché la sua rivelazione creerebbe inutili dipendenze che comprometterebbero l'invarianza ai cambiamenti. Quindi nel principio di astrazione funzionale si suggerisce di occultare i dettagli del processo di trasformazione cioè come esso è operato e il principio di astrazione dati mira ad occultare i dettagli della rappresentazione del dato. In entrambi i casi non si dice come farlo.
Incapsulamento
L'incapsulamento è una tecnica di progettazione che consiste nell'impacchettare o racchiudere in capsule una collezione di entità, creandone una barriera concettuale. Come l'astrazione, l'incapsulamento sottintende un processo: l'impacchettamento; un'entità: il pacchetto ottenuto. Es: Una procedura impacchetta diversi comandi, una libreria incapsula diverse funzioni e un oggetto incapsula un dato e diverse operazioni sul dato. L'incapsulamento non dice però come devono essere le pareti che possono essere:
- Trasparenti cioè che permettono di vedere tutto ciò che è stato impacchettato
- Traslucide che permettono di vedere in modo parziale ciò che è stato impacchettato
- Opache cioè che nascondono tutto il contenuto del pacchetto
Incapsulamento e astrazione dati
La combinazione tra i principi dell'astrazione dati con la tecnica dell'incapsulamento suggerisce che la rappresentazione del dato va nascosta, l'accesso al dato deve passare solo attraverso delle operazioni dette lecite e che le operazioni lecite, che ovviamente devono avere accesso all'informazione sulla rappresentazione del dato, vanno impacchettate con la rappresentazione del dato stesso. Ovviamente l'isolamento non può essere totale in quanto deve essere disponibile la specifica o contratto che descrive come si può interagire con un dato astratto. Per questo viene introdotta la parametrizzazione di un'astrazione. Questa consiste nell'utilizzo di parametri per la comunicazione con l'ambiente esterno per migliorarne l'efficacia dell'astrazione. Quando un'astrazione è chiamata, ciascun parametro formale verrà associato in qualche modo al corrispondente argomento. I meccanismi utilizzati per la realizzazione di queste associazioni sono fondamentalmente due:
- Meccanismi di copia cioè che copiano il valore da passare
- Meccanismi definizionali cioè che legano il parametro formale alla definizione dell'argomento passato
In generale l'astrazione separa gli interessi degli utenti a cui interessa sapere solo a cosa si astrae (COSA) da quella degli implementatori che sono interessati solo a come si realizza (COME). Per questo la definizione di un'astrazione ha sempre due componenti: la specifica e la realizzazione. Per realizzare la specifica si fa ricorso a dei linguaggi di specifica. La specifica potrà essere:
- Sintattica che stabilisce quali identificatori sono associati all'astrazione
- Semantica che definisce il risultato della computazione inclusa nell'astrazione
Anche l'astrazione dati è costituita dalla specifica e dalla realizzazione; la prima permette di descrivere un nuovo dato e gli operatori ad esso applicati mentre la realizzazione stabilisce come il nuovo dato e i nuovi operatori vengono ricondotti ai dati e agli operatori già disponibili. Chi intende usare i nuovi dati con i nuovi operatori è tenuto a conoscere la specifica dell'astrazione dei dati. Nell'astrazione dati i linguaggi più usati per la specifica sono: il linguaggio logico-matematico usato nelle asserzioni (specifiche assiomatiche) ed il linguaggio dell'algebra usato nelle equazioni definite fra gli operatori specificati nel dato astratto (specifiche algebriche).
Specifiche assiomatiche
È un linguaggio formale per la specifica di un tipo astratto di dato costituito dalla notazione logico-matematica delle asserzioni. Dell'insieme delle specifiche assiomatiche fanno parte:
- La Specifica sintattica detta anche signature che fornisce l'elenco dei nomi dei domini e delle operazioni specifiche del tipo e i domini di partenza e di arrivo per ogni nome di operatore
- La Specifica semantica che associa un insieme ad ogni nome di tipo della specifica sintattica ed una funzione ad ogni nome di operatore, esplicitando le seguenti condizioni sui domini di partenza e di arrivo:
- Precondizione che definisce quando l'operatore è applicabile
- Postcondizione che stabilisce la relazione tra argomenti e risultato
Il dato astratto vettore, pila, coda ed esercizi vari sul quaderno. Vettore = il vettore è un dato astratto che permette la lettura e la scrittura di qualsiasi elemento all'interno di essa in un qualsiasi ordine mediante l'utilizzo di un indice; Pila = è un dato astratto che comprende una sequenza di dati che permette l'aggiunta di un elemento solo alla testa. La lettura può avvenire solo dalla testa e questo tipo di dato è di tipo LIFO cioè last in first out. Coda = è un dato astratto che comprende una sequenza di elementi di un qualsiasi tipo alla quale è possibile accedervi solo dalla testa e l'aggiunta viene fatta in coda. È di tipo FIFO cioè first in first out.
Limiti delle specifiche assiomatiche
Le specifiche assiomatiche sono precise nella definizione della specifica sintattica ma non consentono di definire valori che possono essere generati mediante l'applicazione di operatori e inoltre non consente di stabilire quando l'applicazione di diverse sequenze di operatori porta ad un medesimo valore. Questi problemi vengono risolti mediante l'uso delle specifiche algebriche.
Specifiche algebriche
Le specifiche algebriche definiscono un dato astratto come un'algebra eterogenea cioè una collezione di diversi insiemi su cui sono definite diverse operazioni. Le algebre tradizionali sono quelle omogenee cioè un unico insieme con diverse operazioni. Una specifica algebrica è composta da tre parti:
- Specifica sintattica che è la stessa delle specifiche assiomatiche
- Specifica semantica che è l'insieme di equazioni algebriche che descrivono in modo indipendente dalla rappresentazione le proprietà delle operazioni
- Specifiche di Restrizione cioè condizioni che devono essere soddisfatte prima che siano applicate le operazioni o dopo che esse siano state completate
Nella dichiarazione delle specifiche semantiche delle specifiche algebriche è importante indicare l'insieme minimale di equazioni (dette assiomi) a partire dalle quali possiamo derivare tutte le altre. Le specifiche semantiche si diranno:
- Incomplete se non permetteranno di derivare tutte le equazioni desiderate
- Inconsistenti o contraddittorie se permetteranno di derivare delle equazioni indesiderate, cioè considerate false
- Ridondanti se alcune delle equazioni sono ricavabili dalle altre
Non è semplice definire delle specifiche algebriche complete, consistenti e non ridondanti e per farlo è necessario distinguere gli operatori di un dato astratto in:
- Costruttori che creano o istanziano il dato astratto
- Osservazioni che ritrovano informazioni sul dato astratto
Il comportamento di un'astrazione dati può essere specificato riportando il valore di ciascuna osservazione applicata a ciascun costruttore. Talvolta è difficile distinguere cosa è costruttore e cosa operazione. Per farlo ci viene in aiuto il criterio di minimalità per l'insieme dei costruttori che dice che esso deve essere il più piccolo possibile e deve essere necessario a costruire tutti i possibili valori per un dato astratto. Le osservazioni che osservano un singolo valore del dato astratto sono dette unarie. Per confrontare due valori è necessario osservare due istanze del dato astratto. Questo complica la specifica in quanto il valore dell'osservazione deve essere definito per tutte le combinazioni di costruttori possibili per i valori astratti che si devono confrontare.
Astrazione di controllo
L'astrazione di controllo si riferisce alla possibilità di specificare un modulo software che esegue delle operazioni in un ordine, nascondendo i dettagli su come il mantenimento dell'ordine è ottenuto. Cioè il modulo software deve essere parametrizzato rispetto alle operazioni da eseguire, il modulo software è associato a un controllo di sequenza e i dettagli di come il controllo di sequenza è garantito non sono visibili al consumatore del modulo. Un modulo che ha in input un'espressione e un comando e itera l'esecuzione del comando fintanto che l'espressione è vera, è un modulo che implementa il costrutto di controllo while e l'effettiva implementazione del while è nascosta. Esso può essere realizzato in diversi modi o persino ricorsivamente ma all'utente del modulo non interessa sapere quale di queste implementazioni è stata utilizzata. Nella programmazione sequenziale l'ordine di esecuzione delle istruzioni è totale mentre nella programmazione concorrente o parallela l'ordine di esecuzione può essere parziale. I linguaggi di specifica utilizzati per l'astrazione di controllo si basano sulla definizione di relazioni di precedenza fra le istruzioni. La combinazione dell'astrazione dati e dell'astrazione di controllo permette di sviluppare soluzioni software invarianti al cambiamento della rappresentazione dei dati e invarianti al cambiamento nei meccanismi di visita del dato astratto.
Astrazione nella programmazione
Consiste nell'applicare i principi dell'astrazione visti nella fase progettuale alla fase realizzativa della programmazione. In linea di principio ogni linguaggio simbolico offre di per sé una forma di astrazione della particolare macchina. Con il linguaggio assembler vennero introdotti i nomi mnemonici per le istruzioni e per l'accesso alla memoria nascondendone i dettagli della codifica (astrazione). Con i linguaggi di alto livello si aggiunsero nuove strutture di controllo astratte (for, while, ecc.), nuovi operatori non previsti dal linguaggio macchina (moltiplicazione, divisione, ecc.) e domini di valori trattabili indipendentemente dalla rappresentazione in memoria centrale.
Astrazione a 6 classi sintattiche
- Astrazione di Funzione: Espressione
- Astrazione di Procedura: Comando
- Astrazione di Controllo: Controllo di sequenza
- Astrazione di Selettore: Accesso a un'area di memoria
- Astrazione di Tipo: Definizione di un dato
- Astrazione Generica: Dichiarazione
Astrazione di funzione
Un'astrazione di funzione include un'espressione da valutare, e quando chiamata, darà un valore come risultato: Function l(FP1, FP2, ecc.) is E dove l è un identificatore, FP sono i parametri formali, E è l'espressione da valutare. Per definizione un'astrazione di funzione deve solo valutare un'espressione ma include anche dei comandi come l'assegnazione in quanto per restituire un valore è necessario assegnarlo ad una pseudo variabile. Il corpo della funzione è sintatticamente un comando ma semanticamente è un'espressione. Quindi molti linguaggi di programmazione permettono di avere comandi nel corpo di funzioni soprattutto per ragioni di efficienza in quanto altrimenti dovrebbe fare uso di ritorsione. Il programmatore nella scrittura di una funzione deve evitare che essa abbia effetti collaterali (side effects) oltre quello di calcolare un valore. Le funzioni in quanto astrazioni di espressioni possono comparire ovunque occorra un'espressione pertanto compaiono alla destra di assegnazioni e anche al posto di parametri effettivi. In alcuni linguaggi è possibile definire dei parametri formali che sono riferimenti ad una funzione e in altri le funzioni possono essere il risultato di valutazioni di espressioni e assegnate a variabili. Quindi le funzioni possono essere:
- di terza classe cioè solo chiamate
- di seconda classe cioè anche passate come argomenti, es. Pascal
- di prima classe cioè anche restituite come risultato della chiamata di altre funzioni e assegnate come valore a una variabile
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
-
Infermieristica clinica 2 (riassunti)
-
Riassunti Inglese
-
Riassunti Microeconomia
-
Riassunti Nanomedicine