Как правильно подобрать архетикуру (ООП) для задачи? Не могу правильно подобрать архитектуру для задачи, пишу что-то наподобии агрегатора сайтов.
Есть модель Account c такими полями: login, password, provider_name
Есть класс Manager, в конструктор которого передается модель Account. В классе Manager есть метод getProvider(). Который инициализирует и возвращает объект класса Provider в соответствии со значением свойства provider_name в модели Account.
На каждый агрегируемый сайт есть свой класс Provider который может имплетировать интерфейсы например: ProfileInterface, MessageInterface, NewsInterface и т.д.
Интерфейсы описывают основные методы для работы с сайтом. Что бы можно было работать в цикле (при помощи конструкции instanceof) с разными сайтами не думая о том что происходит внутри класса Provider.
Так вот получается что когда класс Provider имплементирует несколько интерфейсов - то все хорошо, но когда количество имплементируеммых интерфейсов становится больше 5-10, то файл становится не читаемым, слишком много методов в классе Provider.
Допустим есть такие провайдеры:Social/VK/ProviderSocial/OK/ProviderSocial/Facebook/Provider
Класс Manager получая в конструкторе объект Account по полю provider_name находит нужный Provider, например Social/VK/Provider и инициализирует его и возвращает объект Provider. То есть проводится авторизация на сайте Вконтакте в конструкторе класса Provider.
Дальше есть задача получить новости со всех аккаунтов:foreach($accounts as $account) {
$provider = Manager::getProvider($account);
if ($provider instanceof NewsInterface) {
$news = $provider->getNews();
//...
} else continue;
}
Я первым делом вспомнил про трейты, но дело в том что методы из разных интерфейсов могут использовать друг друга (например трейт описывающий реализацию интерфейса MessageInterface использует трейт описывающий реализацию интерфейса ProfileInterface). Да и почти в каждом трейте идет работа с БД коннект которого находится в свойстве объекта Provider.
В общем трейты работают, но не эстетически красиво. Я уверен что есть более красивая реализация, только не могу ее найти.
Заранее спасибо за любое замечание и предложение =)

21 Авг 2019 в 07:05
281 +1
0
Ответы
1

Для данной задачи можно использовать паттерн проектирования "Фасад". В этом случае вы можете создать класс-фасад, который будет объединять все необходимые операции для работы с различными провайдерами.

Вы можете создать отдельные классы для каждого провайдера и интерфейсов, которые они имплементируют. Затем в классе-фасаде вы можете реализовать методы для работы с каждым провайдером, вызывая нужные методы из соответствующего класса провайдера.

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

Также, вы можете использовать инверсию управления (Dependency Injection), чтобы предоставлять экземпляры провайдеров в класс Manager через конструктор или методы, вместо создания их внутри класса Manager. Это упростит тестирование кода и сделает его более гибким.

Надеюсь, эти советы помогут вам выбрать более подходящую архитектуру для вашего проекта.

20 Апр в 13:07
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 92 548 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир