Как придерживаться разделения ответственности между репозиториями?
В приложении есть необходимость получить список юзеров с постами для каждого из юзеров:
|
1 |
[ {id: 1, username: 'xyz', age: 22, posts: [{id: 1, title: 'first post'}, {id: 2, username: 'aaa', age: 41, posts: [{id: 41, title: 'hello'}, ] // и так далее... |
У меня уже отдельно имплементированы репозитории где можно получить либо только юзеров, либо только посты.
Для юзкейса с получением юзеров включая в них посты, будет ли ок сначала получить юзеров и потом для них фетчить посты?
|
1 |
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 звучит как анти-паттерн какой-то. Точно ли такой роут необходим или есть возможность получить посты для выбранного пользователя отдельно?
Для решения данной проблемы вы можете воспользоваться услугами фрилансеров. Мы выполним необходимую работу быстро и качественно.
Оставить комментарий Отменить
Ответы
- Есть ответ! к записи Как уменьшить масштаб меньше 100% в Windows 10 (22H2)
- Есть ответ! к записи Аналоги CloudFlare в России?
- Есть ответ! к записи Аналоги CloudFlare в России?
- Есть ответ! к записи Как называется человек, который дизайн придумает для сайта и сверстает его?
- Есть ответ! к записи Можно ли установить Яндекс.Диск на АльтЛинукс?
- Есть ответ! к записи Картинки мутные только на сафари, есть выход?
- Есть ответ! к записи Keenetic. Как настроить SSTP клиент с сертификатом?
- Есть ответ! к записи Чем заменить executor в aiogram 3?
Для эффективной работы с репозиториями и разделения ответственности между ними, существует несколько bewst practices, которые могут помочь вам справиться с этой задачей:
1. Один проект - один репозиторий: Для удобства управления кодом и его изменениями, рекомендуется держать весь код одного проекта в одном репозитории. Это позволит легче отслеживать изменения, управлять версиями и контролировать доступ к коду.
2. Использование веток: Для разделения ответственности между разработчиками и различными частями проекта, можно использовать ветки в репозитории. Каждая ветка может быть отведена под определенную функциональность или задачу, что позволит разработчикам работать независимо друг от друга, не мешаясь в изменениях.
3. Использование подмодулей: Если ваш проект состоит из нескольких независимых компонентов или библиотек, можно использовать подмодули в гите. Это позволит хранить различные части проекта в отдельных репозиториях, сохраняя при этом связь между ними.
4. Использование системы управления зависимостями: Для управления зависимостями между различными частями проекта, рекомендуется использовать системы управления зависимостями, такие как Composer для PHP проектов. Это позволит автоматически устанавливать и обновлять необходимые библиотеки и компоненты.
Пример использования в коде PHP:
// Пример разделения ответственности между классами в PHP class User { private $name; public function __construct($name) { $this->name = $name; } public function getName() { return $this->name; } } class UserRepository { private $users = []; public function addUser(User $user) { $this->users[] = $user; } public function getUsers() { return $this->users; } } $user = new User('John Doe'); $userRepository = new UserRepository(); $userRepository->addUser($user); $users = $userRepository->getUsers(); foreach ($users as $user) { echo $user->getName() . "