• Non ci sono risultati.

Programmazione Strutturata

N/A
N/A
Protected

Academic year: 2021

Condividi "Programmazione Strutturata"

Copied!
1
0
0

Testo completo

(1)

Programmazione Strutturata

Si basano sull’astrazione, al massimo livello, del funzionamento dei calcolatori. L’attenzione è posta sulle operazioni, poichè si astrae il comportamento degli elaboratori che si fonda sull’esecuzione di flussi di istruzioni.

Le caratteristiche principali sono:

· l’astrazione procedurale assume un ruolo centrale: una funzione realizza una serie di azioni e tale funzione può essere usata come primitiva in altre funzioni

· una funzione può restituire un dato e quindi può essere considerata anche una astrazione sui dati

· ogni funzione è scomposta in azioni sequenziali a vari livelli di dettaglio (scomposizione top-down)

· si utilizzano i costrutti strutturati (if-then-else, while...) per eliminare i goto

· le funzioni hanno un nome univoco nell’intero programma

· è possibile definire aggregati di dati

· i linguaggi tipici sono Pascal, C, Fortran77

L’approccio strutturato è adeguato se la complessità del problema da risolvere non è eccessiva. Il limite deriva dal fatto che la risoluzione è impostata seguendo il modo di ragionare dell’elaboratore (flusso di istruzioni) e non seguendo il mondo reale.

La riusabilità del software è molto ridotta perchè l’astrazione funzionale è sviluppata in funzione di uno specifico sistema.

Programmazione Modulare

Rappresenta il collegamento tra l’approccio strutturato e quello ad oggetti. Si basa sul concetto di ADT (Abstract Data Type) secondo il quale un modulo è un tipo di dato astratto definito dall’utente, esso è composto da una struttura dati e delle procedure per operare sui dati.

Le caratteristiche della programmazione modulare sono:

· l’accesso ai dati può avvenire solo tramite le procedure (INCAPSULAMENTO)

· un modulo equivale ad un tipo, infatti si possono definire variabili e puntatori al modulo

· un modulo è composto da un’interfaccia esterna e da una implementazione interna nettamente separate (INFORMATION HIDING). L’interfaccia è costituita dalle procedure disponibili all’utente e l’implementazione può variare senza che gli utenti ne risentano

· i nomi delle procedure sono univoci nel modulo, ma non entro il sistema ed è opportuno che le procedure che fanno le stesse cose in moduli diversi abbiano lo stesso nome (POLIMORFISMO)

· si possono definire funzioni ed operatori (OVERLOADING) ottenendo una notevole elasticità e riconfigurabilità

· i moduli sono unità riusabili

Con la programmazione modulare il punto focale si è spostato dalle funzioni ai moduli. La separazione tra interfacce ed implementazione permette di modificare le implementazioni senza ripercussioni sulle applicazioni (se non in termini di migliori prestazioni).

Programmazione Object Oriented

L’approccio OO si si basa sulla definizione di un modello dei dati derivato dal modo di pensare umano: ogni sistema è composto da oggetti che interagiscono tra di loro scambiandosi informazioni. L’approccio OO comprende le caratteristiche dell’approccio modulare ed aggiunge altre caratteristiche proprie. Gli oggetti sono entità attive che si scambiano richieste e risposte alle richieste (MESSAGGI) e non sono solo moduli elaborati in modo funzionale.

Le caratteristiche della programmazione OO sono:

· CLASSI ed ISTANZE: una classe è una implementazione di un ADT, un’istanza è un oggetto di una classe

· METODI: poichè le classi sono implementazioni di un ADT, l’unico modo per accedere ai dati di un oggetto (che ne rappresentano lo stato) è eseguire i metodi dell’oggetto. I metodi sono la descrizione delle operazioni eseguibili sugli oggetti di una classe ed equivalgono alle procedure dei linguaggi tradizionali

· MESSAGGI: la chiamata di un metodo comporta l’invio di un messaggio all’oggetto (equivalente alla chiamata di funzione dei linguaggi tradizionali con un parametro in più che specifica l’oggetto ricevente a cui è inviato il messaggio). Il risultato dell’invio di un messaggio ad un oggetto è un altro oggetto (diversa istanza della classe)

· POLIMORFISMO: oggetti di classi diverse possono rispondere allo stesso messaggio facendo la stessa cosa ma in modo diverso, ad esempio gli oggetti testo e figura reagiranno con un comportamento diverso allo stesso messaggio output-su-video. Il polimorfismo può essere ottenuto staticamente, al momento della compilazione, o attraverso il binding dinamico. Il binding dinamico permette di eliminare i case dai programmi rendendo così il codice più compatto, leggibile e generale

· EREDITARIETA’: una classe può essere definita erede di una o più super classi. La struttura dati della nuova classe è l’unione delle strutture dati di tutte le classi da cui deriva (lo stesso vale per i metodi), più eventuali altre strutture dati ( e metodi) personali, è anche possibile ridefinire alcuni dei metodi ereditati.

Un uso corretto dell’approccio OO favorisce la costruzione di software di qualità, migliorando le caratteristiche di correttezza, robustezza, verificabilità, estensibilità e riusabilità del prodotto software.

Riferimenti

Documenti correlati

• Problemi polinomiali non deterministici = problemi risolvibili in tempo polinomiale da un algoritmo non deterministico, ma per i quali non è ancora stata trovata una.

● Associamo a ciascun elemento della struttura dati un numero di crediti. – Un credito può essere utilizzato per eseguire O(1)

Scrivere la funzione ricorsiva printGreaterKeys(u, a) che, data la radice u di un BST, un valore a di chiave, stampa in ordine tutte le chiavi dell’albero maggiori della chiave

È seguito dalla matrice di adiacenza del grafo stesso, stampata una riga per ogni rigo, con gli elementi separati da virgole. I nodi del grafo sono da considerarsi

• Il tempo impiegato per trovare lo slot desiderato (quello che contiene la chiave desiderata, oppure quello libero in cui inserire l'oggetto) dipende (anche) dalla sequenza

• quando coloriamo un nodo u di G di nero (cioè ogni volta che finiamo di visitare un nodo di G), inseriamo u in testa alla lista. • dopo che abbiamo visitato tutti i nodi di G,

Si progettino un algoritmo euristico di tipo greedy ed uno di ricerca locale per risolvere il problema della BISEZIONE in forma di ottimizzazione: “Dato un grafo non orientato G =

Si scriva una procedura Pascal, basata sulla ricerca binaria, per individuare in tempo O(log n) l’unico intero dell’intervallo 1..n+1 che non compare in V.... Si scriva