Lorsque je recherchais les avantages du C par rapport à C ++, je suis tombé sur ce paragraphe:
La méthode standard en C pour effectuer l'encapsulation est de déclarer en avant une structure et de n'autoriser l'accès à ses données que par le biais de fonctions. Cette méthode crée également une encapsulation au moment de la compilation. L'encapsulation en temps de compilation nous permet de changer les structures de données des membres sans recompilation du code client (autre code utilisant notre interface). En revanche, la méthode standard d'encapsulation C ++ (à l'aide de classes) nécessite la recompilation du code client lors de l'ajout ou de la suppression de variables de membre privé.
Je comprends comment la déclaration d'une structure et l'accès à ses membres via des fonctions masquent les détails d'implémentation de la structure. Ce que je ne comprends pas, c'est cette ligne spécifiquement:
L'encapsulation en temps de compilation nous permet de changer les structures de données des membres sans recompilation du code client (autre code utilisant notre interface).
Dans quel scénario est-ce applicable?
struct
est une boîte noire avec des composants internes inconnus. Si le client ne connaît pas les internes, il ne pourra jamais y accéder directement et vous pourrez les changer à volonté. Ceci est similaire à l'encapsulation dans la POO. Les internes sont privés et vous ne modifiez l'objet qu'en utilisant des méthodes publiques.Réponses:
Un scénario possible dans le monde réel où cela se produirait serait lorsqu'une bibliothèque de bases de données, écrite à l'époque où l'espace sur le disque dur était très limité, utilisait un seul octet pour stocker le champ 'année' d'une date (par exemple 11-NOV-1973 aurait
73
pour l'année). Mais, au moment de l'an 2000, cela ne serait plus suffisant, et l'année devait alors être stockée sous la forme d'un entier court (16 bits). L'en-tête pertinent (très simplifié) de cette bibliothèque pourrait être le suivant:Et un programme «client» serait:
L'implémentation «originale»:
Ensuite, à l'approche de Y2K, ce fichier d'implémentation serait modifié comme suit (tout le reste étant inchangé):
Lorsque le client doit être mis à jour pour utiliser la nouvelle version (Y2K-safe), aucun changement de code n'est requis. En fait, vous n'aurez peut- être même pas à recompiler: une simple reconnexion à la bibliothèque d'objets mise à jour (si c'est ce que c'est) pourrait être suffisante.
la source
Remarque: La liste suivante ne sera pas exhaustive. Les modifications sont les bienvenues!
Les scénarios applicables incluent:
La structure la plus connue de ce type est
FILE
. Vous venez d'appelerfopen()
et d'obtenir un pointeur en cas de succès. Ce pointeur est ensuite remis à l'autre fonction qui fonctionne sur les fichiers. Mais vous ne connaissez pas - et vous ne voulez pas savoir - les détails, comme les éléments contenus et la taille.la source