“если” по сравнению с “переключателем” [дубликат]

14
задан Community 23 May 2017 в 11:53
поделиться

4 ответа

Лично мне переключатель удобнее читать. Вот причина:

if ($foo == 'bar') {
} elseif ($foo == 'baz') {
} elseif ($foo == 'buz') {
} elseif ($fou == 'haz') {
}

Таким образом, вы можете легко увидеть ошибку (будь то опечатка или честная разница). Но с переключателем вы неявно знаете, что имелось в виду:

switch ($foo) {
    case 'bar': 
        break;
    case 'baz': 
        break;
    case 'buz': 
        break;
    case 'haz': 
        break;
}

Плюс, что легче читать:

if ($foo == 'bar' || $foo == 'baz' || $foo == 'bat' || $foo == 'buz') {
}

или

case 'bar':
case 'baz':
case 'bat':
case 'buz':
    break;

С точки зрения производительности ... Что ж, не беспокойтесь о производительности. Если вы не сделаете несколько тысяч из них внутри узкого цикла, вы даже не сможете заметить разницу (разница, скорее всего, будет в диапазоне микросекунд, если не ниже).

Выбирайте метод, который вы считаете наиболее читаемым. Это важная часть. Не пытайтесь микрооптимизировать. Помните, Преждевременная оптимизация - корень всех зол ...

27
ответ дан 1 December 2019 в 05:50
поделиться

Вам следует рассмотреть возможность использования полиморфизма в качестве альтернативы управляющим структурам, таким как if или switch. Это особенно удобно, если у вас очень много опций, так как это может значительно упростить логику управления.

Я писал о концепции здесь: http://codeutopia.net/blog/2009/02/02/avoiding-endless-switch-case-structures-with-classes/

3
ответ дан 1 December 2019 в 05:50
поделиться

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

1
ответ дан 1 December 2019 в 05:50
поделиться

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

<?php
$numof = 100000;
$file = fopen('benchmark.php', 'w');
if (!$file) die('file error');
fwrite($file, '<pre><?php' . "\n" . 'echo $i = $_GET[\'i\'], "\n";' . "\n");

fwrite($file,
'$start = microtime(true);
if ($i == 0) {}' . "\n");
for ($i = 1; $i < $numof; ++$i) {
    fwrite($file, 'elseif($i == '.$i.') {}'. "\n");
}
fwrite($file,
'echo \'elseif took: \', microtime(true) - $start, "\n";' . "\n");

fwrite($file,
'$start = microtime(true);
switch($i) {' . "\n");
for ($i = 1; $i < $numof; ++$i) {
    fwrite($file, 'case '.$i.': break;'. "\n");
}
fwrite($file,
'}
echo \'switch took: \', microtime(true) - $start, "\n";' . "\n");

Полученные данные (для numof = 100000):

i: 0
elseif took: 6.2942504882812E-5
switch took: 3.504753112793E-5

i: 10
elseif took: 6.4849853515625E-5
switch took: 4.3869018554688E-5

i: 100
elseif took: 0.00014805793762207
switch took: 0.00011801719665527

i: 1000
elseif took: 0.00069785118103027
switch took: 0.00098896026611328

i: 10000
elseif took: 0.0059938430786133
switch took: 0.0074150562286377

i: 100000 (first non-existing offset)
elseif took: 0.043318033218384
switch took: 0.075783014297485

Запустил скрипт на моей старой и медленной машине windows с PHP 5.3.1 или 5.3.2, не знаю точно.

45
ответ дан 1 December 2019 в 05:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: