我们有一个商业模式,比如说,需要识别不同类型的车辆。例如,摩托车,船,游艇,农业设备,雪地摩托,重型卡车,轻型卡车,乘用车,和“其他”。
我认为有两种方法来处理它:创建一个带有几个子类的Vehicle类,例如,船只、卡车、汽车,并且有一个枚举来表示实际的类型。这将起作用,允许您表示与公共子类共享一些共同功能的车辆。但它允许您有与类不匹配的枚举。
我认为传统的处理方法是为每种类型都有一个单独的子类,它可以是车辆的子类,也可以是车辆的子类。例如,重型和轻型卡车可能是子类卡车;小船和游艇可能是子类船;雪橇车可能是子类车辆。问题是,它并不能真正代表他人的概念。
对于这类场景,有人有任何模式或最佳实践吗?
彼得
编辑:对象的目的是传递有关车辆的信息,并能够以用户友好的方式显示该信息。例如,从数据库中提取数据并将其显示在要查看/编辑的屏幕上。
这导致了传统的OO的另一个缺点,即对实际类型不使用类型指示符,因为要显示类型,就需要执行某种实例,并将值转换为用户友好的东西。
(另外,我说的是单个枚举,而不是每个子类一个枚举。)
发布于 2014-04-29 14:51:15
实数问题
两种“东西”在配得上自己的课之前需要有多大的区别?
答案
这完全取决于您将如何使用对象。
这只是两个例子。关键是,如果您创建了一个新类,那么它应该是有用的。Java特别容易出现抽象过度的情况。
我该如何对待Other**?** ?
其他的听起来像是一组不是卡车,也不是汽车的车辆。听起来好像你想赶上所有其他的车辆,并把他们放在一个班。为什么不使用汽车类呢?不要创建另一个从Vehicle派生但添加零功能的类。同样的有用性测试也适用于这里。
Vehicle是否足以满足我对所有“其他”车辆的需求?如果没有,我需要创建更多的类。,我听取了您的建议,创建了两个有用的类。现在,我无法区分它们,我拒绝使用实例。我该怎么办?
不管您的类有多抽象,我总是能够将类的实例添加到List<Object>中,这样就无法区分它们。你的设计不能防弹。
让我换一种说法--如果你把鸡蛋和汽车加到一个列表中,然后你需要区分鸡蛋和汽车,那么你的列表就会出现问题,而不是鸡蛋和汽车。
发布于 2014-04-29 14:32:01
我会从车辆开始,而不是增加太多的抽象。
我不会使用类层次结构来描述您可以用字段来描述的东西。
这些类型的代码如此不同吗?
例如,假设你有一种你以前没想过的类型。就像一辆水车(它是一辆能在水面上行驶的汽车)、一条海道或一辆独轮车。您可以为每种类型创建一个新的类,也可以使用以下字段驱动它的全部数据
name: aqua-car
type: Exotic Car
travelsOnWater: true
travelsOdLand: true
wheels: 4我建议您更好地阅读你不会需要的,只添加所需的抽象,而不是可以想象的抽象。
发布于 2014-04-29 14:35:42
你的问题没有简单的答案。因为它依赖于业务逻辑,所以您必须使用该数据结构来执行。
我将从一个接口Vehicle开始,它将解析Identyficator以获得具体代表的描述。
interface VehicleIdentyficator {
String identyficator();
}
interface Vehicle {
Identyficator getIdentyficator();
}有了这一点,你就不局限于课堂,枚举或其他类型的设计。
然后,我将使用类层次结构来描述每个车辆的属性。
在此之后,向代码中添加一些逻辑/行为方面,并查看我的数据结构对任务是有效的。
最后,重要的方面是执行一些操作。
例如,没有必要创建三个类别的卡车,LightTruck和HavyTruck。
您可以创建一个类,根据它们执行的任务来描述它们。
当我们和这艘船相比,我们看到它更像轻型卡车,唯一的区别是它在水上旅行。
所以,试着去理解对象,而不是它是什么,而是它能做什么。它可以执行哪些任务,限制是什么。然后你的设计将会非常接近你所需要的。
我希望这句话是正确的,我会重复一遍。你使用的是那些车辆,而不是建造它们。因此,专注于他们的使命,充分填补,而不是他们的身体方面。
但你可以做这样的事
enum VechicleType implements VehicleIdentyficator {
TRUCK("TRUCK"),
HEAVY_TRUCK("HEAVY_TRUCK")
private final String indentyficator;
private VechicleType(String indetyficator) {
this.indentyficator = identyficator;
}
public String identyficator() {
return indentyficator;
}
}但是,每次你添加一些新的车辆,你必须涵盖所有的点,这些新的硬编码类型将被使用。
https://stackoverflow.com/questions/23367491
复制相似问题