Nascondere i dati è più incapsulamento, davvero. L'astrazione riguarda nascondere i dettagli di implementazione
Ad esempio, supponiamo di voler aggiungere due numeri insieme. A meno che tu non abbia fatto un bel po 'di studi di ingegneria elettronica, probabilmente non hai idea di quanto sia complesso un problema così semplice.
Innanzitutto, il compilatore trasforma la tua istruzione x = y + z
in codice macchina che carica due valori in due registri nella CPU, quindi esegue un'istruzione ADD
, recupera il risultato dal registro e lo memorizza in memoria. E quell'istruzione ADD
richiede alcune porte logiche complicate per funzionare correttamente e quelle porte logiche sono costruite di transistor e semiconduttori, che devono essere progettati in base a specifiche molto precise basate sulle leggi della meccanica quantistica ...
... ma a te non interessa davvero niente di tutto ciò. Tutto quello che ti interessa è poter scrivere il codice e ottenere la risposta giusta. Il linguaggio di programmazione è un'astrazione che copre i dettagli di come funziona realmente il codice macchina, e il codice macchina è un'astrazione che copre i dettagli di come funziona l'elettronica sottostante, e così via. Finché funziona, non devi davvero preoccuparti di come, e questo rende il tuo lavoro come programmatore molto più semplice!
A un livello un po 'più alto, supponiamo che tu voglia un modo per salvare dati in un file e caricarlo da un file. Bene, ci sono API di filesystem nel tuo sistema operativo per quello. Ma cosa succede se vuoi che il tuo programma sia in grado di scaricare un file da Internet ed elaborarlo? Puoi sempre scaricarlo e salvarlo in un file, e quindi usare il tuo codice per caricarlo da un file, ma è un po 'dispendioso e eccessivamente complicato, specialmente se l'utente non ha realmente bisogno del tuo programma per lasciare quel file sul loro disco rigido.
Quindi, invece, puoi usare un'astrazione: un flusso. L'idea di un flusso è "Ho questa sequenza di dati che può essere letta o scritta in ordine". Nota come non dice nulla sulla rappresentazione sottostante dei dati. Quindi, se rielabori il tuo codice per gestire flussi invece di file, diventa improvvisamente molto più versatile. Ora puoi leggere da un file dando al codice un oggetto FileStream
, o lavorare con un download dando lo stesso identico codice a HTTPStream
oggetto, o anche lavorare con i dati contenuti interamente nella memoria locale con un oggetto MemoryStream
. Il codice che sta elaborando il flusso non ha più bisogno di sapere nulla sui file; ha solo bisogno di sapere dei dati contenuti nel flusso. Estrapolando i dettagli ("i dati vengono salvati in un file") il tuo lavoro come programmatore diventa più semplice e il tuo codice diventa più flessibile.