Правильный способ создания списка объектов - PullRequest
4 голосов
/ 25 января 2012

Мне всегда было интересно, как мне написать и какой шаблон проектирования использовать для создания списков объектов.

Прежде всего, учтите, что у меня есть класс Customer и класс Order. Я хотел бы получить все заказы, принадлежащие пользователю.

Я бы хотел $ oCustomer-> getOrders (); вернуть массив объектов Order.

По сути, я думал о:

Класс OrderManager, который является одноэлементным и имеет возможность извлекать данные Order из механизма хранения и создавать объекты Order. Но я везде читал, что это плохая практика, так что это не кажется хорошей идеей.

Использование статических методов в классе Order, таких как getOrders (args), но я не уверен, что это реальная точка статических методов.

Использование фабрики (которую я, к сожалению, никогда не использовал) для управления созданием объектов (мне может понадобиться несколько примеров)

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

Это похоже на очень простую задачу, которую я думаю. Но я нигде не смог найти кого-то, кто дал бы «правильный» способ сделать это. Я в порядке с добавлением других классов и т. Д. (Таких как DataMappers, Gateways, ASO ... для обработки поиска и отображения), но я действительно не хочу говорить с ними в моей логике бизнеса.

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 25 января 2012

Посмотрите на шаблон Lazy Load из POEAA :

Lazy Load pattern from POEAA

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

Существует четыре основных варианта ленивой нагрузки. Ленивая инициализация использует специальное значение маркера (обычно нулевое), чтобы указать, что поле не загружено.Каждый доступ к полю проверяет поле на наличие значения маркера и, если он не загружен, загружает его. Виртуальный прокси - это объект с тем же интерфейсом, что и у реального объекта.При первом вызове одного из его методов он загружает реальный объект, а затем делегирует. Value Holder - это объект с методом getValue.Клиенты вызывают getValue для получения реального объекта, первый вызов запускает загрузку. призрак - это реальный объект без каких-либо данных.Когда вы в первый раз вызываете метод, призрак загружает полные данные в свои поля.

Для дополнительных шаблонов рассмотрите Репозиторий и посмотрите на Data Source ArchitecturalУзоры .В общем, когда у вас много проблем с объектно-реляционным поведением, рассмотрите возможность использования ORM, например Doctrine2.

0 голосов
/ 25 января 2012

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

http://en.wikipedia.org/wiki/Data_access_object

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