Astrazione dei dati in C ++

L'astrazione dei dati si riferisce a fornire solo informazioni essenziali al mondo esterno e nascondere i dettagli di fondo, ovvero rappresentare le informazioni necessarie nel programma senza presentare i dettagli.

L'astrazione dei dati è una tecnica di programmazione (e progettazione) che si basa sulla separazione tra interfaccia e implementazione.

Facciamo un esempio di vita reale di un televisore, che puoi accendere e spegnere, cambiare canale, regolare il volume e aggiungere componenti esterni come altoparlanti, videoregistratori e lettori DVD, MA non conosci i suoi dettagli interni, che Cioè, non sai come riceve i segnali via etere o via cavo, come li traduce e infine li visualizza sullo schermo.

Quindi, possiamo dire che un televisore separa chiaramente la sua implementazione interna dalla sua interfaccia esterna e puoi giocare con le sue interfacce come il pulsante di accensione, il cambia canale e il controllo del volume senza avere alcuna conoscenza dei suoi interni.

In C ++, le classi forniscono un ottimo livello di data abstraction. Forniscono sufficienti metodi pubblici al mondo esterno per giocare con la funzionalità dell'oggetto e per manipolare i dati dell'oggetto, cioè lo stato senza sapere realmente come la classe è stata implementata internamente.

Ad esempio, il tuo programma può effettuare una chiamata a sort()senza sapere quale algoritmo la funzione utilizza effettivamente per ordinare i valori dati. In effetti, l'implementazione sottostante della funzionalità di ordinamento potrebbe cambiare tra i rilasci della libreria e finché l'interfaccia rimane la stessa, la chiamata di funzione continuerà a funzionare.

In C ++, usiamo classesper definire i nostri tipi di dati astratti (ADT). Puoi usare il filecout oggetto di classe ostream per trasmettere i dati allo standard output in questo modo -

#include <iostream>
using namespace std;

int main() {
   cout << "Hello C++" <<endl;
   return 0;
}

Qui, non è necessario capire come coutvisualizza il testo sullo schermo dell'utente. Devi solo conoscere l'interfaccia pubblica e l'implementazione sottostante di "cout" è libera di cambiare.

Le etichette di accesso impongono l'astrazione

In C ++, usiamo le etichette di accesso per definire l'interfaccia astratta della classe. Una classe può contenere zero o più etichette di accesso -

  • I membri definiti con un'etichetta pubblica sono accessibili a tutte le parti del programma. La vista di astrazione dei dati di un tipo è definita dai suoi membri pubblici.

  • I membri definiti con un'etichetta privata non sono accessibili al codice che utilizza la classe. Le sezioni private nascondono l'implementazione dal codice che utilizza il tipo.

Non ci sono restrizioni sulla frequenza di visualizzazione di un'etichetta di accesso. Ogni etichetta di accesso specifica il livello di accesso delle definizioni di membri successive. Il livello di accesso specificato rimane in vigore fino a quando non viene incontrata l'etichetta di accesso successiva o viene visualizzata la parentesi graffa destra di chiusura del corpo della classe.

Vantaggi dell'astrazione dei dati

L'astrazione dei dati offre due importanti vantaggi:

  • Gli interni della classe sono protetti da errori involontari a livello di utente, che potrebbero danneggiare lo stato dell'oggetto.

  • L'implementazione della classe può evolversi nel tempo in risposta a requisiti mutevoli o segnalazioni di bug senza richiedere modifiche nel codice a livello utente.

Definendo i membri dei dati solo nella sezione privata della classe, l'autore della classe è libero di apportare modifiche ai dati. Se l'implementazione cambia, è necessario esaminare solo il codice della classe per vedere quale effetto potrebbe avere la modifica. Se i dati sono pubblici, qualsiasi funzione che accede direttamente ai membri dei dati della vecchia rappresentazione potrebbe essere interrotta.

Esempio di astrazione dei dati

Qualsiasi programma C ++ in cui si implementa una classe con membri pubblici e privati ​​è un esempio di astrazione dei dati. Considera il seguente esempio:

#include <iostream>
using namespace std;

class Adder {
   public:
      // constructor
      Adder(int i = 0) {
         total = i;
      }
      
      // interface to outside world
      void addNum(int number) {
         total += number;
      }
      
      // interface to outside world
      int getTotal() {
         return total;
      };
      
   private:
      // hidden data from outside world
      int total;
};

int main() {
   Adder a;
   
   a.addNum(10);
   a.addNum(20);
   a.addNum(30);

   cout << "Total " << a.getTotal() <<endl;
   return 0;
}

Quando il codice precedente viene compilato ed eseguito, produce il seguente risultato:

Total 60

La classe sopra somma i numeri e restituisce la somma. I membri pubblici -addNum e getTotalsono le interfacce con il mondo esterno e un utente deve conoscerle per usare la classe. Il membro privatototal è qualcosa che l'utente non ha bisogno di sapere, ma è necessario affinché la classe funzioni correttamente.

Strategia di progettazione

L'astrazione separa il codice in interfaccia e implementazione. Pertanto, durante la progettazione del componente, è necessario mantenere l'interfaccia indipendente dall'implementazione in modo che, se si modifica l'implementazione sottostante, l'interfaccia rimarrebbe intatta.

In questo caso, qualunque programma stia utilizzando queste interfacce, non ne verrebbe influenzato e richiederebbe solo una ricompilazione con l'ultima implementazione.