在某些情况下,对象应该知道他们的用户吗?

时间:2015-07-02 00:31:31

标签: encapsulation information-hiding

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

一般来说,人们说对象应该相互依赖,以保持模块化和封装。

然而,有时让某些物体彼此了解似乎很方便。

假设我们有一个名为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}}信息,这似乎违反了信息隐藏。它似乎也会创建冗余,因为DogOwnerDog,而DogOwnerDogOwner

找到所有者的另一种方法是简单地浏览所有所有者,并找到相应的狗。虽然这不会创建DogDog的依赖关系,但这似乎比它需要的要昂贵得多,因为我们必须遍历所有的所有者。

那么,DogOwner是否可以使用Dog方法?如果不是,如果仅知道getOwner(),还有哪些其他替代方案可以有效地访问所有者?

3 个答案:

答案 0 :(得分:0)

虽然我不是软件设计实用主义者,但我不知道这是如何违反太多设计原则的。对于Dog到"知道"关于DogOwner的任何内容,它仍然需要访问DogOwner的方法。所以,你不会说Dog.getDogOwnersName或类似的东西,你会说Dog.getOwner().getName()。这样,所有Dog关心的都是它的拥有者。但除此之外的任何信息实际上仍然是隐藏的。

答案 1 :(得分:0)

"应该很少依赖" - 尽可能多,而不是更多,而不是更少。

当然,狗可以与其主人有链接。您询问了其他选择:一,始终将狗和所有者信息一起携带,即使许多代码并不关心所有者。第二,如果你有一只狗并且不了解主人,你显然不能问主人。您可以将哈希表映射到所有者的狗,但是您可能只是将狗与所有者一起存储。或者你有一个所有狗主人的数据库,并扫描它的狗的主人 - 不完全可扩展。

答案 2 :(得分:0)

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