Я закладываю основы для потенциальной игры, но у меня возникают проблемы с проектированием классов, которые должны быть инкапсулированы, но при этом эффективны.
Как правило, люди говорят, что объекты должны мало полагаться друг на друга, чтобы сохранить модульность и инкапсуляцию.
Однако иногда кажется удобным, чтобы некоторые объекты знали друг о друге.
Допустим, у нас есть класс 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
.
Другой способ найти владельца — просто просмотреть всех владельцев и найти соответствующую собаку. Хотя это не создаст зависимости Dog
и DogOwner
, это кажется намного более дорогим, чем должно быть, потому что нам нужно перебрать всех владельцев.
Итак, нормально ли для Dog
использовать метод getOwner()
? Если это не так, какие другие альтернативы существуют для эффективного доступа к владельцу, если известен только Dog
?