在面向对象设计中处理类型指标的最佳方法是什么?

Ris*_*ser 5 java oop ooad object-oriented-analysis

我们的商业模式需要识别不同类型的车辆.例如,摩托车,船,游艇,农场设备,雪地车,重型卡车,轻型卡车,乘用车和"其他".

我认为有两种方法可以处理它:创建一个带有几个子类的Vehicle类,比如船,卡车,汽车,并有一个枚举指示实际类型.这可以工作,允许您表示与公共子类共享一些共同特征的车辆.但是它允许你在类中使用不匹配的枚举.

我认为处理它的传统方法是为每种类型设置一个单独的子类,它可以是车辆的子类或车辆的子类.例如,重型和轻型卡车可能是卡车的子类; 船和游艇可能是船的子类; 雪地摩托车可能是车辆的子类.问题是,它并不能真正代表其他概念.

有没有人对这些场景有任何模式或最佳实践?

彼得

编辑: 目标的目的是传达有关车辆的信息,并能够以用户友好的方式显示该信息.例如,从数据库中提取数据并将其显示在要查看/编辑的屏幕上.

这导致了传统OO手段的另一个缺点,即偏离实际类型的类型指示器,因为它显示了需要执行某种实例的类型并将值转换为用户友好的类型.

(另外,澄清我说的是单个枚举,而不是每个子类的枚举.)

Pet*_*rey 6

我会从一个车辆开始,而不是添加太多的抽象.
我不会使用类层次结构来描述您可以使用字段来描述的内容.

这些类型的代码是如此不同吗?

例如,假设您有一个之前没有想到的类型.像水上汽车(这是一辆可以在水上行驶的汽车)或者是一个水上运动车,或者是独轮车.您可以为每种类型创建一个新类,或者您可以使用像这样的字段完全使用数据驱动它

name: aqua-car
type: Exotic Car
travelsOnWater: true
travelsOdLand: true
wheels: 4
Run Code Online (Sandbox Code Playgroud)

我建议你阅读你不会需要它只添加你需要的抽象,而不是你能想象的抽象.


Rai*_*olt 4

真正的问题

两个“事物”需要有多大的不同才能获得属于自己的类?

答案

这完全取决于您将如何使用这些对象。

  • 您会根据它们拥有的某些属性(例如,它是否浮动?)来比较它们?如果是这样,那么具有差异化属性的单个类就有意义了。
  • 您要在界面上显示您的对象吗?在您的应用程序中,在单个表中显示轻型卡车和重型卡车是否有意义?如果它们不能有意义地存在并作为一个数据集显示,那么有两个类是有意义的。

这只是两个例子。关键是,如果你创建一个新类,它应该是有用的。Java 特别容易出现过度抽象。


我该怎么办Other

其他听起来像是一组既不是卡车也不是汽车的车辆。听起来您想捕获所有其他车辆并将它们归为一类。为什么不使用Vehicle类呢?不要创建另一个派生自 Vehicle 但添加零功能的类。同样的有用性测试也适用于此。

  • 是否Vehicle足够有用以满足我对所有“其他”车辆的需求?如果没有,我需要创建更多课程。

我采纳了你的建议并创建了两个有用的课程。现在,我无法区分它们,并且我拒绝使用instanceof。我该怎么办?

无论你的类有多抽象,我总是能够将你的类的实例添加到 a 中List<Object>,然后无法区分它们。你的设计无法防弹。

让我换一种说法 - 如果您将鸡蛋和汽车添加到列表中,并且稍后需要区分鸡蛋和汽车,那么您的列表有问题,而不是鸡蛋和汽车。