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

  1. ^ "Loop-switch sekvenser" . NIVEAU OPKODE . Hentet 11. april 2016 .
  2. ^ FOR-CASE-paradigmet og tændte sløjfer The Daily WTF