За последние 24 часа нас посетил 20631 программист и 1109 роботов. Сейчас ищут 412 программистов ...

Как правильно избавится от повторов и так уж ли это принципиально важно?

Тема в разделе "Прочие вопросы по PHP", создана пользователем Вероломство, 11 мар 2021.

  1. Вероломство

    Вероломство Активный пользователь

    С нами с:
    19 июн 2017
    Сообщения:
    615
    Симпатии:
    24
    Иногда сталкиваюсь с критикой относительно повторов в коде, ну вот для примера

    PHP:
    1. public static function buy(User $user, $unit_id, $count)
    2. {
    3.     if (!Unit::findOne($unit_id)) {
    4.         throw new Alert('Такой техники нет в игре');
    5.     }
    6.  
    7.     $user_unit = self::findOneBy('`user_id` = ? and `unit_id` = ?', [$user->id, $unit_id]);
    8.  
    9.     if (!$user_unit) {
    10.         throw new Alert('Такая техника Вам ещё недоступна');
    11.     }
    12.  
    13.     if (!filter_var($count, FILTER_VALIDATE_INT, ['options' => ['min_range' => 1]])) {
    14.         throw new Alert('Вы неправильно ввели количество');
    15.     }
    16.  
    17.     $sum = $user_unit->getPrice($user->country_code) * $count;
    18.  
    19.     if ($sum > $user->{$user_unit->kind}) {
    20.         throw new Alert('У Вас недостаточно ' . ($user_unit->kind == 'baks' ? 'баксов' : 'золота') . ' для покупки');
    21.     }
    22.  
    23.     $user_unit->amount += $count;
    24.  
    25.     $user_unit->save();
    26.  
    27.     $user->{$user_unit->kind} -= $sum;
    28. }
    29.  
    30. public static function sell(User $user, $unit_id, $count)
    31. {
    32.     if (!Unit::findOne($unit_id)) {
    33.         throw new Alert('Такой техники нет в игре');
    34.     }
    35.  
    36.     $user_unit = self::findOneBy('`user_id` = ? and `unit_id` = ?', [$user->id, $unit_id]);
    37.  
    38.     if (!$user_unit) {
    39.         throw new Alert('Такая техника Вам ещё недоступна');
    40.     }
    41.  
    42.     if (!filter_var($count, FILTER_VALIDATE_INT, ['options' => ['min_range' => 1, 'max_range' => $user_unit->amount]])) {
    43.         throw new Alert('Вы неправильно ввели количество');
    44.     }
    45.  
    46.     $sum = $user_unit->getPriceForSell($user->country_code) * $count;
    47.  
    48.     $user_unit->amount -= $count;
    49.  
    50.     $user_unit->save();
    51.  
    52.     $user->{$user_unit->kind} += $sum;
    53. }

    Ну вот надо ли мне

    PHP:
    1. if (!Unit::findOne($unit_id)) {
    2.     throw new Alert('Такой техники нет в игре');
    3. }
    4.  
    5. $user_unit = self::findOneBy('`user_id` = ? and `unit_id` = ?', [$user->id, $unit_id]);
    6.  
    7. if (!$user_unit) {
    8.     throw new Alert('Такая техника Вам ещё недоступна');
    9. }
    выносить в отдельный метод? Это принципиально важно как-то?

    Я так размышляю, что если один из методов забрать в другое место, то он уже имеет свою целостность функционала, выполняя все проверки локально уже.
     
  2. don.bidon

    don.bidon Активный пользователь

    С нами с:
    28 мар 2021
    Сообщения:
    845
    Симпатии:
    129
    Да можно вынести в отдельный метод, только правильно его назвать и чтобы что-то возвращал полезное или там в свойство объекта складывал, чтобы повторных запросов не плодить на выемку данных.