【问题标题】:Modeling Java Iterables: Route impl Iterable<Stations> or route.stations()?Java Iterables 建模:Route impl Iterable<Stations> 或 route.stations()?
【发布时间】:2016-08-12 08:48:40
【问题描述】:

我的域中有 RouteStation 类。路线描述了车辆通过序列站和旅程元数据(运营商、公共汽车号等)进行的旅程。

因此,Route 会有一个站点列表和一些额外的元数据。此列表的一些辅助方法也有必要,例如 firstStation() 和 lastStation() ,这里我有 2 个选项:


在 Route 类中实现它们:

public class Route implements Iterable<Station> {

    // metadata

    private List<Station> stations;

    public Station firstStation() {
        return stations.get(0);
    }

    public Station lastStation() {
        return stations.get(stations.size() - 1);
    }

    @Override
    public Iterator<Station> iterator() {
        return stations.iterator();
    }


    // ...
}

唯一让我担心的是 Route 提供了 Station 迭代器,这对开发人员来说可能不是很明显,尤其是在这种情况下:

for (Station st : route)

但是对于第一个/最后一个方法看起来很自然:

Station st = route.firstStation();

另一个想法是创建自定义集合实现:

public class Stations implements Iterable<Station> {
    private List<Station> stations;

    public Stations(List<Station> stations) {
        this.stations = stations;
    }

    public Station lastStation() {
        return stations.get(stations.size() - 1);
    }

    public Station firstStation() {
        return stations.get(0);
    }

    @Override
    public Iterator<Station> iterator() {
        return stations.iterator();
    }
}

public class Routte {
    private Iterable<Station> stations = new Stations();

    public Iterable<Station> stations() {
        return stations;
    }
}

所以这段代码更有意义:

for (Station st : route.stations())

这种方法更冗长,需要一些技巧才能创建 JPA 映射。

这个问题是关于您的个人喜好的,我很高兴听到您对上述代码在您看来应该如何实现(以及为什么)的建议和想法。

【问题讨论】:

  • 我想说:尽可能选择组合而不是继承。我认为在这种情况下,代码的可读性要好得多...
  • 或者你可以为你的 Stations 使用 LinkedList 并使用内置的 getFirst() 和 getLast() 方法。
  • @ppeterka 所以你的投票是第一种方法,不是吗?
  • 没有。不要实现Iterable。事实上,不要实现任何东西:默认情况下,Java 中有一个很好的 Collections 集合......按照@Nicktar 的建议做:使用 LinkedList。无需再发明一个轮子。
  • 我不明白你为什么需要一个单独的课程。你为什么不简单地返回车站?除此之外,我同意,for (Station st : route) 看起来很奇怪。

标签: java collections iterator domain-driven-design


【解决方案1】:

由于您的自定义方法似乎在“路线”上运行,我会选择

public class Route {
    private List<Station> stations;

    public Station firstStation() {
        return stations.get(0);
    }

    public Station lastStation() {
        return stations.get(stations.size() - 1);
    }

    public Iterable<Station> getStations() {
        return stations;
    }

    private static class Station {

    }
}

这允许您将自定义方法添加到 Route 并且仍然具有

for (Station st : route.getStations())

【讨论】:

  • 因为漂亮的设计而被赞成。只是一个细节,让Station 成为私有内部类并返回Iterable&lt;Station&gt; 是没有意义的。
  • @Ole V.V.我只将 Station 创建为一个内部类,以便有一个最小的自包含示例进行编译。
猜你喜欢
  • 2021-09-13
  • 2016-06-16
  • 2015-12-13
  • 1970-01-01
  • 2010-11-07
  • 2023-04-07
  • 1970-01-01
  • 2010-10-09
  • 1970-01-01
相关资源
最近更新 更多