Сабж, архитектура, проэктирование, сервис с состоянием.

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
IIIKET
Сообщения: 116
Зарегистрирован: 2015.06.10, 16:38
Откуда: Kharkiv
Контактная информация:

Сабж, архитектура, проэктирование, сервис с состоянием.

Сообщение IIIKET »

Доброго дня. Помогите разобратся с сервисом состояния. Я не знаю данный патерн, если узнаете скиньте ссылки.
Цель моего поста услышать критику в свой адресс, как стоит делать и почему.
Был мой сервис таков:

Код: Выделить всё

<?php

namespace core\services\user\bonus;


use common\models\User;
use common\models\UserBonusLog;
use core\repositories\UserBonusLogRepository;
use Yii;
use yii\base\Object;


class ReferralBonusService extends Object
{
    const REGISTRATION_BONUS = 3500;
    const FIRST_ORDER_BONUS = 1500;


    private $logRepository;
    private $orderRepository;

    public function __construct(
        UserBonusLogRepository $logRepository,
        OrderRepository $orderRepository,
        $config = []
    ) {
        $this->logRepository = $logRepository;
        $this->orderRepository = $orderRepository;

        parent::__construct($config);
    }

    public function registration(User $user)
    {
        if (empty($user->referral)) {
            return false;
        }

        if ($this->logRepository->existsReferralRegistrationByEntityId($user->id)) {
            throw new \DomainException('Referral bonus already charged.');
        }

        $log = UserBonusLog::create(...);

        $user->referral->servisBonus->add($log->bonus);
    }
}
И после рефакторинга:

Код: Выделить всё

public function registration(User $user)
    {
        $this->user = $user; // Зачем? что это дает???

        if ($this->isEmptyUserReferral()) {
            return false;
        }

        if ($this->isRegistrationBonusCharged()) {
            throw new \DomainException('Referral bonus already charged.');
        }

        $log = UserBonusLog::create(...);

        $this->user->referral->servisBonus->add($log->bonus);
        unset($this->user); // Нужно ли это ??????????????????????
        return true;
    }
    
    private function isEmptyUserReferral()
    {
        return empty($this->user->referral);
    }

    private function isRegistrationBonusCharged()
    {
        return $this->logRepository->existsReferralRegistrationByEntityId($this->user->id);
    }
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Сабж, архитектура, проэктирование, сервис с состоянием.

Сообщение zelenin »

смотрю в статью, смотрю в код - не пойму как оно все у вас связано. По-моему вы спутали "сервис, хранящий состояние" и паттерн "состояние". Причем в вашем случае ни первый ни второй ни нужен.
IIIKET
Сообщения: 116
Зарегистрирован: 2015.06.10, 16:38
Откуда: Kharkiv
Контактная информация:

Re: Сабж, архитектура, проэктирование, сервис с состоянием.

Сообщение IIIKET »

zelenin писал(а): 2017.10.12, 17:50 смотрю в статью, смотрю в код - не пойму как оно все у вас связано. По-моему вы спутали "сервис, хранящий состояние" и паттерн "состояние". Причем в вашем случае ни первый ни второй ни нужен.
Вот у меня собственно тоже не допонимание, мне сказали делай так. Но зачем и что это такое я особо недопонимаю.
Если можете обясните причины мутации кода из 1-го примера во 2-й.
Что это за практика...
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Сабж, архитектура, проэктирование, сервис с состоянием.

Сообщение zelenin »

а, это не вы ссылку кинули. тогда упрек zabachok, что кинул не то, о чем спрашивают.
kawabanga
Сообщения: 806
Зарегистрирован: 2013.10.12, 23:35
Откуда: Новосибирск

Re: Сабж, архитектура, проэктирование, сервис с состоянием.

Сообщение kawabanga »

zelenin писал(а): 2017.10.12, 17:59 а, это не вы ссылку кинули. тогда упрек zabachok, что кинул не то, о чем спрашивают.
Простите за офтоп, зашел сегодня вечером на форум, хотел вас с 10К поздравить :D :D :D :lol: :lol: :lol:
Причем, совершенно без сарказма. Очень здорово, когда на форуме есть человек, которые раздает пендали всем падаванам, и заставляет критично к себе относиться =)
Ответить