Loop-Switch-Sequenz - Loop-switch sequence
Eine Loop-Switch-Sequenz (auch als For-Case-Paradigma oder Anti- Duff-Gerät bekannt ) ist ein Programmier- Antimuster, bei dem ein klarer Satz von Schritten als Switch-in-Loop implementiert wird. Die Loop-Switch-Sequenz ist eine spezifische Ableitung des Spaghetti-Codes .
Es ist nicht unbedingt ein Antimuster , eine switch-Anweisung innerhalb einer Schleife zu verwenden. Sie wird nur dann als falsch angesehen, wenn sie zum Modellieren einer bekannten Abfolge von Schritten verwendet wird. Das häufigste Beispiel für die korrekte Verwendung eines Schalters innerhalb einer Schleife ist eine Umkehrung der Steuerung, z. B. eines Ereignishandlers. In Event-Handler-Schleifen ist die Reihenfolge der Ereignisse zur Kompilierungszeit nicht bekannt, daher ist der wiederholte Wechsel sowohl notwendig als auch korrekt (siehe ereignisgesteuerte Programmierung , Ereignisschleife und ereignisgesteuerte Finite-State-Maschine ).
Dies ist kein Leistungs-Antimuster, obwohl es aufgrund des Fehlens einer nicht gerollten Schleife zu einer unwichtigen Leistungseinbuße führen kann . Es handelt sich vielmehr um ein klares Antimuster, da es in jedem nicht trivialen Beispiel viel schwieriger ist, die Absicht und die tatsächliche Funktion des Codes zu entschlüsseln, als die einfachere überarbeitete Lösung.
Beispiel
Eine ereignisgesteuerte Lösung würde eine Listener-Schnittstelle implementieren :
String key = null;
String value = null;
List<String> params = null;
int column = 0;
public void addToken(token) {
// parse a key, a value, then three parameters
switch (column) {
case 0:
params = new LinkedList<String>();
key = token;
break;
case 1:
value = token;
break;
default:
params.add(token);
break;
}
if (++column >= 5) {
column = 0;
completeRow(key, value, params);
}
}
Aber ohne den Hörer wird es ein Beispiel für das Antimuster:
// parse a key, a value, then three parameters
String key = null;
String value = null;
List<String> params = new LinkedList<String>();
for (int i = 0; i < 5; i++) {
switch (i) {
case 0:
key = stream.parse();
break;
case 1:
value = stream.parse();
break;
default:
params.add(stream.parse());
break;
}
}
Und hier ist die überarbeitete Lösung:
// parse a key and value
String key = stream.parse();
String value = stream.parse();
// parse 3 parameters
List<String> params = new LinkedList<String>();
for (int i = 0; i < 3; i++) {
params.add(stream.parse());
}
Verweise
- ^ "Loop-Switch-Sequenzen" . LEVEL UP CODE . Abgerufen am 11. April 2016 .
- ^ Das FOR-CASE-Paradigma und die eingeschalteten Schleifen bei The Daily WTF