Abstraction des données C++
L'abstraction des données consiste à fournir uniquement des informations clés au monde extérieur et à masquer les détails de mise en œuvre en arrière-plan, c'est-à-dire à afficher uniquement les informations nécessaires sans présenter de détails.
L'abstraction des données est une technique de programmation (conception) qui repose sur la séparation de l'interface et de la mise en œuvre.
Prenons un exemple concret, comme un téléviseur, vous pouvez l'allumer et l'éteindre, changer de chaîne, régler le volume, ajouter des composants externes (comme des haut-parleurs, un magnétoscope, un lecteur DVD), mais vous ne le faites pas connaissez ses détails de mise en œuvre interne, c'est-à-dire que vous ne savez pas comment il reçoit le signal via le câble, convertit le signal et finalement l'affiche à l'écran.
On peut donc dire que le téléviseur sépare sa mise en œuvre interne et son interface externe. Vous n'avez pas besoin de connaître son principe de mise en œuvre interne, et pouvez directement utiliser son interface externe (telle que le bouton d'alimentation, la télécommande, le volume). contrôleur ) pour contrôler le téléviseur.
Maintenant, passons aux choses sérieuses. En ce qui concerne la programmation C++, les classes C++ offrent la possibilité de abstraction des données. Ils fournissent un grand nombre de méthodes publiques pour manipuler les données des objets au monde extérieur, c'est-à-dire que le monde extérieur ne connaît pas réellement l'implémentation interne de la classe.
Par exemple, votre programme peut appeler la fonction sort() sans connaître l'algorithme utilisé pour trier les données dans la fonction. En fait, l'implémentation sous-jacente du tri des fonctions variera en fonction de la version de la bibliothèque. Tant que l'interface reste inchangée, les appels de fonction fonctionneront comme d'habitude.
En C++, nous utilisons des classes pour définir nos propres types de données abstraits (ADT). Vous pouvez utiliser l'objet cout de la classe ostream pour afficher des données sur la sortie standard comme suit :
#include <iostream> using namespace std; int main( ) { cout << "Hello C++" <<endl; return 0; }
Ici, vous n'avez pas besoin de comprendre cout est la manière dont le texte est affiché sur l'écran de l'utilisateur. Il vous suffit de connaître l'interface publique, l'implémentation sous-jacente de cout peut être modifiée librement.
Les balises d'accès forcent l'abstraction
En C++, nous utilisons des balises d'accès pour définir l'interface abstraite d'une classe. Une classe peut contenir zéro ou plusieurs balises d'accès :
Les membres définis avec des balises publiques ont accès à toutes les parties du programme. La vue abstraite des données d'un type est définie par ses membres publics.
Les membres définis à l'aide de balises privées ne sont pas accessibles à partir du code utilisant la classe. La partie privée masque les détails d'implémentation du code qui utilise le type.
Il n'y a aucune limite sur la fréquence des balises d'accès. Chaque balise d'accès spécifie le niveau d'accès de la définition de membre qui la suit. Le niveau d'accès spécifié reste en vigueur jusqu'à ce que la prochaine balise d'accès soit rencontrée ou que le crochet fermant fermant du corps de la classe soit rencontré.
Avantages de l'abstraction des données
L'abstraction des données présente deux avantages importants :
Les éléments internes de la classe sont protégés contre les erreurs accidentelles au niveau de l'utilisateur qui provoquent un objet État à corrompre.
Les implémentations de classes peuvent changer au fil du temps en réponse à des exigences changeantes ou en réponse à des rapports de bogues qui ne nécessitent aucune modification du code au niveau de l'utilisateur.
Si les données membres ne sont définies que dans la partie privée d'une classe, l'auteur de la classe peut modifier les données à volonté. Si l'implémentation change, il vous suffit de vérifier le code de la classe pour voir quel impact ce changement aura. Si les données sont publiques, toute fonction qui accède directement à une donnée membre de l'ancienne représentation peut être affectée.
Instances d'abstraction de données
Dans un programme C++, toute classe avec des membres publics et privés peut être utilisée comme instance d'abstraction de données. Jetez un œil à l'exemple suivant :
#include <iostream> using namespace std; class Adder{ public: // 构造函数 Adder(int i = 0) { total = i; } // 对外的接口 void addNum(int number) { total += number; } // 对外的接口 int getTotal() { return total; }; private: // 对外隐藏的数据 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 ajoute des nombres et renvoie la somme. Les membres publics addNum et getTotal sont des interfaces externes et les utilisateurs doivent les connaître pour pouvoir utiliser la classe. Le membre privé total est quelque chose que l'utilisateur n'a pas besoin de connaître, mais est requis pour que la classe fonctionne correctement.
Stratégie de conception
L'abstraction sépare le code en interfaces et implémentations. Ainsi, lors de la conception de composants, vous devez conserver l'interface indépendante de l'implémentation, de sorte que si l'implémentation sous-jacente est modifiée, l'interface reste inchangée.
Dans ce cas, quel que soit le programme qui utilise l'interface, celle-ci ne sera pas affectée et seule la dernière implémentation doit être recompilée.