169 похожих чатов

Подскажите в сторону какого паттерна(паттернов) можно покопаться? Причем не охота в

SocialService в каждом методе на каждый вызов постоянно создавать новый класс

Псевдо код:

19 ответов

12 просмотров
Никита- Автор вопроса

Немного поправил

DI можно заюзать (dependency injection). Получится примерно так: class SocialService { public function _construct( protected TGSocialService $telegramService, protected VKSocialServics $vkService ) {} public function delete(Post $post): void { some_condition ? $this->telegramService->delete($post) : $this->vkService->delete($post); } // ... } // Code for the customers $posts->each( fn (Post $post) => $this->socialService->delete($post) );

можно просто app(ClassName::class)->method()

Никита
screenshot Немного поправил

как выглядет сам кондишн?)

Никита- Автор вопроса
Andrey Helldar
DI можно заюзать (dependency injection). Получится...

ну DI не очень хочу, т.к. один из сервисов вообще может ни разу не заюзаться в ходе жизненного цикла, хочу сделать наверное отложенную инициализацию через геттеры и сеттеры. Тут больше вопрос в том что сервисов может быть и не 2 и не 3, хотелось удобную масштабируемость иметь. Куча if-ов городить не хочется

Никита
screenshot Немного поправил

Паттерн Фабричный как будет?)

Никита
ну DI не очень хочу, т.к. один из сервисов вообще ...

ну в данном сервисе через геттер пробрасывай нужный провайдер нужной сети. А выше где-то его разруливай через фабрику

Никита
ну DI не очень хочу, т.к. один из сервисов вообще ...

Юзай match: protected function service(Post $post): SocialService { return match(true) { condition_1 => new TgSocialService(), condition_2 => new VKSocialService(), condition_3 => new ..., default => ... } } public function delete(Post $post): void { $this->service($post)->delete($post); }

Никита- Автор вопроса
Andrey Helldar
Юзай match: protected function service(Post $pos...

только опять таки на каждый вызовы новый объект)

Никита
только опять таки на каждый вызовы новый объект)

хочешь чтобы создавалсь только один обьект?

Никита- Автор вопроса

protected function service(Post $post): SocialService { return match(true) { condition_1 => $this->getTgService(), condition_2 => $this->getVkService(), condition_3 => new ..., default => ... } private function getTgService(): TgService { if(!$this->tgService) { $this->tgService = new TgService(); } return $this->tgService; } } public function delete(Post $post): void { $this->service($post)->delete($post); }

Класс разрастется, тебе на каждый сервис добавлять метод и свойство. Храни в свойстве-массиве все инициализированные

Никита- Автор вопроса
Nikita
Класс разрастется, тебе на каждый сервис добавлять...

Как вариант. Разрастается конечно, но уже не так критично.

Никита
protected function service(Post $post): SocialServ...

protected function service(Post $post): SocialService { return match(true) { condition_1 => $this->getService(TgSocialService::class), condition_2 => $this->getService(VKSocialService()), condition_3 => new ..., default => ... } private function getService(string $class): SocialService { if(isset($this->services[$class]) { return $this->services[$class]; } return $this->services[$class] = new $class(); } } public function delete(Post $post): void { $this->service($post)->delete($post); }

похоже у тебя перевернуто немного. я очень сомневаюсь, что нагромождение if-ов тебе нужно. и match - это тоже теже ифы, погоду не меняют. у тебя есть класс SocialServices, который вызывает сервисы, которые выглядят как подтипы этого сервиса, что не так, т.е. нестыковка логики. куда логичнее было б, что TgSocialService является подтипом SocialService. этот код как не пиши будет выглядеть всегда уродливо. тебе же надо инжектить SocialService (абстракцию) - а уже передавать необходимый подтип, Tg,Vk и прочие. Посмотри паттерн адаптер и декоратор на эту тему. у тебя по сути получилось некоторое подобие фабрики, но топорное, а ваще переизобретаешь сервис контейнер ларки. на счет ветвления логики посмотри паттерн стратегия. ну и еще как вариант, ты можешь сделать обычный массив в конфигурации, например tg => App\Services\TgService, vk => App\Services\VkServices и таким образом по ключу вытаскивать нужную реализацию и еще: у тебя в примере some_condition ? A : B, где B получилось дефолтным значением. этот момент тоже лучше обыграть, т.е. ты либо матчишь по ключу и возвращаешь сервис, либо кидаешь эксепшен, если такого сервиса нет, либо возвращаешь дефолтный сервис.

Похожие вопросы

Обсуждают сегодня

Мужики и девушки, привет) в Вelphi xe7 в настройках во вкладке "Editor Options" далее " Color" есть список: "Elements", открыв который мы можем настраивать отображение разных...
Kraszx
14
Добрый вечер. Есть вопрос, а может и предложение. Был у меня диалог в другой группе о делфи и я задался вопросом: "А нельзя ли в делфи цвет //коментария и {комментария} сде...
Kraszx
24
как быть с принтером? такой подход прокатит?
zamtmn
12
Всем привет! Подскажи, пожалуйста, как передать в TComboBox сразу значение и id записи. На Delphi я делал так: ComboBox1.Items.AddObject('Какое-то значение', Pointer(id запис...
Евгений
13
Мдя, прикол, боевая сборка запускается (именно под отладчиком) после F9 примерно полторы минуты (97 секунд если быть точным). Начал копать - проблема детектится сразу - зависа...
Александр (Rouse_) Багель
38
А вот это что за конструкция? Вернее, она тут нафига?
Serjone
10
Привет. Подскажите, как правильно сматчить лист фиксированного размера, чтобы компилятор не говорил мне о неполном паттерне? Допустим что-то такое [x', y'] = sort [x, y]?
Arseny
8
Здравствуйте, вопрос по структурам данных. Были у вас случаи, когда пришлось писать деревья или двунаправленные списки?
/ /
50
Товарищи, кто работа с iphelper? Или может я в самой логике ошибки фигачу, не пойму.... var ifTable : PMIB_IFTABLE; size, corSize: DWORD; Buffer ...
Warfarellen
4
Мужики. привет) в Вelphi xe7 в настройках во вкладке "Editor Options" далее " Color" есть список: "Elements", открыв который мы можем настраивать отображение разных элементов...
Kraszx
2
Карта сайта