热门问题
时间线
聊天
视角
迴圈-switch序列
来自维基百科,自由的百科全书
Remove ads
迴圈-switch序列(loop-switch sequence)[1],也稱為for-case範式[2]或反達夫裝置,是程式設計的反面模式,將一連串明確的動作用迴圈裡的switch指令實現。這算是麵條式代碼的衍生產物。
在迴圈中使用switch指令不一定就是反面模式,只有在將一連串明確且已知的步驟用迴圈和switch實現時,才是反面模式。迴圈和switch指令的正確用法中,最常見的是事件處理器中的控制反轉。在事件處理器迴圈中,事件的順序在編輯時還不確定,因此在迴圈中反覆執行switch指令,是必要而且正確的(參考事件驅動程式設計、事件迴圈和事件驅動有限狀態機)。
若以效能的觀點來看,迴圈-switch序列不是反面模式,不過因為沒有迴圈展開,會有小幅的效能損失。不過以程式閱讀性來說,迴圈-switch序列是反面模式,針對許多例子,使用迴圈-switch序列會不容易瞭解程式設計者的意圖,以及程式實際的功能。
Remove ads
例子
用事件驅動程式來實現觀察者模式:
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());
}
Remove ads
參考資料
Wikiwand - on
Seamless Wikipedia browsing. On steroids.
Remove ads