oop - 信息隐藏和函数式编程编码风格

标签 oop functional-programming java-8 java-stream information-hiding

我正在开发一个名为 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 并删除结果来确定该操作是否可行。为此目的使用可处理方法会更简洁。

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

相关文章:

python - 从类对象列表中调用类方法的更好方法 - Python

Javascript 如何覆盖构造函数方法?

flash - 如何在AS3中定义具有不同参数的接口(interface)方法?

java - Java 中的函数式编程语法

Java 8 : Using Instant, 如何检索 ZoneId 信息

java - 回调和 dto 之间有什么关系?

F#高级练习

java - 在 java.util.Date 和 java.time.Instant 之间转换古代日期时出现差异

java - 为什么 java.util.function 不为所有原始类型定义专门的功能接口(interface)?

Java 8 流和 map 值得吗?