Паттерн Фабрика на реальном примере в PHP

  Рет қаралды 10,007

Backend TV

Backend TV

Күн бұрын

#php #designpatterns #programming #программирование Рассказываю как с помощью фабрики избежать дублирования кода.
Старался не пересказать википедию, а показать пример с пользой от использования паттерна.
Друзья, я решил немного сменить формат, приглашаю на новый канал / @live_coding

Пікірлер: 39
@yanbess1
@yanbess1 2 жыл бұрын
Немного не понял почему хелпер отдает фабрику конкретного сервиса, если этот хелпер может сам выступать в роли фабрики, которая возвращает уже непосредственно нужный нам экземпляр класса оплаты. Какая-то усложненная фабрика получилась...
@resolution07
@resolution07 Жыл бұрын
Хелпер используется в качестве какого-то контекста, в рамках которого по коду из paymentType определяет фабрика. По хорошему такое выносится в конфигурационный файл или накрайняк сразу привязывается фабрика к заказу. Авто реально упростил. Основной смысл видео в фабрике.
@back_to_life0
@back_to_life0 2 жыл бұрын
Хоть один нормальный человек показывает на реальных примерах,,, а то рассказыватели про секс рассказывают на примере резиновой бабы постоянно.
@quitting
@quitting Жыл бұрын
Я уже более 5-ти лет занимаюсь программированием и мне всегда было интересно почему дублирование кода это плохо, а дублирование файлов с этим самим кодом хорошо))))))
@SiegeMechanic
@SiegeMechanic Жыл бұрын
полагаю,потому,что если код дублирается в файле,то чаще всего это предполагает то,что повторяющийся код будет прочитан,либо бесконечные кейсы/ифелсы,что нагромождает и делает нечитабельным
@ВладиславКресак-б3ъ
@ВладиславКресак-б3ъ Жыл бұрын
Я тоже не понял, у нас была раскладушка условий, теперь у нас раскладушка условий и еще несколькоко, Фабрик несколько интерфейсов, кода стало больше
@roganovich
@roganovich 2 жыл бұрын
Полезный ролик. И теория и пример
@backendtv1345
@backendtv1345 2 жыл бұрын
спасибо!
@prod.wembley3816
@prod.wembley3816 Жыл бұрын
По-моему тут нужна не фабрика а стратегия
@mrkonst
@mrkonst 2 жыл бұрын
Хотелось бы посмотреть про все паттерны, а так же ссылку на гит с кодом конкретно урока)
@backendtv1345
@backendtv1345 2 жыл бұрын
в планах)
@yalmeme
@yalmeme 8 ай бұрын
в чем проблема просто сделать один класс или функцию payment, в которую передавать вместе с заказом параметр например paymentType и внутри по этой развилке через if/case производить нужные действия? это же элементарная логика. я понимаю зачем можно разнести каждый тип оплаты в отдельный класс, но зачем городить еще интерфейс, хелпер и называть это "паттерн фабрика" - не понимаю.
@wickedtorpedo75
@wickedtorpedo75 2 ай бұрын
Мне кажется либо правила open closed нарушена либо паттерн неправильно реализована
@dirty_monk_17
@dirty_monk_17 2 жыл бұрын
большое спасибо! очень доходчиво, как для новичка, было всё понятно. моё почтение автору ))
@ТимурКамаев-р5л
@ТимурКамаев-р5л 2 жыл бұрын
Все же непонятно, зачем нужна фарбрика в этом случае? Почему в том же хелпере, сразу не возвращать объект реализующий PaymentInterface. Ничего же не измениться, при появлении нового способа оплаты, создаем новый файл - объект и добавляем его в хелпер, который вернет его. Зачем это нужно делать через фабрику? Почему именно фабрика, которая инититься через хелпер, должна нам вернуть объект PaymentInterface, почему сразу из хелпера не вернуть этот объект?
@timofeygaltsev8933
@timofeygaltsev8933 2 жыл бұрын
у меня такой же вопрос :D
@nickyx3
@nickyx3 2 жыл бұрын
Чтоб не раздувать хелпер лишними условиями. Хелпер выдает фабрику по типа оплаты, а уже фабрика может выдать разные реализации. Если брать пример из жизни на пальцах - для безнала в зависимости от типа карты выбрать реализацию для нее, или в зависимости от суммы, выбрать более дешёвый процессинг.
@fitter2boss72
@fitter2boss72 2 жыл бұрын
@@nickyx3 Т.е. если расширения сервиса не предвидится, то и фабрика сервиса не нужна? (Рассматривая пример не всегда видна глубина проблемы. Спасибо за пояснение.)
@nickyx3
@nickyx3 2 жыл бұрын
@@fitter2boss72 В зависимости от стиля и правил принятых в команде. В теории можно вообще на нативном php всё писать 🙂 Вообще, чем больше я тут погружаюсь в лару, тем больше вопросов к некоторым вещам. Из последнего - почему redirect($url,301) выдает код 200 а редирект в теле ответа, а мне надо 301 именно в хидерах, пришлось обойти через response('',301)->header('Location',$url). Но выглядит как костыль
@backendtv1345
@backendtv1345 Жыл бұрын
@@nickyx3 когда Тейлор удалил все пользовательские issue в репе ларавел, все стало ясно)
@igornetineya5389
@igornetineya5389 2 ай бұрын
как ты схему включил в ide? на 8:40)))
@fenix_63
@fenix_63 5 ай бұрын
Так в классе PaymentHelper опять же куча ветвлений. В чём тогда вообще смысл? Мы всё равно не избавились от ветвлений, а только заменили if else на switch
@soversus5374
@soversus5374 3 ай бұрын
Идеально было бы, если бы не было никаких if и case. Например подгружался бы объект, который был выбран при оплате. А так, всеми этими case, получается тот же if, только в другом виде. Таки образом, не надо править код, если потребуется добавить или удалить способ оплаты.
@matveyru2976
@matveyru2976 3 ай бұрын
это можно сделать, например, если мнемоника типа явно коррелирует с именем класса, например "sber" -> SberPayment, либо где-то хранить таблицу соответствия
@Diqeeeeeeeeeei
@Diqeeeeeeeeeei 2 жыл бұрын
Патерн стратегия наверное лучше подойдет?
@palach_666
@palach_666 7 ай бұрын
Да очень схожи
@allinfo3926
@allinfo3926 7 ай бұрын
Я тут не вижу логику. Мы IF заменили на switch. И плодим не IF, а плодим case. В одном файле плодили IF, - сделали фабрику и в другом файле плодим case. И в чем прикол? оО?
@suleymanaliev1459
@suleymanaliev1459 7 ай бұрын
Смотря на схему получается что мы добавляем сущности и расширяем систему, но в классе где описан switch мы изменям. А если избавится от точки изменения? допустим сделать более динамический способ создания сущности и добавлении оплаты в фабрику?
@TheKirk1989
@TheKirk1989 Жыл бұрын
хм, в итоге мы пришли к switch - case хмм.. чот я не понмю такой реализации, наоборот старатются с помощью композиции и наследования уйти от всяких if и подобных ему... Не очень врубался в этот пример, но пришло в голову, что в самом PaymentHelpere может возникнуть необходимость дополнительных методов, в которых придётся делать то-же самое, т.е. для общение с классами продуктами юзать этот присловутый switch-case. Почему нельзя сделать PaymentHalper абстрактным, определить в нём метод получения PaymentMethodGetter который должны будут реализовывать его дочерние классы, а именно VtbPayment , TcsPayment, SberPayment и уже ОНИ будут возвращать эти самые new TcsPaymentFactory(), new SberPaymentFactory() и так далее?
@ТимофейМахотин
@ТимофейМахотин 8 ай бұрын
Я обязательно напишу с чем я не согласен, когда пойму с чем, именно, я не согласен:)
@ВладиславКресак-б3ъ
@ВладиславКресак-б3ъ Жыл бұрын
То есть теперь у нас не только раскладушка ифов а раскладушка кейсов + еще несколько файлов. Я так и не понял зачем
@ВиталийИльинский-з3я
@ВиталийИльинский-з3я 2 жыл бұрын
Выкладывая видео, предварительно глянь - как будут его видеть те, для кого ты стараешьсяю
@potapow8684
@potapow8684 Жыл бұрын
Ну намудрил
@newplayer1334
@newplayer1334 2 жыл бұрын
Огромное спасибо, супер доходчиво и понятно)))
@KimarTV
@KimarTV 2 жыл бұрын
У меня PHP_EOL просто пробел ставит, а не на новую строку переносит
@nickyx3
@nickyx3 2 жыл бұрын
Помнится эта константа переопределяется через ini файл, ну и к тому же перенос строки в ответе с content-type:text/html и будет выглядеть как пробел
@КоляСолдат
@КоляСолдат Жыл бұрын
Шаблоны Java. FactoryMethod (Фабричный метод)
12:22
Eugene Suleimanov
Рет қаралды 95 М.
Bike Vs Tricycle Fast Challenge
00:43
Russo
Рет қаралды 100 МЛН
哈莉奎因怎么变骷髅了#小丑 #shorts
00:19
好人小丑
Рет қаралды 53 МЛН
Will A Guitar Boat Hold My Weight?
00:20
MrBeast
Рет қаралды 251 МЛН
PYTHON )))))
34:22
Winderton
Рет қаралды 129 М.
Фабричный метод
15:48
Volodya Mozhenkov
Рет қаралды 60 М.
G.R.A.S.P | шаблоны проектирования
12:09
Микросервисы для Дебила
9:19
ПИТОНИСТЫ | КИРИЛЛ ПОЗДНЯКОВ
Рет қаралды 38 М.
PHP 8.0 - 8.2 | Производительность и фичи
18:19
Bike Vs Tricycle Fast Challenge
00:43
Russo
Рет қаралды 100 МЛН