Есть ли лучший способ ссылки на объект, содержащий объект? - PullRequest
0 голосов
/ 05 июля 2019

Для многих приложений, которые я сделал до сих пор, всегда есть классы, которые содержат множество других классов. Например, у меня может быть класс Player, у которого есть питомец. Тем не менее, я хочу иметь возможность ссылаться на игрока через питомца иногда. Следующий код будет работать для этого:

public class Player {
    Pet p;
    public Player() {
        p = new Pet(this);
    }
}

public class Pet {
    Player owner;
    public Pet(Player owner) {
        this.owner = owner;
    }
}

Если я хочу обратиться к Игроку через питомца, тогда, конечно, я могу просто использовать переменную owner. Но есть ли лучший способ сделать это? У меня часто будут классы, содержащие классы, содержащие классы и т. Д., Так что мой класс Player будет иметь питомца, у которого может быть игрушка, а затем у игрушки будет ссылка на игрока. И, черт возьми, у меня даже могут быть классы выше Игрока, такие как Здание в Городе в мире Так что Игрушка питомца может иметь ссылку на весь мир. Я чувствую, что должен быть лучший способ сделать это.

Ответы [ 2 ]

0 голосов
/ 05 июля 2019

Если ссылка является отношением один-к-одному, вам лучше иметь инкапсулирующий объект, объединяющий вашего питомца и вашего игрока.Или сохраните эту двойную связь между родителем и ребенком, если ваше приложение не слишком большое.

Из вашего описания города, здания и мира я предполагаю, что ссылка может легко стать однозначной.-Много, и это может стать сложным, если он масштабируется.В этом случае вам, возможно, придется проявить связь с чем-то вроде двунаправленных карт.В основном это карта, где вы можете получить значение из ключа как карту нормалей, но также получить ключ из значения.И в этом случае вы можете легко связать свою собаку и ее питомца.

0 голосов
/ 05 июля 2019

Я чувствую, что должен быть лучший способ сделать это.

Ну, это действительно зависит от масштаба.Когда ваша объектная модель довольно мала, и вы (вполне) уверены, что в ближайшие месяцы или годы не ожидается каких-либо серьезных улучшений ... тогда такая простая "двойная бухгалтерия" может быть разумным ответом.

Но в более реалистичных сценариях: да, этот подход быстро ломается.

Затем он часто помогает взглянуть на идеи доменного дизайна.Прежде всего: посмотрите, что вы моделируете.Конечно, мой питомец знает меня, но не знает понятия «владеть», не знает, что я его владелец.

Итак, первое решение может быть таким: просто отбросьте эту owner часть из класса Pet.Вместо этого вы можете захотеть создать какой-то индекс.В самой простой форме это может быть карта.В каком-то центральном реестре сказано , что человеку X принадлежит домашнее животное Y. Теперь ваш код может пойти и спросить Y, знает ли он владельца X.

И, возвращаясь к DDD, вы говорите о агрегаты .Вещи, которые так или иначе принадлежат друг другу.Но вы не можете просто добраться до любого участников, вам всегда нужно пройти через некоторый элемент root .См. здесь , например.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...