PHP datamapper – зачем использовать их для не-коллекционных объектов?

Возможно, это вопрос с тривиальным ответом, но, тем не менее, это заводит меня на пару дней, поэтому я хотел бы услышать ответ. Недавно я просмотрел много информации, связанной с созданием настраиваемого datamapper для моего собственного проекта (и не используя ORM), и прочитал несколько потоков на stackoverflow или других веб-сайтах.

Мне кажется очень убедительным, что у меня есть объекты AuthorCollection , которые в основном представляют собой только контейнер экземпляров Author или BookCollection , которые содержат несколько экземпляров Book . Но зачем нужен картограф для одного объекта Author ? Все критерии выборки, о которых я могу думать (кроме тех, кто запрашивает объект с указанным BookID или AuthorID ), возвратят несколько экземпляров Book или Author следовательно, экземпляры BookCollection или AuthorCollection . Итак, зачем беспокоиться о картографе для отдельных объектов, если тот, который подходит для соответствующей коллекции, является более общим, и вам не нужно быть уверенным, что ваши критерии вернут только один результат?

Заранее спасибо за вашу помощь.

Короткий ответ

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

Примечание . Выбор этого маршрута означает, что вы должны тщательно следить за нарушениями SRP .


Длинные (er) ответы

Все зависит от того, что вы пытаетесь сделать. Для этого сообщения давайте назовем AuthorMapper преобразователем данных и AuthorCollectionMapper средством сбора данных коллекции.

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

Одна из основных частей этих «специфичных для коллекции вещей», которые я раскрываю, – это условия 1 и способы их реализации в запросах. Часто в сборщиках вы, вероятно, будете иметь более продвинутые, более длинные и утомительные запросы, чем то, что обычно находится внутри устройства отображения данных элемента. Несмотря на то, что вы можете комбинировать свой средний запрос данных картографического объекта ( SELECT ... WHERE id = :id ) со сложным запросом сборщика карт без использования вонючего условия 2 , он становится более сложным и по-прежнему беспокоит базу данных для выполнения длинного запроса, когда все, что ему нужно, было простым, общим.

Кроме того, хотя вы указали на то, что с помощью элемента mapper мы действительно получаем только первичный ключ, он обычно оказывается радикально более простым с использованием устройства отображения элементов для других вещей. Методы save() и remove() метода сопоставления элементов могут обрабатывать (с правильной реализацией) работу лучше, чем пытаться использовать сборщик карт для сохранения / удаления элементов. И, наряду с этим, также становится очевидным, что время от времени с помощью метода save() и remove() сборщика сборщик может захотеть использовать методы сопоставления элементов.

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

1. Условие здесь означает свойство, заданное в экземпляре коллекции, которое запрос сборщика отображает как обрабатывать. Если вы еще этого не сделали, посмотрите здесь @ tereško .
2. Это условие другое и относится к «злым, если» говорят люди. Если вы не понимаете их гнусности, я бы предложил посмотреть некоторые чистые коды. Это конкретно, но все отлично.