// codeart.ru / Pet projects / Продолжая тему рефакторинга DAOS Форум

Продолжая тему рефакторинга DAOS rss подписка

Автор: Evgeniy Sergeev

Я уже говорил в прошлом посте о рефакторинге, что считаю лишние условия злом. Так как продолжаю копаться с кодом DAOS-а (который мне любезно подарил Тормоз) хочу поделиться еще некоторыми решениями по повышению читабельности:

Момент №1:

if (time() - $line['time'] > $stat['records']['age'])
$stat['records']['age'] = time() - $line['time'];

меняем на:


$age = time() - $line['time']; // имя переменной $age нужно подобрать получше
$stat['records']['age'] = max($age, $stat['records']['age']);

Момент №2:

$result = ($CTR - $stat['average']['CTR']);
if ($result > 0)
$results = $set['txt']['bigCTR'];
elseif ($result < 0) $results = $set['txt']['smallCTR']; else $results = 'Ваша ссылка вышла из ротации.';

меняем на:


$result = ($CTR - $stat['average']['CTR']);
$select = array(
($result > 0) => $set['txt']['bigCTR'],
($result < 0) => $set['txt']['smallCTR'],
($result == 0) => 'Ваша ссылка вышла из ротации.'
);
$result = $select[true];

Если первый момент должен быть очевиден для всех, то второй скорее всего понравится далеко не всем. Что скажите?

  1. Про скрытую сортировку и фильтрацию массивов

    Лучшие комментарии

  1. А мне второй вариант тоже нравится.
    Только в слегка другом виде, но тут уж на любителя.
    Идея по своей сути такая же, но через switch(true).
    В варианте со switch применима только там, где пишешь сразу return. Иначе break; портит всю малину :)

    В вашем варианте, кстати, при использовании, стоит учитывать, что если два условия будут корректны, то результат вернется последний, а не первый. Ну и, как следствие, действия будут выполняться все. Независимо от того — есть результат уже или нет. В данном примере не важно, но если какие-то условия будут посложнее и надо последовательно проверять, это надо учесть.

    Для простоты пример я бы написал так:


    public function getMessage($ctr, $stat) {
    $ctr -= $stat['average']['ctr'];
    if(!$ctr) {
    return 'Ваша ссылка не прошла ротация';
    }
    $label = $ctr > 0 ? 'bigCTR' : 'smallCTR';
    return $stats['txt'][$label];
    }

  1. Последний пример клевый.
    вообще понравились эти практики, возьму на заметку

  2. Скоро спать уже буду, не соображаю ничего, вот только допишу большую заметку с картинками из прошлой жизни :)

    Завтра проснусь и обязательно внимательно изучу всё, что ты сделал.

  3. А мне второй вариант тоже нравится.
    Только в слегка другом виде, но тут уж на любителя.
    Идея по своей сути такая же, но через switch(true).
    В варианте со switch применима только там, где пишешь сразу return. Иначе break; портит всю малину :)

    В вашем варианте, кстати, при использовании, стоит учитывать, что если два условия будут корректны, то результат вернется последний, а не первый. Ну и, как следствие, действия будут выполняться все. Независимо от того — есть результат уже или нет. В данном примере не важно, но если какие-то условия будут посложнее и надо последовательно проверять, это надо учесть.

    Для простоты пример я бы написал так:


    public function getMessage($ctr, $stat) {
    $ctr -= $stat['average']['ctr'];
    if(!$ctr) {
    return 'Ваша ссылка не прошла ротация';
    }
    $label = $ctr > 0 ? 'bigCTR' : 'smallCTR';
    return $stats['txt'][$label];
    }

  4. …что если два условия будут корректны…
  5. Наверное, Вы все же имели в виду не корректны, а «истины». Потому что все три условия корректны. В остальном согласен, вариант работает только для непересекающихся условий.

  • С первым вариантом, действительно, вопросов нет — точно лучше.
    А второй вариант сперва не понял вчера (просто на первый быстрый взгляд), а сегодня оценил — красиво.

    Только не нравится, что присваивания в массиве происходят в любом случае, а в моём варианте выполняется только нужная ветвь кода.

    Но это во мне гипероптимизатор говорит, не стоит заморачиваться из-за таких копеек.

    Примеры классные.

  • Leave a Reply

    « »