Jump to content
Wikipedia The Free Encyclopedia

Loop-switch sequence

From Wikipedia, the free encyclopedia
This article is an orphan, as no other articles introduce links to this page from related articles . (October 2022)

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 ]
  1. ^ "Loop-switch sequences". LEVEL UP CODE. 30 November 2013. Retrieved 11 April 2016.
  2. ^ The FOR-CASE paradigm and Switched on Loops at The Daily WTF

AltStyle によって変換されたページ (->オリジナル) /