Я пытался включить шаблон репозитория в свое PHP-приложение, примерно следуя этот пример.
Я пытаюсь выбрать между:
Принятый ответ в теме, на которую я ссылаюсь, показывает способ реализации варианта 1. Второй ответ показывает, почему вместо этого может быть лучше извлекать полные объекты.
В моем случае получение полных объектов часто включает в себя получение от 50 до 250 полей. Получите массив этих объектов, и это будет много полей, которые могут повлиять на производительность приложения. Вот почему я склоняюсь к тому, чтобы быть избирательным в отношении того, какие поля я извлекаю, поскольку мне обычно требуется до 10 для выполнения обычных операций.
Если я выберу выборочный подход, то не смогу использовать объекты предметной области для хранения данных и могу столкнуться с проблемами, упомянутыми во «втором ответе».
- You end up with essentially the same data across many queries. For example, with a User, you'll end up writing essentially the same select * for many calls. One call will get 8 of 10 fields, one will get 5 of 10, one will get 7 of 10. Why not replace all with one call that gets 10 out of 10? The reason this is bad is that it is murder to re-factor/test/mock.
- It becomes very hard to reason at a high level about your code over time. Instead of statements like "Why is the User so slow?" you end up tracking down one-off queries and so bug fixes tend to be small and localized.
- It's really hard to replace the underlying technology. If you store everything in MySQL now and want to move to MongoDB, it's a lot harder to replace 100 ad-hoc calls than it is a handful of entities.
Я по-прежнему мог бы использовать объекты домена для операций Create Update и Delete, но операции Read должны были бы храниться в простых объектах или ассоциативных массивах в соответствии с Шаблон CQRS. В настоящее время у меня есть несколько более сложных запросов, которые включают соединения, которые было бы трудно реплицировать с объектами домена, без дополнительных вызовов БД и обработки, которые база данных обычно обрабатывает в 1 запросе.
Учитывая все это, имеет ли смысл использовать объекты предметной области только для операций чтения или вообще? Я упускаю какие-то другие преимущества, которые могут предоставить объекты предметной области, чтобы помочь с проблемами, которые я изложил?






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