Периодически делаю мелкий рефакторинг своего кода над текущим проектом, я раньше вообще не занимался этим и только начинаю изучать это дело. Вот хочу привести пример элементарного кода, который я захотел сделать еще более "элементарным", как мне кажется
Есть таблица 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/
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости