我正在开发一个简单的类Simulator,该类将Simulation的列表应用于特定输入。对于每个输入,基于输入相对于每个模拟必须满足的某些条件,模拟是否可以产生输出。 Simulator产生的结果是输出列表。

这是代码。

class Simulator {
    final List<Simulation> simulations;

    // Some initialization code...

    List<Ouput> execute(Input input) {
        return simulations
            .stream()
            .filter(s -> s.processable(input))
            .map(s -> s.prepareOutput(input))
            .collect(Collectors.toList());
    }
}

如您所见,首先,我将验证Simulation是否可处理输入,过滤掉不是的模拟,然后将这些模拟应用于输入。

从面向对象的角度,我公开了Simulation类的内部。 processable方法完成的检查操作应隐藏在prepareOutput方法内部。

但是,让processableSimulator可见,我可以应用更多功能的方法,这非常方便。

哪种方法更好?我还有其他解决方案吗?

最佳答案

由于您的类Simulation已经公开了prepareOutput操作,该操作可能会失败,因此当您提供processable方法进行预先检测时,就不会有额外的暴露,即prepareOutput操作是否会失败。实际上,提供这种检查是一种很好的API设计,只要事先计算起来不会太昂贵。

您仍可以考虑在Simulation类中提供批量处理操作。

public class Simulation {
    public Output prepareOutput(Input input) {
        …
    }
    public static List<Output> prepareWhenPossible(List<Simulation> list, Input input) {
        return simulations.stream()
            .filter(s -> s.processable(input))
            .map(s -> s.prepareOutput(input))
            .collect(Collectors.toList());
    }
}

请务必告知调用者,它将跳过无法进行操作的元素,而不是实施“全有或全无”行为。

如果实施起来很便宜,这仍然不排除公开processable。这似乎不是原本不可能完成的操作,因为总是可以只调用prepareOutput并删除结果来确定该操作是否可行。为此目的使用processable方法要干净得多。

关于oop - 信息隐藏和函数式编程编码风格,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43044089/

10-11 10:44