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

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

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

Псевдо код:

19 ответов

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

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

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 получилось дефолтным значением. этот момент тоже лучше обыграть, т.е. ты либо матчишь по ключу и возвращаешь сервис, либо кидаешь эксепшен, если такого сервиса нет, либо возвращаешь дефолтный сервис.

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта