Агрегированные объекты - PullRequest
1 голос
/ 30 апреля 2009

Если у вас есть класс A, который является совокупностью классов B и C, лучше ли это для A

  • для хранения идентификаторов для B и C
  • для загрузки и сохранения всего объекта для B и C (редактирование, сохранение по ссылке на объект B / C, т.е. создание экземпляров объектов B и C, а не сохранение идентификаторов для B и C.
  • хранить идентификаторы и предоставлять методы для извлечения методов B и C

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

Ответы [ 4 ]

3 голосов
/ 30 апреля 2009

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

Загрузка и хранение «всего объекта» является сомнительной концепцией. Я знаю, что вы пытаетесь быть независимым от языка, но одна из первых вещей, которые действительно помогли мне «получить» ОО, заключается в том, что почти у каждого объекта должен быть свой жизненный цикл.

Если у вас есть объект A, который «содержит» объект B, и вы передаете ссылку на объект B на объект C, тогда объект A должен что-то знать об объекте C, это совершенно НЕ нормально. Освобождение жизненного цикла объекта B, чтобы объект A ничего не знал об объекте C, является одной из основных концепций, которая заставляет ОО работать.

Так что, если вы имели в виду, что хранили весь объект, то нет - никогда не делайте этого.

И это относится и к базам данных и другим хранилищам. Даже если один объект отвечает за уничтожение другого, он редко должен содержать данные других объектов.

И (хотя я думаю, что вы хотели сказать «тянуть объекты B и C», а не «методы»), концепция возможности передавать объект от другого также очень полезна, и в этом нет ничего плохого одно предостережение:

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

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

2 голосов
/ 30 апреля 2009

Я склонен загружать и хранить целые объекты (и их подобъекты) в качестве моего подхода по умолчанию.

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

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

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

1 голос
/ 30 апреля 2009

Зависит от

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

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

1 голос
/ 30 апреля 2009

Это зависит от ситуации. Если объекты остаются в памяти, то в OO (и проще) иметь A, содержащую B и C. Я обнаружил, что если объекты необходимо сохранить, тем не менее, это упрощает и повышает эффективность хранения A B и C. (Таким образом, если вам нужны данные непосредственно в A, но не в B и C, вам не нужно будет извлекать B и C из базы данных, файла и т.

...