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

แชร์
ฝัง
  • เผยแพร่เมื่อ 13 ก.ย. 2024
  • #php #designpatterns #programming #программирование Рассказываю как с помощью фабрики избежать дублирования кода.
    Старался не пересказать википедию, а показать пример с пользой от использования паттерна.
    Друзья, я решил немного сменить формат, приглашаю на новый канал / @live_coding

ความคิดเห็น • 39

  • @yanbess1
    @yanbess1 2 ปีที่แล้ว +21

    Немного не понял почему хелпер отдает фабрику конкретного сервиса, если этот хелпер может сам выступать в роли фабрики, которая возвращает уже непосредственно нужный нам экземпляр класса оплаты. Какая-то усложненная фабрика получилась...

    • @resolution07
      @resolution07 ปีที่แล้ว

      Хелпер используется в качестве какого-то контекста, в рамках которого по коду из paymentType определяет фабрика. По хорошему такое выносится в конфигурационный файл или накрайняк сразу привязывается фабрика к заказу. Авто реально упростил. Основной смысл видео в фабрике.

  • @dirty_monk_17
    @dirty_monk_17 2 ปีที่แล้ว +5

    большое спасибо! очень доходчиво, как для новичка, было всё понятно. моё почтение автору ))

  • @quitting
    @quitting ปีที่แล้ว +4

    Я уже более 5-ти лет занимаюсь программированием и мне всегда было интересно почему дублирование кода это плохо, а дублирование файлов с этим самим кодом хорошо))))))

    • @SiegeMechanic
      @SiegeMechanic ปีที่แล้ว

      полагаю,потому,что если код дублирается в файле,то чаще всего это предполагает то,что повторяющийся код будет прочитан,либо бесконечные кейсы/ифелсы,что нагромождает и делает нечитабельным

    • @user-nz6kh2bz1c
      @user-nz6kh2bz1c ปีที่แล้ว +3

      Я тоже не понял, у нас была раскладушка условий, теперь у нас раскладушка условий и еще несколькоко, Фабрик несколько интерфейсов, кода стало больше

  • @user-be4qc1hw4b
    @user-be4qc1hw4b 2 ปีที่แล้ว +5

    Все же непонятно, зачем нужна фарбрика в этом случае? Почему в том же хелпере, сразу не возвращать объект реализующий PaymentInterface. Ничего же не измениться, при появлении нового способа оплаты, создаем новый файл - объект и добавляем его в хелпер, который вернет его. Зачем это нужно делать через фабрику? Почему именно фабрика, которая инититься через хелпер, должна нам вернуть объект PaymentInterface, почему сразу из хелпера не вернуть этот объект?

    • @timofeygaltsev8933
      @timofeygaltsev8933 2 ปีที่แล้ว +2

      у меня такой же вопрос :D

    • @nickyx3
      @nickyx3 2 ปีที่แล้ว +2

      Чтоб не раздувать хелпер лишними условиями. Хелпер выдает фабрику по типа оплаты, а уже фабрика может выдать разные реализации. Если брать пример из жизни на пальцах - для безнала в зависимости от типа карты выбрать реализацию для нее, или в зависимости от суммы, выбрать более дешёвый процессинг.

    • @fitter2boss72
      @fitter2boss72 2 ปีที่แล้ว

      @@nickyx3 Т.е. если расширения сервиса не предвидится, то и фабрика сервиса не нужна? (Рассматривая пример не всегда видна глубина проблемы. Спасибо за пояснение.)

    • @nickyx3
      @nickyx3 2 ปีที่แล้ว

      @@fitter2boss72 В зависимости от стиля и правил принятых в команде. В теории можно вообще на нативном php всё писать 🙂
      Вообще, чем больше я тут погружаюсь в лару, тем больше вопросов к некоторым вещам. Из последнего - почему redirect($url,301) выдает код 200 а редирект в теле ответа, а мне надо 301 именно в хидерах, пришлось обойти через response('',301)->header('Location',$url). Но выглядит как костыль

    • @backendtv1345
      @backendtv1345  ปีที่แล้ว +1

      @@nickyx3 когда Тейлор удалил все пользовательские issue в репе ларавел, все стало ясно)

  • @newplayer1334
    @newplayer1334 2 ปีที่แล้ว

    Огромное спасибо, супер доходчиво и понятно)))

  • @soversus5374
    @soversus5374 3 หลายเดือนก่อน

    Идеально было бы, если бы не было никаких if и case. Например подгружался бы объект, который был выбран при оплате.
    А так, всеми этими case, получается тот же if, только в другом виде.
    Таки образом, не надо править код, если потребуется добавить или удалить способ оплаты.

    • @matveyru2976
      @matveyru2976 2 หลายเดือนก่อน +1

      это можно сделать, например, если мнемоника типа явно коррелирует с именем класса, например "sber" -> SberPayment, либо где-то хранить таблицу соответствия

  • @wickedtorpedo75
    @wickedtorpedo75 หลายเดือนก่อน

    Мне кажется либо правила open closed нарушена либо паттерн неправильно реализована

  • @fenix_63
    @fenix_63 5 หลายเดือนก่อน +1

    Так в классе PaymentHelper опять же куча ветвлений. В чём тогда вообще смысл? Мы всё равно не избавились от ветвлений, а только заменили if else на switch

  • @roganovich
    @roganovich 2 ปีที่แล้ว

    Полезный ролик. И теория и пример

  • @prod.wembley3816
    @prod.wembley3816 ปีที่แล้ว +3

    По-моему тут нужна не фабрика а стратегия

  • @yalmeme
    @yalmeme 7 หลายเดือนก่อน +1

    в чем проблема просто сделать один класс или функцию payment, в которую передавать вместе с заказом параметр например paymentType и внутри по этой развилке через if/case производить нужные действия? это же элементарная логика. я понимаю зачем можно разнести каждый тип оплаты в отдельный класс, но зачем городить еще интерфейс, хелпер и называть это "паттерн фабрика" - не понимаю.

  • @igornetineya5389
    @igornetineya5389 2 หลายเดือนก่อน

    как ты схему включил в ide? на 8:40)))

  • @mrkonst
    @mrkonst 2 ปีที่แล้ว +1

    Хотелось бы посмотреть про все паттерны, а так же ссылку на гит с кодом конкретно урока)

  • @Diqeeeeeeeeeei
    @Diqeeeeeeeeeei 2 ปีที่แล้ว +2

    Патерн стратегия наверное лучше подойдет?

    • @palach_666
      @palach_666 6 หลายเดือนก่อน

      Да очень схожи

  • @suleymanaliev1459
    @suleymanaliev1459 7 หลายเดือนก่อน

    Смотря на схему получается что мы добавляем сущности и расширяем систему, но в классе где описан switch мы изменям. А если избавится от точки изменения? допустим сделать более динамический способ создания сущности и добавлении оплаты в фабрику?

  • @back_to_life0
    @back_to_life0 2 ปีที่แล้ว +4

    Хоть один нормальный человек показывает на реальных примерах,,, а то рассказыватели про секс рассказывают на примере резиновой бабы постоянно.

  • @user-wy2kp1hh5g
    @user-wy2kp1hh5g 2 ปีที่แล้ว

    Выкладывая видео, предварительно глянь - как будут его видеть те, для кого ты стараешьсяю

  • @user-nz6kh2bz1c
    @user-nz6kh2bz1c ปีที่แล้ว

    То есть теперь у нас не только раскладушка ифов а раскладушка кейсов + еще несколько файлов. Я так и не понял зачем

  • @TheKirk1989
    @TheKirk1989 ปีที่แล้ว

    хм, в итоге мы пришли к switch - case хмм.. чот я не понмю такой реализации, наоборот старатются с помощью композиции и наследования уйти от всяких if и подобных ему... Не очень врубался в этот пример, но пришло в голову, что в самом PaymentHelpere может возникнуть необходимость дополнительных методов, в которых придётся делать то-же самое, т.е. для общение с классами продуктами юзать этот присловутый switch-case. Почему нельзя сделать PaymentHalper абстрактным, определить в нём метод получения PaymentMethodGetter который должны будут реализовывать его дочерние классы, а именно VtbPayment , TcsPayment, SberPayment и уже ОНИ будут возвращать эти самые new TcsPaymentFactory(), new SberPaymentFactory() и так далее?

  • @ТимофейМахотин
    @ТимофейМахотин 8 หลายเดือนก่อน

    Я обязательно напишу с чем я не согласен, когда пойму с чем, именно, я не согласен:)

  • @allinfo3926
    @allinfo3926 6 หลายเดือนก่อน

    Я тут не вижу логику. Мы IF заменили на switch. И плодим не IF, а плодим case.
    В одном файле плодили IF, - сделали фабрику и в другом файле плодим case. И в чем прикол? оО?

  • @KimarTV
    @KimarTV 2 ปีที่แล้ว

    У меня PHP_EOL просто пробел ставит, а не на новую строку переносит

    • @nickyx3
      @nickyx3 2 ปีที่แล้ว

      Помнится эта константа переопределяется через ini файл, ну и к тому же перенос строки в ответе с content-type:text/html и будет выглядеть как пробел

    • @КоляСолдат
      @КоляСолдат ปีที่แล้ว

  • @potapow8684
    @potapow8684 ปีที่แล้ว

    Ну намудрил