- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设我正在设计一个名为 ToyBox 服务的服务,它将一堆形状对象写入数据库并返回对象。它使用的形状是多态的,因此结构如下:
class Shape {
int id;
}
class Circle extends Shape {
int radius;
}
class Square extends Shape {
int length;
}
class ToyBox {
List<Shape> shapes;
}
现在我的问题是对于这样一个服务的设计,ToyBox 对象保存对 Shape 对象集合的引用是否更好,或者是每种类型的形状(即形状)的集合更好。 ShapeContainer 中的 List<Square>, List<Circle>
等)? CRUD 服务接口(interface)也是如此,如果它接受 List 对象或容器对象,如下所示:
class ShapeContainer {
List<Circle> circles;
List<Square> squares;
}
服务方法如下:
List<ToyBox> persistToyboxes (List<ToyBox> boxes)
.
在应用程序的其他地方,我希望对正方形和圆形进行不同的处理,因此如果我采用包含 List<Shape>
的 ToyBox 方法,我将必须执行以下操作对象:
List<Circle> circles = toyBox.getShapes().stream().filter(s -> s instanceOf Circle).collect(Collectors.toList());
只是想确定这样一个系统的最佳设计是什么?
最佳答案
答案是……这取决于情况。
一般来说,如果 ToyBox
会更简单、更清晰(并且 API 更小)。 API 对所有形状一视同仁。对它们进行相同的处理还意味着您无需更改 API 来添加(例如)Triangle
反对 ToyBox
API。
但是,如果 API 要求存在某些问题,则意味着 ToyBox
需要“包含”不同的形状。以根本不同的方式,那么它对于 ToyBox
来说可能有意义。拥有不同的API方法。
实现可能应该反射(reflect) API,但并非绝对必须如此。例如,您可以为圆形、正方形等的“集合”使用单独的 API 方法,将它们存储在单个列表对象中……并通过一些复杂的过滤或包装来实现这些方法。
底线是这样的:您需要了解 API 必须满足的要求...以及(理想情况下)合理预期这些要求的概括1 .. .并进行相应的设计。
<小时/>1 - 例如,您的 ToyBox
的概括您应该预期的要求是用户可能希望 API 能够处理三角形。
顺便说一句,这行不通:
List<Circle> circles = toyBox.getShapes().stream()
.filter(s -> s instanceOf Circle)
.collect(Collectors.toList());
Stream
的类型交付者filter
将是Stream<Shape>
。你需要做这样的事情:
List<Circle> circles = toyBox.getShapes().stream()
.filter(s -> s instanceOf Circle)
.map(s -> (Circle) s)
.collect(Collectors.toList());
IMO,你最好在 ToyBox
中声明一个方法像这样的 API:
public List<Circle> getCircles() { ... }
甚至
public <T> List<T> getToysOfType(Class<T> typeClass) { ... }
关于java - 同质列表与异构列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46385026/
我是一名优秀的程序员,十分优秀!