Boolean vs. Enumeration

Booleans sind Datentypen die nur zwei Zustände besitzen. Wahr (true) oder falsch (false). Booleans haben durchaus eine Daseinsberechtigung, in vielen Fällen kann man sie jedoch durch Enumerations ersetzen. In den meisten Fällen wird der Code dadurch besser zu lesen und leichter zu erweitern.
Viele Programmiersprachen besitzen Enumerations oder ein ähnliches Konstrukt. In jeder Objektorientierten Sprache sollte es zudem kein großer Aufwand sein selbst eine derartige Klasse zu erstellen. Enumerations zu deutsch Aufzählungen werden von vielen Programmierern kaum oder gar nicht eingesetzt. Entweder weil der Gebrauch nicht bekannt ist, oder weil man sich die Mühe sparen möchte. Für ein Beispiel schauen wir uns zuerst einmal folgenden Code an:
public class Valve
{
  bool isOpen;

  void openValve(bool a){
    isOpen = a;
  }

  bool isVavleOpen(){
    return isOpen;
  }
}
Das Problem an diesem Code ist die irreführende Methode openValve(bool). Woher soll der Benutzer dieser Klasse wissen, dass er mit dieser Methode das Ventil auch wieder schließen kann? Natürlich könnte man eine Methode wie etwa setValvePosition(bool open) benutzen. Auch das ist jedoch eine große Fehlerquelle, da man hier leicht durcheinander kommen kann ob nun wahr oder falsch zum öffnen des Ventils benutzt wird. Das ganze verschlimmert sich, wenn man nur den Code vor sich liegen hat und auf keine interaktive Hilfe zurückgreifen kann.
Als Alternative könnte man zwei separate Methoden schreiben.
public class Valve
{
  bool isOpen;

  void openValve(){
    isOpen = true;
  }

  void closeValve(){
    isOpen = true;
  }

  bool isVavleOpen(){
    return isOpen;
  }

  bool isVavleClosed(){
    return !isOpen;
  }
}
Das ganze verbessert zwar das Verständnis für den Code, ob damit jedoch sauberer Programmiert wurde ist fraglich. Ein großes Problem, das durch viele Methoden verschlimmert wird ist die Erweiterbarkeit. Wurde die bestehende Anlage beispielsweise um ein 3-Wege-Ventil erweitert, so ist der gesamte Code unbrauchbar geworden. Wie gut das ganze mit Enumerations funktioniert zeigt folgendes Beispiel:
public enum ValvePosition{
  Position1,
  Position2,
  Closed
}

public class Valve
{
  ValvePosition valvePos;

  void setValvePosition(ValvePosition pos){
    valvePos = pos;
  }

  ValvePosition getValvePosition(){
    return valvePos;
  }
}
Bei dieser Vorgehensweise ist es kinderleicht eine zusätzliche Ventilposition hinzuzufügen.

Es gibt jedoch auch Szenarien in denen der Einsatz einer Enumeration von Nachteil ist. Soll ein Ventil beispielsweise beliebig weit geöffnet werden, also von 0%-100% so wäre es idiotisch eine Enumeration für jedes Prozent zu schreiben. Hier wäre ein Integer eindeutig die bessere Wahl.
Ein weiteres Beispiel liegt vor, sobald man den Boolean durch eine Vererbung entfernen kann.
public class Human{
  bool male;

  bool isMale(){
    return male;
  }
}
Hier ist es besser Vererbung zu benutzten und eine Klasse für Mann und eine für Frau zu entwerfen.
public class Human{
}

public class Male : Human{
}

public class Female : Human{
}
Bookmark and Share

0 Kommentare:

Kommentar veröffentlichen