【发布时间】:2016-08-12 08:48:40
【问题描述】:
我的域中有 Route 和 Station 类。路线描述了车辆通过序列站和旅程元数据(运营商、公共汽车号等)进行的旅程。
因此,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