Разработка DataMapper для объектов, которые иногда должны объединять другие объекты, но не всегда - PullRequest
0 голосов
/ 26 февраля 2011

У меня есть объект ученик, который отображается на таблицу ученика.Существует также таблица курсов и таблица user_courses для назначения студентов на курсы.У этого объекта ученика может быть много объектов курса, и поэтому с моим DataMapper учеников он будет извлекать объекты студента и любые объекты курса для курсов, в которые зачислен студент. Это прекрасно работает в тех случаях, когда мне нужна вся эта информация, нов тех случаях, когда мне нужно только отобразить имя и фамилию студента, поиск объектов курса не требуется.Мой вопрос: как мне спроектировать мои dataMappers для учета этого?Должны ли у меня быть отдельные средства отображения для разных уровней объектов учащихся, т.е. baseStudentObject с только базовой информацией об ученике и затем extendedStudentObject, который дополнительно включает объекты курса?Или лучше реализовать какое-нибудь решение для отложенной загрузки?Как всегда, все отзывы очень ценятся!Приветствия.

1 Ответ

1 голос
/ 26 февраля 2011

Я бы сказал, что это компромисс. В плане дизайна лучше всего выбрать ленивый маршрут погрузки. Вы не действительно хотите, чтобы искусственно различные типы учеников плавали вокруг, засоряя модель вашего домена. Конечно, это не конец света, если у вас есть простой Student и StudentWithCourses в качестве быстрого взлома, но он может быстро запутаться. Вы можете получить StudentWithContacts или StudentWithCoursesButNotContacts и т. Д. ... вы понимаете, моя точка зрения - это не совсем объектно-ориентированный дизайн. При ленивой загрузке в вашей модели будет только один объект Student, который ближе к реальному домену.

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

(или, конечно, вы можете использовать существующий ORM для отображения данных, например Doctrine .)

...