Ответы пользователя по тегу Паттерны проектирования
  • Какой хороший ресурс чтобы изучить шаблоны проектирования ООП и все нюансы?

    vitaly_74
    @vitaly_74
    Сначала разберитесь что такое ООП, т.к. в настоящее время его путают с СОП (сервис ориентированное программирование). А так рефакторинг гуру
    Ответ написан
    Комментировать
  • Какие шаблоны проектирования подходят для оптимизации маркетплейса (принять Order JSON API в одном формате и транслировать в другой)?

    vitaly_74
    @vitaly_74
    ответ на первый вопрос - адаптер (потому что вы преобразовываете объект в другую сущность)
    др. словами:
    при одном типе запроса, мы преобразовываем объект 1 в объект 2 и отдаем обратно (адаптер 1)
    при втором типе запроса, мы преобразуем объект 3 в объект 2 и отдаем обратно (адаптер 2)
    либо можете рассмотреть паттерн стратегии. будет тоже самое. но мне кажется лучше использовать адаптер.
    Ответ написан
    Комментировать
  • Паттерн "Фабричный метод": как получить конкретный продукт из конкретной фабрики?

    vitaly_74
    @vitaly_74
    (получаю название нужной фабрики и продукта из запроса — в контроллере)
    Например в yii2 есть такая штука как сценарии у моделей, вы можете использовать сценарий как имя продукта.
    либо вы можете написать валидатор, который из запроса будет определять, какой параметр использовать для конструктора фабрики.
    Например, если у вас много платежных систем, то пользователю можно дать на выбор 4 ссылки (4 платежные системы) в роутеры которых зашиты их названия, т.е. pay/yandex-money или pay/webmoney
    тогда в клиентском коде вы должны будете что то типо такого сделать:
    ... 
    Validator / Scenario / Router
    ...
    $payMethod = $validator->scenario() // yandex-money
    ...
    $paymentSystem = new PaymentFactory($payMethod);
    $paymentSystem->pay();//оплачиваем через яндекc деньги
    ...
    Ответ написан
    2 комментария
  • Как создать экземпляр класса в фабричном методе?

    vitaly_74
    @vitaly_74
    1. case сам по себе не есть плохо, и это не считается дурным тоном. т.е. использовать конструкцию case можно и нужно.
    2. Давайте подумает чем характеризуется объект экземпляра класса, а потом перейдем к фабрике.
    Объект прежде всего характеризуется данными хранящимися внутри него. Т.е. Фабрика должна внутри себя хранить то что она выпускает (строит) и всю информацию о нем.
    3. не используйте рефлекшен. это плохо это дурной код, без крайней необходимости не нужно. Обычно рефлекшены не используются в клиентском коде, только непосредственно в самих фреймворках. но раз вы задаете вопросы про фабрики, вы фреймворк не пишите, а значит и использование рефлекшенов вам не нужно.
    4. Взгляните на оператор new (например, new Factory()) по сути оператор new и есть фабрика, которая из класса создает объект с уникальными (а может и не всегда) наборами данных.
    5. в ссылке выше, вам дали информацию по рефакторингу switch но если прочитать там, написано,
    не стоит трогать если
    Зачастую оператор switch используется в фабричных паттернах проектирования (Фабричный метод, Абстрактная фабрика) для выбора создаваемого класса

    вот в данном случае не нужно трогать.
    Почему лучше использовать switch?
    - потому что когда через год, или два зайдете в эту фабрику, навряд ли вы захотите разбираться в рефлекшенах, и не интуитивных выражениях. А когда все есть в switch вы сразу увидите перед глазами какие объекты может выпускать фабрика + по аналогии создать подобный объект используя менее трудозатрат (почти копипаст).
    Вот тут хороший пример фабрики:
    https://refactoring.guru/ru/design-patterns/factor...
    или можно так:
    /**
     * Интерфейс Продукта объявляет операции, которые должны выполнять все
     * конкретные продукты.
     */
    interface Product
    {
        public function operation(): string;
    }
    
    /**
     * Конкретные Продукты предоставляют различные реализации интерфейса Продукта.
     */
    class ConcreteProduct1 implements Product
    {
        public function operation(): string
        {
            return "{Result of the ConcreteProduct1}";
        }
    }
    
    class ConcreteProduct2 implements Product
    {
        public function operation(): string
        {
            return "{Result of the ConcreteProduct2}";
        }
    }
    
    class Factory implements Product{
       private $product;
       function __construct(string $productClass){
           switch($productClass){
               case default:
               case ConcreteProduct1::class:
                          $product = new ConcreteProduct1();
               break;
               case ConcreateProduct2::class:
                          $product = new ConcreateProduct2();
               break;
           }
           $this->product = $product;
       }
    
       public function operation(): string
        {
            return $this->product->operation();
        }
    }
    
    $product = new Factory(ConcreateProduct1::class);
    echo $product->operation();


    В данном случае Разрешено менять старый код, но только в пределах switch.
    Ответ написан
    7 комментариев
  • Какой паттерн использовать для задачи получение заказов, отправка статусов заказов из нескольких разных внешних источников?

    vitaly_74
    @vitaly_74
    сейчас подобным занимаюсь. что надо: фабрику точно, один интерфейс для каждого вида операции (внесение средств возврат средств), какие либо адаптеры, для саязи с вашей црм, и декораторы (чтобы в любой момент добавлять функционал не изменяя старый код). и возможно еще нужна будет стратегия (для принятия решения если транзакция будет отменена, то что делать).
    Ответ написан
    Комментировать