b'\n_START_ARTICLE_\nAstrazione (informatica)\n_START_SECTION_\nLinguaggi di specificazione\n_START_PARAGRAPH_\nI linguaggi di specificazione spesso fanno affidamento su un tipo di astrazione o un altro, visto che le specificazioni sono tipicamente definite all\'inizio di un progetto (ad un livello pi\xc3\xb9 astratto). Il linguaggio UML, ad esempio, permette di definire classi astratte, che rimangono astratte durante l\'architettura e la fase di specificazione del progetto.\n_START_SECTION_\nProgrammazione strutturata\n_START_PARAGRAPH_\nLa programmazione strutturata implica la suddivisione di complessi compiti di un programma in pezzi pi\xc3\xb9 piccoli con lo scopo di semplificarli ed evitare "effetti collaterali"._NEWLINE_In un programma semplice, questo potrebbe servire per assicurarsi che un ciclo abbia un singolo o pi\xc3\xb9 ovvi punti di uscita e, dove possibile, per assicurarsi che funzioni e procedure ne abbiano solo uno._NEWLINE_In un sistema pi\xc3\xb9 grande, invece, potrebbe implicare la suddivisione di compiti complessi in tanti moduli diversi. La programmazione orientata agli oggetti (OOP) ha abbracciato ed esteso questo concetto.\n_START_SECTION_\nStrutture di dati astratte\n_START_PARAGRAPH_\nLe strutture di dati astratte rinforzano una chiara separazione tra le propriet\xc3\xa0 astratte di un tipo di dati e i dettagli concreti della sua implementazione. Le propriet\xc3\xa0 astratte sono quelle che sono visibili a colui che fa uso del tipo di dati - l\'interfaccia del tipo di dati - mentre l\'implementazione concreta \xc3\xa8 completamente mantenuta privata, e ovviamente pu\xc3\xb2 cambiare per implementare migliorie di efficienza nel tempo. L\'idea \xc3\xa8 che questi cambiamenti non devono avere alcun impatto, e non devono creare differenze nell\'aspetto astratto._NEWLINE_Per esempio, si potrebbe definire un tipo di dato astratto chiamato tavola di ricerca (lookup table), che associa in modo univoco chiavi a valori, e nella quale \xc3\xa8 possibile ottenere il valore desiderato digitando la chiave corrispondente. Una tavola di ricerca del genere pu\xc3\xb2 essere implementata in vari modi, ad esempio con una hash table (in italiano Tabella Hash)._NEWLINE_I linguaggi che implementano le strutture di dati astratte includono Ada e Modula-2.\n_START_SECTION_\nAstrazione nella programmazione orientata agli oggetti (OOP)\n_START_PARAGRAPH_\nNella teoria della programmazione orientata agli oggetti, l\'astrazione implica la facilit\xc3\xa0 di definire oggetti che rappresentino "attori" che possono svolgere lavori, riportare e cambiare il loro stato, e comunicare con gli altri oggetti nel sistema. Il termine incapsulamento si riferisce al nascondere i dettagli di stato, ma estendere il concetto di tipo di dato dai primi linguaggi di programmazione, e standardizzare il modo in cui i diversi tipi di dati interagiscono, \xc3\xa8 l\'inizio dell\'astrazione. Si parla di polimorfismo quando l\'astrazione consente a oggetti di diverso tipo di venire sostituiti. Si parla di ereditariet\xc3\xa0 quando pi\xc3\xb9 tipi o classi vengono strutturati per semplificare un set complesso di relazioni._NEWLINE_Vari linguaggi di programmazione orientata agli oggetti offrono simili agevolazioni per l\'astrazione, per supportare tutti insieme una strategia generale di polimorfismo, che implica la sostituzione di un tipo in uno che abbia lo stesso ruolo o uno simile._NEWLINE_Common Lisp Object System (conosciuto anche come CLOS) e self hanno un grande utilizzo del polimorfismo. Oggetti individuali e funzioni sono astratti pi\xc3\xb9 flessibilmente in modo da adattarsi meglio all\'eredit\xc3\xa0 condivisa funzionale del Lisp._NEWLINE_Anche se alcuni linguaggi offrono strategie alternative per ottenere la stessa astrazione, fondamentalmente non modificano il bisogno di supportare nomi astratti nel codice - tutta la programmazione conta sull\'abilit\xc3\xa0 di astrarre verbi, funzioni, strutture di dati, nomi e processi._NEWLINE_Consideriamo ad esempio un frammento di codice Java per rappresentare alcuni comuni "animali" di fattoria ad un livello di astrazione tale da simulare i pi\xc3\xb9 semplici aspetti della loro fame e del nutrimento. Definiamo una classe "Animale" per rappresentare entrambi gli stati dell\'animale e le sue funzioni:_NEWLINE_public class Animale extends EssereVivente{_NEWLINE_   private Luogo loc;_NEWLINE_   private double riserveEnergia;_NEWLINE__NEWLINE_   boolean affamato()_NEWLINE_   {_NEWLINE_      return riserveEnergia < 2.5;_NEWLINE_   }_NEWLINE_   void mangia(Cibo f)_NEWLINE_   {_NEWLINE_      //Mangia il cibo_NEWLINE_      riserveEnergia += f.getCalorie();_NEWLINE_   }_NEWLINE_   void muoviti (Luogo l)_NEWLINE_   {_NEWLINE_      //Si muove verso un altro luogo_NEWLINE_      loc = l;_NEWLINE_   }}_NEWLINE_Con la definizione di cui sopra, si potrebbero creare oggetti di tipo "Animale" e chiamare metodi del genere:_NEWLINE_ilMaiale = new Animale();laMucca = new Animale();if (ilMaiale.affamato()){_NEWLINE_   ilMaiale.mangia(avanzi);}if (laMucca.affamato()){_NEWLINE_   laMucca.mangia(erba);}laMucca.muoviti(fienile);_NEWLINE_Nell\'esempio sopra, la classe "Animale" \xc3\xa8 un\'astrazione usata al posto di un vero animale, "EssereVivente" \xc3\xa8 un\'ulteriore astrazione (in questo caso una generalizzazione) di "Animale"._NEWLINE_Se viene richiesta una gerarchia pi\xc3\xb9 differenziata di animali - per differenziare, diciamo, quelli che producono latte da quelli che non producono niente e non la carne dopo che hanno finito di vivere - pu\xc3\xb2 esserci un livello intermedio di astrazione, come "Animali Lattiero-Caseari" (mucche o capre) che mangiano cibi per produrre buon latte, e "Animali" (suini e manzi) che mangiano cibi per dare la migliore qualit\xc3\xa0 di carne._NEWLINE_Una astrazione del genere rimuoverebbe il bisogno di specificare il tipo di cibo, in modo da concentrarsi invece sulla pianificazione del nutrimento. Le due classi potrebbero essere legate usando ereditariet\xc3\xa0 o potrebbero essere da sole, e il programmatore potrebbe definire vari gradi di polimorfismo tra i due tipi. Queste agevolazioni tendono a variare drasticamente tra un linguaggio e l\'altro, ma in generale ci\xc3\xb2 che riesce a fare uno pu\xc3\xb2 essere fatto con tutti gli altri.\n_START_SECTION_\nDesign orientato agli oggetti\n_START_PARAGRAPH_\nLe decisioni su cosa rendere astratto e cosa no \xc3\xa8 diventata la maggiore preoccupazione del design orientato agli oggetti e dell\'analisi dei domini - ci\xc3\xb2 che invero determina le relazioni rilevanti nel mondo reale \xc3\xa8 ci\xc3\xb2 che riguarda l\'analisi orientata agli oggetti._NEWLINE_In genere, per determinare appropriate astrazioni, bisogna fare piccole decisioni riguardo al campo, determinare quali altri sistemi devono cooperare, e infine fare una dettagliata analisi orientata agli oggetti. Nel nostro esempio di prima, il dominio \xc3\xa8 il fienile, i maiali e le mucche e i luoghi sono i vincoli ereditari, la dettagliata analisi \xc3\xa8 che i programmatori devono avere la flessibilit\xc3\xa0 necessaria per nutrire gli animali, e non c\'\xc3\xa8 alcun motivo di inserire il tipo di cibo dentro la classe stessa, e il design \xc3\xa8 una singola e semplice classe Animale dove sono inseriti i maiali e le mucche, con le stesse funzioni. La decisione di implementare gli Animali Lattiero-Caseari cambierebbe l\'analisi dettagliata, ma il dominio e l\'analisi delle eredit\xc3\xa0 non cambierebbero - quindi questo \xc3\xa8 interamente sotto il controllo del programmatore, e ci riferiamo all\'astrazione nella programmazione ad oggetti in modo diverso dall\'astrazione nei domini o nell\'analisi delle eredit\xc3\xa0.\n_START_SECTION_\nConsiderazioni\n_START_PARAGRAPH_\nQuando si discute di semantica dei linguaggi di programmazione, metodi formali o interpretazioni astratte, con astrazione ci si riferisce a una meno dettagliata, ma sicura, definizione dei comportamenti di un determinato programma. Per esempio, \xc3\xa8 possibile osservare solo il risultato finale del programma, a meno che non si considerino tutti i passaggi intermedi dell\'esecuzione. L\'astrazione \xc3\xa8 definita per un concreto (pi\xc3\xb9 preciso) modello di esecuzione._NEWLINE_L\'astrazione potrebbe essere esatta o molto fedele a una propriet\xc3\xa0 se si risponde egualmente bene alle domande sulla propriet\xc3\xa0 del modello astratto. Per esempio, se vogliamo sapere qual \xc3\xa8 il risultato di una espressione matematica che implica solo l\'utilizzo di interi, abbiamo solo bisogno di utilizzare operazioni modulo n (una forma familiare di questa astrazione \xc3\xa8 la prova del nove)._NEWLINE_Le astrazioni, comunque, anche se non esatte, devono essere buone. Infatti, potrebbe essere possibile ottenere buone risposte da esse - anche se l\'astrazione pu\xc3\xb2 semplicemente produrre un risultato di indecidibilit\xc3\xa0. Per esempio, potremmo rendere astratti gli studenti di una classe, secondo la loro massima e minima et\xc3\xa0; se viene chiesto se una persona appartiene a quella classe, si potrebbe semplicemente comparare l\'et\xc3\xa0 di quella persona con la massima e la minima di quella classe. Se la sua et\xc3\xa0 non rientra in quell\'intervallo, sicuramente si pu\xc3\xb2 rispondere che quella persona non appartiene a quella classe. Se invece vi rientra, si pu\xc3\xb2 solo rispondere "Non lo so"._NEWLINE_Il livello di astrazione implementato in un linguaggio di programmazione pu\xc3\xb2 influenzare tutta la sua usabilit\xc3\xa0. La struttura delle Dimensioni Cognitive include il concetto di gradiente di astrazione in un formalismo. Questa struttura permette al designer di un linguaggio di programmazione di studiare gli scambi tra l\'astrazione e le altre caratteristiche del design, e come i cambiamenti nell\'astrazione influiscano l\'usabilit\xc3\xa0 del linguaggio._NEWLINE_Le astrazioni possono dimostrarsi utili quando si lavora con i programmi, poich\xc3\xa9 particolari propriet\xc3\xa0 di questi sono essenzialmente indecidibili. Come conseguenza, i metodi automatici per ottenere informazioni sul comportamento dei programmi possono terminare improvvisamente (senza dare un risultato o andando semplicemente in crash) o potrebbero dare false informazioni._NEWLINE_L\'astrazione \xc3\xa8 il concetto principale dell\'interpretazione astratta. Il Model checking generalmente prende luogo su versioni astratte dei sistemi studiati.\n_START_SECTION_\nLivelli di astrazione\n_START_PARAGRAPH_\nL\'informatica presenta comunemente livelli (o meno comunemente, strati) di astrazione, dove ogni livello rappresenta un diverso modello della stessa informazione o processo, ma usa un sistema di espressione che implica un diverso set di oggetti e composizioni che si applicano solo ad un particolare dominio. I livelli pi\xc3\xb9 "alti" di astrazione tendono a costruirsi su qualcosa di relativamente concreto, mentre quelli pi\xc3\xb9 "bassi" tendono a dare progressivamente una rappresentazione pi\xc3\xb9 "granulare". Ad esempio, le porte costruite mediante circuiti elettronici, il linguaggio macchina binario, linguaggi di programmazione basati sul linguaggio binario, applicazioni e sistemi operativi basati su linguaggi di programmazione. Ogni livello \xc3\xa8 incorporato, ma non determinato, dal livello sotto di esso, rendendolo un linguaggio di descrizione che \xc3\xa8 in un certo senso autocontenuto.\n_START_SECTION_\nSistemi di database\n_START_PARAGRAPH_\nPoich\xc3\xa9 molti utenti di sistemi di database hanno molta familiarit\xc3\xa0 con le strutture di dati, gli sviluppatori di database spesso nascondono le complessit\xc3\xa0 attraverso i seguenti livelli:_NEWLINE_Livello fisico: Il livello pi\xc3\xb9 basso di astrazione descrive come un sistema immagazzini i dati. Il livello fisico descrive dettagliatamente le strutture di dati a basso livello._NEWLINE_Livello logico: Il livello superiore di astrazione descrive quali dati immagazzina il database, e quali relazioni ci sono tra questi dati. Il livello logico quindi descrive un intero database in termini di piccoli numeri e strutture relativamente semplici. Anche se l\'implementazione delle semplici strutture a livello logico potrebbe implicare complesse strutture a livello fisico, gli utilizzatori dei livelli logici non devono preoccuparsi di queste complessit\xc3\xa0. Gli amministratori dei database, che devono decidere quali informazioni tenere in un database, usano il livello di astrazione logico._NEWLINE_Livello a viste: Il livello pi\xc3\xb9 alto di astrazione descrive solo parte dell\'intero database. Anche se il livello logico usa struttura pi\xc3\xb9 semplici, rimane la complessit\xc3\xa0 a causa della variet\xc3\xa0 di informazioni immagazzinata in un grande database. Ad alcuni utenti di sistemi di database non servono tutte queste informazioni; invece, hanno solo bisogno di accedere a una parte del database. Il livello di astrazione a viste esiste per semplificare la loro interazione con il sistema. Il sistema potrebbe anche fornire pi\xc3\xb9 viste per lo stesso database.'