[linux-l] Function Pointer in C (was: java Klotz am Bein ?)
Rocco Rutte
pdmef at cs.tu-berlin.de
Mi Mai 18 22:00:19 CEST 2005
Hi,
* Axel Weiß [05-05-18 21:21:18 +0200] wrote:
[...]
>wie machst Das das in C eleganter?
struct foo {
char* key;
int (*handle) (char* key, list_t* args, unsigned long data);
unsigned long data;
};
Damit braucht man nur noch:
struct foo Foo[] = {
{ "foo", handle1, 0 },
{ "bar", handle2, 0 },
{ NULL, NULL, 0 }
};
Und braucht quasi nur noch:
int config_exec (list_t* l) {
int i = 0;
while (Foo[i].key) {
if (safe_strcmp (Foo[i], l->data[0]) == 0 && Foo[i].handle)
return (Foo[i].handle (l->data[0], l, Foo[i].data));
i++;
}
return (0);
}
int config_parse (const char* line) {
list_t* l = list_from_str (line, " \t");
int rc = config_exec (l);
list_del (&l, _free);
return (rc);
}
Vorurteilsfrei: das einzige, was ich in Java in dieser Richtung gesehen
habe sind lange Orgien, wo mittels TokenizerIrgendwas ein String in
String[] aufgespalten wurde und dann sowas wie:
if (t.getFirst.equals ("foo"))
// behandle keyword "foo"
else if (t.getFirst.equals ("bar"))
// behandle keyword "bar"
...
Der Vorteil an Callback ist IMHO, dass man nicht alles direkt in den
Code frickeln muss, weil es dort nicht hingehört, und wenn es nur ein
Aufruf pro Keyword ist. Man könnte ja auch auf die Idee kommen, solche
Keywords von außen dynamisch hinzufügen zu wollen oder eine Liste mit
allen Keywords haben zu wollen...
Auch wenn man da wild mit Pointern durch die Gegend schiesst, was
manchmal gefährlich sein kann, erreicht man dadurch sauberes Information
Hiding auch locker in C und man spart es sich, sehr viel Zeug immer
direkt in den Code zu schreiben sondern packt es ordentlich in Methoden.
Für ein Projekt habe ich zum Beispiel:
void* hash_new (int size);
...
void hash_map (void*, int (*mapfunc) (const char*, void*, unsigned long), unsigned long);
Es muss außer der Implementierung niemand wissen, wie ich die Tabelle
organisiere bzw. ob es überhaupt eine Tabelle ist, ein Baum, was auch
immer. Der Aufrufer bekommt bei der map-Funktion (ähnlich funktionalen
Sprachen) nur den aktuellen Schlüssel, die dazugehörigen Daten und
wahlweise extra Informationen. Da kann man sauber Funktionalität wie
"nur bestimmte Schlüssel zurückgeben" aus der Tabelle raushalten.
Auch wenn da schrecklich viele Klammern, Sternchen und & drin vorkommen
werden, so habe ich als derjenige, der nur das schlanke Interface kennt,
quasi alle Möglichkeiten über den Callback.
Ich tendiere eher dazu, die generischsten EierLegendenWollmichSauen
haben zu wollen, quasi supereinfachübersichtlich und trotzdem sehr
mächtig. Das geht mit solchen Konstrukten IMHO ganz gut auch wenn die
Gefahr besteht, dass man den Überblick verliert.
Ich will damit nicht sagen, dass ich Java per se nicht mag und C ja
sowieso ganz toll ist, die Frage nach dem Wie war ernst gemeint.
bye, Rocco
--
:wq!
Mehr Informationen über die Mailingliste linux-l