Стоит ли так рефакторить? Замена условий на простые математические формулы

239
27 января 2018, 00:03

Периодически делаю мелкий рефакторинг своего кода над текущим проектом, я раньше вообще не занимался этим и только начинаю изучать это дело. Вот хочу привести пример элементарного кода, который я захотел сделать еще более "элементарным", как мне кажется

Есть таблица Orders, состоящая из id, user_id, created_at, type, value, status, в данном примере нас интересуют только поля value и type. value - любое целочисленное положительное число, type - либо 0, либо 1 (0 - списание, 1 - начисление)

И собсно простой метод getPoints в классе User, который подсчитывает количество доступных очков пользователя

public function getPoints() {
        $return = 0;
        foreach (Order::findAll(['user_id'=> $this->id, 'status' => 1]) as $k => $value) {
            if ($value['type'] == 0)
                $return -= $value['value'];
            if ($value['type'] == 1)
                $return += $value['value'];
        }
        return $return;
}

От нечего делать я решил его немного изменить

public function getPoints() {
        $return = 0;
        foreach (Order::findAll(['user_id'=> $this->id, 'status' => 1]) as $value)
                $return += (-1 + 2*(int)$value['type'])*$value['value']; //$value['type'] равно либо 0, либо 1. 0 - вычитание, 1 - сумма. Формула -1 + 2*$value['type'] нужна для сокращения кода -1 + 2*0 = -1 -1 + 2*1 = 1
        return $return;
    }

То есть по сути просто избавился от условий и заменил это дело формулой (предполагается, что значения 0 и 1 никогда не будут меняться). Так вообще нормально делать? Стоит ли?

Answer 1

Если уже "рефакторить", то где то так

public function getPoints() {
        $return = 0;
        foreach (Order::findAll(['user_id'=> $this->id, 'status' => 1]) as $k => $value) {
            $type = $value['type'];
            $val = $value['value'];
            if ($type == 0) {
                $return -= $val;
            else if ($type == 1) {
                $return += $val;
            } else {
              # а тут добавить вывод в лог, может что то пошло не так
            }
        }
        return $return;
}
Answer 2

Такие сокращения не всегда есть хорошо, первый вариант гораздо быстрее и удобнее прочитать, и потратить меньше времени на то, что бы разобраться в логике.

P.S. По этому поводу на харбе недавно хорошая статья вышла: https://habrahabr.ru/post/347166/

READ ALSO
Механизм изменения цены на сайтах

Механизм изменения цены на сайтах

Имеется несколько интернет-магазиновКак можно сделать так, что если человек уже был на одном из сайтов, следующий сайт при отправки заявки...

274
Вывести метод из другого класса opencart 2

Вывести метод из другого класса opencart 2

Подскажите как вывести метод из system/library оба файла лежат в одной папке library

234
PHP, MySQL + PhoneGap/Cordova

PHP, MySQL + PhoneGap/Cordova

Здравствуйте Объясните, пожалуйста, принцип использования PHP и соответственно MySQL в приложении написанном на PhoneGap

137
Как добавить на сайт информер погоды текущего местоположения пользователя?

Как добавить на сайт информер погоды текущего местоположения пользователя?

Хочу добавить на сайт простейший информер погоды текущего местоположенияДля этого в качестве кросс-доменного api взял openweathermap, зарегистрировался...

206