C++ Abstraction des données

L'abstraction des données consiste à fournir uniquement les informations clés au monde extérieur et à masquer les détails d'implémentation sous-jacents — c'est-à-dire à ne présenter que les informations nécessaires sans montrer les détails.

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

Prenons un exemple concret, comme un téléviseur. Vous pouvez l'allumer et l'éteindre, changer de chaîne, régler le volume et ajouter des composants externes (comme des haut-parleurs, un magnétoscope ou un lecteur DVD), mais vous ne connaissez pas les détails de son implémentation interne. En d'autres termes, vous ne savez pas comment il reçoit les signaux par les câbles, comment il convertit ces signaux et enfin les affiche à l'écran.

Par conséquent, nous pouvons dire qu'un téléviseur sépare son implémentation interne de son interface externe. Vous n'avez pas besoin de savoir comment il fonctionne à l'intérieur ; vous pouvez utiliser le téléviseur directement via ses interfaces externes, telles que le bouton d'alimentation, la télécommande et la commande de volume.

Maintenant, revenons à l'essentiel. En matière de programmation C++, les classes C++Abstraction des donnéesrendent cela possible. Elles fournissent un grand nombre de méthodes publiques au monde extérieur pour manipuler les données des objets, ce qui signifie que le monde extérieur ne connaît pas réellement l'implémentation interne de la classe.

Par exemple, votre programme peut appeler des fonctionssort(), sans avoir besoin de connaître l'algorithme utilisé dans la fonction pour trier les données. En fait, l'implémentation sous-jacente du tri de la fonction peut varier selon la version de la bibliothèque ; tant que l'interface reste inchangée, l'appel de fonction peut continuer à fonctionner normalement.

En C++, nous utilisonsClasspour définir nos propres types abstraits de données (ADTs). Vous pouvez utiliser des classesiostreamdecoutobjets pour afficher des données sur la sortie standard, comme indiqué ci-dessous :

Exemple

#include <iostream> using namespace std; int main( ) { cout << "Hello C++" <<endl; return 0; }

Ici, vous n'avez pas besoin de comprendrecoutcomment le texte est affiché sur l'écran de l'utilisateur. Vous avez seulement besoin de connaître l'interface publique ; l'implémentation sous-jacente de cout peut être librement modifiée.

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

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

  • Les membres définis avec l'étiquette public sont accessibles à toutes les parties du programme. La vue d'abstraction des données d'un type est définie par ses membres publics.
  • Les membres définis avec l'étiquette private ne sont pas accessibles au code qui utilise la classe. La section private cache les détails d'implémentation au code qui utilise le type.

Il n'y a pas de limite sur la fréquence d'apparition des étiquettes d'accès. Chaque étiquette d'accès spécifie le niveau d'accès des définitions de membres qui la suivent immédiatement. Le niveau d'accès spécifié reste en vigueur jusqu'à ce que la prochaine étiquette d'accès soit rencontrée ou jusqu'à ce que l'accolade fermante du corps de la classe soit atteinte.

Avantages de l'abstraction des données

L'abstraction des données présente deux avantages importants :

  • L'état interne d'une classe est protégé contre les dommages causés par des erreurs involontaires au niveau de l'utilisateur.
  • L'implémentation de la classe peut changer au fil du temps pour répondre à l'évolution des exigences, ou pour répondre à des rapports de bogues qui ne nécessitent aucune modification du code au niveau utilisateur.

Si les membres de données sont définis uniquement dans la section privée d'une classe, l'auteur de la classe peut modifier les données à volonté. Si l'implémentation change, seul le code de la classe doit être examiné pour voir quel impact le changement entraîne. Si les données sont publiques, toute fonction qui accède directement aux membres de données de l'ancienne représentation peut être affectée.

Exemples d'abstraction de données

Dans un programme C++, toute classe avec des membres publics et privés peut servir d'instance d'abstraction de données. Voir l'exemple suivant :

Exemple

#include <iostream> using namespace std; class Adder{ public: // constructeur Adder(int i = 0) { total = i; } // Interface externe void addNum(int number) { total += number; } // Interface externe int getTotal() { return total; }; private: // Données masquées à l'extérieur 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 les résultats suivants :

Total 60

La classe ci-dessus additionne des nombres et renvoie la somme. Les membres publicsaddNumetgetTotalconstituent l'interface externe ; les utilisateurs doivent les connaître pour pouvoir utiliser la classe. Les membres privéstotalsont des choses que les utilisateurs n'ont pas besoin de connaître, mais qui sont nécessaires pour que la classe fonctionne correctement.

Stratégie de conception

L'abstraction sépare le code en interface et implémentation. Par conséquent, lors de la conception de composants, l'interface doit être maintenue indépendante de l'implémentation, de sorte que si l'implémentation sous-jacente change, l'interface reste inchangée.

Dans ce cas, quel que soit le programme qui utilise l'interface, l'interface ne sera pas affectée ; seule la dernière implémentation doit être recompilée.

autres extensions