我正在为一个潜在的游戏奠定基础,但我在设计要封装的课程时却遇到了麻烦。
一般来说,人们说对象应该相互依赖,以保持模块化和封装。
然而,有时让某些物体彼此了解似乎很方便。
假设我们有一个名为Dog的课程。
public class Dog {
public void eat() { ... }
public void wagTail() { ... }
}
狗有主人,所以有狗主人阶层。
public class DogOwner {
private Dog dog;
public Dog getDog() { return dog; }
public void petDog() { ... }
public void takeDogForWalk() { ... }
}
现在,如果我们有一个Dog
,但我们没有它的拥有者怎么办?为getOwner()
制作Dog
方法似乎很有意义。
public class Dog {
private DogOwner owner;
public void eat() { ... }
public void wagTail() { ... }
public DogOwner getOwner() { return owner; }
}
但是,现在这会提供有关Dog
的{{1}}信息,这似乎违反了信息隐藏。它似乎也会创建冗余,因为DogOwner
有Dog
,而DogOwner
有DogOwner
。
找到所有者的另一种方法是简单地浏览所有所有者,并找到相应的狗。虽然这不会创建Dog
和Dog
的依赖关系,但这似乎比它需要的要昂贵得多,因为我们必须遍历所有的所有者。
那么,DogOwner
是否可以使用Dog
方法?如果不是,如果仅知道getOwner()
,还有哪些其他替代方案可以有效地访问所有者?
答案 0 :(得分:0)
虽然我不是软件设计实用主义者,但我不知道这是如何违反太多设计原则的。对于Dog
到"知道"关于DogOwner
的任何内容,它仍然需要访问DogOwner
的方法。所以,你不会说Dog.getDogOwnersName
或类似的东西,你会说Dog.getOwner().getName()
。这样,所有Dog
关心的都是它的拥有者。但除此之外的任何信息实际上仍然是隐藏的。
答案 1 :(得分:0)
"应该很少依赖" - 尽可能多,而不是更多,而不是更少。
当然,狗可以与其主人有链接。您询问了其他选择:一,始终将狗和所有者信息一起携带,即使许多代码并不关心所有者。第二,如果你有一只狗并且不了解主人,你显然不能问主人。您可以将哈希表映射到所有者的狗,但是您可能只是将狗与所有者一起存储。或者你有一个所有狗主人的数据库,并扫描它的狗的主人 - 不完全可扩展。
答案 2 :(得分:0)
我会说这样做是可以的。我想到的一个替代方案是使用以Dog作为键的字典和DogOwner作为值(因为假设DogOwner可能随时间而变化)。这还有一个额外的好处,就是保留Dog / DogOwner关系的一个中央存储库。