Читабельность кода ветвления на PHP

274
20 января 2017, 09:56

Есть один и тот же функционал, реализованный разными инструментами.
Какой вариант, на ваш взгляд проще читать?
На выходе один из вариантов заголовка, зависящий от входных параметров.
На входе 3 параметра:

  • $area - площадь (различные заголовки до и более 150);
  • $type_deal - тип объявления (продажа и несколько видов аренды);
  • $ssid - id-объявления (делим на три группы по признаку остатка от деления на 3, для каждой группы выводим свой заголовок).

В1 через ветвление if+switch

   if($type_deal == 2) { // Продажа
        if($area > 150) { // Офисный блок
            $title = "Продажа офисного блока ";
        } else { // Офис
            $title = "Продажа офиса ";
        }
    } else { // Аренда
        if($area > 150) { // Офисный блок
            switch($ssid % 3){
                case 0:
                    $title = "Аренда офисного блока ";
                    break;
                case 1:
                    $title = "Офисный блок в аренду ";
                    break;
                case 2:
                    $title = 'Сдается офисный блок ';
                    break;
            }
        } else { // Офис
            switch($ssid % 3){
                case 0:
                    $title = "Аренда офиса ";
                    break;
                case 1:
                    $title = "Офис в аренду ";
                    break;
                case 2:
                    $title = 'Сдается офис ';
                    break;
            }
        }
    }

В2 только switch

        // type  area  ssid
        // {0-1}_{0-1}_{0-2}
    $title_type = 
        ($type_deal == 2 ? '1' : '0')
        .($area > 150 ? '1' : '0')
        .($ssid % 3);
    switch($title_type){
        // Аренда офиса
        case 000:
            $title = "Аренда офиса ";
            break;
        case 001:
            $title = "Офис в аренду ";
            break;
        case 002:
            $title = 'Сдается офис ';
            break;
        // Аренда офисного блока
        case 010:
            $title = "Аренда офисного блока ";
            break;
        case 011:
            $title = "Офисный блок в аренду ";
            break;
        case 012:
            $title = 'Сдается офисный блок ';
            break;
        // Продажа офиса
        case 100:
        case 101:
        case 102:
            $title = "Продажа офиса ";
            break;
        // Продажа офисного блока
        case 110:
        case 111:
        case 112:
            $title = "Продажа офисного блока ";
            break;
        default:
            $title = false;
    }        

В3 через конструкцию ?:

    $title_type = $ssid % 3;
    return $type_deal == 2
        // Продажа
        ?   ($area > 150
            // Офисного блока
            ? "Продажа офисного блока "
            // Офиса
            : "Продажа офиса ")
        // Аренда
        : ($area > 150 
            // Офисный блок
            ? ($title_type == 2 
                // Три вариант заголовка
                ? "Аренда офисного блока "
                : ($title_type == 1 
                    ? "Офисный блок в аренду "
                    : 'Сдается офисный блок '))
            // Офис
            : ($title_type == 2 
                // Три варианта заголовка
                ? "Аренда офиса "
                : ($title_type == 1 
                    ? "Офис в аренду "
                    : 'Сдается офис ')));

Производительность

Результаты тестирования на большой выборке:

  • getName_if = 0.474610090256с
  • getName_switch = 1.85297989845с
  • getName_tree = 0.482807159424с
  • Вытаскивать данные из массива значений (индексы определяются по аналогии с вариантом для switch) = 1.3737449646с
Answer 1

Я бы слегка модифицировал 2й вариант, и получилось бы очень красиво, форматирование, все дела, шо хошь. Единственный минус - весь функционал, это возвращение какого-либо значения. В случаях с кейсами, или ифами можно дополнительно хендлить события еще, но если задача стоит только в выводе, я бы предпочел это:

    // type  area  ssid
    // {0-1}_{0-1}_{0-2}
$title_type = 
    ($type_deal == 2 ? '1' : '0')
    .($area > 150 ? '1' : '0')
    .($ssid % 3);
$titles = Array(
    001 => 'Офис в аренду ',
    002 => 'Офис на продажу',
    ... => '...',
   1337 => 'куплю гараж'
);
$title = $titles[$title_type];

Емнип, самый быстрый вывод, по индексированному массиву.

READ ALSO
SimpleSearch modx

SimpleSearch modx

есть такая структура ресурсов в админке

293
Вывод информации из столбца в mysql

Вывод информации из столбца в mysql

Как вывести информация из столбца в mysqlЕсть столбик test, в котором присутствует подобное содержание id|15||id2|20||id3|25

258
update двух таблиц одним запросом

update двух таблиц одним запросом

здравствуйте, помогите сформировать SQL запрос,

264
Изменить содержание iframe

Изменить содержание iframe

Чтобы получить контроль над содержанием подключенного к странице iframe был создан файл redirectphp с кодом:

394