Периодически делаю мелкий рефакторинг своего кода над текущим проектом, я раньше вообще не занимался этим и только начинаю изучать это дело. Вот хочу привести пример элементарного кода, который я захотел сделать еще более "элементарным", как мне кажется
Есть таблица 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 никогда не будут меняться). Так вообще нормально делать? Стоит ли?
Если уже "рефакторить", то где то так
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;
}
Такие сокращения не всегда есть хорошо, первый вариант гораздо быстрее и удобнее прочитать, и потратить меньше времени на то, что бы разобраться в логике.
P.S. По этому поводу на харбе недавно хорошая статья вышла: https://habrahabr.ru/post/347166/
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Имеется несколько интернет-магазиновКак можно сделать так, что если человек уже был на одном из сайтов, следующий сайт при отправки заявки...
Подскажите как вывести метод из system/library оба файла лежат в одной папке library
Здравствуйте Объясните, пожалуйста, принцип использования PHP и соответственно MySQL в приложении написанном на PhoneGap
Хочу добавить на сайт простейший информер погоды текущего местоположенияДля этого в качестве кросс-доменного api взял openweathermap, зарегистрировался...