【发布时间】:2017-08-20 00:34:22
【问题描述】:
我正在开发一个名为Simulator 的简单类,它将Simulations 的列表应用于某个输入。对于每个输入,模拟可以产生或不产生输出,这取决于输入对于每个模拟必须满足的某些条件。 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方法中。
但是,processable 对Simulator 可见,我可以应用更实用的方法,这非常方便。
哪种方法更好?我还缺少其他解决方案吗?
【问题讨论】:
-
如果你认为你在暴露内部,那你为什么要这样做呢?需要考虑的其他一些问题:如果我用
someSimulation.prepareOutput(null)调用您的任何模拟会发生什么?这甚至可以处理吗?或者,如果我使用给定模拟无法处理的输入参数调用prepareOutput,会发生什么?我是否需要从外部了解或检查其可加工性?它是返回null还是抛出异常?Optional是一个选项吗?
标签: oop functional-programming java-8 java-stream information-hiding