在Java中将对象从一个位置移动到另一个位置

时间:2018-07-18 14:08:37

标签: java oop

这是我发现很难研究的东西,因为它需要一些解释。

我基本上想了解在其他物体周围移动物体的最佳方法,并跟踪所有物体的位置。请允许我解释一下。

让我们假装我们正在制作Person类和Park类。公园课上有一堆玩具和供人玩的游乐设施。这些可以是Slide类,SeeSaw类等。但是可以说,我们的程序需要始终跟踪Pe​​rson对象的位置。如果他们在幻灯片上,我们将要询问课程的人他们的位置。例如...

//location could be set in the person whenever we move them..
person.setLocation(slide);
//now getLocation could return the object they are on (slide, seesaw, ect)
person.getLocation(); 

但是,现在我想说出在任何给定时间,谁在公园中的Slide对象上。就像...

slide.getOccupants(); // could return the objects that are on the slide (Persons)

但是现在这意味着当“人”在公园中从一个物体移到另一个物体时。我不得不说类似...

person.setLocation(seeSaw);
slide.removeOccupant(person);
seeSaw.addOccupant(person);
//this would get annoying and scary to do everytime a person moves...

因此,创建一种方法来处理所有这些更改是否是可行的方法?例如,一个人每次移动时,都可以调用此代码...

//person being who you're moving and the ride being where you're moving them to..
public void move(Person person, Ride ride){
    person.getLocation().removeOccupant(person);
    person.setLocation(ride);
    person.getLocation().addOccupant(person);
}

我忍不住觉得有更好的方法来做,因为它感觉到更大规模了。也许我想得太多,但是我很想知道有关此的任何最佳实践或设计。

谢谢。

3 个答案:

答案 0 :(得分:2)

根据 Functional Programming 的说法,您遇到了一个真正的OO问题。作为一个纯粹的面向对象驱动的世界,不允许您以一致的方式表示此问题。无论您怎么做,最终都会有以下三种可能性之一:

  • X人不在哪里
  • X人在两个地方
  • 你不知道X人在哪里

因此,这里的真正问题是您有多个对象,并且移动位置会更改整个系统状态。没有线程,一切都很好,但是一旦有多个线程加入,不同线程可能会看到不一致的状态。

因此FP人士告诉您,首先,您需要通过具有功能来解决该概念性问题,该功能可以将系统从一种有效状态“移动”到另一种有效状态。非常类似于您的move()代码,但是在使用该方法时不会不一致地更新“对象状态”。

好的,但这可能不是您要的。解决您的问题的一种方法是:将移动一个人视为一种服务。您拥有实体(人员,位置),并且该服务负责“移动”事物。

然后猜猜看:那么您的第一个实现就是一个好的开始。因此,实际上,对于“教育”项目,您做的很好。可能您应该考虑使用合适的接口(以抽象出要移动的“事物”的详细信息,或它们从/移至的位置)。将其放入特定的服务类,然后从那里开始工作。

答案 1 :(得分:2)

要维护Location上谁的历史和当前信息,您没有成千上万的选择:您必须将它们保存在某个地方。
您的示例代码显示了一种实现方法。
另一种方法是通过应用一个Aspect来使用AOP,Aspect在一个人每次移动到某个地方时都会更新状态。 但是,如果您这样做是为了节省3或4次调用,那似乎就太过分了。

关于实际代码,您可以使用一种接受任何Location来更通用的方法,例如:

public void move(Person person, Location newLocation){  
    person.getLocation().removeOccupant(person);
    person.setLocation(newLocation);
    person.getLocation().addOccupant(person);
}

通过这种方式,对于客户端代码而言,它变得更加直接。

作为旁注,Location实例可能不负责为自己设置任何Location的集合。它给它带来了太多的责任。
您可以通过将处理委托给负责状态更改的Locations类来分离关注点。

答案 2 :(得分:0)

一个可能的解决方案是,与其构造一个全新的move方法(该方法会产生过多的代码感觉),不如让此人的setLocation方法实质上使用与您构造的move方法相同的代码(将其从当前的公园玩具并将其移至另一个)。这将允许使用更简洁的代码,并且应保持所有功能相同。

相关问题