Объектные отношения - PullRequest
2 голосов
/ 09 июня 2009

Предположим, у вас есть два объекта, Персона и Адрес, и у них есть отношения, то есть Персона имеет адрес. Очевидно, что объект person имеет ссылку на объект адреса, но действительно ли объект адреса должен знать об объекте Person? Что дает, что это должны быть двусторонние отношения?

Спасибо!

Ответы [ 9 ]

2 голосов
/ 09 июня 2009

В этом случае похоже, что ваш объект Address не должен иметь отношения к объекту Person.

Как правило, вы можете подумать, должен ли объект «знать» другого, чтобы работать. Человек должен знать свой адрес, а адрес не должен знать человека, которому он принадлежит.

«необходимость знать» здесь отражает необходимость взаимодействия с объектом в методе.

1 голос
/ 09 июня 2009

Они думают, что мой объект зависит от свойства существовать. Таким образом, в этом конкретном сценарии Person зависит от Адреса, поэтому ему необходимо знать детали адреса. Адрес, с другой стороны, не зависит * от Человека , следовательно, может существовать без ведома Человека.

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

Джеймс.

1 голос
/ 09 июня 2009

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

Кроме этого, в отношениях, которые вы описываете, нет причин, чтобы это были двусторонние отношения. Нет правила, согласно которому для адреса требуется ссылка на человека.

1 голос
/ 09 июня 2009

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

Другой пример: если эти объекты связаны с таблицами базы данных и эти таблицы имеют отношение (скажем, Person.id == Address.IdPerson), тогда будет полезно иметь двусторонние отношения в классах для вставок и обновлений.

0 голосов
/ 09 июня 2009

В этом случае я бы начал с определения корневого объекта, который содержит список лиц и список адресов. Каждому человеку и адресу будет разрешен доступ к этому корневому (родительскому) объекту. Каждый объект Person также будет содержать ссылку на адрес. Чтобы найти адрес всех людей, проживающих в этом месте, я бы пошел к корневому объекту и отфильтровал список людей по всем лицам, которые ссылаются на этот адрес.

Но что, если человек живет по двум адресам? Или не имеет адреса? : -)

Кстати, если вы используете корневой / родительский класс, вы можете создать базовый класс "Child", который ссылается на "Parent" и наследует "Person" и "Address" от этого дочернего класса.

0 голосов
/ 09 июня 2009

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

Если вы хотите иметь более сложную модель реального мира, рассмотрите возможность перехода на терминологию к местоположениям (которые могут даже быть представлены пространственно).

Вопросы * * 1005

  • Человек может относиться к нулю или большему количеству мест (рассмотрим летние и зимние дома)
  • Местоположение существует независимо от того, имеют ли люди, связанные с ним
  • Если человек переезжает домой, подумайте об изменении отношения (раньше жили), а не местоположения. Это обеспечивает большую гибкость в будущем
  • Несколько человек могут быть связаны с одним и тем же местоположением. Это позволяет очень легко найти всех, кто в настоящее время (или ранее) останавливался в месте

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

0 голосов
/ 09 июня 2009

Что дает, что это должно быть двусторонним отношения?

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

0 голосов
/ 09 июня 2009

Адрес не должен знать о существовании человека, я думаю, что это не логика в реальном мире: адрес это просто группа информации (например, улица, город и т. Д.), Он может использоваться письмо или от человека, но в каждом случае оно все равно остается тем, чем оно является, не зная его окружения. Следует только заботиться о информации, строго связанной с ним.

0 голосов
/ 09 июня 2009

По моему мнению, объект Address вообще не знает об объекте Person.
Если это произойдет, то это приведет к подключению системы к системе.
Если вам нужно найти человека по его адресу, вы создаете константу Pepole, у которой есть метод поиска, который выполняет поиск по адресу.

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