Abstraction de données en C ++

L'abstraction des données se réfère à la fourniture uniquement des informations essentielles au monde extérieur et au masquage de leurs détails de base, c'est-à-dire pour représenter les informations nécessaires dans le programme sans en présenter les détails.

L'abstraction des données est une technique de programmation (et de conception) qui repose sur la séparation de l'interface et de la mise en œuvre.

Prenons un exemple réel de téléviseur, que vous pouvez allumer et éteindre, changer de chaîne, régler le volume et ajouter des composants externes tels que des haut-parleurs, des magnétoscopes et des lecteurs DVD, MAIS vous ne connaissez pas ses détails internes, que c'est-à-dire que vous ne savez pas comment il reçoit les signaux hertziens ou via un câble, comment il les traduit et les affiche enfin à l'écran.

Ainsi, nous pouvons dire qu'un téléviseur sépare clairement son implémentation interne de son interface externe et que vous pouvez jouer avec ses interfaces comme le bouton d'alimentation, le changeur de canal et le contrôle du volume sans avoir aucune connaissance de ses composants internes.

En C ++, les classes fournissent un excellent niveau de data abstraction. Ils fournissent suffisamment de méthodes publiques au monde extérieur pour jouer avec la fonctionnalité de l'objet et pour manipuler les données de l'objet, c'est-à-dire l'état sans réellement savoir comment la classe a été implémentée en interne.

Par exemple, votre programme peut appeler le sort()sans savoir quel algorithme la fonction utilise réellement pour trier les valeurs données. En fait, l'implémentation sous-jacente de la fonctionnalité de tri peut changer entre les versions de la bibliothèque, et tant que l'interface reste la même, votre appel de fonction fonctionnera toujours.

En C ++, nous utilisons classespour définir nos propres types de données abstraits (ADT). Vous pouvez utiliser lecout objet de classe ostream pour diffuser des données vers une sortie standard comme celle-ci -

#include <iostream>
using namespace std;

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

Ici, vous n'avez pas besoin de comprendre comment coutaffiche le texte sur l'écran de l'utilisateur. Vous devez uniquement connaître l'interface publique et l'implémentation sous-jacente de «cout» est libre de changer.

Les étiquettes d'accès appliquent l'abstraction

En C ++, nous utilisons des étiquettes d'accès pour définir l'interface abstraite de la classe. Une classe peut contenir zéro ou plusieurs étiquettes d'accès -

  • Les membres définis avec un label public sont accessibles à toutes les parties du programme. La vue d'abstraction de données d'un type est définie par ses membres publics.

  • Les membres définis avec une étiquette privée ne sont pas accessibles au code qui utilise la classe. Les sections privées masquent l'implémentation du code qui utilise le type.

Il n'y a aucune restriction sur la fréquence d'apparition d'une étiquette d'accès. Chaque étiquette d'accès spécifie le niveau d'accès des définitions de membre suivantes. Le niveau d'accès spécifié reste en vigueur jusqu'à ce que la prochaine étiquette d'accès soit rencontrée ou que l'accolade droite de fermeture du corps de classe soit vue.

Avantages de l'abstraction des données

L'abstraction des données offre deux avantages importants -

  • Les éléments internes de la classe sont protégés contre les erreurs involontaires au niveau de l'utilisateur, qui pourraient corrompre l'état de l'objet.

  • L'implémentation de classe peut évoluer au fil du temps en réponse à des exigences changeantes ou à des rapports de bogue sans nécessiter de changement de code au niveau de l'utilisateur.

En définissant les membres de données uniquement dans la section privée de la classe, l'auteur de la classe est libre d'apporter des modifications aux données. Si l'implémentation change, seul le code de classe doit être examiné pour voir quel effet le changement peut avoir. Si les données sont publiques, toute fonction qui accède directement aux données membres de l'ancienne représentation peut être interrompue.

Exemple d'abstraction de données

Tout programme C ++ dans lequel vous implémentez une classe avec des membres publics et privés est un exemple d'abstraction de données. Prenons l'exemple suivant -

#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;
}

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -

Total 60

La classe ci-dessus ajoute les nombres ensemble et renvoie la somme. Les membres du public -addNum et getTotalsont les interfaces avec le monde extérieur et un utilisateur doit les connaître pour utiliser la classe. Le membre privétotal est quelque chose que l'utilisateur n'a pas besoin de connaître, mais qui est nécessaire pour que la classe fonctionne correctement.

Conception de la stratégie

L'abstraction sépare le code en interface et implémentation. Ainsi, lors de la conception de votre composant, vous devez garder l'interface indépendante de l'implémentation afin que si vous changez l'implémentation sous-jacente, l'interface reste intacte.

Dans ce cas, quels que soient les programmes utilisant ces interfaces, ils ne seraient pas affectés et auraient juste besoin d'une recompilation avec la dernière implémentation.