2012-01-25 2 views
4

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

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

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

В принципе, я думал о:

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

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

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

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

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

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

+0

Поскольку вы не подтвердили или не ответили ни на один из существующих ответов, можете ли вы, пожалуйста, обновить свой вопрос с более подробной информацией о том, что вы ищете в ответ. Благодарю. – Gordon

ответ

2

Посмотрите на Lazy Load pattern from POEAA:

Lazy Load pattern from POEAA

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

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

Для дополнительных моделей, рассмотреть Repository и взглянуть на Data Source Architectural Patterns. В общем, когда у вас много проблем с Object-Relational Behavioral, подумайте об использовании ORM, например Doctrine2.

+1

@ user1159791 Либо вытащите полный граф объекта при создании клиента, либо используйте Lazy Loading с любым из перечисленных выше опций. В качестве альтернативы, добавьте репозиторий заказов в клиентов. – Gordon

0

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

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

+0

Привет, Это может помочь получить данные, но я не уверен, как это позволит мне создать список объектов, проблема остается прежней. Если я хорошо понимаю, DAO позволит мне обрабатывать хранение данных и сопоставление с моим объектом buisness. Но я должен был бы попросить DAO создать список объектов, который я не хочу. Плюс у меня было бы 1 DAO для каждого объекта buisness, который бы быстро стал беспорядочным – user1159791

+0

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

+0

Я просто хочу всегда использовать свои объекты buisness, когда я работаю над логикой buisness. Мне нужно, чтобы абстракция уровня доступа к данным полностью дополнялась логикой работы приложения. Не уверен, ясно ли я. Может быть, это очень плохая практика, я действительно не знаю: s – user1159791

Смежные вопросы