热门问题
时间线
聊天
视角

循环-switch序列

来自维基百科,自由的百科全书

Remove ads

循环-switch序列(loop-switch sequence)[1],也称为for-case范式[2]反达夫设备,是程式设计的反面模式,将一连串明确的动作用回圈里的switch指令英语switch statement实现。这算是面条式代码的衍生产物。

在回圈中使用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

参考资料

Loading related searches...

Wikiwand - on

Seamless Wikipedia browsing. On steroids.

Remove ads