Als ich die Vorteile von C gegenüber C ++ untersuchte, stieß ich auf diesen Absatz:
Die Standardmethode in C zur Kapselung besteht darin, eine Struktur weiterzuleiten und den Zugriff auf ihre Daten nur über Funktionen zuzulassen. Diese Methode erstellt auch eine Kapselung zur Kompilierungszeit. Die Kapselung der Kompilierungszeit ermöglicht es uns, die Mitglieder der Datenstrukturen zu ändern, ohne den Clientcode neu zu kompilieren (anderer Code über unsere Schnittstelle). Die Standardmethode für die Kapselung von C ++ (unter Verwendung von Klassen) erfordert andererseits die Neukompilierung des Clientcodes beim Hinzufügen oder Entfernen von privaten Mitgliedsvariablen.
Ich verstehe, wie das Vorwärtsdeklarieren einer Struktur und der Zugriff auf ihre Mitglieder über Funktionen die Implementierungsdetails der Struktur verbirgt. Was ich nicht verstehe, ist diese Zeile speziell:
Die Kapselung der Kompilierungszeit ermöglicht es uns, die Mitglieder der Datenstrukturen zu ändern, ohne den Clientcode neu zu kompilieren (anderer Code über unsere Schnittstelle).
In welchem Szenario gilt dies?
struct
handelt es sich um eine Black Box mit unbekannten Interna. Wenn der Client die Interna nicht kennt, kann er niemals direkt darauf zugreifen und Sie können sie nach Belieben ändern. Dies ähnelt der Einkapselung in OOP. Die Interna sind privat und Sie ändern das Objekt nur mit öffentlichen Methoden.Antworten:
Ein mögliches reales Szenario, in dem dies auftreten würde, besteht darin, dass eine Datenbankbibliothek, die in den Tagen geschrieben wurde, als der Festplattenspeicher sehr begrenzt war, ein einzelnes Byte zum Speichern des Felds "Jahr" eines Datums verwendete (z. B. 11. November 1973) hätte
73
für das Jahr). Als das Jahr 2000 kam, würde dies jedoch nicht mehr ausreichen, und das Jahr musste dann als kurze (16-Bit) Ganzzahl gespeichert werden. Der relevante (stark vereinfachte) Header für diese Bibliothek könnte folgender sein:Und ein "Client" -Programm wäre:
Die "ursprüngliche" Implementierung:
Beim Ansatz von Y2K würde diese Implementierungsdatei dann wie folgt geändert (alles andere bleibt unberührt):
Wenn der Client aktualisiert werden muss, um die neue (Y2K-sichere) Version zu verwenden, sind keine Codeänderungen erforderlich. Möglicherweise müssen Sie nicht einmal neu kompilieren: Eine einfache erneute Verknüpfung mit der aktualisierten Objektbibliothek (sofern dies der Fall ist) kann ausreichen.
quelle
Hinweis: Die folgende Liste erhebt keinen Anspruch auf Vollständigkeit. Änderungen sind willkommen!
Die anwendbaren Szenarien umfassen:
Die bekannteste Struktur dieser Art ist
FILE
. Sie rufen einfach anfopen()
und erhalten einen Zeiger, wenn Sie erfolgreich sind. Dieser Zeiger wird dann an die andere Funktion übergeben, die an Dateien arbeitet. Aber Sie kennen die Details wie die enthaltenen Elemente und die Größe nicht - und Sie möchten es auch nicht wissen.quelle