Двойная загрузка / сохранение объектов в OOPHP – ненужное дублирование?

У меня есть (концептуально) довольно простая прикладная спецификация, которую я реализую на PHP – большая ее часть состоит из загрузки данных проекта, отображения ее, позволяющей пользователю ее редактировать (потенциально добавляя разделы), а затем отправлять указанные данные обратно базы данных.

Я планирую подойти к нему так:

  • У вас есть набор базовых объектов «Загрузить» (например, ProjectLoad, FormLoad), которые принимают идентификатор при создании, запрашивают базу данных и заполняют собой извлеченные данные. Эти объекты затем могут использоваться для заполнения элементов страницы.

  • Имейте еще один набор объектов «Сохранить» (например, ProjectSave, FormSave), которые принимают массивы (возвращаются при отправке страницы), заполняют эти данные и затем выполняют операции INSERT\UPDATE в базе данных.

Это лишнее дублирование? Я просто обращаюсь к OOPHP, и все советы, которые я видел до сих пор, как представляется, указывают на то, что лучше всего пытаться сохранить все (объекты, методы и т. Д.) Как можно более целенаправленные и одноцелевые. Это, похоже, соответствует этим критериям, но есть ли лучший способ?

Related of "Двойная загрузка / сохранение объектов в OOPHP – ненужное дублирование?"

Похоже, вам удалось провести мозговой штурм на пути к двум концепциям:

  • основная идея Data Mappers

  • разделение логики для создания новых записей и логики для извлечения данных (эта идея действительно важна в CQRS , особенно в контексте Event Sourcing )

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

Что касается ваших вопросов ..
Если вы не сделаете что-то глупое, в вашем «загрузочном объекте» и «сохранить объекты» не будет много дублирования … хотя вы, вероятно, извлечете там один или два суперкласса.

«Совет, который вы видели», на самом деле называется принципом единой ответственности и является, TBH, является одним из наиболее туманных концепций в ООП. Это как определение, что такое «порно» это – знаете, когда вы видите его.

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

 $project = new Entity\Project; $mapper = new Mapper\Project($pdo); $project->setId(43); $mapper->load($project); //pulls data about project 43 from DB if ($project->getDeadline() > time()) { $project->setStatus(Entity\Project::STATUS_OVERDUE); $mapper->save($project); //pushes changed state to DB } 

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

Если вы действительно находитесь в OOPHP, вы можете также проверить темы о шаблонах проектирования :

  • Шаблоны проектирования ООП – для базовых (строительных блоков) шаблонов проектирования.
  • Шаблоны архитектуры приложений Мартина Фаулера – расширенные шаблоны проектирования

Согласно Википедии:

В разработке программного обеспечения шаблон разработки программного обеспечения является общим многоразовым решением для часто встречающейся проблемы … Шаблоны проектирования – это формализованные передовые методы, которые программист может использовать для решения общих проблем при разработке приложения или системы.