Les fonctionnalités d’encapsulation de données de C ++ s’avèrent utiles lors de la lecture et de l’écriture d’enregistrements
Bruce Eckel
Bruce Eckel est consultant C ++ et propriétaire d’Eisys Consulting. Il écrit pour Micro Cornucopia depuis deux ans et demi. Cet article est adapté de son livre Using C ++ (Osborne / McGraw Hill, 1989). Bruce peut être contacté chez Eisys Consulting, 501 N. 36th St., Ste. 163, Seattle, WA 98103.
La plupart des systèmes de gestion de bases de données de micro-ordinateurs (SGBD) lisent et écrivent des enregistrements dans un format ‘ASCII séparé par des virgules’. C’est probablement un artefact du temps où Basic (qui utilise ce format) était la seule langue commune sur les micro-ordinateurs. Les fichiers ASCII séparés par des virgules sont utiles non seulement parce qu’ils permettent de déplacer les enregistrements d’un SGBD vers un autre, mais aussi parce qu’ils peuvent être manipulés en utilisant des langages de programmation.
Pendant que Basic lit et écrit automatiquement ces enregistrements, d’autres langues doivent être programmées pour le faire. En C ++, cette tâche fastidieuse peut être encapsulée dans plusieurs classes; L’utilisateur de la classe n’a pas besoin de s’inquiéter des détails Dans la première partie de cet article, deux classes sont créées: La première, champ de classe, lit un seul champ entre guillemets et séparés par des virgules et crée un objet à partir de ce champ. La seconde, la classe csascii, ouvre un fichier ASCII séparé par des virgules et lit les enregistrements (en tant que tableaux d’objets de terrain) un à la fois, jusqu’à la fin du fichier.Une application simple utilisant les classes pour rechercher un nom de famille dans un fichier de base de données est présenté.
Les fichiers de base de données doivent souvent être manipulés ou générés de manière organisée en tant que ‘rapport’. Il devient fastidieux et problématique d’écrire et de compiler du code pour chaque rapport différent puisque les non-programmeurs doivent souvent concevoir des rapports. Une solution courante à un problème comme celui-ci est la création d’un «langage de script» spécifiquement adapté à la tâche à accomplir. La deuxième partie de cet article est la création d’un langage simple qui génère les enregistrements (à la sortie standard) dans un fichier ASCII séparé par des virgules selon un script dans un fichier séparé.
Le programme s’appelle TAWK pour ‘tiny awk’, car le problème qu’il résout rappelle vaguement le langage de correspondance ‘awk’ trouvé sur Unix (des versions ont également été créées pour DOS). Il démontre l’un des problèmes les plus épineux en informatique: l’analyse et l’exécution d’un langage de programmation. Les fonctionnalités d’encapsulation de données de C ++ s’avèrent très utiles ici, et une technique de descente récursive est utilisée pour lire des champs et des enregistrements arbitrairement longs.
Le code a été développé et testé sur un système DOS. Il compile avec Zortech C ++ ou le traducteur Glockenspiel / Advantage utilisé avec Microsoft C. Les programmes devraient aussi fonctionner sur Unix, car tous les appels de bibliothèque sont ANSI C et la seule classe utilisée qui n’est pas définie ici est la classe streams (qui est incluse avec chaque paquet C ++). La programmation orientée objet signifie ‘envoyer des messages aux objets’. Dans les langues traditionnelles, les données sont déclarées et les fonctions agissent directement sur les données. Dans la programmation orientée objet, des objets sont créés, des messages sont envoyés aux objets, et les objets décident de ce qu’ils doivent faire avec le message (en d’autres termes, comment agir sur leurs données internes).
Un objet est une entité avec un état interne (données) et des opérations externes, appelées fonctions membres en C ++. ‘Envoyer un message’ signifie appeler l’une de ces fonctions membres.
Une raison importante pour organiser un programme en objets distincts est le concept d’encapsulation. Lorsque les données sont encapsulées dans un objet, elles sont cachées (privées) et ne peuvent être accessibles qu’au moyen d’une interface clairement définie. Seules les fonctions de membre de classe et les fonctions d’ami peuvent modifier des données privées. L’encapsulation des données peut clarifier le code en combinant les données dans un seul paquet avec des opérations juridiques spécifiques (fonctions membres). Lorsqu’un message est envoyé à un objet dans Smalltalk, l’objet décide toujours quoi faire du message (c’est-à-dire la fonction spécifique à appeler) au moment de l’exécution, coque iphone 6 simple donc l’adresse de la fonction n’est pas liée à l’appel de fonction jusqu’à l’appel Étant donné que la coque rigide iphone 6s plupart des compilateurs lient les appels de fonction lors de la compilation, la ipad air photo liaison d’exécution est souvent appelée liaison tardive.
C ++ effectue toujours la liaison au moment de la compilation, sauf si le programmeur demande au compilateur d’attendre l’exécution en utilisant le mot-clé virtual. Cette fonctionnalité permet aux sous-classes (toutes héritées de la même classe de base) d’avoir des appels de fonction identiques qui sont exécutés différemment. Une collection d’objets génériques (tous de la même classe de base) peut être conservée et tous les messages ‘légaux’ de la classe de base peuvent être envoyés à n’importe lequel des objets de cette collection. L’objet détermine ce qu’il faut faire avec le message en fonction de sa sous-classe spécifique. C’est la programmation orientée objet dans son vrai sens.
La plupart des problèmes peuvent bénéficier des fonctionnalités d’encapsulation de données de C ++. Il semble cependant que tous les problèmes n’exigent pas de fonctions virtuelles. Le projet présenté ici est l’un de ces cas. Pour un exemple d’utilisation de fonctions virtuelles, voir mon article ‘Building MicroCAD’ dans le numéro de novembre / décembre 1988 de Micro Cornucopia (également disponible dans le disque de bibliothèque de code source C ++ 1, disponible chez Eisys Consulting pour 15 $).
Lecture du code C ++
Si vous êtes un programmeur en C, voici une façon simple de penser à C ++ pendant que vous lisez le code de cet article: Les objets ressemblent à des structures, avec quelques cloches et sifflets Une cloche est que vous pouvez cacher certains membres de la structure Les membres sont automatiquement masqués (privés) à moins que vous n’indiquiez explicitement qu’ils sont publics Un sifflet est la possibilité d’inclure des fonctions en tant que membres de la structure Les membres d’une classe (un type défini par l’utilisateur) sont accédés comme vous avec un point (ou une flèche, si vous avez un pointeur sur un objet) Un dernier coup de sifflet est que le programmeur peut définir la façon dont les objets sont initialisés (en utilisant le constructeur) quand ils entrent dans la portée, et nettoyé (par en utilisant le destructeur) quand ils sortent du champ d’application.
L’exemple 1 montre une classe minuscule pour vous présenter les bases de la programmation C ++. Ceci est bien sur Unix, qui est sensible à la casse, mais provoque des problèmes en DOS..