Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Else Considered Harmful

Else Considered Harmful

People are bad at logic and at keeping state. “else” clauses are often used to implement complicated logic and require us to backtrack, a.k.a. to keep a lot of state.

75fb365927cb3f5f7b677682d6249406?s=128

Nikolay Bachiyski

November 29, 2014
Tweet

Transcript

  1. I F JSCONF Argentina, buenos aires, nov 29th, 2014

  2. J O K E

  3. None
  4. if  (eggs)  { }

  5. None
  6. None
  7. W E H AV E A P RO B L

    E M O B V I O U S LY
  8. I F ?

  9. None
  10. None
  11. None
  12. None
  13. None
  14. E L S E ?

  15. I N E N G L I S H B

    O O K S else If
  16. I N C O M P U T E R

    P R O G R A M S else If
  17. I N C O M P U T E R

    P R O G R A M S else If 2.5 times more else!
  18. W H Y ?

  19. if  (⩸⩸⩸⩸⩸1)  {      ⩸⩸⩸⩸      ⩸⩸⩸⩸  

       if  (⩸⩸2)  {          ⩸⩸⩸⩸      }  else  {          ⩸⩸⩸          ⩸⩸⩸⩸⩸⩸          ⩸⩸          if  (⩸⩸⩸3)  {              ⩸⩸          }  else  {              ⩸⩸                    ⩸⩸⩸⩸⩸⩸          }      }   }  else  {      ⩸⩸⩸   }
  20. if  (⩸⩸⩸⩸⩸1)  {      ⩸⩸⩸⩸      ⩸⩸⩸⩸  

       if  (⩸⩸2)  {          ⩸⩸⩸⩸      }  else  {          ⩸⩸⩸          ⩸⩸⩸⩸⩸⩸          ⩸⩸          if  (⩸⩸⩸3)  {              ⩸⩸          }  else  {              ⩸⩸                    ⩸⩸⩸⩸⩸⩸          }      }   }  else  {      ⩸⩸⩸   } 1: true
  21. if  (⩸⩸⩸⩸⩸1)  {      ⩸⩸⩸⩸      ⩸⩸⩸⩸  

       if  (⩸⩸2)  {          ⩸⩸⩸⩸      }  else  {          ⩸⩸⩸          ⩸⩸⩸⩸⩸⩸          ⩸⩸          if  (⩸⩸⩸3)  {              ⩸⩸          }  else  {              ⩸⩸                    ⩸⩸⩸⩸⩸⩸          }      }   }  else  {      ⩸⩸⩸   } 1: true 1: true, 2: true
  22. if  (⩸⩸⩸⩸⩸1)  {      ⩸⩸⩸⩸      ⩸⩸⩸⩸  

       if  (⩸⩸2)  {          ⩸⩸⩸⩸      }  else  {          ⩸⩸⩸          ⩸⩸⩸⩸⩸⩸          ⩸⩸          if  (⩸⩸⩸3)  {              ⩸⩸          }  else  {              ⩸⩸                    ⩸⩸⩸⩸⩸⩸          }      }   }  else  {      ⩸⩸⩸   } 1: true 1: true, 2: true 1: true, 2: false
  23. if  (⩸⩸⩸⩸⩸1)  {      ⩸⩸⩸⩸      ⩸⩸⩸⩸  

       if  (⩸⩸2)  {          ⩸⩸⩸⩸      }  else  {          ⩸⩸⩸          ⩸⩸⩸⩸⩸⩸          ⩸⩸          if  (⩸⩸⩸3)  {              ⩸⩸          }  else  {              ⩸⩸                    ⩸⩸⩸⩸⩸⩸          }      }   }  else  {      ⩸⩸⩸   } 1: true 1: true, 2: true 1: true, 2: false 1: true, 2: false, 3: true
  24. if  (⩸⩸⩸⩸⩸1)  {      ⩸⩸⩸⩸      ⩸⩸⩸⩸  

       if  (⩸⩸2)  {          ⩸⩸⩸⩸      }  else  {          ⩸⩸⩸          ⩸⩸⩸⩸⩸⩸          ⩸⩸          if  (⩸⩸⩸3)  {              ⩸⩸          }  else  {              ⩸⩸                    ⩸⩸⩸⩸⩸⩸          }      }   }  else  {      ⩸⩸⩸   } 1: true 1: true, 2: true 1: true, 2: false 1: true, 2: false, 3: true 1: true, 2: false, 3: false
  25. if  (⩸⩸⩸⩸⩸1)  {      ⩸⩸⩸⩸      ⩸⩸⩸⩸  

       if  (⩸⩸2)  {          ⩸⩸⩸⩸      }  else  {          ⩸⩸⩸          ⩸⩸⩸⩸⩸⩸          ⩸⩸          if  (⩸⩸⩸3)  {              ⩸⩸          }  else  {              ⩸⩸                    ⩸⩸⩸⩸⩸⩸          }      }   }  else  {      ⩸⩸⩸   } 1: true 1: true, 2: true 1: true, 2: false 1: true, 2: false, 3: true 1: true, 2: false, 3: false 1: false, 2 & 3 don’t matter
  26. if  (⩸⩸⩸⩸⩸1)  {      ⩸⩸⩸⩸      ⩸⩸⩸⩸  

       if  (⩸⩸2)  {          ⩸⩸⩸⩸      }  else  {          ⩸⩸⩸          ⩸⩸⩸⩸⩸⩸          ⩸⩸          if  (⩸⩸⩸3)  {              ⩸⩸          }  else  {              ⩸⩸                    ⩸⩸⩸⩸⩸⩸          }      }   }  else  {      ⩸⩸⩸   } 1: true 1: true, 2: true 1: true, 2: false 1: true, 2: false, 3: true 1: true, 2: false, 3: false 1: false, 2 & 3 don’t matter We have to context-switch
  27. if  (⩸⩸⩸⩸⩸1)  {      ⩸⩸⩸⩸      ⩸⩸⩸⩸  

       if  (⩸⩸2)  {          ⩸⩸⩸⩸          ⩸⩸⩸⩸⩸⩸          ⩸⩸          if  (⩸⩸⩸3)  {              ⩸⩸              if  (⩸⩸⩸4)  {                  ⩸⩸                        ⩸⩸⩸⩸⩸⩸              }              ⩸⩸              ⩸⩸⩸⩸⩸⩸⩸⩸          }      }   }
  28. if  (⩸⩸⩸⩸⩸1)  {      ⩸⩸⩸⩸      ⩸⩸⩸⩸  

       if  (⩸⩸2)  {          ⩸⩸⩸⩸          ⩸⩸⩸⩸⩸⩸          ⩸⩸          if  (⩸⩸⩸3)  {              ⩸⩸              if  (⩸⩸⩸4)  {                  ⩸⩸                        ⩸⩸⩸⩸⩸⩸              }              ⩸⩸              ⩸⩸⩸⩸⩸⩸⩸⩸          }      }   } 1: true
  29. if  (⩸⩸⩸⩸⩸1)  {      ⩸⩸⩸⩸      ⩸⩸⩸⩸  

       if  (⩸⩸2)  {          ⩸⩸⩸⩸          ⩸⩸⩸⩸⩸⩸          ⩸⩸          if  (⩸⩸⩸3)  {              ⩸⩸              if  (⩸⩸⩸4)  {                  ⩸⩸                        ⩸⩸⩸⩸⩸⩸              }              ⩸⩸              ⩸⩸⩸⩸⩸⩸⩸⩸          }      }   } 1: true 1 & 2: TRUE
  30. if  (⩸⩸⩸⩸⩸1)  {      ⩸⩸⩸⩸      ⩸⩸⩸⩸  

       if  (⩸⩸2)  {          ⩸⩸⩸⩸          ⩸⩸⩸⩸⩸⩸          ⩸⩸          if  (⩸⩸⩸3)  {              ⩸⩸              if  (⩸⩸⩸4)  {                  ⩸⩸                        ⩸⩸⩸⩸⩸⩸              }              ⩸⩸              ⩸⩸⩸⩸⩸⩸⩸⩸          }      }   } 1: true 1 & 2: TRUE 1 & 2 & 3: TRUE
  31. if  (⩸⩸⩸⩸⩸1)  {      ⩸⩸⩸⩸      ⩸⩸⩸⩸  

       if  (⩸⩸2)  {          ⩸⩸⩸⩸          ⩸⩸⩸⩸⩸⩸          ⩸⩸          if  (⩸⩸⩸3)  {              ⩸⩸              if  (⩸⩸⩸4)  {                  ⩸⩸                        ⩸⩸⩸⩸⩸⩸              }              ⩸⩸              ⩸⩸⩸⩸⩸⩸⩸⩸          }      }   } 1: true 1 & 2: TRUE 1 & 2 & 3: TRUE 1 & 2 & 3 & 4: true
  32. if  (⩸⩸⩸⩸⩸1)  {      ⩸⩸⩸⩸      ⩸⩸⩸⩸  

       if  (⩸⩸2)  {          ⩸⩸⩸⩸          ⩸⩸⩸⩸⩸⩸          ⩸⩸          if  (⩸⩸⩸3)  {              ⩸⩸              if  (⩸⩸⩸4)  {                  ⩸⩸                        ⩸⩸⩸⩸⩸⩸              }              ⩸⩸              ⩸⩸⩸⩸⩸⩸⩸⩸          }      }   } 1: true 1 & 2: TRUE 1 & 2 & 3: TRUE 1 & 2 & 3 & 4: true No switches, just adding :-)
  33. C H A N G E I S B A

    D
  34. B U I L D I N G I S

    G O O D
  35. W H Y ?

  36. we use complex logic: • More when we talk to

    computers • less when we talk to people
  37. P E O P L E A R E N

    OT G R E AT AT LO G I C
  38. None
  39. P E O P L E A R E N

    OT G R E AT AT F O L LO W I N G S TAT E
  40. Pepole are graet at reizncinogg patetrns, but teirrlbe at foonwillg

    loigc.
  41. FA C E S P E O P L E

    A R E G O O D AT
  42. None
  43. None
  44. S O U N D S P E O P

    L E A R E G O O D AT
  45. None
  46. https://www.flickr.com/photos/fdecomite/446394032/in/photostream/

  47. M O R E PAT T E R N S

    L E S S “ E L S E ”
  48. N OT N E C E S S A R

    I LY “ D E S I G N PAT T E R N S "
  49. 0 . E M P H A S I Z

    E E S S E N T I A L C O D E
  50. valid  =  validator(data)   if  (valid)  {      

       ⩸⩸⩸⩸⩸⩸          ⩸⩸⩸⩸⩸          ⩸⩸⩸          ⩸⩸⩸⩸⩸⩸   }  else  {      return  null;   }   ⩸⩸⩸⩸⩸⩸   return  data;
  51. valid  =  validator(data)   if  (valid)  {      

       ⩸⩸⩸⩸⩸⩸          ⩸⩸⩸⩸⩸          ⩸⩸⩸          ⩸⩸⩸⩸⩸⩸   }  else  {      return  null;   }   ⩸⩸⩸⩸⩸⩸   return  data; essential code
  52. valid  =  validator(data)   if  (!valid)  {      return

     null;   }   ⩸⩸⩸⩸⩸⩸   ⩸⩸⩸⩸⩸   ⩸⩸⩸   ⩸⩸⩸⩸⩸⩸   ⩸⩸⩸⩸⩸⩸   return  data; essential code
  53. 1 . P O LYM O R P H I

    S M
  54. G R E E K MY T H O LO

    GY ?
  55. fieldAsHtml:  function(field)  {      if  ('text'  ===  field.type)  

           return  <input  ⩸⩸⩸⩸⩸⩸  />;   else  if  ('number'  ===  field.type)          return  <Number  ⩸⩸⩸⩸⩸⩸>;      else  if  ('textarea'  ===  field.type)          return  <textarea  ⩸⩸⩸⩸⩸⩸⩸⩸⩸⩸⩸>      else          throw  new  IMissYou(type,  field)   }
  56. fieldAsHtml:  function(field)  {      if  ('text'  ===  field.type)  

           return  <input  ⩸⩸⩸⩸⩸⩸  />;   else  if  ('number'  ===  field.type)          return  <Number  ⩸⩸⩸⩸⩸⩸>;      else  if  ('textarea'  ===  field.type)          return  <textarea  ⩸⩸⩸⩸⩸⩸⩸⩸⩸⩸⩸>      else          throw  new  IMissYou(type,  field)   } fieldAsHtml:  function(field)  {      renderer  =  renderers[field.type]  ||  throw…      return  renderer(field)   }
  57. Design pattern: strategy™

  58. refactoring: Replace Conditional with Polymorphism™

  59. P E O P L E ❤️ PAT T E

    R N S
  60. None
  61. None
  62. if  ('text'  ===  field.type)      return  ⩸⩸⩸⩸⩸;   else

     if  ('textarea'  ===  field.type)      return  ⩸⩸⩸⩸⩸;   else  if  ('number'  ===  field.type)      return  ⩸⩸⩸⩸⩸;   else  if  ('airplane  on  wheels'  ===  field.type)      return  ⩸⩸⩸⩸⩸;   else  if  ('scooter  with  squirrel'  ===  field.type)      return  ⩸⩸⩸⩸⩸;   else  if  ('name'  ===  field.type  &&  name.length  >  5      return  ⩸⩸⩸⩸⩸;   else  if  ('name'  ===  field.type  &&  name.length  <  5      return  ⩸⩸⩸⩸⩸;   else  if  ('textarea  on  JavaScript'  ===  field.type)      return  ⩸⩸⩸⩸⩸;   else  if  ('textarea  raised  with  love'  ===  field.type)      return  ⩸⩸⩸⩸⩸;   else      return  ⩸⩸⩸⩸⩸;
  63. if  ('text'  ===  field.type)      return  ⩸⩸⩸⩸⩸;   else

     if  ('textarea'  ===  field.type)      return  ⩸⩸⩸⩸⩸;   else  if  ('number'  ===  field.type)      return  ⩸⩸⩸⩸⩸;   else  if  ('airplane  on  wheels'  ===  field.type)      return  ⩸⩸⩸⩸⩸;   else  if  ('scooter  with  squirrel'  ===  field.type)      return  ⩸⩸⩸⩸⩸;   else  if  ('name'  ===  field.type  &&  name.length  >  5)      return  ⩸⩸⩸⩸⩸;   else  if  ('name'  ===  field.type  &&  name.length  <  5)      return  ⩸⩸⩸⩸⩸;   else  if  ('textarea  on  JavaScript'  ===  field.type)      return  ⩸⩸⩸⩸⩸;   else  if  ('textarea  raised  with  love'  ===  field.type)      return  ⩸⩸⩸⩸⩸;   else      return  ⩸⩸⩸⩸⩸;
  64. 2 . P U T M O R E F

    O C U S O N A C T I O N
  65. if  (spring)  {      if  (weekday)  {    

         school();      }  elseif  (saturday)  {          if  (raining)              tv();          else              football();      }  else  {          homework();      }   }  else  if  (winter)  {      hibernate();   }
  66. if  (spring)  {      if  (weekday)  {    

         school();      }  elseif  (saturday)  {          if  (raining)              tv();          else              football();      }  else  {          homework();      }   }  else  if  (winter)  {      hibernate();   } if  (spring  &&  weekday)      school();   if  (spring  &&  saturday  &&  !raining)      football();   if  (spring  &&  saturday  &&  raining)      tv();   if  (spring  &&  sunday)      homework();   if  (winter)      hibernate();
  67. if  (spring)  {      if  (weekday)  {    

         school();      }  elseif  (saturday)  {          if  (raining)              tv();          else              football();      }  else  {          homework();      }   }  else  if  (winter)  {      hibernate();   } if  (spring  &&  weekday)      school();   if  (spring  &&  saturday  &&  !raining)      football();   if  (spring  &&  saturday  &&  raining)      tv();   if  (spring  &&  sunday)      homework();   if  (winter)      hibernate();
  68. 3 . N O E S C A P E

  69. E X T R A C T!

  70. if  (⩸⩸⩸⩸⩸1)  {      ⩸⩸⩸⩸      ⩸⩸⩸⩸  

       if  (⩸⩸2)  {          ⩸⩸⩸⩸      }  else  {          ⩸⩸⩸          ⩸⩸⩸⩸⩸⩸          ⩸⩸          if  (⩸⩸⩸3)  {              ⩸⩸          }  else  {              ⩸⩸                    ⩸⩸⩸⩸⩸⩸          }      }   }  else  {      ⩸⩸⩸   }
  71. if  (⩸⩸⩸⩸⩸1)  {      ⩸⩸⩸⩸      ⩸⩸⩸⩸  

       if  (⩸⩸2)  {          ⩸⩸⩸⩸      }  else  {          ⩸⩸⩸          ⩸⩸⩸⩸⩸⩸          ⩸⩸          if  (⩸⩸⩸3)  {              ⩸⩸          }  else  {              ⩸⩸                    ⩸⩸⩸⩸⩸⩸          }      }   }  else  {      ⩸⩸⩸   } if  (⩸⩸⩸⩸⩸1)  {      ⦾(⩸,  ⩸⩸⩸)   }  else  {      ⩸⩸⩸   }   function  ⦾(⩸,  ⩸⩸⩸)  {      ⪍  ⪍  ⪍      ⪍      ⪍  ⪍  ⪍  ⪍   }
  72. if  (⩸⩸⩸⩸⩸1)  {      ⩸⩸⩸⩸      ⩸⩸⩸⩸  

       if  (⩸⩸2)  {          ⩸⩸⩸⩸      }  else  {          ⩸⩸⩸          ⩸⩸⩸⩸⩸⩸          ⩸⩸          if  (⩸⩸⩸3)  {              ⩸⩸          }  else  {              ⩸⩸                    ⩸⩸⩸⩸⩸⩸          }      }   }  else  {      ⩸⩸⩸   } var  ⪍  =  ⩸⩸⩸⩸⩸1;   if  (⪍)  {      ⦾(⩸,  ⩸⩸⩸)   }  else  {      ⩸⩸⩸   }
  73. I N D I R E C T I O

    N ! = A B S T R A C T I O N
  74. P RO G R A M M I N G

    + U S A B I L I T Y = ❤️
  75. None
  76. P E O P L E > CO M P

    U T E R S
  77. T H A N KS ! @ N I KO

    L AY B H T T P : // E X T R A P O L AT E . M E /