Loop-switch sequence
A loop-switch sequence[1] (also known as the for-case paradigm[2] or Anti-Duff's Device) is a programming antipattern where a clear set of steps is implemented as a switch-within-a-loop. The loop-switch sequence is a specific derivative of spaghetti code.
It is not necessarily an antipattern to use a switch statement within a loop—it is only considered incorrect when used to model a known sequence of steps. The most common example of the correct use of a switch within a loop is an inversion of control such as an event handler. In event handler loops, the sequence of events is not known at compile-time, so the repeated switch is both necessary and correct (see event-driven programming, event loop and event-driven finite state machine).
This is not a performance antipattern, though it may lead to an inconsequential performance penalty due to the lack of an unrolled loop. Rather, it is a clarity antipattern, as in any non-trivial example it is much more difficult to decipher the intent and actual function of the code than the more straightforward refactored solution.
Example
[edit ]An event-driven solution would implement a listener interface:
Stringkey=null; Stringvalue=null; List<String>params=null; intcolumn=0; publicvoidaddToken(token){ // parse a key, a value, then three parameters switch(column){ case0: params=newLinkedList<String>(); key=token; break; case1: value=token; break; default: params.add(token); break; } if(++column>=5){ column=0; completeRow(key,value,params); } }
But without the listener, it becomes an example of the antipattern:
// parse a key, a value, then three parameters Stringkey=null; Stringvalue=null; List<String>params=newLinkedList<String>(); for(inti=0;i<5;i++){ switch(i){ case0: key=stream.parse(); break; case1: value=stream.parse(); break; default: params.add(stream.parse()); break; } }
And here is the refactored solution:
// parse a key and value Stringkey=stream.parse(); Stringvalue=stream.parse(); // parse 3 parameters List<String>params=newLinkedList<String>(); for(inti=0;i<3;i++){ params.add(stream.parse()); }
References
[edit ]- ^ "Loop-switch sequences". LEVEL UP CODE. 30 November 2013. Retrieved 11 April 2016.
- ^ The FOR-CASE paradigm and Switched on Loops at The Daily WTF