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…