Есть ли какие-либо преимущества для вложенного If / Else вместо Else If? - PullRequest
6 голосов
/ 27 ноября 2010

Я столкнулся с этой уникальной практикой в ​​сценарии обнаружения браузера.

if (/MSIE/.test(_3)) {
    IE = true;
} else {
    if (/AppleWebKit/.test(_3)) {
        Safari = true;
    } else {
        if (/Opera/.test(_3)) {
            Opera = true;
        } else {
            if (/Camino/.test(_3)) {
                Camino = true;
            } else {
                if (/Firefox/.test(_3) || /Netscape/.test(_3) || ) {
                    Mozilla = true;
                }
            }
        }
    }
}

Есть ли преимущества использования этого вложенного метода If / Else?

Что, если я просто изменил его на:

 if (){
 } else if (){
 } else if (){
 } else if (){
 }

Будет ли он работать медленнее или как?

Ответы [ 3 ]

11 голосов
/ 27 ноября 2010

Это не изменит ничего, кроме отступа и читабельности. Все тот же код, абсолютно эквивалентный :-) Я бы определенно изменил его, так как это сделает его более читабельным Отступ обычно означает вложение, тогда как здесь нет вложения.

4 голосов
/ 27 ноября 2010

Это известно как " анти-паттерн стрелки " (из-за сходства со стрелкой) ...

 if
   if
     if
       if
         do something
       endif
     endif
   endif
 endif

.. и почти всегда это плохо для читабельностиЕсли только нет веской причины покинуть его.

http://www.codinghorror.com/blog/2006/01/flattening-arrow-code.html

Я бы сгладил это.

4 голосов
/ 27 ноября 2010

В этом случае также можно использовать оператор switch? Что-то вроде:

switch ((_3).match(/msie|applewebkit|opera|camino|firefox/i)[0]) {
  case 'MSIE' : /* ...; */ break;
  case 'AppleWebKit' : /* ...; */ break;
  /* ... etc. */
  default: BrowserCouldntBeDetermined = true;
}

Я придерживаюсь предыдущего ответа: иначе if () эквивалентно, но более читабельно, чем еще {if () ...}

В любом случае, код, который вы нашли и представили, выглядит немного неуклюжим и не очень быстрым по другим причинам, кроме того, как используется if...else. Что касается значения кода (и помимо вопроса), лучший способ позаботиться о различиях в браузере - это обнаружение объектов Я бы сказал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...