Ugrás a tartalomhoz

Loop-switch szekvencia

A Wikipédiából, a szabad enciklopédiából
A lap korábbi változatát látod, amilyen TurkászBot (vitalap | szerkesztései) 2019. június 2., 15:57-kor történt szerkesztése után volt. Ez a változat jelentősen eltérhet az aktuális változattól. (CheckWiki error (22) javítása; kategória szóközökkel)

A loop-switch szekvencia,[1] avagy for-case paradigma[2] egy programozási antiminta, ahol egy lépéssorozatot egy ciklus belsejében elhelyezett switch valósít meg, mintha nem lenne ismert az egyes lépések sorrendje. A spagetti kód speciális esete.

Ha egy ciklusban switch van, az még nem biztos, hogy antiminta. Csak akkor tekinthető annak, ha a lépések sorrendje ismert. A korrekt megvalósításra példa a kontroll megfordítása, és egy eseménykezelő működtetése. Az eseménykezelő ciklusokban a lépések sorrendje ismeretlen fordítási időben, mivel azokat a felhasználó választja ki. Emiatt a switch valóban szükséges. Lásd: eseményvezérelt programozás, eseménykezelő ciklus, és eseményvezérelt véges állapotú gép.

A kigöngyölített ciklus hiánya okozhat gyengébb performanciát, habár ez nem mindig érződik. Mégsem a performancia gyengítése, hanem a rosszabb olvashatóság a minta legfontosabb következménye. Minden nem triviális példában nehezebb megérteni a programrészletet, annak célját és működését, mint egy szekvenciát tartalmazó ciklust.

Példa

A következő példa egy megfigyelő interfészt valósít meg:

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);
    }
}

Az eseménykezelő nélkül ez antiminta:

// 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;
    }
}

A refraktorált megoldás:

// 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 = 2; i < 5; i++) {
    // in practice, that might be written as (i = 0; i < 3; i++),
    // but for illustration we use the same range of indices here
    // as in the switch above; the fact that the loop body does
    // not actually use the value of i proves that the
    // loop-and-switch construct was superfluous in the example above.
    params.add(stream.parse());
}

Jegyzetek

  1. Loop-switch sequences. LEVEL UP CODE. (Hozzáférés: 2016. április 11.)
  2. The FOR-CASE paradigm and Switched on Loops at The Daily WTF

Fordítás

Ez a szócikk részben vagy egészben a Loop-switch sequence című angol Wikipédia-szócikk fordításán alapul. Az eredeti cikk szerkesztőit annak laptörténete sorolja fel. Ez a jelzés csupán a megfogalmazás eredetét és a szerzői jogokat jelzi, nem szolgál a cikkben szereplő információk forrásmegjelöléseként.