Loop-switch sekvens - Loop-switch sequence
En loop-switch-sekvens (også kendt som for-case-paradigmet eller Anti- Duff's Device ) er en programmerings- antipattern, hvor et klart sæt trin implementeres som en switch-in-a-loop. Loop-switch-sekvensen er et specifikt derivat af spaghettikode .
Det er ikke nødvendigvis en antipattern at bruge en switch-sætning i en løkke - det betragtes kun som ukorrekt, når det bruges til at modellere en kendt trinsekvens. Det mest almindelige eksempel på korrekt anvendelse af en switch inden i en løkke er en inversion af kontrol, såsom en begivenhedshåndterer. I begivenhedshåndteringssløjfer er begivenhedssekvensen ikke kendt på kompileringstidspunktet, så den gentagne switch er både nødvendig og korrekt (se begivenhedsdrevet programmering , begivenhedsløkke og begivenhedsdrevet sluttilstand maskine ).
Dette er ikke en antipattern ydeevne, skønt det kan føre til en inconsequent præstationsstraf på grund af manglen på en ikke- rullet sløjfe . Det er snarere en klarhed mod antipattern, da det i ethvert ikke-trivielt eksempel er meget vanskeligere at dechiffrere kodens intention og faktiske funktion end den mere ligetil refactorerede løsning.
Eksempel
En begivenhedsstyret løsning ville implementere en lyttergrænseflade :
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);
}
}
Men uden lytteren bliver det et eksempel på antipattern:
// 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;
}
}
Og her er den refactored løsning:
// 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());
}
Referencer
- ^ "Loop-switch sekvenser" . NIVEAU OPKODE . Hentet 11. april 2016 .
- ^ FOR-CASE-paradigmet og tændte sløjfer på The Daily WTF