我正在开发一个简单的类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
方法内部。但是,让
processable
对Simulator
可见,我可以应用更多功能的方法,这非常方便。哪种方法更好?我还有其他解决方案吗?
最佳答案
由于您的类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/