У меня есть (концептуально) довольно простая прикладная спецификация, которую я реализую на PHP – большая ее часть состоит из загрузки данных проекта, отображения ее, позволяющей пользователю ее редактировать (потенциально добавляя разделы), а затем отправлять указанные данные обратно базы данных.
Я планирую подойти к нему так:
У вас есть набор базовых объектов «Загрузить» (например, ProjectLoad, FormLoad), которые принимают идентификатор при создании, запрашивают базу данных и заполняют собой извлеченные данные. Эти объекты затем могут использоваться для заполнения элементов страницы.
Имейте еще один набор объектов «Сохранить» (например, ProjectSave, FormSave), которые принимают массивы (возвращаются при отправке страницы), заполняют эти данные и затем выполняют операции INSERT\UPDATE
в базе данных.
Это лишнее дублирование? Я просто обращаюсь к 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, вы можете также проверить темы о шаблонах проектирования :
Согласно Википедии:
В разработке программного обеспечения шаблон разработки программного обеспечения является общим многоразовым решением для часто встречающейся проблемы … Шаблоны проектирования – это формализованные передовые методы, которые программист может использовать для решения общих проблем при разработке приложения или системы.