0

下面是为控制中断模式创建可重用解决方案的尝试。它建立在命令模式(操作和测试接口)之上。然而,我意识到我以前的 COBOL 思维阻碍了我,因为这个解决方案基于每个可以访问“全局变量”的 Action 和 Test 对象。在那之后我的直接想法是“需要像这样(更广泛的范围)的变量访问必须是一个已经发明的轮子。

如何让下面的所有操作和测试访问一组变量——一个不确定的组,因为这应该是一个可重用的解决方案?

public class ControlBreak {

public static void controlBreak(Action initialize, 
                                Test   endOfInput, 
                                Test   onChange, 
                                Action breakAction, 
                                Action detailAction, 
                                Action getNext) {

    boolean hasProcessed = false;

    getNext.execute();
    for (initialize.execute();endOfInput.test();detailAction.execute(),getNext.execute()) {
        hasProcessed = true;
        if (onChange.test()) {
            breakAction.execute();
        }
        detailAction.execute();
    }
    if (hasProcessed) {
        breakAction.execute();
    } else {
        // throw empty input exception
    }
}
}
4

2 回答 2

1

在几次重读中,您似乎正在尝试抽象某个控制流,其中可以耦合参数。在这种情况下,我会研究泛型。即是这样的:

public static void <TParams> controlBreak(Action<TParams> initialize, ..., TParams params) {
    // ...
    initialize.execute(params)
    // ...
}

这样,该方法将保持可重用,但各种操作/测试仍然可以接受强类型的参数/变量集。(具体类型TParam。)

于 2013-02-08T17:11:13.917 回答
1

多亏了millimoose,我到了要去的地方。这是充实的代码,供参考:

    public class ControlBreak<TParams> {

    public TParams controlBreak(Action<TParams> initialize, 
                                    Test<TParams>   endOfInput, 
                                    Test<TParams>   onChange, 
                                    Action<TParams> breakAction, 
                                    Action<TParams> detailAction, 
                                    Action<TParams> getNext,
                                    TParams params) {

        boolean hasProcessed = false;

        getNext.execute(params);
        for (params = initialize.execute(params);endOfInput.test(params);params = detailAction.execute(params),params = getNext.execute(params)) {
            hasProcessed = true;
            if (onChange.test(params)) {
                breakAction.execute(params);
            }
            detailAction.execute(params);
        }
        if (hasProcessed) {
            breakAction.execute(params);
        } else {
            // throw empty input exception
        }
        return params;
    }
}
于 2013-02-08T19:13:03.150 回答