Ответы пользователя по тегу Паттерны проектирования
  • Как правильно реализовать MVC и MVP?

    @EvgeniiR
    https://github.com/EvgeniiR
    Вы правильно поняли, что в MVC контроллер не является связующим звеном между View и Model, то что в вебе называют MVC на самом деле является MVA - https://en.wikipedia.org/wiki/Model%E2%80%93view%E... .

    MVC это один их тех терминов про которые много кто говорит но который почти никто не понимает, увы. В приведённых статьях с Хабра просто производится подмена понятий

    Тут же на тостере, из старого, советую пару годных описаний - раз и два. Там в принципе всё что вам нужно знать на текущий момент
    Ответ написан
    1 комментарий
  • Как правильно реализовать создание дочерних экземпляров класса?

    @EvgeniiR
    https://github.com/EvgeniiR
    Как то так
    class UserData {
        /**
         * @readonly
         * @var string
         */
        public $source;
    
        public function __construct(string $source)
        {
            $this->source = $source;
        }
    }
    
    class NoSupportingSenderFound extends \Exception {}
    class AnswerTransportError extends \Exception {}
    
    interface AnswerSender {
        public function supportSource(string $source): bool;
    
        /**
         * @throws AnswerTransportError
         */
        public function sendAnswer(string $answer): void;
    }
    
    class AnswerSenderFacade
    {
        /**
         * @var AnswerSender[]
         */
        private $senders = [];
    
        public function __construct(AnswerSender ... $answerSenders)
        {
            $this->senders = $answerSenders;
        }
    
        /**
         * @throws AnswerTransportError
         * @throws NoSupportingSenderFound
         */
        public function sendAnswer(UserData $userData, string $answer)
        {
            foreach ($this->senders as $sender) {
                if($sender->supportSource($userData->source)) {
                    $sender->sendAnswer($answer);
                    return;
                }
            }
            throw new NoSupportingSenderFound("...");
        }
    }


    В конструктор класса AnswerSenderFacade нужно передать инстансы всех реализаций интерфейса AnswerSender. В Symfony это просто делается через tagged services (Навесить тег на _instanceof AnswerSender через конфиг и в конфиге же указать что все помеченные тегом классы нужно заинжектить)

    Над названием конечно можно ещё подумать.

    p.s. в случае Симфони, правда, в конструкторе вместо ...$providers придётся использовать iterable и дополнительно проверять что пришли инстансы SenderInterface через instanceof
    Ответ написан
    4 комментария
  • Chain Of Responsibility vs Event Bus, в чем принципиальная разница?

    @EvgeniiR
    https://github.com/EvgeniiR
    1. Если нужен порядок обработки в event bus, возможно у вас в системе есть проблемы(см. Temporal coupling)

    2. Да, паттерны решают похожие задачи, есть разница в децентрализации. В Chain if responsibility есть менеджер который который цепочку вызывает по порядку.
    В то время как event - событие, факт, один модуль кидает ивент и ему нет никакого дела кто будет его обрабатывать и кому этот ивент интересен.
    Обработчики ивентов не знают друг о друге и никак на другие обработчики не полагаются, и ни один обработчикик не может остановить дальнейшую обработку события. (Поэтому ивенты в js с их stopPropagation(), или "events" в некоторых фреймворках не совсем ивенты).
    Ответ написан
    1 комментарий
  • Какие паттерны или какой подход лучше всего использовать в данной задаче?

    @EvgeniiR
    https://github.com/EvgeniiR
    Реализцаия IoC(Инверсия управления) через Dependency Injection.

    Опишите логику игры скрыв все компоненты которые должны быть нестабильными/гибкими (см. Stable Abstractions Principle) за абстракциями(интерфейсами/абстрактными классами).

    Все что вам нужно - отсутствие любых прямых зависимостей от реализации UI(пользовательского интерфейса) и, желательно, устройств ввода.
    Ответ написан
    Комментировать
  • Как понять фабричный метод?

    @EvgeniiR
    https://github.com/EvgeniiR
    Постарайтесь понять предназначение и паттернов, заучивать реализации практически бессмысленно. Абстрактная фабрика создает объект определенного типа, а не класс, конечно же.

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

    Могу посоветовать Чистую Архитектуру от Дяди Боба в качестве пищи для размышлений
    Ответ написан
    Комментировать
  • Конфликтует ли фабричный метод с OCP?

    @EvgeniiR
    https://github.com/EvgeniiR
    Фабричный метод возвращает объекты одного типа, это даже показано в приведенной вами статье.
    То есть, по хорошему, всё что должен знать клиентский код при вызове фабричного метода - объект с каким интерфейсом/экзмепляр какого абстрактного класса должен вернуться.

    Кстати, совет, новички этим частенько грешат - не пытайтесь впихнуть паттерны в код, просто за то что они есть, и не пытайтесь изучить их чтобы улучшить качество своего кода. Это скорее названия наиболее часто повторяющихся мест в разных программах.
    Если интересны паттерны, и вы хотите извлечь из этого пользу - старайтесь найти побольше примеров использования изучаемых на текущий момент, и разобраться почему были выбраны именно они. Вот там будет простор на подумать
    Ответ написан
    Комментировать