Java设计问题

时间:2010-11-23 19:34:40

标签: java inheritance

我将应用程序作为业余爱好项目。它是用Java编写的,是计算水肺潜水减压方案的系统的一部分。 我遇到的问题是存放我的潜水计划的课程,这不是一个问题,因为它工作正常,但我觉得它可以更好地设计,所以我想要一些反馈。

我现在得到的是以下内容。

DivePlan,其ArrayList为DiveOpperations(ArrayList<DiveOpperation>)。 DivePlan类有3个函数。一个计划下降,一个计划上升,一个计划在同一深度上进行平底潜水。所有这些函数都将一个DiveOpperation对象添加到ArrayList。然而,上升和下降具有一些其他属性作为潜水,保持在相同的深度。例如,上升/下降的速度(m / s)。我现在将它设置为0的平坦潜水,但感觉不对。我知道我应该创建一个扩展DiveOpperation的单独的类,但是当我得到它时,我不知道它是ascentdescent还是flatdive类它离开阵列。

这种功能的优秀设计是什么?

4 个答案:

答案 0 :(得分:2)

对此的多态解决方案是将DiveOperation类扩展为AscentOperation,DescentOperation和FlatOperation,并保持现有的ArrayList类型。考虑到实现的简单性,我不确定你是否需要这样做。

为计算开发一套好的单元测试会更好,如果需要增加复杂性来容纳更多功能,你可以更轻松地重构。

答案 1 :(得分:1)

如何让verticalSpeed变量决定?

值为0时,DiveOperation表示平坦,有正值或负值分别表示上升或下降?

如果您有其他属性而不仅仅是上升/下降速度,您可能希望将DiveOperation转换为抽象类,并创建三个子AscentOperationDescentOperation和{{1} }}。但是,如果我理解正确,你就会遇到麻烦,例如迭代,因为你不知道FlatDiveOperation的实际类型。这可以通过大量DiveOperation检查(丑陋!)或使用visitor pattern(更好的imo)来解决。在这种情况下,您可能会像instanceof那样依次访问每个DecompressionCalculatorVisitor

有关访客模式的详细示例,请查看我的回答over here

答案 2 :(得分:0)

我不确定我是否完全理解你的问题但是 我不认为你必须知道什么是DiveOperation的真实类型。使用命令模式,只需调用命令方法。该命令将完成其工作。 2.如果您仍然需要知道类型,可以使用instanceof运算符检索它。

答案 3 :(得分:0)

扩展它。您可以通过从数组中取出它然后检查(object instanceof AscentDive)等来确定它是什么子类(上升,下降,平坦)。

请记住,泛型在运行时会被删除。因此,您实际定义的ArrayList仅从JVM的角度包含“对象”。通用程序用于编译时验证。如果您对DiveOperation进行子类化并定义ArrayList<DiveOperation>,则始终可以将子类添加到该列表中。