Как придерживаться разделения ответственности между репозиториями?
В приложении есть необходимость получить список юзеров с постами для каждого из юзеров:
[ {id: 1, username: 'xyz', age: 22, posts: [{id: 1, title: 'first post'}, {id: 2, username: 'aaa', age: 41, posts: [{id: 41, title: 'hello'}, ] // и так далее... |
[ {id: 1, username: 'xyz', age: 22, posts: [{id: 1, title: 'first post'}, {id: 2, username: 'aaa', age: 41, posts: [{id: 41, title: 'hello'}, ] // и так далее...
У меня уже отдельно имплементированы репозитории где можно получить либо только юзеров, либо только посты.
Для юзкейса с получением юзеров включая в них посты, будет ли ок сначала получить юзеров и потом для них фетчить посты?
const users = await this.userRepository.findLatest(); const postsByUserIds = await this.postRepository.findByUserIds(users.map(user => user.id)); return users.map((user) => { return { ...user, posts: postsByUserIds(user.id) } }) |
const users = await this.userRepository.findLatest(); const postsByUserIds = await this.postRepository.findByUserIds(users.map(user => user.id)); return users.map((user) => { return { ...user, posts: postsByUserIds(user.id) } })
Или же лучше создать в UserReposotory метод findWithPosts в котором просто дополнительно тянуть посты для каждого юзера?
Просто в этом случае тогда вроде как нарушается разделение ответственности. Но такой способ вроде выглядит проще.
А предыдущий - в плане разделения ответственности гуд, но по производительности из-за дополнительных циклов вроде бы хуже.
Дополнительно:
Пусть клиент тянет то, что ему нужно. Твоя работа сделать чистое api, будешь пытаться каждый случай покрывать end-поинтом получится примерно так-же, как с 100% покрытием тестами
Ответы:
1) Используйте ORM, там эти проблемы уже решены.
2) Самый правильный вариант - получать посты по требованию (так называемый lazy loading). Я это говорю, опираясь на то предположение, что пользователь может написать тысячи постов по тысяче символов. Если постов не много и они короткие - можно получать сразу всё через JOIN.
3) Получать список пользователей вместе со список их постов в API звучит как анти-паттерн какой-то. Точно ли такой роут необходим или есть возможность получить посты для выбранного пользователя отдельно?
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для эффективной работы с репозиториями и разделения ответственности между ними, существует несколько bewst practices, которые могут помочь вам справиться с этой задачей:
1. Один проект - один репозиторий: Для удобства управления кодом и его изменениями, рекомендуется держать весь код одного проекта в одном репозитории. Это позволит легче отслеживать изменения, управлять версиями и контролировать доступ к коду.
2. Использование веток: Для разделения ответственности между разработчиками и различными частями проекта, можно использовать ветки в репозитории. Каждая ветка может быть отведена под определенную функциональность или задачу, что позволит разработчикам работать независимо друг от друга, не мешаясь в изменениях.
3. Использование подмодулей: Если ваш проект состоит из нескольких независимых компонентов или библиотек, можно использовать подмодули в гите. Это позволит хранить различные части проекта в отдельных репозиториях, сохраняя при этом связь между ними.
4. Использование системы управления зависимостями: Для управления зависимостями между различными частями проекта, рекомендуется использовать системы управления зависимостями, такие как Composer для PHP проектов. Это позволит автоматически устанавливать и обновлять необходимые библиотеки и компоненты.
Пример использования в коде PHP: