首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在面向对象的设计中,处理类型指示符的最佳方法是什么?

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

Stack Overflow用户
提问于 2014-04-29 14:25:31
回答 5查看 427关注 0票数 5

我们有一个商业模式,比如说,需要识别不同类型的车辆。例如,摩托车,船,游艇,农业设备,雪地摩托,重型卡车,轻型卡车,乘用车,和“其他”。

我认为有两种方法来处理它:创建一个带有几个子类的Vehicle类,例如,船只、卡车、汽车,并且有一个枚举来表示实际的类型。这将起作用,允许您表示与公共子类共享一些共同功能的车辆。但它允许您有与类不匹配的枚举。

我认为传统的处理方法是为每种类型都有一个单独的子类,它可以是车辆的子类,也可以是车辆的子类。例如,重型和轻型卡车可能是子类卡车;小船和游艇可能是子类船;雪橇车可能是子类车辆。问题是,它并不能真正代表他人的概念。

对于这类场景,有人有任何模式或最佳实践吗?

彼得

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

这导致了传统的OO的另一个缺点,即对实际类型不使用类型指示符,因为要显示类型,就需要执行某种实例,并将值转换为用户友好的东西。

(另外,我说的是单个枚举,而不是每个子类一个枚举。)

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2014-04-29 14:51:15

实数问题

两种“东西”在配得上自己的课之前需要有多大的区别?

答案

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

  • 你会根据它们所拥有的某些属性(例如,它是否浮动)来比较它们吗?如果是这样的话,具有区分属性的单个类是有意义的。
  • 你要在接口上显示你的对象吗?在你的应用程序中,把轻型卡车和重型卡车放在一张桌子上有意义吗?如果它们不能有意义地存在并显示为一个数据集,那么有两个类是有意义的。

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

我该如何对待Other**?**

其他的听起来像是一组不是卡车,也不是汽车的车辆。听起来好像你想赶上所有其他的车辆,并把他们放在一个班。为什么不使用汽车类呢?不要创建另一个从Vehicle派生但添加零功能的类。同样的有用性测试也适用于这里。

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

,我听取了您的建议,创建了两个有用的类。现在,我无法区分它们,我拒绝使用实例。我该怎么办?

不管您的类有多抽象,我总是能够将类的实例添加到List<Object>中,这样就无法区分它们。你的设计不能防弹。

让我换一种说法--如果你把鸡蛋和汽车加到一个列表中,然后你需要区分鸡蛋和汽车,那么你的列表就会出现问题,而不是鸡蛋和汽车。

票数 4
EN

Stack Overflow用户

发布于 2014-04-29 14:32:01

我会从车辆开始,而不是增加太多的抽象。

我不会使用类层次结构来描述您可以用字段来描述的东西。

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

例如,假设你有一种你以前没想过的类型。就像一辆水车(它是一辆能在水面上行驶的汽车)、一条海道或一辆独轮车。您可以为每种类型创建一个新的类,也可以使用以下字段驱动它的全部数据

代码语言:javascript
复制
name: aqua-car
type: Exotic Car
travelsOnWater: true
travelsOdLand: true
wheels: 4

我建议您更好地阅读你不会需要的,只添加所需的抽象,而不是可以想象的抽象。

票数 6
EN

Stack Overflow用户

发布于 2014-04-29 14:35:42

你的问题没有简单的答案。因为它依赖于业务逻辑,所以您必须使用该数据结构来执行。

我将从一个接口Vehicle开始,它将解析Identyficator以获得具体代表的描述。

代码语言:javascript
复制
interface VehicleIdentyficator {
  String identyficator();
}

interface Vehicle {

  Identyficator getIdentyficator();

}

有了这一点,你就不局限于课堂,枚举或其他类型的设计。

然后,我将使用类层次结构来描述每个车辆的属性。

在此之后,向代码中添加一些逻辑/行为方面,并查看我的数据结构对任务是有效的。

最后,重要的方面是执行一些操作。

例如,没有必要创建三个类别的卡车,LightTruck和HavyTruck。

您可以创建一个类,根据它们执行的任务来描述它们。

  • 他们可以在地面运输
  • 轻型卡车能运载较少的货物,但它过去常在小城市行驶。
  • 这辆重型卡车在光明的对面。有大范围携带更多的负荷。

当我们和这艘船相比,我们看到它更像轻型卡车,唯一的区别是它在水上旅行。

所以,试着去理解对象,而不是它是什么,而是它能做什么。它可以执行哪些任务,限制是什么。然后你的设计将会非常接近你所需要的。

我希望这句话是正确的,我会重复一遍。你使用的是那些车辆,而不是建造它们。因此,专注于他们的使命,充分填补,而不是他们的身体方面。

但你可以做这样的事

代码语言:javascript
复制
 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; 
   }

 }

但是,每次你添加一些新的车辆,你必须涵盖所有的点,这些新的硬编码类型将被使用。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23367491

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档