Virtuelle Konstruktoren in C++

Wir kennen das Konzept der Polymorphie, die die dynamische Bindung (Dynamic Binding) auf Klassen-Funktionen ermöglicht. Der Vorteil der dynamischen Bindung ist die schwächere Kopplung zu Objekttypen. Wir müssen keine Typunterscheidung vornehmen, wenn wir eine Objektfunktion aufrufen, und dadurch ist unser Programm wartungsfreundlicher und erweiterbar.

In C++ erreichen wir das durch virtuelle Funktionen. Aber können wir dieses Konzept auch auf die Erstellung von Objekt-Typen anwenden? Also das unser Programm nicht schon beim Kompilieren wissen muss, welcher Typ zu erzeugen ist?

// konkreter Typ nicht bekannt, 
// wir kennen nur den Basis-Typ:
Base *obj = new Unbekannt();

Weiterlesen

Java – Achtung Falle: Boolean parsen

Heute musste ich aus einem XML-File eine Boolean-Konfiguration laden. Das habe ich nicht das erst mal gemacht, aber es ist auch nichts, was ich täglich mache:

Element node = element.getChild("Editor");
String str = node.getAttributeValue("Overwrite"); 
// str hat "true"
m_settings = new EditorSettings(Boolean.getBoolean(str));

Bitte einfach mal den Code auf sich wirken lassen… Weiterlesen

Library und Framework, was ist der Unterschied?

Frage ich viele erfahrene Java-Kollegen (teilweise Projektleiter!) „was denn der Unterschied zwischen einer Library und Framework sei?“, erhalte ich meistens die falsche Antwort: „Es ist eine Sammlung von Bibliotheken die ein bestimmtes Thema umfassen.“.

Weiterlesen

Bessere Schnittstellen

Letztens hatte ich in einer Klasse eine Methode überschrieben, um zu verhindern, das ein bestimmter Wert unterschritten wird.

public class FontPreviewPanel extends JPanel {
 ...
  @Override
  public void setSize(Dimension d)
  {
    if (d.width <= 0)
      d.width = 1;
    if (d.height <= 0)
      d.height = 1;
    super.setSize(d);
  }
}

Die Maßnahme zeigte auch seine gewollte Wirkung. Doch dann fiel mir noch ein, dass die Super-Klassen ein weiteres setSize besitzen:

public void setSize(int width, int height);

Muss ich mir da jetzt Sorgen machen? Weiterlesen

Objekte anstatt Null-Referenzen

Können Sie sich noch an den Milliarden-Dollar-Fehler von Tony Hoare erinnern?

Jedenfalls bringt die Null-Referenz (in C++ der Null-Zeiger) viele Programmierer zur Verzweiflung. Denn man tappt immer wieder in die Falle, das eine Referenz Null sein kann. Wenn man diese nicht vor der Benutzung prüft, gibt es einen Absturz. Und dieser Fehler führte weltweit seit seiner Erfindung zusammen gerechnet wohl zu eine Milliarde-Dollar Kosten.

Sie erleben den Fehler und umgehen diesen deshalb so oder ähnlich:

void bar(Type r) {
   if(r != null)
      r.foo();
}
TypeList r = search();
if(r != null)
   r.foo();

Die if-Abfragen sind doch unnötiger Ballast und haben nichts mit der eigentlich zu lösenden Aufgabe (Algorithmus) zu tun. Diese if-Abfragen machen nur deutlich, dass die API oder Programmiersprache anscheinend nicht vertrauenswürdig genug ist. Überall sind diese „Stützräder“ und machen den Code unleserlicher und lenken vom eigentlichen Code ab. Weiterlesen