Information Hiding, typedef struct * und sizeof

21/03/2009 - 20:14 von Matthias Brischwein | Report spam
Hash: SHA1

Hallo Community,

als C-Neuling möchte ich mir von Anfang an einen sauberen, modularen
Programmierstil angewöhnen und bei Recherchen nach Best Practices bin
ich auf diverse Veteranen gestoßen, welche das Information Hiding auch
für C-Strukturen propagieren. Konkret:


modul.h
...

// eigentliche Deklaration in modul.c; Schnittstelle verwendet
// ausschließlich Stellvertretertyp
typedef struct abstrakterDatentyp * Stellvertretertyp;

...
Stellvertretertyp getStellvertreter();
void tueWasMitStellvertreter (Stellvertretertyp param);


Prinzipiell ist das ja sehr elegant, der Typ wird gekapselt und eine
Referenz hole ich mir immer über eine Art Konstruktor
(getStellvertretertyp). Was mach ich aber, wenn ich dynamisch Speicher
für diesen Typ (bzw. ein Vielfaches davon) allokieren will?


Stellvertretertyp var Stellvertretertyp)malloc(sizeof(Stellvertretertyp);


allokiert mir an dieser Stelle nur Speicher von der Lànge des Zeigers.
Eine Allokation der Form


Stellvertretertyp var = (Stellvertretertyp)malloc(sizeof(struct
abstrakterDatentyp);


geht zwar, an dieser Stelle verlangt das Konzept von mir aber doch, dass
ich mir über die Interna der Struktur bewusst bin womit mit dem
Information Hiding in gewisser Weise doch gebrochen wird, oder? (also
ich meine den Cast nach Stellvertretertyp einerseits, aber sizeof auf
den konkreten Typ andererseits)

Konkret frage ich mich halt auch, ob die letzte Zeile Code nun guter
Stil ist oder vielleicht doch nicht, und ob die genannten Veteranen
diesen Fall vielleicht großherzig übersehen haben (Nicht, dass ich an
deren Kompetenz zweifle ;-) )? Wie wird das in der Praxis gemacht? Wird
von solchen Konstrukten tatsàchlich Gebrauch gemacht, oder erntet man
nur Kopfschütteln ob der verwirrenden Syntax?

Referenzen:
HAYES, John (2001): Modular Programming in C.
www.embedded.com/story/OEG20011129S0051, Stand 30.11.2001.

VAN STEENHOVEN, Pippijn (2008): Information Hiding.
http://xinutec.org/~pippijn/en/programming_data-hiding.xhtml, Stand
08.11.2008

Vielen Dank und viele Grüße,

Matthias Brischwein
Student Informatik

Bin kreativ bin Architekt,
doch bleiben meine Schlösser unentdeckt!
Ich bau' auf einem Fundament,
das man die Geisteswissenschaften nennt!
 

Lesen sie die antworten

#1 Thomas Koller
21/03/2009 - 20:55 | Warnen spam
Matthias Brischwein wrote:
modul.h
...

// eigentliche Deklaration in modul.c; Schnittstelle verwendet
// ausschließlich Stellvertretertyp
typedef struct abstrakterDatentyp * Stellvertretertyp;

...
Stellvertretertyp getStellvertreter();
void tueWasMitStellvertreter (Stellvertretertyp param);


Prinzipiell ist das ja sehr elegant, der Typ wird gekapselt und eine
Referenz hole ich mir immer über eine Art Konstruktor



Was macht denn dein "getStellvertreter()" genau?

(getStellvertretertyp). Was mach ich aber, wenn ich dynamisch Speicher
für diesen Typ (bzw. ein Vielfaches davon) allokieren will?



Du könntest dir so eine Art Konstruktor schreiben. ;-)

Stellvertretertyp mallocStellvertreter() {
return malloc(sizeof(struct abstrakterDatentyp));
}

Oder mit einem Parameter, wenn du ein Vielfaches brauchst.
Wobei du aber bei Arrays aufpassen musst, wenn du den Datentyp nicht
bekannt machst kannst du natürlich auch wieder nur das gesamte
Array übergeben und nicht einzelne Elemente, es macht also wohl nur
selten Sinn gleich ein Vielfaches zu erzeugen.

geht zwar, an dieser Stelle verlangt das Konzept von mir aber doch, dass
ich mir über die Interna der Struktur bewusst bin womit mit dem
Information Hiding in gewisser Weise doch gebrochen wird, oder? (also
ich meine den Cast nach Stellvertretertyp einerseits, aber sizeof auf
den konkreten Typ andererseits)



Richtig.

Konkret frage ich mich halt auch, ob die letzte Zeile Code nun guter
Stil ist oder vielleicht doch nicht, und ob die genannten Veteranen
diesen Fall vielleicht großherzig übersehen haben (Nicht, dass ich an
deren Kompetenz zweifle ;-) )? Wie wird das in der Praxis gemacht? Wird
von solchen Konstrukten tatsàchlich Gebrauch gemacht, oder erntet man
nur Kopfschütteln ob der verwirrenden Syntax?



Ja, sowas wird durchaus in der Praxis verwendet. Nein, dieser Fall
wurde nicht großherzig übersehen. Du brauchst dir nur mal FILE aus
der C-Standardbibliothek als Beispiel ansehen.

Tom

Ähnliche fragen