这是我发现很难研究的东西,因为它需要一些解释。
我基本上想了解在其他物体周围移动物体的最佳方法,并跟踪所有物体的位置。请允许我解释一下。
让我们假装我们正在制作Person类和Park类。公园课上有一堆玩具和供人玩的游乐设施。这些可以是Slide类,SeeSaw类等。但是可以说,我们的程序需要始终跟踪Person对象的位置。如果他们在幻灯片上,我们将要询问课程的人他们的位置。例如...
//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);
}
我忍不住觉得有更好的方法来做,因为它感觉到更大规模了。也许我想得太多,但是我很想知道有关此的任何最佳实践或设计。
谢谢。
答案 0 :(得分:2)
根据 Functional Programming 的说法,您遇到了一个真正的OO问题。作为一个纯粹的面向对象驱动的世界,不不允许您以一致的方式表示此问题。无论您怎么做,最终都会有以下三种可能性之一:
因此,这里的真正问题是您有多个对象,并且移动位置会更改整个系统状态。没有线程,一切都很好,但是一旦有多个线程加入,不同线程可能会看到不一致的状态。
因此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方法相同的代码(将其从当前的公园玩具并将其移至另一个)。这将允许使用更简洁的代码,并且应保持所有功能相同。