我将应用程序作为业余爱好项目。它是用Java编写的,是计算水肺潜水减压方案的系统的一部分。 我遇到的问题是存放我的潜水计划的课程,这不是一个问题,因为它工作正常,但我觉得它可以更好地设计,所以我想要一些反馈。
我现在得到的是以下内容。
类DivePlan
,其ArrayList为DiveOpperations(ArrayList<DiveOpperation>
)。
DivePlan
类有3个函数。一个计划下降,一个计划上升,一个计划在同一深度上进行平底潜水。所有这些函数都将一个DiveOpperation
对象添加到ArrayList。然而,上升和下降具有一些其他属性作为潜水,保持在相同的深度。例如,上升/下降的速度(m / s)。我现在将它设置为0的平坦潜水,但感觉不对。我知道我应该创建一个扩展DiveOpperation
的单独的类,但是当我得到它时,我不知道它是ascent
,descent
还是flatdive
类它离开阵列。
这种功能的优秀设计是什么?
答案 0 :(得分:2)
对此的多态解决方案是将DiveOperation类扩展为AscentOperation,DescentOperation和FlatOperation,并保持现有的ArrayList类型。考虑到实现的简单性,我不确定你是否需要这样做。
为计算开发一套好的单元测试会更好,如果需要增加复杂性来容纳更多功能,你可以更轻松地重构。
答案 1 :(得分:1)
如何让verticalSpeed
变量决定?
值为0
时,DiveOperation
表示平坦,有正值或负值分别表示上升或下降?
如果您有其他属性而不仅仅是上升/下降速度,您可能希望将DiveOperation
转换为抽象类,并创建三个子AscentOperation
,DescentOperation
和{{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>
,则始终可以将子类添加到该列表中。