3 回答
TA贡献1900条经验 获得超5个赞
根据函数式编程人员的说法,您遇到了真正的面向对象问题。作为一个纯粹的OO驱动的世界也不会允许你代表一致的方法解决此问题。不管你怎么做,你最终都会得到以下三种可能性之一:
人 X 无处可去
人 X 在两个位置
你不知道X在哪里
所以这里真正的问题是你有多个对象,移动位置会改变整个系统状态。没有线程一切正常,但是一旦您有多个线程启动,不同的线程可能会看到不一致的状态。
因此,FP 人员告诉您,您首先需要通过具有将系统从一个有效状态“移动”到另一个有效状态的功能来解决这个概念性问题。非常像您的move()
代码,但在使用该方法时不会不一致地更新“对象状态”。
好的,但这可能不是您要的。您的问题的一个答案是:将人员搬迁视为一项服务。您有实体(人员、位置),该服务负责“移动”事物。
你猜怎么着:那么你的第一个实现是一个好的开始。所以,实际上,对于一个“教育”项目,你做得很好。可能你应该考虑使用合适的接口(抽象被移动的“事物”的细节,或者它们从/到的地方)。把它放到一个特定的服务类中,然后从那里开始工作。
TA贡献1780条经验 获得超5个赞
要维护关于谁和曾经在 a 的历史和当前信息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实例可能不应该负责为自己设置 any 的集合Location。它给了它太多的责任。
您可以通过将处理委托给Locations负责状态更改的类来分离关注点。
TA贡献1816条经验 获得超4个赞
一种可能的解决方案是,与其构建一个全新的 move 方法,这会造成代码过多的感觉,而是允许该人的 setLocation 方法基本上使用与您构建的 move 方法相同的代码(从当前的公园玩具中删除该人)并将它们移动到另一个)。这将允许更清晰的代码,并应保持所有功能相同。
添加回答
举报