Ответы пользователя по тегу ООП
  • Какой метод реализации при подходе CQRS правильный?

    vhood
    @vhood
    Не забывайте отмечать решения
    Архитектура монолит.
    например для Order это его классы которые лежать в папке Order, его Aggregate Root
    У Вас модуль = агрегат? Это не одно и то же.

    За пределами своего неймспейса модуля, классы напрямую не используются и не вызываются, кроме Api service классов
    Модуль - самостоятельная единица, которая должна работать без других модулей. Low coupling, high cohesion. Представьте, что он может подключаться через composer, вот каким он должен быть? У Вас так?
    Что за паттерн "Api service", который какие-то DTO отдает? У агрегата может быть id другого агрегата и этого ему должно быть достаточно.

    У Вас один контекст? Когда кто-то говорит "Store" (или, скорее всего, склад), все имеют ввиду одно и то же? Store с точки зрения покупателя и Store с точки зрения какого-то другого актора (например, поставщика) - одно и то же?
    Если нет, Вам стоит разделить 2 контекста и сделать 2 Store. Один самостоятельный, и один как поддомен у Order и тогда вся логика будет в Order.
    spoiler
    слой Application одного контекста не может ссылаться на слой Domain другого контекста

    Если контекст единый, может Store не заслуживает быть самостоятельным агрегатом? Если все-таки заслуживает, Order может выполнять свои обязанности, имея только id из Store? Это "на подумать".

    В любом случае, один агрегат может воспользоваться другим (но не получать напрямую его объекты для реализации своей логики, только использовать функционал Aggregate Root), но если ими можно воспользоваться в слое Apprication последовательно - это будет лучше.

    сперва у модуля Store проверить работает ли этот store, то есть проверить его рабочие часы и дневной лимит на продажу
    Мне кажется, очевидно, что если это все-таки 2 разных агрегата одного контекста, то Store даже бизнес-логику тут не реализует, нужно просто проверить спецификацию. Делать это нужно в Application, вызвать 2 агрегата последовательно. Не нужно делать это ответственностью Order.
    Ответ написан
  • Как упростить метод, выполняющий операции для всех других методов класса, если он получается слишком раздутым?

    vhood
    @vhood
    Не забывайте отмечать решения
    Здесь Вы принимаете type
    public function makeRequest(array $args, string $type) {
    Здесь выполняете логику в зависимости от typeif($type === "source1") {

    Для каждого type нужно создать класс, который будет выполнять логику, описанную в его блоке if.
    пример

    class SpecificTypeApiService implemets ApiServiceInterface
    {
        public function send()
       {
    //код ниже просто скопирован, стоит вынести что-то в параметры, что-то в конструктор и сделать код более элегантным
    //можно сделать абстрактный класс и делегировать ему общий для разных type (сервисов) функционал
        $proxiesArr = array('72.37.217.3:4145', '174.77.111.196:4145');
              
              $randProx = array_rand($proxiesArr, 1);
              
              $proxyIp = $proxiesArr[$randProx];
            
    //      $proxyIp = '174.77.111.196:4145';
            $url1 = $args[0] . $args[1];
                $headers = [
                'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.105 YaBrowser/21.3.3.230 Yowser/2.5 Safari/537.36'
                ];
    
                $curl = curl_init();
    
            curl_setopt($curl, CURLOPT_PROXY, $proxyIp);
            curl_setopt($curl, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS4);
            curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
            curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); 
            curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($curl, CURLOPT_VERBOSE, 1); 
            curl_setopt($curl, CURLOPT_POST, false);
            curl_setopt($curl, CURLOPT_URL, $url1);
    
            $result = curl_exec($curl);
    
            if(curl_exec($curl) === false)
            {
            echo 'Ошибка curl: ' . curl_error($curl);
            } else {
            echo 'Операция завершена без каких-либо ошибок';
            }
    
            return $result;
       }
    }


    После, с помощью DI и полиморфизма, отрефакторить существующий код следующим образом:

    Здесь Вы принимаете сервис вместо type
    public function makeRequest(array $args, ApiServiceInterface $apiService) {

    Здесь выполняете логику, но выполнение делегируете сервису$apiService->send();

    Стоит получше подумать над именами классов, переменных и функций.
    Ответ написан
    Комментировать