循环-switch序列

循环-switch序列（loop-switch sequence），也稱為for-case範式The FOR-CASE paradigm and Switched on Loops at The Daily WTF或反达夫设备，是程式設計的反面模式，將一連串明確的動作用迴圈裡的實現。這算是面条式代码的衍生產物。

在迴圈中使用switch指令不一定就是反面模式，只有在將一連串明確且已知的步驟用迴圈和switch實現時，才是反面模式。迴圈和switch指令的正確用法中，最常見的是事件處理器中的控制反转。在事件處理器迴圈中，事件的順序在編輯時還不確定，因此在迴圈中反覆執行switch指令，是必要而且正確的（參考事件驅動程式設計、事件循环和事件驅動有限狀態機）。

若以效能的觀點來看，循环-switch序列不是反面模式，不過因為沒有循环展开，會有小幅的性能損失。不過以程式閱讀性來說，循环-switch序列是反面模式，針對許多例子，使用循环-switch序列會不容易瞭解程式設計者的意圖，以及程式實際的功能。

例子

用事件驅動程式來實現观察者模式：
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);
    }
}

但若不用观察者模式，會變成以下的反面模式：
// 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;
    }
}

在重構之後的內容如下：
// 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());
}

參考資料

Category:计算机编程