0

我正在为一个潜在的游戏奠定基础,但我在设计要封装但高效的类时遇到了麻烦。

通常,人们说对象应该很少相互依赖以保持模块化和封装性。

但是,有时让某个对象相互了解似乎很方便。

假设我们有一个名为 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有关 的信息DogOwner,这似乎违反了信息隐藏。它似乎也造成了冗余,因为Dog有一个DogOwner,并且DogOwner有一个Dog

另一种寻找主人的方法是简单地浏览所有主人,找到对应的狗。虽然这不会产生 and 的依赖DogDogOwner但这似乎比它需要的要昂贵得多,因为我们必须循环遍历所有所有者。

那么,DoggetOwner()方法可以吗?如果不是,如果只知道 ,还有什么其他替代方法可以有效地访问所有者Dog

4

3 回答 3

0

虽然我不是软件设计实用主义者,但我不认为这必然会违反太多设计原则。因为Dog要“了解”它的任何信息DogOwner,仍然需要访问DogOwner的方法。所以,你不是在说Dog.getDogOwnersName或类似的话,你会说Dog.getOwner().getName()。这样,所有Dog关心的是它的主人是谁。但除此之外的任何信息实际上仍然是隐藏的。

于 2015-07-02T00:42:44.550 回答
0

“应该少依赖”——尽可能多地依赖,而不是更多,而不是更少。

当然,狗可以与它的主人建立联系。您询问了替代方案:第一,始终将狗和所有者信息放在一起,即使很多代码都不关心所有者。二、如果你有一只狗,不认识主人,你显然不能问主人。您可以有一个将狗映射到所有者的哈希表,但是您也可以将狗与所有者一起存储。或者你有一个包含所有狗主人的数据库并扫描它以找到该狗的主人 - 不完全可扩展。

于 2015-07-02T00:42:54.313 回答
0

我会说这样做没关系。不过,想到的一种替代方法是使用以 Dog 作为键,以 DogOwner 作为值的字典(因为假设 DogOwner 可能会随着时间而改变)。这还有一个额外的好处,那就是保留一个 Dog/DogOwner 关系的中央存储库。

于 2015-07-02T00:51:27.517 回答