Metodologie di Programmazione = decomposizione basata su astrazioni Vari programmi possono risolvere lo stesso problema



Scaricare 515 b.
13.11.2018
Dimensione del file515 b.


Metodologie di Programmazione = decomposizione basata su astrazioni


Vari programmi possono risolvere lo stesso problema

  • Efficienti (Algoritmi)

  • Ben Strutturati:

  • Facili da capire e su cui ragionare (per esempio per convincersi della loro correttezza)

  • Facili da mantenere e da modificare (per esempio che ammettono modifiche locali e che siano estendibili)

  • Questi aspetti sono spesso in contrasto tra loro, e’ necessario un compromesso

  • Esistono delle tecniche da seguire per strutturare in modo efficace un programma?



Osservazione di partenza…

  • quando si devono sviluppare programmi abbastanza grandi e’ necessario decomporre in moduli

    • i moduli risolvono sotto-problemi piu’ semplici
    • i moduli che risolvono i sotto-problemi devono riuscire a cooperare nella soluzione del problema originale
  • moduli il piu’ possibile indipendenti

  • le interazioni tra i moduli che risolvono il problema devono essere chiare e facili da capire



Importanza dei “moduli”

  • persone diverse possono/devono essere coinvolte

    • si deve poter lavorare in modo indipendente (ma coerente) nello sviluppo dei diversi moduli
    • deve essere possibile eseguire “facilmente” (da parte di persone diverse da quelle coinvolte nello sviluppo) modifiche e aggiornamenti (manutenzione)
      • a livello dei singoli moduli, senza influenzare il comportamento degli altri


Processo di Sviluppo: decomposizione e astrazione

  • la decomposizione può essere effettuata in modo produttivo ricorrendo all’astrazione

    • cambiamento del livello di dettaglio, nella descrizione di un problema, limitandosi a “considerare” solo alcune delle sue caratteristiche
      • cose che sono diverse diventano uguali
    • Si puo’ semplificare l’analisi, separando gli attributi che si ritengono rilevanti da quelli che si ritiene possano essere trascurati
    • si passa ad un problema più semplice
      • su questo si effettua la decomposizione in sotto-problemi


Astrazione

  • noi studieremo alcuni meccanismi di astrazione legati alla programmazione, quelli presenti nei linguaggi ad alto livello (in particolare Java)

  • come utilizzare i meccanismi di astrazione per sviluppare programmi di buona qualita’ (in base alle caratteristiche dette in precedenza)





Il più comune tipo di astrazione

  • l’astrazione procedurale

    • presente in tutti i linguaggi di programmazione
  • la separazione tra “definizione” e “chiamata” rende disponibili nel linguaggio i due meccanismi fondamentali di astrazione



Astrazione via parametrizzazione

  • l’introduzione dei parametri permette di descrivere un insieme (anche infinito) di computazioni diverse con un singolo programma che le astrae tutte

  • x * x + y * y

    • descrive una computazione
  • x,y:int.(x * x + y * y)

    • descrive tutte le computazioni che si possono ottenere chiamando la procedura, cioè applicando la funzione ad una opportuna n-upla di valori
  • x,y:int.(x * x + y * y)(w,z)

    • ha la stessa semantica dell’espressione w * w + z * z


Astrazione via specifica

  • astrarre dalla specifica computazione descritta nel corpo della procedura, associando ad ogni procedura una specifica

    • semantica intesa della procedura (cosa fa e non come la fa)
  • la specifica deve contenere tutte le informazioni necessarie a chi usa la procedura, e’ di fatto l’interfaccia con l’esterno

  • chi utilizza la procedura vede cosa fa (la specifica) e non come lo fa (l’implementazione)



Vantaggi

  • Se la specifica e l’implementazione sono progettati in modo opportuno, ovvero sono chiaramente separate e l’implementazione e’ invisibile a chi usa la procedura

  • si rende la procedura indipendente dai moduli che la usano

  • l’implementazione per esempio puo’ essere cambiata, estesa



Astrazione via specifica

  • non è di solito supportata dal linguaggio di programmazione

    • se non in parte (vedi specifiche di tipo)
  • si realizza con specifiche semi-formali

    • sintatticamente, commenti
    • tipo quelli che abbiamo usato a LIP




Il punto di vista di chi usa la procedura







Tipi di astrazione

    • astrazione procedurale
      • si aggiungono nuove operazioni a quelle della macchina astratta del linguaggio di programmazione
    • astrazione di dati
      • si aggiungono nuovi tipi di dato a quelli della macchina astratta del linguaggio di programmazione
    • iterazione astratta
    • gerarchie di tipo
      • permette di astrarre da specifici tipi di dato a famiglie di tipi correlati


Astrazione procedurale

  • fornita da tutti i linguaggi ad alto livello

  • aggiunge nuove operazioni a quelle della macchina astratta del linguaggio di programmazione

    • per esempio, sqrt sui float
  • la specifica descrive le proprietà della nuova operazione



Astrazione sui dati

  • fornita da tutti i linguaggi ad alto livello moderni

  • aggiunge nuovi tipi di dato e relative operazioni a quelli della macchina astratta del linguaggio

    • tipo Insieme con le operazioni vuoto, inserisci, rimuovi, e dimensione
    • La specifica descrive il tipo di dato e le proprieta’ delle operazioni
    • L’implementazione richiede di dare: la rappresentazione dei valori di tipo MultiInsieme e la realizzazione delle operazioni
    • l’implementazione deve essere invisibile all’utente che deve fare solo riferimento alle proprietà presenti nella specifica
  • la specifica descrive le relazioni fra le varie operazioni



Iterazione astratta

  • non è fornita da nessun linguaggio di uso comune

    • può essere simulata (per esempio, in Java)
  • permette di iterare su elementi di una collezione, senza sapere come questi vengono ottenuti

  • evita di dire cose troppo dettagliate sul flusso di controllo all’interno di un ciclo

    • per esempio, potremmo iterare su tutti gli elementi di un Insieme senza imporre nessun vincolo sull’ordine con cui vengono elaborati
  • astrae (nasconde) il flusso di controllo nei cicli



Gerarchie di tipo

  • fornite da alcuni linguaggi ad alto livello moderni

    • per esempio, Java (ereditarieta’)
  • L’ereditarieta’ permette di definire nel supertipo

  • tutte le operazioni, comuni ai sottotipi

  • Il supertipo astrae i dettagli che rendono diversi tra loro i vari sottotipi

  • Meccanismo fondamentale per avere codice compatto, per fattorizzare le informazioni comuni, estendere etc..

  • Relazione tra le specifiche del sottotipo e del supertipo







©astratto.info 2017
invia messaggio

    Pagina principale