Objektorientierte programmierung…

Erstmal ein kleiner aufwärmer, der achtzig prozent der leser zum schließen des brausertabs bringt — die restlichen zwanzig prozent können sich ja fragen, was daran falsch ist:

class ID
{
  private:
  static unsigned int nextId = 1;
  unsigned int myId;

  public:
  ID () : myId(nextId++) { }
  unsigned int getID () { return myId; }
};

Ich bin leider auf dem sprung und kann deshalb nicht mal eben schnell einen anreißer dieses „kleinen“ englischen textchens mit dem titel „objektorientierte programmierung ist eine teure katastrofe, die aufhören muss“ ins deutsche übertragen.

Anmerkung: das eingangs zitierte kwelltext-schnippselchen habe ich vor ein paar jahren mal wirklich in einer sehr ähnlichen form (in einem namespace und mit etwas mehr kram) gesehen. Seitdem bin ich der meinung, dass „multithreading“ eine erfindung des teufels sein muss. Die durch das handliche postinkrement so harmlos aussehende anweisung nextId++ ist nicht zwangsläufig eine einzelne CPU-instrukzjon, sondern kann (und in diesem kontext: wird fast überall) bedeuten, dass für den folgenden schreibvorgang ein wert aus dem RAM in ein register eingelesen, dann im register inkrementiert, dann als instanzvariable ins RAM geschrieben und wieder ins RAM zurückgeschrieben wird, und zwischendurch kann ein anderer thread seine scheibe rechenzeit bekommen und nochmal die gleiche ID generieren. Und wenn man dann ahnand dieser IDs objekte identifiziert: viel spaß mit dem debugger, um so einen (natürlich sehr tief im ganzen kram versteckten) scheißfehler zu finden! Und ja, ich weiß natürlich, dass mitmensch java-progger da einfach synchronized in seine funkzjonsdefinizjon reinschreibt und sich dabei für so überlegen hält, dass er gar nicht mehr merkt, wie sein gehäcksel schleicht und resorßen wegmümmelt, aber das war halt postinkrementiertes C…

7 Antworten zu “Objektorientierte programmierung…

  1. Lustiger Code.
    Wozu überhaupt nextId? Die sieht man doch ohnehin nicht.

    Was ist das denn für ne Sprache? Der Konstruktor sieht für mich recht merkwürdig aus.

    • Axo. Also ich finde OOP schon gut bis sehr gut. Mit der zugewiesenen Eigenschaft „teure Katastrophe“ kann ich nichts anfangen. Was soll das bedeuten?

    • Die sprache ist C++, und ja, C++ hat auch für meine augen eine kaputte syntax. Ich würde angesichts der krankheiten mit templates und den vielen, kontextabhängigen bedeutungen von schlüsselwörtern wie static am liebsten schreiben: eine fraktal kaputte syntax — das, was an der C++-syntax brauchbar ist, hats von C geerbt. (Und die möglichkeit zum direkten herumhantieren mit adressen von objekten und funkzjonen ebenfalls, aber das ist ein ganz anderes tema. Wer als neuling erstmals eine „ganz normale“ C-funkzjondeklarazjon void (*)(const char *) setcb (void (*newcb) (const char *)) zu dechiffrieren versucht, weiß, was an der C-syntax weniger gelungen ist… und ja, so etwas ist aus dem „wirklichen leben„.)

      Dieses nextId ist eine private klassenvariable, die hier dazu benutzt wird, fortlaufende ints als IDs für instanzen zu machen. So ein ding, natürlich „ein bisschen“ komplizierter, mit sehr viel mehr schnittstelle und mit persistenter speicherung der klassenvariable, wurde in einem relativ großen projekt „überall“ reinvererbt, und wenn dann in unregelmäßigen abständen der besagte fehler auftritt, kann man sich totsuchen. Ein schneller workaround war übrigens die benutzung des präinkrements, so dass die inkrement-operation zumindest auf mit dem verwendeten kompeiler für x86 atomar wurde. Diese flickerei war so ähnlich, wie dumme teenager an sex herangehen: schnell, einfach und gefährlich… aber hej, das wird ja hoffentlich nie mit einem anderen kompeiler oder gar auf eine andere CPU… weia! Aber wer wird denn gleich zu semaphoren grefen… 😦

      Wohl dem, der daten in einem RDBMS hält und IDs wie etwa primärschlüssel automatisiert vergeben kann (zum beispiel mit einem trigger oder dem nicht-standardmäßigen AUTO INCREMENT).

      Ich will gar nicht daran denken, wie viele derartiger probleme irgendwo in softwäjhr herumlungern können und zu rätselhaften, nicht richtig in den griff zu bekommenden, sporadisch auftretenden fehlfunkzjonen führen. Dass softwäjhr im laufe meiner lebenszeit besser geworden ist, kann ich jedenfalls nicht beobachten. Fetter ist sie geworden, die ganze softwäjhr, und oft so viel weniger performant, dass die technischen fortschritte der CPU-entwicklung in den letzten zwanzig jahren beinahe davon „aufgegessen“ wurden. Die wartezeiten bei der kompjuternutzung sind bemerkenswert konstant geblieben. Leider gilt das nicht nur für die beliebten kommerzjellen systeme.

      • Ah axo, verstehe.
        Dann würd ich aber eher nextId mit 0 Anfangen und „myId(++nextId)“ machen. Nur ist dann die Variablenbezeichnung irreführend und newId wohl besser geeignet.

        Ne andere Möglichkeit, die mir grad durch den Kopf geht.
        Die ID von außen setzen. Z.B.Objekte in einem Array. idArr.push(new ID(idArr.length+1)); Und dann im Konstruktor nur die Id setzen. Wenn man ne Datenbank die IDs vergeben lässt kommt sie auch von außen.
        Mit ArrayCollections kann man die Objekte auch gut verwalten etc.

        • Axo. Ob bei der Sache mit den Arrays auch „Semaphoren“ nötig wären kann ich jetzt nicht sagen, wären imo aber auch hier und generell ne gute Idee. Z.B. nen einfacher lock auf das Array, vielleicht wegen der Reihenfolge, je nach Sprachfeatures. Das hier sieht für mich, im Bereich C++ ganz nett aus. Aber so weit bin ich da gar nicht (mehr) drin. 😉

      • Ich habe schon sehr lange nicht mehr in C++ Code weder gearbeitet noch intensiver rein geschaut. Vermutlich kommt es mir auch deshalb so fremd vor. Diese Schreibweise des Konstruktors hab ich z.B. noch nie gesehen *G*. Ich hab dann aber auch eher C# genommen – gefällt mir besser als C++ 😉

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden /  Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden /  Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden /  Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden /  Ändern )

Verbinde mit %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.