Globale Variablen in Bibliotheken - Vorteil oder Fehldesign?



  • Hallo,

    ich habe jetzt schon öfters Bibliotheken gesehen, die viel mit globalen Variablen arbeiten, z. B. die Python-C-API.

    Ich persönlich achte immer darauf, besonders in Bibliotheken keine globalen Variablen zu benutzen, am Ende gibts noch Schwierigkeiten, weil der Bibliotheken-Nutzer versucht, eine Variable mit demselben Name zu deklarieren wie die globale Variable (das wär zwar schon ein sehr großer Zufall, könnte es aber geben).

    Was haltet ihr davon?

    Ich finde, das ganze ist eindeutig ein Fehldesign.

    Übrigens meine ich auch globale Char-Pointer, die sehr oft für Fehlermeldungen benutzt werden ("..._GetLastError();"), ihr wisst schon, was ich meine.



  • E-Bibliothekar schrieb:

    ... eine Variable mit demselben Name zu deklarieren wie die globale Variable (das wär zwar schon ein sehr großer Zufall, könnte es aber geben)...

    oder eine klasse oder funktion mit einem schon benutzen namen.

    lieber gleich ordentlich -> namespaces benutzen. im namespace kann vom mir aus jeder globale funktionen, variablen usw. haben solange alles funzt.



  • E-Bibliothekar schrieb:

    Was haltet ihr davon?

    Kommt auf den Fall an. Variablen mit statischer Lebenszeit sind nicht immer schlecht. Aber oft. 🙂



  • ich rede von C. Nix mit namespaces.

    Die Python-API für C benutzt globale Variablen.



  • Benutzt die auch globale Funktionen? 😮



  • cooky451 schrieb:

    Benutzt die auch globale Funktionen? 😮

    Ja, muss so sein.

    als die api wird mittels Py_Initialize(); gestartet, da keine Parameter oder ähnliches verlang werden, bzw. die funktion kein "python-parser-struct" oder so zurückgibt, nehme ich an, dass dieses "python-parser-struct" global ist.



  • Ich halte genau gar nix von globalen Variablen in Libraries. Bzw. allgemein gloablen State - wie auch immer auf diesen zugegriffen wird.

    Wenn man meint "globalen" State in eine Library zu brauchen, dann braucht man in Wirklichkeit ein "Kontext"-Objekt.
    Darf auch gerne "Library" oder sonstwie heissen.

    Wie sowas aussehen kann, kann man sich z.B. bei Direct3D9 abgucken.

    Grund:

    Globale Variablen machen es verdammt schwer/lästig/fehleranfällig eine Library in grösseren Projekten zu verwenden, wo mehrere Programmteile auf die Idee kommen könnten die selbe Library verwenden zu wollen.
    Die kommen sich dann nämlich schnell in die Quere.
    Der eine will Option X über Config-Variable Y ausschalten, der andere will sie einschalten => Boom.
    Und wenn Threads dazukommen wird alles noch viel lustiger.

    E-Bibliothekar schrieb:

    Ich finde, das ganze ist eindeutig ein Fehldesign.

    Ja, sehe ich genau so!

    Und "C" ist da auch keine Entschuldigung. Gibt ja auch genug Libraries die vormachen wie man das auch in C halbwegs schön und ohne all zu viel Overhead machen kann.

    ps: Statt Namespaces kann man in C ja Prefixe verwenden. Wer das nicht macht gehört IMO auch gedroschen.

    C-Libraries die keine Prefixe für Bezeichner (inklusive Makros!) verwenden finde ich auch grässlich.


Anmelden zum Antworten