c / expert
Snippet
Opaque-Handle-Muster zur strukturellen Datenkapselung
Das Opaque-Handle-Muster verbirgt die internen Elementdeklarationen eines Typs vor öffentlichen Header-Schnittstellen. Aufrufer interagieren ausschließlich über Fabrik- und Zugriffsfunktionen mit Zeiger-Handles, was eine vollständige Kapselung und stabile ABI-Grenzen in C gewährleistet.
snippet.c
c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <stdio.h>#include <stdlib.h>typedef struct WidgetImpl* WidgetHandle;struct WidgetImpl {int id;char name[32];};WidgetHandle widget_create(int id) {struct WidgetImpl* w = (struct WidgetImpl*)malloc(sizeof(struct WidgetImpl));if (!w) return NULL;w->id = id;snprintf(w->name, sizeof(w->name), "Widget-%d", id);return w;}void widget_process(WidgetHandle handle) {if (!handle) return;printf("Processing %s (ID: %d)\n", handle->name, handle->id);}void widget_destroy(WidgetHandle handle) {free(handle);}int main(void) {WidgetHandle w = widget_create(101);widget_process(w);widget_destroy(w);return 0;}
Erklärung
1
typedef struct WidgetImpl* WidgetHandle;
Deklariert ein Opaque-Zeiger-Handle, dessen konkretes Struktur-Layout für öffentliche Aufrufer verborgen ist.
2
struct WidgetImpl { int id; char name[32]; };
Definiert die interne Struktur-Implementierung innerhalb des Moduls.
3
WidgetHandle widget_create(int id)
Erstellt und initialisiert das gekapselte Objekt und gibt ein abstraktes Zeiger-Handle zurück.
4
void widget_destroy(WidgetHandle handle)
Gibt den Objektspeicher sicher über dedizierte Lebenszyklus-Rückgabefunktionen frei.