Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Are there any advantages to a nested If/Else instead of Else If's?

I came across this unique practice in a browser detection script.

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;
                }
            }
        }
    }
}

Are there any advantages to using this nested If/Else method?

What if I just changed it to:

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

Would it run slower or anything?

like image 993
Robin Rodricks Avatar asked Nov 27 '10 09:11

Robin Rodricks


3 Answers

It won't change anything other than the indentation and readability. Still the same code, absolutely equivalent :-) I would definitely change it though as it would make it more readable. Indentation usually means nesting whereas here there's no nesting.

like image 147
Darin Dimitrov Avatar answered Oct 19 '22 23:10

Darin Dimitrov


This is known as "the arrow anti-pattern" (due to the resemblance to an arrowhead) ...

 if
   if
     if
       if
         do something
       endif
     endif
   endif
 endif

.. and it's almost always bad for readability, unless there is some compelling reason to leave it.

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

I would flatten it.

like image 41
Jeff Atwood Avatar answered Oct 19 '22 23:10

Jeff Atwood


In this case the switch statement could also be used? Something like:

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

I adhere to the previous answer: else if() is equivalent to but more readable then else { if () ...}

Anyway, the code you found and presented looks a bit clumsy and not really fast for other reasons than the way if...else is used. Concerning the meaning of the code (and aside from the question), a better way to take care of browser differences is by object detection I would say.

like image 28
KooiInc Avatar answered Oct 19 '22 22:10

KooiInc