$30 off During Our Annual Pro Sale. View Details »

Nothing is Something (RailsConf)

Nothing is Something (RailsConf)

Our code is full of hidden assumptions, things that seem like nothing, secrets that we did not name and thus cannot see.

These secrets represent missing concepts and this talk shows you how to expose those concepts with code that is easy to understand, change and extend.

Being explicit about hidden ideas makes your code simpler, your apps clearer and your life better. Even very small ideas matter. Everything, even nothing, is something.

Sandi Metz

April 16, 2015
Tweet

More Decks by Sandi Metz

Other Decks in Programming

Transcript

  1. Jan 2015 @sandimetz 1.to_s   =>  "1"   1.send(:to_s)  

    =>  "1" 1  +  1   =>  2   1.send(:+,  1)
  2. Jan 2015 @sandimetz 1.to_s   =>  "1"   1.send(:to_s)  

    =>  "1" 1  +  1   =>  2   1.send(:+,  1)   =>  2
  3. Jan 2015 @sandimetz 1.to_s   =>  "1"   1.send(:to_s)  

    =>  "1"   1  +  1   =>  2   1.send(:+,  1)   =>  2
  4. Jan 2015 @sandimetz 1.class 1.to_s   =>  "1"   1.send(:to_s)

      =>  "1"   1  +  1   =>  2   1.send(:+,  1)   =>  2
  5. Jan 2015 @sandimetz 1.class   =>  Fixnum 1.to_s   =>

     "1"   1.send(:to_s)   =>  "1"   1  +  1   =>  2   1.send(:+,  1)   =>  2
  6. Jan 2015 @sandimetz Fixnum.instance_methods(false)   =>  [    :to_s,  

     :+,    :-­‐,    :*,    :/,    :==,    :%,    :modulo,  #  etc 1.to_s   =>  "1"   1.send(:to_s)   =>  "1"   1  +  1   =>  2   1.send(:+,  1)   =>  2
  7. Jan 2015 @sandimetz Fixnum.instance_methods(false)   =>  [    :to_s,  

     :+,    :-­‐,    :*,    :/,    :==,    :%,    :modulo,  #  etc 1.to_s   =>  "1"   1.send(:to_s)   =>  "1"   1  +  1   =>  2   1.send(:+,  1)   =>  2
  8. Jan 2015 @sandimetz Fixnum.instance_methods(false)   =>  [    :to_s,  

     :+,    :-­‐,    :*,    :/,    :==,    :%,    :modulo,  #  etc 1.to_s   =>  "1"   1.send(:to_s)   =>  "1"   1  +  1   =>  2   1.send(:+,  1)   =>  2
  9. Jan 2015 @sandimetz Fixnum.instance_methods(false)   =>  [    :to_s,  

     :+,    :-­‐,    :*,    :/,    :==,    :%,    :modulo,  #  etc 1.to_s   =>  "1"   1.send(:to_s)   =>  "1"   1  +  1   =>  2   1.send(:+,  1)   =>  2
  10. Jan 2015 @sandimetz 1.to_s   =>  "1"   1.send(:to_s)  

    =>  "1"   1  +  1   =>  2   1.send(:+,  1)   =>  2 1  ==  1
  11. Jan 2015 @sandimetz 1.to_s   =>  "1"   1.send(:to_s)  

    =>  "1"   1  +  1   =>  2   1.send(:+,  1)   =>  2 1  ==  1   =>  true
  12. Jan 2015 @sandimetz 1.to_s   =>  "1"   1.send(:to_s)  

    =>  "1"   1  +  1   =>  2   1.send(:+,  1)   =>  2   1  ==  1   =>  true
  13. Jan 2015 @sandimetz 1.to_s   =>  "1"   1.send(:to_s)  

    =>  "1"   1  +  1   =>  2   1.send(:+,  1)   =>  2   1  ==  1   =>  true true.class
  14. Jan 2015 @sandimetz 1.to_s   =>  "1"   1.send(:to_s)  

    =>  "1"   1  +  1   =>  2   1.send(:+,  1)   =>  2   1  ==  1   =>  true true.class   =>  TrueClass
  15. Jan 2015 @sandimetz 1.to_s   =>  "1"   1.send(:to_s)  

    =>  "1"   1  +  1   =>  2   1.send(:+,  1)   =>  2   1  ==  1   =>  true   true.class   =>  TrueClass
  16. Jan 2015 @sandimetz 1.to_s   =>  "1"   1.send(:to_s)  

    =>  "1"   1  +  1   =>  2   1.send(:+,  1)   =>  2   1  ==  1   =>  true   true.class   =>  TrueClass TrueClass.instance_methods(false)   =>  [    :to_s,      :inspect,      :&,      :|,      :^,      :pretty_print_cycle,      :pretty_print]  
  17. Jan 2015 @sandimetz 1.to_s   =>  "1"   1.send(:to_s)  

    =>  "1"   1  +  1   =>  2   1.send(:+,  1)   =>  2   1  ==  1   =>  true   true.class   =>  TrueClass TrueClass.instance_methods(false)   =>  [    :to_s,      :inspect,      :&,      :|,      :^,      :pretty_print_cycle,      :pretty_print]  
  18. Jan 2015 @sandimetz Smalltalk keywords true,  false,  nil,  self,  super,

     thisContext   Ruby keywords alias  and  BEGIN  begin  break  case  class  def  defined?  do   else  elsif  END  end  ensure  false  for  if  in  module  next  nil   not  or  redo  rescue  retry  return  self  super  then  true   undef  unless  until  when  while  yield
  19. Jan 2015 @sandimetz Smalltalk keywords true,  false,  nil,  self,  super,

     thisContext   Ruby keywords alias  and  BEGIN  begin  break  case  class  def  defined?  do   else  elsif  END  end  ensure  false  for  if  in  module  next  nil   not  or  redo  rescue  retry  return  self  super  then  true   undef  unless  until  when  while  yield
  20. Jan 2015 @sandimetz if  (1  ==  1)      'is

     true'   else      'is  false'   end
  21. Jan 2015 @sandimetz if  (1  ==  1)      'is

     true'   else      'is  false'   end true
  22. Jan 2015 @sandimetz if  (1  ==  1)      'is

     true'   else      'is  false'   end   =>  'is  true' true
  23. Jan 2015 @sandimetz if  (1  ==  1)      code

     to  eval  when  ‘true’   else      code  to  eval  when  ‘false’   end true
  24. Jan 2015 @sandimetz if  (  truthy  )      code

     to  eval  when  ‘truthy’   else      code  to  eval  when  ‘falsey’   end
  25. Jan 2015 @sandimetz if  (some  object  whose  type  I  know)

         code  to  do  some  stuff   else      code  to  do  some  other  stuff   end
  26. Jan 2015 @sandimetz class  TrueClass      def  if_true  

           yield          self      end   end
  27. Jan 2015 @sandimetz class  TrueClass      def  if_true  

           yield          self      end      def  if_false          self      end   end
  28. Jan 2015 @sandimetz class  TrueClass      def  if_true  

           yield          self      end      def  if_false          self      end   end class  FalseClass      def  if_true          self      end            def  if_false          yield          self      end   end
  29. Jan 2015 @sandimetz class  TrueClass      def  if_true  

           yield          self      end      def  if_false          self      end   end class  FalseClass      def  if_true          self      end            def  if_false          yield          self      end   end
  30. Jan 2015 @sandimetz class  TrueClass      def  if_true  

           yield          self      end      def  if_false          self      end   end class  FalseClass      def  if_true          self      end            def  if_false          yield          self      end   end
  31. Jan 2015 @sandimetz class  TrueClass      def  if_true  

           yield          self      end      def  if_false          self      end   end class  FalseClass      def  if_true          self      end            def  if_false          yield          self      end   end
  32. Jan 2015 @sandimetz class  TrueClass      def  if_true  

           yield          self      end      def  if_false          self      end   end class  FalseClass      def  if_true          self      end            def  if_false          yield          self      end   end
  33. Jan 2015 @sandimetz class  TrueClass      def  if_true  

           yield          self      end      def  if_false          self      end   end class  FalseClass      def  if_true          self      end            def  if_false          yield          self      end   end
  34. Jan 2015 @sandimetz class  TrueClass      def  if_true  

           yield          self      end      def  if_false          self      end   end class  FalseClass      def  if_true          self      end            def  if_false          yield          self      end   end
  35. Jan 2015 @sandimetz (1  ==  1).if_true  {puts  "evaluated  block"} class

     TrueClass      def  if_true          yield          self      end      #  …   end true
  36. Jan 2015 @sandimetz (1  ==  1).if_true  {puts  "evaluated  block"} class

     TrueClass      def  if_true          yield          self      end      #  …   end
  37. Jan 2015 @sandimetz (1  ==  1).if_true  {puts  "evaluated  block"} class

     TrueClass      def  if_true          yield          self      end      #  …   end
  38. Jan 2015 @sandimetz (1  ==  1).if_true  {puts  "evaluated  block"}  

    "evaluated  block" class  TrueClass      def  if_true          yield          self      end      #  …   end
  39. Jan 2015 @sandimetz (1  ==  1).if_true  {puts  "evaluated  block"}  

    "evaluated  block"   (1  ==  1).if_false  {puts  "evaluated  block"} class  TrueClass      def  if_true          yield          self      end      #  …   end
  40. Jan 2015 @sandimetz (1  ==  1).if_true  {puts  "evaluated  block"}  

    "evaluated  block"   (1  ==  1).if_false  {puts  "evaluated  block"} class  TrueClass      def  if_true          yield          self      end      def  if_false          self      end   end
  41. Jan 2015 @sandimetz (1  ==  1).if_true  {puts  "evaluated  block"}  

    "evaluated  block"   (1  ==  1).if_false  {puts  "evaluated  block"}   #  block  is  ignored class  TrueClass      def  if_true          yield          self      end      def  if_false          self      end   end
  42. Jan 2015 @sandimetz (1  ==  1).if_true  {puts  "evaluated  block"}  

    "evaluated  block"   (1  ==  1).if_false  {puts  "evaluated  block"}   #  block  is  ignored   (1  ==  2).if_true  {puts  "evaluated  block"}
  43. Jan 2015 @sandimetz (1  ==  1).if_true  {puts  "evaluated  block"}  

    "evaluated  block"   (1  ==  1).if_false  {puts  "evaluated  block"}   #  block  is  ignored   (1  ==  2).if_true  {puts  "evaluated  block"}
  44. Jan 2015 @sandimetz (1  ==  1).if_true  {puts  "evaluated  block"}  

    "evaluated  block"   (1  ==  1).if_false  {puts  "evaluated  block"}   #  block  is  ignored   (1  ==  2).if_true  {puts  "evaluated  block"} false
  45. Jan 2015 @sandimetz (1  ==  1).if_true  {puts  "evaluated  block"}  

    "evaluated  block"   (1  ==  1).if_false  {puts  "evaluated  block"}   #  block  is  ignored   (1  ==  2).if_true  {puts  "evaluated  block"} false class  FalseClass    def  if_true          self      end      def  if_false          yield          self      end   end
  46. Jan 2015 @sandimetz (1  ==  1).if_true  {puts  "evaluated  block"}  

    "evaluated  block"   (1  ==  1).if_false  {puts  "evaluated  block"}   #  block  is  ignored   (1  ==  2).if_true  {puts  "evaluated  block"} class  FalseClass    def  if_true          self      end      def  if_false          yield          self      end   end
  47. Jan 2015 @sandimetz (1  ==  1).if_true  {puts  "evaluated  block"}  

    "evaluated  block"   (1  ==  1).if_false  {puts  "evaluated  block"}   #  block  is  ignored   (1  ==  2).if_true  {puts  "evaluated  block"}   #  block  is  ignored class  FalseClass    def  if_true          self      end      def  if_false          yield          self      end   end
  48. Jan 2015 @sandimetz (1  ==  1).if_true  {puts  "evaluated  block"}  

    "evaluated  block"   (1  ==  1).if_false  {puts  "evaluated  block"}   #  block  is  ignored   (1  ==  2).if_true  {puts  "evaluated  block"}   #  block  is  ignored   (1  ==  2).if_false  {puts  "evaluated  block"} class  FalseClass    def  if_true          self      end      def  if_false          yield          self      end   end
  49. Jan 2015 @sandimetz (1  ==  1).if_true  {puts  "evaluated  block"}  

    "evaluated  block"   (1  ==  1).if_false  {puts  "evaluated  block"}   #  block  is  ignored   (1  ==  2).if_true  {puts  "evaluated  block"}   #  block  is  ignored   (1  ==  2).if_false  {puts  "evaluated  block"}   "evaluated  block" class  FalseClass    def  if_true          self      end      def  if_false          yield          self      end   end
  50. Jan 2015 @sandimetz class  TrueClass      def  if_true  

           yield          self      end      def  if_false          self      end   end class  FalseClass      def  if_true          self      end            def  if_false          yield          self      end   end
  51. Jan 2015 @sandimetz class  TrueClass      def  if_true  

           yield          self      end      def  if_false          self      end   end class  FalseClass      def  if_true          self      end            def  if_false          yield          self      end   end
  52. Jan 2015 @sandimetz class  Object      def  if_true  

           yield          self      end      def  if_false          self      end   end class  FalseClass      def  if_true          self      end            def  if_false          yield          self      end   end
  53. Jan 2015 @sandimetz class  Object      def  if_true  

           yield          self      end      def  if_false          self      end   end class  FalseClass      def  if_true          self      end            def  if_false          yield          self      end   end class  NilClass      def  if_true          self      end            def  if_false          yield          self      end   end
  54. Jan 2015 @sandimetz class  Object      def  if_true  

           yield          self      end      def  if_false          self      end   end class  FalseClass      def  if_true          self      end            def  if_false          yield          self      end   end class  NilClass      def  if_true          self      end            def  if_false          yield          self      end   end * Shamelessly swiped from http://yehudakatz.com/2009/10/04/emulating-smalltalks-conditionals-in-ruby/
  55. Jan 2015 @sandimetz "anything".if_true    {puts  "evaluated  block"}   "evaluated

     block"   "anything".if_false  {puts  "evaluated  block"}
  56. Jan 2015 @sandimetz "anything".if_true    {puts  "evaluated  block"}   "evaluated

     block"   "anything".if_false  {puts  "evaluated  block"}   #  block  is  ignored
  57. Jan 2015 @sandimetz "anything".if_true    {puts  "evaluated  block"}   "evaluated

     block"   "anything".if_false  {puts  "evaluated  block"}   #  block  is  ignored   nil.if_true                  {puts  "evaluated  block"}
  58. Jan 2015 @sandimetz "anything".if_true    {puts  "evaluated  block"}   "evaluated

     block"   "anything".if_false  {puts  "evaluated  block"}   #  block  is  ignored   nil.if_true                  {puts  "evaluated  block"}   #  block  is  ignored
  59. Jan 2015 @sandimetz "anything".if_true    {puts  "evaluated  block"}   "evaluated

     block"   "anything".if_false  {puts  "evaluated  block"}   #  block  is  ignored   nil.if_true                  {puts  "evaluated  block"}   #  block  is  ignored   nil.if_false                {puts  "evaluated  block"}
  60. Jan 2015 @sandimetz "anything".if_true    {puts  "evaluated  block"}   "evaluated

     block"   "anything".if_false  {puts  "evaluated  block"}   #  block  is  ignored   nil.if_true                  {puts  "evaluated  block"}   #  block  is  ignored   nil.if_false                {puts  "evaluated  block"}   "evaluated  block"
  61. Jan 2015 @sandimetz if  (1  ==  1)      puts

     'is  true'   else      puts  'is  false'   end   =>  'is  true'
  62. Jan 2015 @sandimetz (1  ==  1).      if_true  {puts

     'is  true'}.      if_false  {puts  'is  false’}   =>  'is  true' if  (1  ==  1)      puts  'is  true'   else      puts  'is  false'   end   =>  'is  true'
  63. Jan 2015 @sandimetz if  (1  ==  2)      puts

     'is  true'   else      puts  'is  false'   end   =>  'is  false' (1  ==  1).      if_true  {puts  'is  true'}.      if_false  {puts  'is  false’}   =>  'is  true' if  (1  ==  1)      puts  'is  true'   else      puts  'is  false'   end   =>  'is  true'
  64. Jan 2015 @sandimetz if  (1  ==  2)      puts

     'is  true'   else      puts  'is  false'   end   =>  'is  false' (1  ==  1).      if_true  {puts  'is  true'}.      if_false  {puts  'is  false’}   =>  'is  true' if  (1  ==  1)      puts  'is  true'   else      puts  'is  false'   end   =>  'is  true' (1  ==  2).      if_true  {puts  'is  true'}.      if_false  {puts  'is  false’}   =>  'is  false'
  65. Jan 2015 @sandimetz ids  =  ['pig',  '',  'sheep']   animals

     =  ids.map  {|id|  Animal.find(id)}   =>  [#<Animal:0x007f94b290ae90  @name="pig">,              nil,              #<Animal:0x007f94b290ae18  @name="sheep">]
  66. Jan 2015 @sandimetz ids  =  ['pig',  '',  'sheep']   animals

     =  ids.map  {|id|  Animal.find(id)}   =>  [#<Animal:0x007f94b290ae90  @name="pig">,              nil,              #<Animal:0x007f94b290ae18  @name="sheep">]   animals.each  {|animal|        puts  animal.name}   =>  'pig'        NoMethodError:  undefined  method  `name'  for  nil:NilClass
  67. Jan 2015 @sandimetz ids  =  ['pig',  '',  'sheep']   animals

     =  ids.map  {|id|  Animal.find(id)}   =>  [#<Animal:0x007f94b290ae90  @name="pig">,              nil,              #<Animal:0x007f94b290ae18  @name="sheep">]   animals.each  {|animal|        puts  animal.name}   =>  'pig'        NoMethodError:  undefined  method  `name'  for  nil:NilClass
  68. Jan 2015 @sandimetz ids  =  ['pig',  '',  'sheep']   animals

     =  ids.map  {|id|  Animal.find(id)}   =>  [#<Animal:0x007f94b290ae90  @name="pig">,              nil,              #<Animal:0x007f94b290ae18  @name="sheep">]   animals.each  {|animal|        puts  animal.name}   =>  'pig'        NoMethodError:  undefined  method  `name'  for  nil:NilClass
  69. Jan 2015 @sandimetz ids  =  ['pig',  '',  'sheep']   animals

     =  ids.map  {|id|  Animal.find(id)}   =>  [#<Animal:  @name="pig">,              nil,              #<Animal:  @name="sheep">]
  70. Jan 2015 @sandimetz ids  =  ['pig',  '',  'sheep']   animals

     =  ids.map  {|id|  Animal.find(id)}   =>  [#<Animal:  @name="pig">,              nil,              #<Animal:  @name="sheep">]   animals.compact   =>  [#<Animal:  @name="pig">,            #<Animal:  @name="sheep">]
  71. Jan 2015 @sandimetz ids  =  ['pig',  '',  'sheep']   animals

     =  ids.map  {|id|  Animal.find(id)}   =>  [#<Animal:  @name="pig">,              nil,              #<Animal:  @name="sheep">]   animals.compact   =>  [#<Animal:  @name="pig">,              #<Animal:  @name="sheep">]   animals.each  {|animal|puts  animal.name}   =>  'pig'          'sheep'
  72. Jan 2015 @sandimetz ids  =  ['pig',  '',  'sheep']   animals

     =  ids.map  {|id|  Animal.find(id)}   =>  [#<Animal:0x007f94b290ae90  @name="pig">,              nil,              #<Animal:0x007f94b290ae18  @name="sheep">]   animals.each  {|animal|        puts  animal.name}   =>  'pig'        NoMethodError:  undefined  method  `name'  for  nil:NilClass
  73. Jan 2015 @sandimetz ids  =  ['pig',  '',  'sheep']   animals

     =  ids.map  {|id|  Animal.find(id)}   =>  [#<Animal:0x007f94b290ae90  @name="pig">,              nil,              #<Animal:0x007f94b290ae18  @name="sheep">]   animals.each  {|animal|        puts  animal.name}   =>  'pig'        NoMethodError:  undefined  method  `name'  for  nil:NilClass
  74. Jan 2015 @sandimetz ids  =  ['pig',  '',  'sheep']   animals

     =  ids.map  {|id|  Animal.find(id)}   =>  [#<Animal:0x007f94b290ae90  @name="pig">,              nil,              #<Animal:0x007f94b290ae18  @name="sheep">]   animals.each  {|animal|        puts  animal.nil?  ?  'no  animal'  :  animal.name}   =>  'pig'          'no  animal'        'sheep'
  75. Jan 2015 @sandimetz ids  =  ['pig',  '',  'sheep']   animals

     =  ids.map  {|id|  Animal.find(id)}   =>  [#<Animal:0x007f94b290ae90  @name="pig">,              nil,              #<Animal:0x007f94b290ae18  @name="sheep">]   animals.each  {|animal|        puts  animal.nil?  ?  'no  animal'  :  animal.name}   =>  'pig'          'no  animal'        'sheep'
  76. Jan 2015 @sandimetz ids  =  ['pig',  '',  'sheep']   animals

     =  ids.map  {|id|  Animal.find(id)}   =>  [#<Animal:0x007f94b290ae90  @name="pig">,              nil,              #<Animal:0x007f94b290ae18  @name="sheep">]   animals.each  {|animal|        puts  animal.nil?  ?  'no  animal'  :  animal.name}   =>  'pig'          'no  animal'        'sheep'
  77. Jan 2015 @sandimetz ids  =  ['pig',  '',  'sheep']   animals

     =  ids.map  {|id|  Animal.find(id)}   =>  [#<Animal:0x007f94b290ae90  @name="pig">,              nil,              #<Animal:0x007f94b290ae18  @name="sheep">]   animals.each  {|animal|        puts  animal.nil?  ?  'no  animal'  :  animal.name}   =>  'pig'          'no  animal'        'sheep'
  78. Jan 2015 @sandimetz ids  =  ['pig',  '',  'sheep']   animals

     =  ids.map  {|id|  Animal.find(id)}   =>  [#<Animal:0x007f94b290ae90  @name="pig">,              nil,              #<Animal:0x007f94b290ae18  @name="sheep">]   animals.each  {|animal|        puts  animal.nil?  ?  'no  animal'  :  animal.name}   =>  'pig'          'no  animal'        'sheep'
  79. Jan 2015 @sandimetz ids  =  ['pig',  '',  'sheep']   animals

     =  ids.map  {|id|  Animal.find(id)}   =>  [#<Animal:0x007f94b290ae90  @name="pig">,              nil,              #<Animal:0x007f94b290ae18  @name="sheep">]   animals.each  {|animal|        puts  animal.nil?  ?  'no  animal'  :  animal.name}   =>  'pig'          'no  animal'        'sheep'
  80. Jan 2015 @sandimetz ids  =  ['pig',  '',  'sheep']   animals

     =  ids.map  {|id|  Animal.find(id)}   =>  [#<Animal:0x007f94b290ae90  @name="pig">,              nil,              #<Animal:0x007f94b290ae18  @name="sheep">]   animals.each  {|animal|      puts  animal  &&  animal.name  }   =>  'pig'          empty  string        'sheep'
  81. Jan 2015 @sandimetz ids  =  ['pig',  '',  'sheep']   animals

     =  ids.map  {|id|  Animal.find(id)}   =>  [#<Animal:0x007f94b290ae90  @name="pig">,              nil,              #<Animal:0x007f94b290ae18  @name="sheep">]   animals.each  {|animal|      puts  animal  &&  animal.name  }   =>  'pig'          empty  string        'sheep'
  82. Jan 2015 @sandimetz ids  =  ['pig',  '',  'sheep']   animals

     =  ids.map  {|id|  Animal.find(id)}   =>  [#<Animal:0x007f94b290ae90  @name="pig">,              nil,              #<Animal:0x007f94b290ae18  @name="sheep">]   animals.each  {|animal|      puts  animal  &&  animal.name  }   =>  'pig'          empty  string        'sheep'
  83. Jan 2015 @sandimetz ids  =  ['pig',  '',  'sheep']   animals

     =  ids.map  {|id|  Animal.find(id)}   =>  [#<Animal:0x007f94b290ae90  @name="pig">,              nil,              #<Animal:0x007f94b290ae18  @name="sheep">]   animals.each  {|animal|      puts  animal  &&  animal.name  }   =>  'pig'          empty  string        'sheep'
  84. Jan 2015 @sandimetz ids  =  ['pig',  '',  'sheep']   animals

     =  ids.map  {|id|  Animal.find(id)}   =>  [#<Animal:0x007f94b290ae90  @name="pig">,              nil,              #<Animal:0x007f94b290ae18  @name="sheep">]   animals.each  {|animal|      puts  animal  &&  animal.name  }   =>  'pig'          empty  string        'sheep'
  85. Jan 2015 @sandimetz ids  =  ['pig',  '',  'sheep']   animals

     =  ids.map  {|id|  Animal.find(id)}   =>  [#<Animal:0x007f94b290ae90  @name="pig">,              nil,              #<Animal:0x007f94b290ae18  @name="sheep">]   animals.each  {|animal|      puts  animal  &&  animal.name  }   =>  'pig'          empty  string        'sheep'
  86. Jan 2015 @sandimetz ids  =  ['pig',  '',  'sheep']   animals

     =  ids.map  {|id|  Animal.find(id)}   =>  [#<Animal:0x007f94b290ae90  @name="pig">,              nil,              #<Animal:0x007f94b290ae18  @name="sheep">]   animals.each  {|animal|        puts  animal.try(:name)}   =>  'pig'          empty  string        'sheep'
  87. Jan 2015 @sandimetz ids  =  ['pig',  '',  'sheep']   animals

     =  ids.map  {|id|  Animal.find(id)}   =>  [#<Animal:0x007f94b290ae90  @name="pig">,              nil,              #<Animal:0x007f94b290ae18  @name="sheep">]   animals.each  {|animal|        puts  animal.try(:name)}   =>  'pig'          empty  string        'sheep'
  88. Jan 2015 @sandimetz ids  =  ['pig',  '',  'sheep']   animals

     =  ids.map  {|id|  Animal.find(id)}   =>  [#<Animal:0x007f94b290ae90  @name="pig">,              nil,              #<Animal:0x007f94b290ae18  @name="sheep">]   animals.each  {|animal|        puts  animal.try(:name)}   =>  'pig'          empty  string        'sheep'
  89. Jan 2015 @sandimetz ids  =  ['pig',  '',  'sheep']   animals

     =  ids.map  {|id|  Animal.find(id)}   =>  [#<Animal:0x007f94b290ae90  @name="pig">,              nil,              #<Animal:0x007f94b290ae18  @name="sheep">]   animals.each  {|animal|        puts  animal.try(:name)}   =>  'pig'          empty  string        'sheep'
  90. Jan 2015 @sandimetz puts  animal.try(:name)   puts  animal.nil?  ?  ''

     :  animal.name   puts  animal  ==  nil  ?  ''  :  animal.name   puts  animal.is_a?(NilClass)  ?  ''  :  animal.name
  91. Jan 2015 @sandimetz puts  animal.try(:name)   puts  animal.nil?  ?  ''

     :  animal.name   puts  animal  ==  nil  ?  ''  :  animal.name   puts  animal.is_a?(NilClass)  ?  ''  :  animal.name
  92. Jan 2015 @sandimetz puts  animal.try(:name)   puts  animal.nil?  ?  ''

     :  animal.name   puts  animal  ==  nil  ?  ''  :  animal.name   puts  animal.is_a?(NilClass)  ?  ''  :  animal.name
  93. Jan 2015 @sandimetz puts  animal.try(:name)   puts  animal.nil?  ?  ''

     :  animal.name   puts  animal  ==  nil  ?  ''  :  animal.name   puts  animal.is_a?(NilClass)  ?  ''  :  animal.name
  94. Jan 2015 @sandimetz puts  animal.is_a?(NilClass)  ?  ''  :  animal.name  

    if  animal.is_a?(NilClass)      puts  ''   else      puts  animal.name   end
  95. Jan 2015 @sandimetz puts  animal.is_a?(NilClass)  ?  ''  :  animal.name  

    if  animal.is_a?(NilClass)      puts  ''   else      puts  animal.name   end
  96. Jan 2015 @sandimetz if  (some  object  whose  type  I  know)

         code  to  do  some  stuff   else      code  to  do  some  other  stuff   end if  animal.is_a?(NilClass)      puts  'no  animal'   else      puts  animal.name   end
  97. Jan 2015 @sandimetz if  (some  object  whose  type  I  know)

         code  to  do  some  stuff   else      code  to  do  some  other  stuff   end if  animal.is_a?(NilClass)      puts  'no  animal'   else      puts  animal.name   end
  98. Jan 2015 @sandimetz if  (some  object  whose  type  I  know)

         code  to  do  some  stuff   else      code  to  do  some  other  stuff   end if  animal.is_a?(NilClass)      puts  'no  animal'   else      puts  animal.name   end
  99. Jan 2015 @sandimetz if  (some  object  whose  type  I  know)

         I'll  supply  the  behavior   else      code  to  do  some  other  stuff   end if  animal.is_a?(NilClass)      puts  'no  animal'   else      puts  animal.name   end
  100. Jan 2015 @sandimetz if  (some  object  whose  type  I  know)

         I'll  supply  the  behavior   else      code  to  do  some  other  stuff   end if  animal.is_a?(NilClass)      puts  'no  animal'   else      puts  animal.name   end
  101. Jan 2015 @sandimetz if  (some  object  whose  type  I  know)

         I'll  supply  the  behavior   else      code  to  do  some  other  stuff   end if  animal.is_a?(NilClass)      puts  'no  animal'   else      puts  animal.name   end
  102. Jan 2015 @sandimetz if  animal.is_a?(NilClass)      puts  'no  animal'

      else      puts  animal.name   end if  (some  object  whose  type  I  know)      I'll  supply  the  behavior   else      I'll  send  a  message   end
  103. Jan 2015 @sandimetz class  Animal   def  self.find animal  =

     Animal.find(id)   animal.nil?  ?  'no  animal'  :  animal.name
  104. Jan 2015 @sandimetz class  Animal   def  self.find animal  =

     Animal.find(id)   animal.nil?  ?  'no  animal'  :  animal.name animal  =  Animal.find(id)   animal.nil?  ?  'no  animal'  :  animal.name animal  =  Animal.find(id)   animal.nil?  ?  'no  animal'  :  animal.name
  105. Jan 2015 @sandimetz class  Animal   def  self.find ind(id)  

    'no  animal'  :  animal.name animal  =  Animal.find(id)   animal.nil?  ?  'no  animal'  :  animal.name animal  =  Animal.find(id)   animal.nil?  ?  'no  animal'  :  animal.name animal  =  Animal.find(id)   animal.nil?  ?  'no  animal'  :  animal.name  Animal.find(id)    ?  'no  animal'  :  animal.name
  106. Jan 2015 @sandimetz class  Animal   def  self.find ind(id)  

    'no  animal'  :  animal.name animal  =  Animal.find(id)   animal.nil?  ?  'no  animal'  :  animal.name animal  =  Animal.find(id)   animal.nil?  ?  'no  animal'  :  animal.name animal  =  Animal.find(id)   animal.nil?  ?  'no  animal'  :  animal.name  Animal.find(id)    ?  'no  animal'  :  animal.name find(id)   animal'  :  animal.name d)   imal'  :  animal.name
  107. Jan 2015 @sandimetz class  Animal   def  self.find ind(id)  

    'no  animal'  :  animal.name animal  =  Animal.find(id)   animal.nil?  ?  'no  animal'  :  animal.name animal  =  Animal.find(id)   animal.nil?  ?  'no  animal'  :  animal.name animal  =  Animal.find(id)   animal.nil?  ?  'no  animal'  :  animal.name  Animal.find(id)    ?  'no  animal'  :  animal.name find(id)   animal'  :  animal.name d)   imal'  :  animal.name 'no  animal'
  108. Jan 2015 @sandimetz class  Animal   def  self.find ind(id)  

    'no  animal'  :  animal.name animal  =  Animal.find(id)   animal.nil?  ?  'no  animal'  :  animal.name animal  =  Animal.find(id)   animal.nil?  ?  'no  animal'  :  animal.name animal  =  Animal.find(id)   animal.nil?  ?  'no  animal'  :  animal.name  Animal.find(id)    ?  'no  animal'  :  animal.name find(id)   animal'  :  animal.name d)   imal'  :  animal.name 'no  animal' 'no  animal'
  109. Jan 2015 @sandimetz class  Animal   def  self.find ind(id)  

    'no  animal'  :  animal.name animal  =  Animal.find(id)   animal.nil?  ?  'no  animal'  :  animal.name animal  =  Animal.find(id)   animal.nil?  ?  'no  animal'  :  animal.name animal  =  Animal.find(id)   animal.nil?  ?  'no  animal'  :  animal.name  Animal.find(id)    ?  'no  animal'  :  animal.name find(id)   animal'  :  animal.name d)   imal'  :  animal.name 'no  animal' 'no  animal' 'no  animal'
  110. Jan 2015 @sandimetz class  Animal   def  self.find ind(id)  

    'no  animal'  :  animal.name animal  =  Animal.find(id)   animal.nil?  ?  'no  animal'  :  animal.name animal  =  Animal.find(id)   animal.nil?  ?  'no  animal'  :  animal.name animal  =  Animal.find(id)   animal.nil?  ?  'no  animal'  :  animal.name  Animal.find(id)    ?  'no  animal'  :  animal.name find(id)   animal'  :  animal.name d)   imal'  :  animal.name 'no  animal' 'no  animal' 'no  animal' 'no  animal'
  111. Jan 2015 @sandimetz class  Animal   def  self.find ind(id)  

    'no  animal'  :  animal.name animal  =  Animal.find(id)   animal.nil?  ?  'no  animal'  :  animal.name animal  =  Animal.find(id)   animal.nil?  ?  'no  animal'  :  animal.name animal  =  Animal.find(id)   animal.nil?  ?  'no  animal'  :  animal.name  Animal.find(id)    ?  'no  animal'  :  animal.name find(id)   animal'  :  animal.name d)   imal'  :  animal.name 'no  animal' 'no  animal' 'no  animal' 'no  animal' 'no  animal'   !!!!
  112. Jan 2015 @sandimetz if  animal.is_a?(NilClass)      puts  'no  animal'

      else      puts  animal.name   end if  (some  object  whose  type  I  know)      I'll  supply  the  behavior   else      I'll  send  a  message   end
  113. Jan 2015 @sandimetz class  Animal      def  name  

         ...      end   end   class  Nil      #  does  not  understand  name   end  
  114. Jan 2015 @sandimetz class  Animal      def  name  

         ...      end   end   class  ???      def  name          'no  animal'      end   end
  115. Jan 2015 @sandimetz class  Animal      def  name  

         ...      end   end   class  MissingAnimal      def  name          'no  animal'      end   end
  116. Jan 2015 @sandimetz ids  =  ['pig',  '',  'sheep']   animals

     =  ids.map  {|id|  Animal.find(id)}   =>  [#<Animal:  @name="pig">,            nil,            #<Animal:  @name="sheep">]   animals.each  {|animal|      if  animal.is_a?(NilClass)          puts  'no  animal'      else          puts  animal.name      end   }
  117. Jan 2015 @sandimetz ids  =  ['pig',  '',  'sheep']   animals

     =  ids.map  {|id|  Animal.find(id)  ||  MissingAnimal.new}   =>  [#<Animal:  @name="pig">,            nil,            #<Animal:  @name="sheep">]   animals.each  {|animal|      if  animal.is_a?(NilClass)          puts  'no  animal'      else          puts  animal.name      end   }
  118. Jan 2015 @sandimetz ids  =  ['pig',  '',  'sheep']   animals

     =  ids.map  {|id|  Animal.find(id)  ||  MissingAnimal.new}   =>  [#<Animal:  @name="pig">,            nil,            #<Animal:  @name="sheep">]   animals.each  {|animal|      if  animal.is_a?(NilClass)          puts  'no  animal'      else          puts  animal.name      end   }
  119. Jan 2015 @sandimetz ids  =  ['pig',  '',  'sheep']   animals

     =  ids.map  {|id|  Animal.find(id)  ||  MissingAnimal.new}   =>  [#<Animal:  @name="pig">,            nil,            #<Animal:  @name="sheep">]   animals.each  {|animal|      if  animal.is_a?(NilClass)          puts  'no  animal'      else          puts  animal.name      end   }
  120. Jan 2015 @sandimetz ids  =  ['pig',  '',  'sheep']   animals

     =  ids.map  {|id|  Animal.find(id)  ||  MissingAnimal.new}   =>  [#<Animal:  @name="pig">,          #<MissingAnimal:>,          #<Animal:  @name="sheep">]   animals.each  {|animal|      if  animal.is_a?(NilClass)          puts  'no  animal'      else          puts  animal.name      end   }
  121. Jan 2015 @sandimetz ids  =  ['pig',  '',  'sheep']   animals

     =  ids.map  {|id|  Animal.find(id)  ||  MissingAnimal.new}   =>  [#<Animal:  @name="pig">,          #<MissingAnimal:>,          #<Animal:  @name="sheep">]   animals.each  {|animal|      if  animal.is_a?(NilClass)          puts  'no  animal'      else          puts  animal.name      end   } added dependency
  122. Jan 2015 @sandimetz ids  =  ['pig',  '',  'sheep']   animals

     =  ids.map  {|id|  Animal.find(id)  ||  MissingAnimal.new}   =>  [#<Animal:  @name="pig">,          #<MissingAnimal:>,          #<Animal:  @name="sheep">]   animals.each  {|animal|      if  animal.is_a?(NilClass)          puts  'no  animal'      else          puts  animal.name      end   }
  123. Jan 2015 @sandimetz ids  =  ['pig',  '',  'sheep']   animals

     =  ids.map  {|id|  Animal.find(id)  ||  MissingAnimal.new}   =>  [#<Animal:  @name="pig">,          #<MissingAnimal:>,          #<Animal:  @name="sheep">]   animals.each  {|animal|      if  animal.is_a?(NilClass)          puts  'no  animal'      else          puts  animal.name      end   } still have the condition
  124. Jan 2015 @sandimetz ids  =  ['pig',  '',  'sheep']   animals

     =  ids.map  {|id|  Animal.find(id)  ||  MissingAnimal.new}   =>  [#<Animal:  @name="pig">,          #<MissingAnimal:>,          #<Animal:  @name="sheep">]   animals.each  {|animal|      if  animal.is_a?(NilClass)          puts  'no  animal'      else          puts  animal.name      end   } but no longer own the behavior
  125. Jan 2015 @sandimetz ids  =  ['pig',  '',  'sheep']   animals

     =  ids.map  {|id|  Animal.find(id)  ||  MissingAnimal.new}   =>  [#<Animal:  @name="pig">,          #<MissingAnimal:>,          #<Animal:  @name="sheep">]   animals.each  {|animal|      if  animal.is_a?(NilClass)          puts  'no  animal'      else          puts  animal.name      end   }
  126. Jan 2015 @sandimetz ids  =  ['pig',  '',  'sheep']   animals

     =  ids.map  {|id|  Animal.find(id)  ||  MissingAnimal.new}   =>  [#<Animal:  @name="pig">,          #<MissingAnimal:>,          #<Animal:  @name="sheep">]   animals.each  {|animal|          puts  animal.name   }
  127. Jan 2015 @sandimetz ids  =  ['pig',  '',  'sheep']   animals

     =  ids.map  {|id|  Animal.find(id)  ||  MissingAnimal.new}   =>  [#<Animal:  @name="pig">,          #<MissingAnimal:>,          #<Animal:  @name="sheep">]   animals.each  {|animal|        puts  animal.name   }
  128. Jan 2015 @sandimetz ids  =  ['pig',  '',  'sheep']   animals

     =  ids.map  {|id|  Animal.find(id)  ||  MissingAnimal.new}   =>  [#<Animal:  @name="pig">,          #<MissingAnimal:>,          #<Animal:  @name="sheep">]   animals.each  {|animal|  puts  animal.name}
  129. Jan 2015 @sandimetz ids  =  ['pig',  '',  'sheep']   animals

     =  ids.map  {|id|  Animal.find(id)  ||  MissingAnimal.new}   =>  [#<Animal:  @name="pig">,          #<MissingAnimal:>,          #<Animal:  @name="sheep">]   animals.each  {|animal|  puts  animal.name}   =>  'pig'          'no  animal'        'sheep'
  130. Jan 2015 @sandimetz ids  =  ['pig',  '',  'sheep']   animals

     =  ids.map  {|id|  Animal.find(id)  ||  MissingAnimal.new}   =>  [#<Animal:  @name="pig">,          #<MissingAnimal:>,          #<Animal:  @name="sheep">]   animals.each  {|animal|  puts  animal.name}   =>  'pig'          'no  animal'        'sheep'
  131. Jan 2015 @sandimetz ids  =  ['pig',  '',  'sheep']   animals

     =  ids.map  {|id|  Animal.find(id)  ||  MissingAnimal.new}   =>  [#<Animal:  @name="pig">,          #<MissingAnimal:>,          #<Animal:  @name="sheep">]   animals.each  {|animal|  puts  animal.name}   =>  'pig'          'no  animal'        'sheep'
  132. Jan 2015 @sandimetz class  Animal      def  name  

         ...      end   end   class  MissingAnimal      def  name          'no  animal'      end   end
  133. Jan 2015 @sandimetz ids  =  ['pig',  '',  'sheep']   animals

     =  ids.map  {|id|  Animal.find(id)  ||  MissingAnimal.new}   animals.each  {|animal|  puts  animal.name}   =>  'pig'          'no  animal'        'sheep'
  134. Jan 2015 @sandimetz ids  =  ['pig',  '',  'sheep']   animals

     =  ids.map  {|id|  Animal.find(id)  ||  MissingAnimal.new}   animals.each  {|animal|  puts  animal.name}   =>  'pig'          'no  animal'        'sheep' dependency
  135. Jan 2015 @sandimetz class  Animal   def  self.find animal  =

     Animal.find(id)  ||  MissingAnimal.new   animal.name
  136. Jan 2015 @sandimetz class  Animal   def  self.find animal  =

     Animal.find(id)  ||  MissingAnimal.new   animal.name animal  =  Animal.find(id)  ||  MissingAnimal.new   animal.name animal  =  Animal.find(id)  ||  MissingAnimal.new   animal.name
  137. Jan 2015 @sandimetz class  Animal   def  self.find  ||  MissingAnimal.new

      animal  =  Animal.find(id)  ||  MissingAnimal.new   animal.name animal  =  Animal.find(id)  ||  MissingAnimal.new   animal.name animal  =  Animal.find(id)  ||  MissingAnimal.new   animal.name al.find(id)  ||  MissingAnimal.new  
  138. Jan 2015 @sandimetz class  Animal   def  self.find  ||  MissingAnimal.new

      animal  =  Animal.find(id)  ||  MissingAnimal.new   animal.name animal  =  Animal.find(id)  ||  MissingAnimal.new   animal.name animal  =  Animal.find(id)  ||  MissingAnimal.new   animal.name al.find(id)  ||  MissingAnimal.new   )  ||  MissingAnimal.new   issingAnimal.new  
  139. Jan 2015 @sandimetz class  Animal   def  self.find  ||  MissingAnimal.new

      animal  =  Animal.find(id)  ||  MissingAnimal.new   animal.name animal  =  Animal.find(id)  ||  MissingAnimal.new   animal.name animal  =  Animal.find(id)  ||  MissingAnimal.new   animal.name al.find(id)  ||  MissingAnimal.new   )  ||  MissingAnimal.new   issingAnimal.new   MissingAnimal
  140. Jan 2015 @sandimetz class  Animal   def  self.find  ||  MissingAnimal.new

      animal  =  Animal.find(id)  ||  MissingAnimal.new   animal.name animal  =  Animal.find(id)  ||  MissingAnimal.new   animal.name animal  =  Animal.find(id)  ||  MissingAnimal.new   animal.name al.find(id)  ||  MissingAnimal.new   )  ||  MissingAnimal.new   issingAnimal.new   MissingAnimal MissingAnimal
  141. Jan 2015 @sandimetz class  Animal   def  self.find  ||  MissingAnimal.new

      animal  =  Animal.find(id)  ||  MissingAnimal.new   animal.name animal  =  Animal.find(id)  ||  MissingAnimal.new   animal.name animal  =  Animal.find(id)  ||  MissingAnimal.new   animal.name al.find(id)  ||  MissingAnimal.new   )  ||  MissingAnimal.new   issingAnimal.new   MissingAnimal MissingAnimal MissingAnimal
  142. Jan 2015 @sandimetz class  Animal   def  self.find  ||  MissingAnimal.new

      animal  =  Animal.find(id)  ||  MissingAnimal.new   animal.name animal  =  Animal.find(id)  ||  MissingAnimal.new   animal.name animal  =  Animal.find(id)  ||  MissingAnimal.new   animal.name al.find(id)  ||  MissingAnimal.new   )  ||  MissingAnimal.new   issingAnimal.new   MissingAnimal MissingAnimal MissingAnimal MissingAnimal
  143. Jan 2015 @sandimetz class  Animal   def  self.find  ||  MissingAnimal.new

      animal  =  Animal.find(id)  ||  MissingAnimal.new   animal.name animal  =  Animal.find(id)  ||  MissingAnimal.new   animal.name animal  =  Animal.find(id)  ||  MissingAnimal.new   animal.name al.find(id)  ||  MissingAnimal.new   )  ||  MissingAnimal.new   issingAnimal.new   MissingAnimal MissingAnimal MissingAnimal MissingAnimal MissingAnimal   ???
  144. Jan 2015 @sandimetz class  Animal      def  self.find(id)  

           #  nil  or  an  Animal      end          #  …   end
  145. Jan 2015 @sandimetz class  GuaranteedAnimal   def  self.find class  Animal

      def  self.find class  GuaranteedAnimal      def  self.find(id)          Animal.find(id)  ||  MissingAnimal.new      end   end
  146. Jan 2015 @sandimetz animals  =  ids.map  {|id|   GuaranteedAnimal.find(id)}  

    =>  [#<Animal:  @name="pig">,          #<MissingAnimal:>,          #<Animal:  @name="sheep">]
  147. Jan 2015 @sandimetz animals  =  ids.map  {|id|   GuaranteedAnimal.find(id)}  

    =>  [#<Animal:  @name="pig">,          #<MissingAnimal:>,          #<Animal:  @name="sheep">]
  148. Jan 2015 @sandimetz animals  =  ids.map  {|id|   GuaranteedAnimal.find(id)}  

    =>  [#<Animal:  @name="pig">,          #<MissingAnimal:>,          #<Animal:  @name="sheep">]   animals.each  {|animal|  puts  animal.name  }   =>  'pig'        'no  animal'        'sheep'  
  149. Jan 2015 @sandimetz animals  =  ids.map  {|id|   GuaranteedAnimal.find(id)}  

    =>  [#<Animal:  @name="pig">,          #<MissingAnimal:>,          #<Animal:  @name="sheep">]   animals.each  {|animal|  puts  animal.name  }   =>  'pig'        'no  animal'        'sheep'  
  150. Jan 2015 @sandimetz animals  =  ids.map  {|id|   GuaranteedAnimal.find(id)}  

    =>  [#<Animal:  @name="pig">,          #<MissingAnimal:>,          #<Animal:  @name="sheep">]   animals.each  {|animal|  puts  animal.name  }   =>  'pig'        'no  animal'        'sheep'  
  151. Jan 2015 @sandimetz    'This  is  the  house  that  Jack

     built.'      'This  is  the  malt  that  lay  in                          the  house  that  Jack  built.' 1 2
  152. Jan 2015 @sandimetz    'This  is  the  house  that  Jack

     built.'      'This  is  the  malt  that  lay  in                          the  house  that  Jack  built.'      'This  is  the  rat  that  ate                          the  malt  that  lay  in                          the  house  that  Jack  built.' 1 2 3
  153. Jan 2015 @sandimetz    'This  is  the  house  that  Jack

     built.'      'This  is  the  malt  that  lay  in                          the  house  that  Jack  built.'      'This  is  the  rat  that  ate                          the  malt  that  lay  in                          the  house  that  Jack  built.'    'This  is  the  horse  and  the  hound  and  the  horn  that  belonged  to                        the  farmer  sowing  his  corn  that  kept                        the  rooster  that  crowed  in  the  morn  that  woke                        the  priest  all  shaven  and  shorn  that  married                        the  man  all  tattered  and  torn  that  kissed                        the  maiden  all  forlorn  that  milked                        the  cow  with  the  crumpled  horn  that  tossed                        the  dog  that  worried                        the  cat  that  killed                          the  rat  that  ate                          the  malt  that  lay  in                          the  house  that  Jack  built.'   12
  154. Jan 2015 @sandimetz        [  'the  horse  and

     the  hound  and  the  horn  that  belonged  to',              'the  farmer  sowing  his  corn  that  kept',              'the  rooster  that  crowed  in  the  morn  that  woke',              'the  priest  all  shaven  and  shorn  that  married',              'the  man  all  tattered  and  torn  that  kissed',              'the  maiden  all  forlorn  that  milked',              'the  cow  with  the  crumpled  horn  that  tossed',              'the  dog  that  worried',              'the  cat  that  killed',              'the  rat  that  ate',              'the  malt  that  lay  in',              'the  house  that  Jack  built'  ]  
  155. Jan 2015 @sandimetz    def  data        

     [  'the  horse  and  the  hound  and  the  horn  that  belonged  to',              'the  farmer  sowing  his  corn  that  kept',              'the  rooster  that  crowed  in  the  morn  that  woke',              'the  priest  all  shaven  and  shorn  that  married',              'the  man  all  tattered  and  torn  that  kissed',              'the  maiden  all  forlorn  that  milked',              'the  cow  with  the  crumpled  horn  that  tossed',              'the  dog  that  worried',              'the  cat  that  killed',              'the  rat  that  ate',              'the  malt  that  lay  in',              'the  house  that  Jack  built']      end  
  156. Jan 2015 @sandimetz    def  data        

     [  'the  horse  and  the  hound  and  the  horn  that  belonged  to',              'the  farmer  sowing  his  corn  that  kept',              'the  rooster  that  crowed  in  the  morn  that  woke',              'the  priest  all  shaven  and  shorn  that  married',              'the  man  all  tattered  and  torn  that  kissed',              'the  maiden  all  forlorn  that  milked',              'the  cow  with  the  crumpled  horn  that  tossed',              'the  dog  that  worried',              'the  cat  that  killed',              'the  rat  that  ate',              'the  malt  that  lay  in',              'the  house  that  Jack  built']      end  
  157. Jan 2015 @sandimetz    def  phrase(number)        

     data.last(number).join("  ")      end      def  data          [  'the  horse  and  the  hound  and  the  horn  that  belonged  to',              'the  farmer  sowing  his  corn  that  kept',              'the  rooster  that  crowed  in  the  morn  that  woke',              'the  priest  all  shaven  and  shorn  that  married',              'the  man  all  tattered  and  torn  that  kissed',              'the  maiden  all  forlorn  that  milked',              'the  cow  with  the  crumpled  horn  that  tossed',              'the  dog  that  worried',              'the  cat  that  killed',              'the  rat  that  ate',              'the  malt  that  lay  in',              'the  house  that  Jack  built']      end  
  158. Jan 2015 @sandimetz    def  phrase(number)        

     data.last(number).join("  ")      end      def  data          [  'the  horse  and  the  hound  and  the  horn  that  belonged  to',              'the  farmer  sowing  his  corn  that  kept',              'the  rooster  that  crowed  in  the  morn  that  woke',              'the  priest  all  shaven  and  shorn  that  married',              'the  man  all  tattered  and  torn  that  kissed',              'the  maiden  all  forlorn  that  milked',              'the  cow  with  the  crumpled  horn  that  tossed',              'the  dog  that  worried',              'the  cat  that  killed',              'the  rat  that  ate',              'the  malt  that  lay  in',              'the  house  that  Jack  built']      end   data.last(3)   =>  ['the  rat  that  ate',          'the  malt  that  lay  in',          'the  house  that  Jack  built']  
  159. Jan 2015 @sandimetz    def  phrase(number)        

     data.last(number).join("  ")      end      def  data          [  'the  horse  and  the  hound  and  the  horn  that  belonged  to',              #  ...              'the  malt  that  lay  in',              'the  house  that  Jack  built']      end  
  160. Jan 2015 @sandimetz    def  phrase(number)        

     data.last(number).join("  ")      end      def  data              [  'the  horse  and  the  hound  and  the  horn  that  belonged  to',                  #  ...                  'the  malt  that  lay  in',                  'the  house  that  Jack  built']      end  
  161. Jan 2015 @sandimetz    def  phrase(number)        

     data.last(number).join("  ")      end      def  data              [  'the  horse  and  the  hound  and  the  horn  that  belonged  to',                  #  ...                  'the  malt  that  lay  in',                  'the  house  that  Jack  built']      end  
  162. Jan 2015 @sandimetz    def  line(number)        

     "This  is  #{phrase(number)}.\n"      end      def  phrase(number)          data.last(number).join("  ")      end      def  data              [  'the  horse  and  the  hound  and  the  horn  that  belonged  to',                  #  ...                  'the  malt  that  lay  in',                  'the  house  that  Jack  built']      end  
  163. Jan 2015 @sandimetz    def  line(number)        

     "This  is  #{phrase(number)}.\n"      end      def  phrase(number)          data.last(number).join("  ")      end      def  data              [  'the  horse  and  the  hound  and  the  horn  that  belonged  to',                  #  ...                  'the  malt  that  lay  in',                  'the  house  that  Jack  built']      end  
  164. Jan 2015 @sandimetz    def  recite        

     (1..data.length).map  {|i|  line(i)}.join("\n")      end      def  line(number)          "This  is  #{phrase(number)}.\n"      end      def  phrase(number)          data.last(number).join("  ")      end      def  data              [  'the  horse  and  the  hound  and  the  horn  that  belonged  to',                  #  ...                  'the  malt  that  lay  in',                  'the  house  that  Jack  built']      end  
  165. Jan 2015 @sandimetz    def  recite        

     (1..data.length).map  {|i|  line(i)}.join("\n")      end      def  line(number)          "This  is  #{phrase(number)}.\n"      end      def  phrase(number)          data.last(number).join("  ")      end      def  data              [  'the  horse  and  the  hound  and  the  horn  that  belonged  to',                  #  ...                  'the  malt  that  lay  in',                  'the  house  that  Jack  built']      end  
  166. Jan 2015 @sandimetz class  House      def  recite  

           (1..data.length).map  {|i|  line(i)}.join("\n")      end      def  line(number)          "This  is  #{phrase(number)}.\n"      end      def  phrase(number)          data.last(number).join("  ")      end      def  data              [  'the  horse  and  the  hound  and  the  horn  that  belonged  to',                  #  ...                  'the  malt  that  lay  in',                  'the  house  that  Jack  built']      end   end
  167. Jan 2015 @sandimetz puts  House.new.line(1) =>  'This  is  the  house

     that  Jack  built.' puts  House.new.line(2) =>  'This  is  the  malt  that  lay  in  the  house  that  Jack  built.'
  168. Jan 2015 @sandimetz puts  House.new.line(1) =>  'This  is  the  house

     that  Jack  built.' puts  House.new.line(2) =>  'This  is  the  malt  that  lay  in  the  house  that  Jack  built.' puts  House.new.line(3) =>  'This  is  the  rat  that  ate  the  malt  that  lay  in  the  house  that  Jack  built.'
  169. Jan 2015 @sandimetz puts  House.new.line(1) =>  'This  is  the  house

     that  Jack  built.' puts  House.new.line(2) =>  'This  is  the  malt  that  lay  in  the  house  that  Jack  built.' puts  House.new.line(3) =>  'This  is  the  rat  that  ate  the  malt  that  lay  in  the  house  that  Jack  built.' puts  House.new.line(12) =>  'This  is  the  horse  and  the  hound  and  the  horn  that  belonged  to  the  farmer  sowing   his  corn  that  kept  the  rooster  that  crowed  in  the  morn  that  woke  the  priest  all   shaven  and  shorn  that  married  the  man  all  tattered  and  torn  that  kissed  the  maiden   all  forlorn  that  milked  the  cow  with  the  crumpled  horn  that  tossed  the  dog  that   worried  the  cat  that  killed  the  rat  that  ate  the  malt  that  lay  in  the  house  that  Jack   built.'
  170. Jan 2015 @sandimetz puts  House.new.line(1) =>  'This  is  the  house

     that  Jack  built.' puts  House.new.line(2) =>  'This  is  the  malt  that  lay  in  the  house  that  Jack  built.' puts  House.new.line(3) =>  'This  is  the  rat  that  ate  the  malt  that  lay  in  the  house  that  Jack  built.' puts  House.new.line(12) =>  'This  is  the  horse  and  the  hound  and  the  horn  that  belonged  to  the  farmer  sowing   his  corn  that  kept  the  rooster  that  crowed  in  the  morn  that  woke  the  priest  all   shaven  and  shorn  that  married  the  man  all  tattered  and  torn  that  kissed  the  maiden   all  forlorn  that  milked  the  cow  with  the  crumpled  horn  that  tossed  the  dog  that   worried  the  cat  that  killed  the  rat  that  ate  the  malt  that  lay  in  the  house  that  Jack   built.' puts  House.new.recite =>   'This  is  the  house  that  Jack  built.' 'This  is  the  malt  that  lay  in  the  house  that  Jack  built.' 'This  is  the  rat  that  ate  the  malt  that  lay  in  the  house  that  Jack  built.' etc
  171. Jan 2015 @sandimetz        [  'the  horse  and

     the  hound  and  the  horn  that  belonged  to',              'the  farmer  sowing  his  corn  that  kept',              'the  rooster  that  crowed  in  the  morn  that  woke',              'the  priest  all  shaven  and  shorn  that  married',              'the  man  all  tattered  and  torn  that  kissed',              'the  maiden  all  forlorn  that  milked',              'the  cow  with  the  crumpled  horn  that  tossed',              'the  dog  that  worried',              'the  cat  that  killed',              'the  rat  that  ate',              'the  malt  that  lay  in',              'the  house  that  Jack  built'  ]  
  172. Jan 2015 @sandimetz        [  'the  rooster  that

     crowed  in  the  morn  that  woke',              'the  farmer  sowing  his  corn  that  kept',              'the  dog  that  worried',              'the  priest  all  shaven  and  shorn  that  married',              'the  man  all  tattered  and  torn  that  kissed',              'the  horse  and  the  hound  and  the  horn  that  belonged  to',              'the  malt  that  lay  in',              'the  cow  with  the  crumpled  horn  that  tossed',              'the  house  that  Jack  built',              'the  cat  that  killed',              'the  maiden  all  forlorn  that  milked',              'the  rat  that  ate']
  173. Jan 2015 @sandimetz        [  'the  rooster  that

     crowed  in  the  morn  that  woke',              'the  farmer  sowing  his  corn  that  kept',              'the  dog  that  worried',              'the  priest  all  shaven  and  shorn  that  married',              'the  man  all  tattered  and  torn  that  kissed',              'the  horse  and  the  hound  and  the  horn  that  belonged  to',              'the  malt  that  lay  in',              'the  cow  with  the  crumpled  horn  that  tossed',              'the  house  that  Jack  built',              'the  cat  that  killed',              'the  maiden  all  forlorn  that  milked',              'the  rat  that  ate']
  174. Jan 2015 @sandimetz        [  'the  rooster  that

     crowed  in  the  morn  that  woke',              'the  farmer  sowing  his  corn  that  kept',              'the  dog  that  worried',              'the  priest  all  shaven  and  shorn  that  married',              'the  man  all  tattered  and  torn  that  kissed',              'the  horse  and  the  hound  and  the  horn  that  belonged  to',              'the  malt  that  lay  in',              'the  cow  with  the  crumpled  horn  that  tossed',              'the  house  that  Jack  built',              'the  cat  that  killed',              'the  maiden  all  forlorn  that  milked',              'the  rat  that  ate']
  175. Jan 2015 @sandimetz        [  'the  rooster  that

     crowed  in  the  morn  that  woke',              'the  farmer  sowing  his  corn  that  kept',              'the  dog  that  worried',              'the  priest  all  shaven  and  shorn  that  married',              'the  man  all  tattered  and  torn  that  kissed',              'the  horse  and  the  hound  and  the  horn  that  belonged  to',              'the  malt  that  lay  in',              'the  cow  with  the  crumpled  horn  that  tossed',              'the  house  that  Jack  built',              'the  cat  that  killed',              'the  maiden  all  forlorn  that  milked',              'the  rat  that  ate']
  176. Jan 2015 @sandimetz    'This  is  the  rat  that  ate.'

         'This  is  the  maiden  all  forlorn  that  milked                          the  rat  that  ate.' 1 2
  177. Jan 2015 @sandimetz    'This  is  the  rat  that  ate.'

         'This  is  the  maiden  all  forlorn  that  milked                          the  rat  that  ate.'      'This  is  the  cat  that  killed                        the  maiden  all  forlorn  that  milked                          the  rat  that  ate.'   1 2 3
  178. Jan 2015 @sandimetz    'This  is  the  rat  that  ate.'

         'This  is  the  maiden  all  forlorn  that  milked                          the  rat  that  ate.'      'This  is  the  cat  that  killed                        the  maiden  all  forlorn  that  milked                          the  rat  that  ate.'      'This  is  the  rooster  that  crowed  in  the  morn  that  woke                          the  farmer  sowing  his  corn  that  kept                          the  dog  that  worried                          the  priest  all  shaven  and  shorn  that  married                          the  man  all  tattered  and  torn  that  kissed                          the  horse  and  the  hound  and  the  horn  that  belonged  to                          the  malt  that  lay  in                          the  cow  with  the  crumpled  horn  that  tossed                          the  house  that  Jack  built                          the  cat  that  killed                          the  maiden  all  forlorn  that  milked                          the  rat  that  ate.' 12
  179. Jan 2015 @sandimetz    'This  is  the  rat  that  ate.'

         'This  is  the  maiden  all  forlorn  that  milked                          the  rat  that  ate.'      'This  is  the  cat  that  killed                        the  maiden  all  forlorn  that  milked                          the  rat  that  ate.'      'This  is  the  rooster  that  crowed  in  the  morn  that  woke                          the  farmer  sowing  his  corn  that  kept                          the  dog  that  worried                          the  priest  all  shaven  and  shorn  that  married                          the  man  all  tattered  and  torn  that  kissed                          the  horse  and  the  hound  and  the  horn  that  belonged  to                          the  malt  that  lay  in                          the  cow  with  the  crumpled  horn  that  tossed                          the  house  that  Jack  built                          the  cat  that  killed                          the  maiden  all  forlorn  that  milked                          the  rat  that  ate.' 12
  180. Jan 2015 @sandimetz class  House      def  recite  

       def  line(number)      def  phrase(number)      def  data              [  'the  horse  and  the  hound  and  the  horn  that  belonged  to',                  #  ...                  'the  malt  that  lay  in',                  'the  house  that  Jack  built']      end   end
  181. Jan 2015 @sandimetz class  House      def  recite  

       def  line(number)      def  phrase(number)      def  data              [  'the  horse  and  the  hound  and  the  horn  that  belonged  to',                  #  ...                  'the  malt  that  lay  in',                  'the  house  that  Jack  built']      end   end Task: Implement RandomHouse without 'if' statements
  182. Jan 2015 @sandimetz class  House      def  recite  

       def  line(number)      def  phrase(number)      def  data              [  'the  horse  and  the  hound  and  the  horn  that  belonged  to',                  #  ...                  'the  malt  that  lay  in',                  'the  house  that  Jack  built']      end   end Inheritance?
  183. Jan 2015 @sandimetz class  House      def  recite  

       def  line(number)      def  phrase(number)      def  data              [  'the  horse  and  the  hound  and  the  horn  that  belonged  to',                  #  ...                  'the  malt  that  lay  in',                  'the  house  that  Jack  built']      end   end class  RandomHouse  <  House      def  data          @data  ||=  super.shuffle      end   end
  184. Jan 2015 @sandimetz class  House      def  recite  

       def  line(number)      def  phrase(number)      def  data              [  'the  horse  and  the  hound  and  the  horn  that  belonged  to',                  #  ...                  'the  malt  that  lay  in',                  'the  house  that  Jack  built']      end   end class  RandomHouse  <  House      def  data          @data  ||=  super.shuffle      end   end
  185. Jan 2015 @sandimetz class  House      def  recite  

       def  line(number)      def  phrase(number)      def  data              [  'the  horse  and  the  hound  and  the  horn  that  belonged  to',                  #  ...                  'the  malt  that  lay  in',                  'the  house  that  Jack  built']      end   end class  RandomHouse  <  House      def  data          @data  ||=  super.shuffle      end   end
  186. Jan 2015 @sandimetz class  House      def  recite  

       def  line(number)      def  phrase(number)      def  data              [  'the  horse  and  the  hound  and  the  horn  that  belonged  to',                  #  ...                  'the  malt  that  lay  in',                  'the  house  that  Jack  built']      end   end class  RandomHouse  <  House      def  data          @data  ||=  super.shuffle      end   end
  187. Jan 2015 @sandimetz class  House      def  recite  

       def  line(number)      def  phrase(number)      def  data              [  'the  horse  and  the  hound  and  the  horn  that  belonged  to',                  #  ...                  'the  malt  that  lay  in',                  'the  house  that  Jack  built']      end   end class  RandomHouse  <  House      def  data          @data  ||=  super.shuffle      end   end
  188. Jan 2015 @sandimetz randomhouse  =  RandomHouse.new puts  randomhouse.line(1) =>  'This

     is  the  rat  that  ate.' puts  randomhouse.line(2) =>  'This  is  the  maiden  all  forlorn  that  milked  the  rat  that  ate.'
  189. Jan 2015 @sandimetz randomhouse  =  RandomHouse.new puts  randomhouse.line(1) =>  'This

     is  the  rat  that  ate.' puts  randomhouse.line(2) =>  'This  is  the  maiden  all  forlorn  that  milked  the  rat  that  ate.' puts  randomhouse.line(3) =>  'This  is  the  cat  that  killed  the  maiden  all  forlorn  that  milked  the  rat   that  ate.'
  190. Jan 2015 @sandimetz randomhouse  =  RandomHouse.new puts  randomhouse.line(1) =>  'This

     is  the  rat  that  ate.' puts  randomhouse.line(2) =>  'This  is  the  maiden  all  forlorn  that  milked  the  rat  that  ate.' puts  randomhouse.line(3) =>  'This  is  the  cat  that  killed  the  maiden  all  forlorn  that  milked  the  rat   that  ate.' puts  randomhouse.line(12) =>  'This  is  the  rooster  that  crowed  in  the  morn  that  woke  the  farmer   sowing  his  corn  that  kept  the  dog  that  worried  the  priest  all  shaven  and   shorn  that  married  the  man  all  tattered  and  torn  that  kissed  the  horse  and   the  hound  and  the  horn  that  belonged  to  the  malt  that  lay  in  the  cow  with   the  crumpled  horn  that  tossed  the  house  that  Jack  built  the  cat  that   killed  the  maiden  all  forlorn  that  milked  the  rat  that  ate.'
  191. Jan 2015 @sandimetz randomhouse  =  RandomHouse.new puts  randomhouse.line(1) =>  'This

     is  the  rat  that  ate.' puts  randomhouse.line(2) =>  'This  is  the  maiden  all  forlorn  that  milked  the  rat  that  ate.' puts  randomhouse.line(3) =>  'This  is  the  cat  that  killed  the  maiden  all  forlorn  that  milked  the  rat   that  ate.' puts  randomhouse.line(12) =>  'This  is  the  rooster  that  crowed  in  the  morn  that  woke  the  farmer   sowing  his  corn  that  kept  the  dog  that  worried  the  priest  all  shaven  and   shorn  that  married  the  man  all  tattered  and  torn  that  kissed  the  horse  and   the  hound  and  the  horn  that  belonged  to  the  malt  that  lay  in  the  cow  with   the  crumpled  horn  that  tossed  the  house  that  Jack  built  the  cat  that   killed  the  maiden  all  forlorn  that  milked  the  rat  that  ate.'
  192. Jan 2015 @sandimetz randomhouse  =  RandomHouse.new puts  randomhouse.line(1) =>  'This

     is  the  rat  that  ate.' puts  randomhouse.line(2) =>  'This  is  the  maiden  all  forlorn  that  milked  the  rat  that  ate.' puts  randomhouse.line(3) =>  'This  is  the  cat  that  killed  the  maiden  all  forlorn  that  milked  the  rat   that  ate.' puts  randomhouse.line(12) =>  'This  is  the  rooster  that  crowed  in  the  morn  that  woke  the  farmer   sowing  his  corn  that  kept  the  dog  that  worried  the  priest  all  shaven  and   shorn  that  married  the  man  all  tattered  and  torn  that  kissed  the  horse  and   the  hound  and  the  horn  that  belonged  to  the  malt  that  lay  in  the  cow  with   the  crumpled  horn  that  tossed  the  house  that  Jack  built  the  cat  that   killed  the  maiden  all  forlorn  that  milked  the  rat  that  ate.'
  193. Jan 2015 @sandimetz randomhouse  =  RandomHouse.new puts  randomhouse.line(1) =>  'This

     is  the  rat  that  ate.' puts  randomhouse.line(2) =>  'This  is  the  maiden  all  forlorn  that  milked  the  rat  that  ate.' puts  randomhouse.line(3) =>  'This  is  the  cat  that  killed  the  maiden  all  forlorn  that  milked  the  rat   that  ate.' puts  randomhouse.line(12) =>  'This  is  the  rooster  that  crowed  in  the  morn  that  woke  the  farmer   sowing  his  corn  that  kept  the  dog  that  worried  the  priest  all  shaven  and   shorn  that  married  the  man  all  tattered  and  torn  that  kissed  the  horse  and   the  hound  and  the  horn  that  belonged  to  the  malt  that  lay  in  the  cow  with   the  crumpled  horn  that  tossed  the  house  that  Jack  built  the  cat  that   killed  the  maiden  all  forlorn  that  milked  the  rat  that  ate.'
  194. Jan 2015 @sandimetz This  is  the  house  that  Jack  built

     the  house  that  Jack  built. This  is  the  malt  that  lay  in  the  malt  that  lay  in                  the  house  that  Jack  built  the  house  that  Jack  built.
  195. Jan 2015 @sandimetz This  is  the  house  that  Jack  built

     the  house  that  Jack  built. This  is  the  malt  that  lay  in  the  malt  that  lay  in                  the  house  that  Jack  built  the  house  that  Jack  built.
  196. Jan 2015 @sandimetz This  is  the  house  that  Jack  built

     the  house  that  Jack  built. This  is  the  malt  that  lay  in  the  malt  that  lay  in                  the  house  that  Jack  built  the  house  that  Jack  built. This  is  the  rat  that  ate  the  rat  that  ate                  the  malt  that  lay  in  the  malt  that  lay  in                  the  house  that  Jack  built  the  house  that  Jack  built.
  197. Jan 2015 @sandimetz class  House      def  recite  

           (1..data.length).map  {|i|  line(i)}.join("\n")      end      def  line(number)          "This  is  #{phrase(number)}.\n"      end      def  phrase(number)          data.last(number).join("  ")      end      def  data              [  'the  horse  and  the  hound  and  the  horn  that  belonged  to',                  #  ...                  'the  malt  that  lay  in',                  'the  house  that  Jack  built']      end   end
  198. Jan 2015 @sandimetz class  House      def  recite  

           (1..data.length).map  {|i|  line(i)}.join("\n")      end      def  line(number)          "This  is  #{phrase(number)}.\n"      end      def  phrase(number)          data.last(number).join("  ")      end      def  data              [  'the  horse  and  the  hound  and  the  horn  that  belonged  to',                  #  ...                  'the  malt  that  lay  in',                  'the  house  that  Jack  built']      end   end
  199. Jan 2015 @sandimetz class  House      def  recite  

       def  line(number)      def  phrase(number)          data.last(number).join("  ")      end      def  data              [  'the  horse  and  the  hound  and  the  horn  that  belonged  to',                  #  ...                  'the  malt  that  lay  in',                  'the  house  that  Jack  built']      end   end
  200. Jan 2015 @sandimetz class  House      def  recite  

       def  line(number)      def  phrase(number)          data.last(number).join("  ")      end      def  data              [  'the  horse  and  the  hound  and  the  horn  that  belonged  to',                  #  ...                  'the  malt  that  lay  in',                  'the  house  that  Jack  built']      end   end
  201. Jan 2015 @sandimetz class  House      def  recite  

       def  line(number)      def  phrase(number)          data.last(number).join("  ")      end      def  data              [  'the  horse  and  the  hound  and  the  horn  that  belonged  to',                  #  ...                  'the  malt  that  lay  in',                  'the  house  that  Jack  built']      end   end
  202. Jan 2015 @sandimetz class  House      def  recite  

       def  line(number)      def  phrase(number)          data.last(number).join("  ")      end      def  parts(number)      end      def  data              [  'the  horse  and  the  hound  and  the  horn  that  belonged  to',                  #  ...                  'the  malt  that  lay  in',                  'the  house  that  Jack  built']      end   end
  203. Jan 2015 @sandimetz class  House      def  recite  

       def  line(number)      def  phrase(number)          data.last(number).join("  ")      end      def  parts(number)          data.last(number)      end      def  data              [  'the  horse  and  the  hound  and  the  horn  that  belonged  to',                  #  ...                  'the  malt  that  lay  in',                  'the  house  that  Jack  built']      end   end
  204. Jan 2015 @sandimetz class  House      def  recite  

       def  line(number)      def  phrase(number)          parts(number).join("  ")      end      def  parts(number)          data.last(number)      end      def  data              [  'the  horse  and  the  hound  and  the  horn  that  belonged  to',                  #  ...                  'the  malt  that  lay  in',                  'the  house  that  Jack  built']      end   end
  205. Jan 2015 @sandimetz class  House      def  recite  

       def  line(number)      def  phrase(number)          parts(number).join("  ")      end      def  parts(number)          data.last(number)      end      def  data              [  'the  horse  and  the  hound  and  the  horn  that  belonged  to',                  #  ...                  'the  malt  that  lay  in',                  'the  house  that  Jack  built']      end   end
  206. Jan 2015 @sandimetz class  House      def  recite  

       def  line(number)      def  phrase(number)      def  parts(number)          data.last(number)      end      def  data              [  'the  horse  and  the  hound  and  the  horn  that  belonged  to',                  #  ...                  'the  malt  that  lay  in',                  'the  house  that  Jack  built']      end   end
  207. Jan 2015 @sandimetz class  House      def  recite  

       def  line(number)      def  phrase(number)      def  parts(number)          data.last(number)      end      def  data              [  'the  horse  and  the  hound  and  the  horn  that  belonged  to',                  #  ...                  'the  malt  that  lay  in',                  'the  house  that  Jack  built']      end   end ['the  rat  that  ate',    'the  malt  that  lay  in',    'the  house  that  Jack  built'] have
  208. Jan 2015 @sandimetz class  House      def  recite  

       def  line(number)      def  phrase(number)      def  parts(number)          data.last(number)      end      def  data              [  'the  horse  and  the  hound  and  the  horn  that  belonged  to',                  #  ...                  'the  malt  that  lay  in',                  'the  house  that  Jack  built']      end   end ['the  rat  that  ate',    'the  malt  that  lay  in',    'the  house  that  Jack  built'] ['the  rat  that  ate',    'the  rat  that  ate',    'the  malt  that  lay  in',    'the  malt  that  lay  in',    'the  house  that  Jack  built',    'the  house  that  Jack  built'] want
  209. Jan 2015 @sandimetz class  House      def  recite  

       def  line(number)      def  phrase(number)      def  parts(number)          data.last(number)      end      def  data              [  'the  horse  and  the  hound  and  the  horn  that  belonged  to',                  #  ...                  'the  malt  that  lay  in',                  'the  house  that  Jack  built']      end   end
  210. Jan 2015 @sandimetz class  House      def  recite  

       def  line(number)      def  phrase(number)      def  parts(number)          data.last(number)      end      def  data              [  'the  horse  and  the  hound  and  the  horn  that  belonged  to',                  #  ...                  'the  malt  that  lay  in',                  'the  house  that  Jack  built']      end   end Task: Implement EchoHouse without 'if' statements
  211. Jan 2015 @sandimetz class  House      def  recite  

       def  line(number)      def  phrase(number)      def  parts(number)          data.last(number)      end      def  data              [  'the  horse  and  the  hound  and  the  horn  that  belonged  to',                  #  ...                  'the  malt  that  lay  in',                  'the  house  that  Jack  built']      end   end Inheritance?
  212. Jan 2015 @sandimetz class  House      def  recite  

       def  line(number)      def  phrase(number)      def  parts(number)          data.last(number)      end      def  data              [  'the  horse  and  the  hound  and  the  horn  that  belonged  to',                  #  ...                  'the  malt  that  lay  in',                  'the  house  that  Jack  built']      end   end class  EchoHouse  <  House      def  parts(number)          super.zip(super).flatten      end   end
  213. Jan 2015 @sandimetz class  House      def  recite  

       def  line(number)      def  phrase(number)      def  parts(number)          data.last(number)      end      def  data              [  'the  horse  and  the  hound  and  the  horn  that  belonged  to',                  #  ...                  'the  malt  that  lay  in',                  'the  house  that  Jack  built']      end   end class  EchoHouse  <  House      def  parts(number)          super.zip(super).flatten      end   end
  214. Jan 2015 @sandimetz class  House      def  recite  

       def  line(number)      def  phrase(number)      def  parts(number)          data.last(number)      end      def  data              [  'the  horse  and  the  hound  and  the  horn  that  belonged  to',                  #  ...                  'the  malt  that  lay  in',                  'the  house  that  Jack  built']      end   end class  EchoHouse  <  House      def  parts(number)          super.zip(super).flatten      end   end
  215. Jan 2015 @sandimetz class  House      def  recite  

       def  line(number)      def  phrase(number)      def  parts(number)          data.last(number)      end      def  data              [  'the  horse  and  the  hound  and  the  horn  that  belonged  to',                  #  ...                  'the  malt  that  lay  in',                  'the  house  that  Jack  built']      end   end class  EchoHouse  <  House      def  parts(number)          super.zip(super).flatten      end   end
  216. Jan 2015 @sandimetz class  House      def  recite  

       def  line(number)      def  phrase(number)      def  parts(number)          data.last(number)      end      def  data              [  'the  horse  and  the  hound  and  the  horn  that  belonged  to',                  #  ...                  'the  malt  that  lay  in',                  'the  house  that  Jack  built']      end   end class  EchoHouse  <  House      def  parts(number)          super.zip(super).flatten      end   end
  217. Jan 2015 @sandimetz ['the  rat  that  ate',    'the  malt

     that  lay  in',    'the  house  that  Jack  built']
  218. Jan 2015 @sandimetz ['the  rat  that  ate',    'the  malt

     that  lay  in',    'the  house  that  Jack  built'] ['the  rat  that  ate',    'the  malt  that  lay  in',    'the  house  that  Jack  built']
  219. Jan 2015 @sandimetz ['the  rat  that  ate',    'the  malt

     that  lay  in',    'the  house  that  Jack  built'] ['the  rat  that  ate',    'the  malt  that  lay  in',    'the  house  that  Jack  built'] super.zip(super)
  220. Jan 2015 @sandimetz ['the  rat  that  ate',    'the  malt

     that  lay  in',    'the  house  that  Jack  built'] ['the  rat  that  ate',    'the  malt  that  lay  in',    'the  house  that  Jack  built'] [['the  rat  that  ate','the  rat  that  ate'],    ['the  malt  that  lay  in','the  malt  that  lay  in'],    ['the  house  that  Jack  built','the  house  that  Jack  built']] super.zip(super)
  221. Jan 2015 @sandimetz ['the  rat  that  ate',    'the  malt

     that  lay  in',    'the  house  that  Jack  built'] super.zip(super).flatten ['the  rat  that  ate',    'the  malt  that  lay  in',    'the  house  that  Jack  built'] [['the  rat  that  ate','the  rat  that  ate'],    ['the  malt  that  lay  in','the  malt  that  lay  in'],    ['the  house  that  Jack  built','the  house  that  Jack  built']] super.zip(super)
  222. Jan 2015 @sandimetz ['the  rat  that  ate',    'the  malt

     that  lay  in',    'the  house  that  Jack  built'] super.zip(super).flatten ['the  rat  that  ate',    'the  malt  that  lay  in',    'the  house  that  Jack  built'] [['the  rat  that  ate','the  rat  that  ate'],    ['the  malt  that  lay  in','the  malt  that  lay  in'],    ['the  house  that  Jack  built','the  house  that  Jack  built']] super.zip(super) ['the  rat  that  ate','the  rat  that  ate',    'the  malt  that  lay  in','the  malt  that  lay  in',    'the  house  that  Jack  built','the  house  that  Jack  built']
  223. Jan 2015 @sandimetz class  House      def  recite  

       def  line(number)      def  phrase(number)      def  parts(number)          data.last(number)      end      def  data              [  'the  horse  and  the  hound  and  the  horn  that  belonged  to',                  #  ...                  'the  malt  that  lay  in',                  'the  house  that  Jack  built']      end   end class  EchoHouse  <  House      def  parts(number)          super.zip(super).flatten      end   end
  224. Jan 2015 @sandimetz puts  EchoHouse.new.line(1) 'This  is  the  house  that

     Jack  built  the  house  that  Jack  built.'
  225. Jan 2015 @sandimetz puts  EchoHouse.new.line(1) 'This  is  the  house  that

     Jack  built  the  house  that  Jack  built.' puts  EchoHouse.new.line(2) 'This  is  the  malt  that  lay  in  the  malt  that  lay  in  the  house  that  Jack  built  the   house  that  Jack  built.'
  226. Jan 2015 @sandimetz puts  EchoHouse.new.line(1) 'This  is  the  house  that

     Jack  built  the  house  that  Jack  built.' puts  EchoHouse.new.line(2) 'This  is  the  malt  that  lay  in  the  malt  that  lay  in  the  house  that  Jack  built  the   house  that  Jack  built.' puts  EchoHouse.new.line(3) 'This  is  the  rat  that  ate  the  rat  that  ate  the  malt  that  lay  in  the  malt  that  lay  in   the  house  that  Jack  built  the  house  that  Jack  built.'
  227. Jan 2015 @sandimetz puts  EchoHouse.new.line(1) 'This  is  the  house  that

     Jack  built  the  house  that  Jack  built.' puts  EchoHouse.new.line(2) 'This  is  the  malt  that  lay  in  the  malt  that  lay  in  the  house  that  Jack  built  the   house  that  Jack  built.' puts  EchoHouse.new.line(3) 'This  is  the  rat  that  ate  the  rat  that  ate  the  malt  that  lay  in  the  malt  that  lay  in   the  house  that  Jack  built  the  house  that  Jack  built.' puts  EchoHouse.new.line(12) 'This  is  the  horse  and  the  hound  and  the  horn  that  belonged  to  the  horse  and  the   hound  and  the  horn  that  belonged  to  the  farmer  sowing  his  corn  that  kept  the  farmer   sowing  his  corn  that  kept  the  rooster  that  crowed  in  the  morn  that  woke  the  rooster   that  crowed  in  the  morn  that  woke  the  priest  all  shaven  and  shorn  that  married  the   priest  all  shaven  and  shorn  that  married  the  man  all  tattered  and  torn  that  kissed   the  man  all  tattered  and  torn  that  kissed  the  maiden  all  forlorn  that  milked  the   maiden  all  forlorn  that  milked  the  cow  with  the  crumpled  horn  that  tossed  the  cow   with  the  crumpled  horn  that  tossed  the  dog  that  worried  the  dog  that  worried  the  cat   that  killed  the  cat  that  killed  the  rat  that  ate  the  rat  that  ate  the  malt  that  lay   in  the  malt  that  lay  in  the  house  that  Jack  built  the  house  that  Jack  built.'
  228. Jan 2015 @sandimetz class  House      def  recite  

       def  line(number)      def  phrase(number)      def  parts(number)      def  data   end
  229. Jan 2015 @sandimetz class  RandomHouse  <  House      def

     data          @data  ||=  super.shuffle      end   end class  House      def  recite      def  line(number)      def  phrase(number)      def  parts(number)      def  data   end
  230. Jan 2015 @sandimetz class  RandomHouse  <  House      def

     data          @data  ||=  super.shuffle      end   end class  House      def  recite      def  line(number)      def  phrase(number)      def  parts(number)      def  data   end
  231. Jan 2015 @sandimetz class  RandomHouse  <  House      def

     data          @data  ||=  super.shuffle      end   end class  EchoHouse  <  House      def  parts(number)          super.zip(super).flatten      end   end class  House      def  recite      def  line(number)      def  phrase(number)      def  parts(number)      def  data   end
  232. Jan 2015 @sandimetz class  RandomHouse  <  House      def

     data          @data  ||=  super.shuffle      end   end class  EchoHouse  <  House      def  parts(number)          super.zip(super).flatten      end   end class  House      def  recite      def  line(number)      def  phrase(number)      def  parts(number)      def  data   end
  233. Jan 2015 @sandimetz class  RandomHouse  <  House      def

     data          @data  ||=  super.shuffle      end   end class  EchoHouse  <  House      def  parts(number)          super.zip(super).flatten      end   end class  House      def  recite      def  line(number)      def  phrase(number)      def  parts(number)      def  data   end What could possibly go wrong?
  234. Jan 2015 @sandimetz class  RandomHouse  <  House      def

     data          @data  ||=  super.shuffle      end   end class  EchoHouse  <  House      def  parts(number)          super.zip(super).flatten      end   end class  House      def  recite      def  line(number)      def  phrase(number)      def  parts(number)      def  data   end
  235. Jan 2015 @sandimetz class  RandomHouse  <  House      def

     data          @data  ||=  super.shuffle      end   end class  EchoHouse  <  House      def  parts(number)          super.zip(super).flatten      end   end
  236. Jan 2015 @sandimetz class  RandomHouse  <  House      def

     data          @data  ||=  super.shuffle      end   end class  EchoHouse  <  House      def  parts(number)          super.zip(super).flatten      end   end
  237. Jan 2015 @sandimetz class  RandomHouse  <  House      def

     data          @data  ||=  super.shuffle      end   end class  EchoHouse  <  House      def  parts(number)          super.zip(super).flatten      end   end Duplicate some of the code?
  238. Jan 2015 @sandimetz class  RandomHouse  <  House      def

     data          @data  ||=  super.shuffle      end   end class  EchoHouse  <  House      def  parts(number)          super.zip(super).flatten      end   end RandomEchoHouse <  RandomHouse <  EchoHouse data parts
  239. Jan 2015 @sandimetz class  RandomHouse  <  House      def

     data          @data  ||=  super.shuffle      end   end   class  RandomEchoHouse  <  RandomHouse      def  parts(number)          super.zip(super).flatten      end   end class  EchoHouse  <  House      def  parts(number)          super.zip(super).flatten      end   end RandomEchoHouse <  RandomHouse <  EchoHouse data parts
  240. Jan 2015 @sandimetz class  RandomHouse  <  House      def

     data          @data  ||=  super.shuffle      end   end   class  RandomEchoHouse  <  RandomHouse      def  parts(number)          super.zip(super).flatten      end   end class  EchoHouse  <  House      def  parts(number)          super.zip(super).flatten      end   end RandomEchoHouse <  RandomHouse <  EchoHouse data parts
  241. Jan 2015 @sandimetz class  RandomHouse  <  House      def

     data          @data  ||=  super.shuffle      end   end   class  RandomEchoHouse  <  RandomHouse      def  parts(number)          super.zip(super).flatten      end   end class  EchoHouse  <  House      def  parts(number)          super.zip(super).flatten      end   end RandomEchoHouse <  RandomHouse <  EchoHouse Inherit data parts
  242. Jan 2015 @sandimetz class  RandomHouse  <  House      def

     data          @data  ||=  super.shuffle      end   end   class  RandomEchoHouse  <  RandomHouse      def  parts(number)          super.zip(super).flatten      end   end class  EchoHouse  <  House      def  parts(number)          super.zip(super).flatten      end   end RandomEchoHouse <  RandomHouse <  EchoHouse Inherit data Duplicate parts
  243. Jan 2015 @sandimetz class  RandomHouse  <  House      def

     data          @data  ||=  super.shuffle      end   end class  EchoHouse  <  House      def  parts(number)          super.zip(super).flatten      end   end RandomEchoHouse <  RandomHouse <  EchoHouse Inherit data Duplicate parts
  244. Jan 2015 @sandimetz class  RandomHouse  <  House      def

     data          @data  ||=  super.shuffle      end   end class  EchoHouse  <  House      def  parts(number)          super.zip(super).flatten      end   end   class   RandomEchoHouse   <   EchoHouse      def  data          @data  ||=  super.shuffle      end   end RandomEchoHouse <  RandomHouse <  EchoHouse Inherit data Duplicate parts
  245. Jan 2015 @sandimetz class  RandomHouse  <  House      def

     data          @data  ||=  super.shuffle      end   end class  EchoHouse  <  House      def  parts(number)          super.zip(super).flatten      end   end   class   RandomEchoHouse   <   EchoHouse      def  data          @data  ||=  super.shuffle      end   end RandomEchoHouse <  RandomHouse <  EchoHouse Inherit data Duplicate parts
  246. Jan 2015 @sandimetz class  RandomHouse  <  House      def

     data          @data  ||=  super.shuffle      end   end class  EchoHouse  <  House      def  parts(number)          super.zip(super).flatten      end   end   class   RandomEchoHouse   <   EchoHouse      def  data          @data  ||=  super.shuffle      end   end RandomEchoHouse <  RandomHouse <  EchoHouse Inherit data Duplicate parts Inherit
  247. Jan 2015 @sandimetz class  RandomHouse  <  House      def

     data          @data  ||=  super.shuffle      end   end class  EchoHouse  <  House      def  parts(number)          super.zip(super).flatten      end   end   class   RandomEchoHouse   <   EchoHouse      def  data          @data  ||=  super.shuffle      end   end RandomEchoHouse <  RandomHouse <  EchoHouse Inherit data Duplicate Duplicate parts Inherit
  248. Jan 2015 @sandimetz class  RandomHouse  <  House   class  EchoHouse

     <  House   class  RandomEchoHouse  <  House  
  249. Jan 2015 @sandimetz class  RandomHouse  <  House   class  EchoHouse

     <  House   class  RandomEchoHouse  <  House  
  250. Jan 2015 @sandimetz class  RandomHouse  <  House      def

     data          @data  ||=  super.shuffle      end   end class  EchoHouse  <  House      def  parts(number)          super.zip(super).flatten      end   end class  RandomEchoHouse  <  House      def  data          @data  ||=  super.shuffle      end      def  parts(number)          super.zip(super).flatten      end   end
  251. Jan 2015 @sandimetz class  RandomHouse  <  House      def

     data          @data  ||=  super.shuffle      end   end class  EchoHouse  <  House      def  parts(number)          super.zip(super).flatten      end   end class  RandomEchoHouse  <  House      def  data          @data  ||=  super.shuffle      end      def  parts(number)          super.zip(super).flatten      end   end
  252. Jan 2015 @sandimetz class  RandomHouse  <  House      def

     data          @data  ||=  super.shuffle      end   end class  EchoHouse  <  House      def  parts(number)          super.zip(super).flatten      end   end class  RandomEchoHouse  <  House      def  data          @data  ||=  super.shuffle      end      def  parts(number)          super.zip(super).flatten      end   end
  253. Jan 2015 @sandimetz class  RandomHouse  <  House      def

     data          @data  ||=  super.shuffle      end   end class  EchoHouse  <  House      def  parts(number)          super.zip(super).flatten      end   end class  RandomEchoHouse  <  House      def  data          @data  ||=  super.shuffle      end      def  parts(number)          super.zip(super).flatten      end   end
  254. Jan 2015 @sandimetz class  RandomHouse  <  House      def

     data          @data  ||=  super.shuffle      end   end class  EchoHouse  <  House      def  parts(number)          super.zip(super).flatten      end   end class  RandomEchoHouse  <  House      def  data          @data  ||=  super.shuffle      end      def  parts(number)          super.zip(super).flatten      end   end
  255. Jan 2015 @sandimetz class  House      def  data  

           [  'the  horse  and  the  hound  and  the  horn  that  belonged  to',              'the  farmer  sowing  his  corn  that  kept',              'the  rooster  that  crowed  in  the  morn  that  woke',              'the  priest  all  shaven  and  shorn  that  married',              'the  man  all  tattered  and  torn  that  kissed',              'the  maiden  all  forlorn  that  milked',              'the  cow  with  the  crumpled  horn  that  tossed',              'the  dog  that  worried',              'the  cat  that  killed',              'the  rat  that  ate',              'the  malt  that  lay  in',              'the  house  that  Jack  built']      end   end   class  RandomHouse  <  House      def  data          @data  ||=  super.shuffle      end   end
  256. Jan 2015 @sandimetz class  House      def  data  

           [  'the  horse  and  the  hound  and  the  horn  that  belonged  to',              'the  farmer  sowing  his  corn  that  kept',              'the  rooster  that  crowed  in  the  morn  that  woke',              'the  priest  all  shaven  and  shorn  that  married',              'the  man  all  tattered  and  torn  that  kissed',              'the  maiden  all  forlorn  that  milked',              'the  cow  with  the  crumpled  horn  that  tossed',              'the  dog  that  worried',              'the  cat  that  killed',              'the  rat  that  ate',              'the  malt  that  lay  in',              'the  house  that  Jack  built']      end   end   class  RandomHouse  <  House      def  data          @data  ||=  super.shuffle      end   end What does RandomHouse change?
  257. Jan 2015 @sandimetz class  House      def  data  

           [  'the  horse  and  the  hound  and  the  horn  that  belonged  to',              'the  farmer  sowing  his  corn  that  kept',              'the  rooster  that  crowed  in  the  morn  that  woke',              'the  priest  all  shaven  and  shorn  that  married',              'the  man  all  tattered  and  torn  that  kissed',              'the  maiden  all  forlorn  that  milked',              'the  cow  with  the  crumpled  horn  that  tossed',              'the  dog  that  worried',              'the  cat  that  killed',              'the  rat  that  ate',              'the  malt  that  lay  in',              'the  house  that  Jack  built']      end   end   class  RandomHouse  <  House      def  data          @data  ||=  super.shuffle      end   end
  258. Jan 2015 @sandimetz class  House      def  data  

           [  'the  horse  and  the  hound  and  the  horn  that  belonged  to',              'the  farmer  sowing  his  corn  that  kept',              'the  rooster  that  crowed  in  the  morn  that  woke',              'the  priest  all  shaven  and  shorn  that  married',              'the  man  all  tattered  and  torn  that  kissed',              'the  maiden  all  forlorn  that  milked',              'the  cow  with  the  crumpled  horn  that  tossed',              'the  dog  that  worried',              'the  cat  that  killed',              'the  rat  that  ate',              'the  malt  that  lay  in',              'the  house  that  Jack  built']      end   end   class  RandomHouse  <  House      def  data          @data  ||=  super.shuffle      end   end Make this
  259. Jan 2015 @sandimetz class  House      def  data  

           [  'the  horse  and  the  hound  and  the  horn  that  belonged  to',              'the  farmer  sowing  his  corn  that  kept',              'the  rooster  that  crowed  in  the  morn  that  woke',              'the  priest  all  shaven  and  shorn  that  married',              'the  man  all  tattered  and  torn  that  kissed',              'the  maiden  all  forlorn  that  milked',              'the  cow  with  the  crumpled  horn  that  tossed',              'the  dog  that  worried',              'the  cat  that  killed',              'the  rat  that  ate',              'the  malt  that  lay  in',              'the  house  that  Jack  built']      end   end   class  RandomHouse  <  House      def  data          @data  ||=  super.shuffle      end   end Make this More like this
  260. Jan 2015 @sandimetz class  House      def  data  

           [  'the  horse  and  the  hound  and  the  horn  that  belonged  to',              'the  farmer  sowing  his  corn  that  kept',              'the  rooster  that  crowed  in  the  morn  that  woke',              'the  priest  all  shaven  and  shorn  that  married',              'the  man  all  tattered  and  torn  that  kissed',              'the  maiden  all  forlorn  that  milked',              'the  cow  with  the  crumpled  horn  that  tossed',              'the  dog  that  worried',              'the  cat  that  killed',              'the  rat  that  ate',              'the  malt  that  lay  in',              'the  house  that  Jack  built']      end   end
  261. Jan 2015 @sandimetz class  House      DATA  =  

           [  'the  horse  and  the  hound  and  the  horn  that  belonged  to',              'the  farmer  sowing  his  corn  that  kept',              'the  rooster  that  crowed  in  the  morn  that  woke',              'the  priest  all  shaven  and  shorn  that  married',              'the  man  all  tattered  and  torn  that  kissed',              'the  maiden  all  forlorn  that  milked',              'the  cow  with  the  crumpled  horn  that  tossed',              'the  dog  that  worried',              'the  cat  that  killed',              'the  rat  that  ate',              'the  malt  that  lay  in',              'the  house  that  Jack  built']   end
  262. Jan 2015 @sandimetz class  House      DATA  =  

           [  'the  horse  and  the  hound  and  the  horn  that  belonged  to',              #  ...            'the  house  that  Jack  built']   end
  263. Jan 2015 @sandimetz class  House      DATA  =  

           [  'the  horse  and  the  hound  and  the  horn  that  belonged  to',              #  ...            'the  house  that  Jack  built']      def  data          DATA      end   end
  264. Jan 2015 @sandimetz class  House      DATA  =  

           [  'the  horse  and  the  hound  and  the  horn  that  belonged  to',              #  ...            'the  house  that  Jack  built']      def  data          DATA      end   end   class  RandomHouse  <  House      def  data          @data  ||=  super.shuffle      end   end
  265. Jan 2015 @sandimetz class  House      DATA  =  

           [  'the  horse  and  the  hound  and  the  horn  that  belonged  to',              #  ...            'the  house  that  Jack  built']      def  data          @data  ||=  DATA      end   end   class  RandomHouse  <  House      def  data          @data  ||=  super.shuffle      end   end
  266. Jan 2015 @sandimetz class  House      DATA  =  

           [  'the  horse  and  the  hound  and  the  horn  that  belonged  to',              #  ...            'the  house  that  Jack  built']      def  data          @data  ||=  DATA      end   end   class  RandomHouse  <  House      def  data          @data  ||=  DATA.shuffle      end   end
  267. Jan 2015 @sandimetz class  House      DATA  =  

           [  'the  horse  and  the  hound  and  the  horn  that  belonged  to',              #  ...            'the  house  that  Jack  built']      def  data          @data  ||=  DATA      end   end   class  RandomHouse  <  House      def  data          @data  ||=  DATA.shuffle      end   end What changed?
  268. Jan 2015 @sandimetz class data order House DATA RandomHouse DATA

    shuffle It's an order algorithm just as valid as this one
  269. Jan 2015 @sandimetz class  DefaultOrder   end   class  RandomOrder

         def  order(data)          data.shuffle      end   end
  270. Jan 2015 @sandimetz class  DefaultOrder      def  order(data)  

       end   end   class  RandomOrder      def  order(data)          data.shuffle      end   end
  271. Jan 2015 @sandimetz class  DefaultOrder      def  order(data)  

           data      end   end   class  RandomOrder      def  order(data)          data.shuffle      end   end
  272. Jan 2015 @sandimetz class  House      DATA  =  

           [  'the  horse  and  the  hound  and  the  horn  that  belonged  to',              #  ...            'the  house  that  Jack  built']      def  data          DATA      end   end   class  RandomHouse  <  House      def  data          @data  ||=  super.shuffle      end   end
  273. Jan 2015 @sandimetz class  House      DATA  =  

           [  'the  horse  and  the  hound  and  the  horn  that  belonged  to',              #  ...            'the  house  that  Jack  built']      def  data          DATA      end   end
  274. Jan 2015 @sandimetz class  House      DATA  =  

           [  'the  horse  and  the  hound  and  the  horn  that  belonged  to',              #  ...            'the  house  that  Jack  built']      def  data          DATA      end        #  ...   end
  275. Jan 2015 @sandimetz class  House      DATA  =  

           [  'the  horse  and  the  hound  and  the  horn  that  belonged  to',              #  ...            'the  house  that  Jack  built']      attr_reader  :data      def  data          DATA      end        #  ...   end
  276. Jan 2015 @sandimetz class  House      DATA  =  

           [  'the  horse  and  the  hound  and  the  horn  that  belonged  to',              #  ...            'the  house  that  Jack  built']      attr_reader  :data      def  initialize          @data  =  DATA      end      def  data          DATA      end        #  ...   end
  277. Jan 2015 @sandimetz class  House      DATA  =  

           [  'the  horse  and  the  hound  and  the  horn  that  belonged  to',              #  ...            'the  house  that  Jack  built']      attr_reader  :data      def  initialize          @data  =  DATA      end        #  ...   end
  278. Jan 2015 @sandimetz class  House      DATA  =  

           [  'the  horse  and  the  hound  and  the  horn  that  belonged  to',              #  ...            'the  house  that  Jack  built']      attr_reader  :data      def  initialize          @data  =  DATA      end        #  ...   end
  279. Jan 2015 @sandimetz class  House      attr_reader  :data  

       def  initialize          @data  =  DATA      end        #  ...   end
  280. Jan 2015 @sandimetz class  House      attr_reader  :data  

       def  initialize          @data  =  DATA      end        #  ...   end
  281. Jan 2015 @sandimetz class  House      attr_reader  :data  

       def  initialize          @data  =  DATA      end        #  ...   end Remove 'ordering' responsibility from House
  282. Jan 2015 @sandimetz class  House      attr_reader  :data  

       def  initialize          @data  =  DATA      end        #  ...   end class  DefaultOrder      def  order(data)          data      end   end
  283. Jan 2015 @sandimetz class  House      attr_reader  :data  

       def  initialize(orderer:  DefaultOrder.new)          @data  =  DATA      end        #  ...   end class  DefaultOrder      def  order(data)          data      end   end
  284. Jan 2015 @sandimetz class  House      attr_reader  :data  

       def  initialize(orderer:  DefaultOrder.new)          @data  =                              DATA      end        #  ...   end class  DefaultOrder      def  order(data)          data      end   end
  285. Jan 2015 @sandimetz class  House      attr_reader  :data  

       def  initialize(orderer:  DefaultOrder.new)          @data  =  orderer.order(DATA)      end        #  ...   end class  DefaultOrder      def  order(data)          data      end   end
  286. Jan 2015 @sandimetz class  House      attr_reader  :data  

       def  initialize(orderer:  DefaultOrder.new)          @data  =  orderer.order(DATA)      end        #  ...   end class  DefaultOrder      def  order(data)          data      end   end puts  House.new.line(12)
  287. Jan 2015 @sandimetz class  House      attr_reader  :data  

       def  initialize(orderer:  DefaultOrder.new)          @data  =  orderer.order(DATA)      end        #  ...   end class  DefaultOrder      def  order(data)          data      end   end puts  House.new.line(12) =>  'This  is  the  horse  and  the  hound  and  the  horn  that  belonged  to  the  farmer  sowing   his  corn  that  kept  the  rooster  that  crowed  in  the  morn  that  woke  the  priest  all  shaven   and  shorn  that  married  the  man  all  tattered  and  torn  that  kissed  the  maiden  all   forlorn  that  milked  the  cow  with  the  crumpled  horn  that  tossed  the  dog  that  worried   the  cat  that  killed  the  rat  that  ate  the  malt  that  lay  in  the  house  that  Jack  built.'
  288. Jan 2015 @sandimetz class  House      attr_reader  :data  

       def  initialize(orderer:  DefaultOrder.new)          @data  =  orderer.order(DATA)      end        #  ...   end class  DefaultOrder      def  order(data)          data      end   end puts  House.new.line(12)   =>  'This  is  the  horse  and  the  hound  and  the  horn  that  belonged  to  the  farmer  sowing   his  corn  that  kept  the  rooster  that  crowed  in  the  morn  that  woke  the  priest  all  shaven   and  shorn  that  married  the  man  all  tattered  and  torn  that  kissed  the  maiden  all   forlorn  that  milked  the  cow  with  the  crumpled  horn  that  tossed  the  dog  that  worried   the  cat  that  killed  the  rat  that  ate  the  malt  that  lay  in  the  house  that  Jack  built.'
  289. Jan 2015 @sandimetz class  House      attr_reader  :data  

       def  initialize(orderer:  DefaultOrder.new)          @data  =  orderer.order(DATA)      end        #  ...   end class  DefaultOrder      def  order(data)          data      end   end puts  House.new.line(12)   =>  'This  is  the  horse  and  the  hound  and  the  horn  that  belonged  to  the  farmer  sowing   his  corn  that  kept  the  rooster  that  crowed  in  the  morn  that  woke  the  priest  all  shaven   and  shorn  that  married  the  man  all  tattered  and  torn  that  kissed  the  maiden  all   forlorn  that  milked  the  cow  with  the  crumpled  horn  that  tossed  the  dog  that  worried   the  cat  that  killed  the  rat  that  ate  the  malt  that  lay  in  the  house  that  Jack  built.' More code
  290. Jan 2015 @sandimetz class  House      attr_reader  :data  

       def  initialize(orderer:  DefaultOrder.new)          @data  =  orderer.order(DATA)      end        #  ...   end class  DefaultOrder      def  order(data)          data      end   end puts  House.new.line(12)   =>  'This  is  the  horse  and  the  hound  and  the  horn  that  belonged  to  the  farmer  sowing   his  corn  that  kept  the  rooster  that  crowed  in  the  morn  that  woke  the  priest  all  shaven   and  shorn  that  married  the  man  all  tattered  and  torn  that  kissed  the  maiden  all   forlorn  that  milked  the  cow  with  the  crumpled  horn  that  tossed  the  dog  that  worried   the  cat  that  killed  the  rat  that  ate  the  malt  that  lay  in  the  house  that  Jack  built.' More code Same behavior
  291. Jan 2015 @sandimetz class  House      attr_reader  :data  

       def  initialize(orderer:  DefaultOrder.new)          @data  =  orderer.order(DATA)      end        #  ...   end class  DefaultOrder      def  order(data)          data      end   end puts  House.new.line(12)   =>  'This  is  the  horse  and  the  hound  and  the  horn  that  belonged  to  the  farmer  sowing   his  corn  that  kept  the  rooster  that  crowed  in  the  morn  that  woke  the  priest  all  shaven   and  shorn  that  married  the  man  all  tattered  and  torn  that  kissed  the  maiden  all   forlorn  that  milked  the  cow  with  the  crumpled  horn  that  tossed  the  dog  that  worried   the  cat  that  killed  the  rat  that  ate  the  malt  that  lay  in  the  house  that  Jack  built.' More code Same behavior Awesome
  292. Jan 2015 @sandimetz class  House      attr_reader  :data  

       def  initialize(orderer:  DefaultOrder.new)          @data  =  orderer.order(DATA)      end        #  ...   end class  DefaultOrder      def  order(data)          data      end   end puts  House.new.line(12)   =>  'This  is  the  horse  and  the  hound  and  the  horn  that  belonged  to  the  farmer  sowing   his  corn  that  kept  the  rooster  that  crowed  in  the  morn  that  woke  the  priest  all  shaven   and  shorn  that  married  the  man  all  tattered  and  torn  that  kissed  the  maiden  all   forlorn  that  milked  the  cow  with  the  crumpled  horn  that  tossed  the  dog  that  worried   the  cat  that  killed  the  rat  that  ate  the  malt  that  lay  in  the  house  that  Jack  built.'
  293. Jan 2015 @sandimetz class  House      attr_reader  :data  

       def  initialize(orderer:  DefaultOrder.new)          @data  =  orderer.order(DATA)      end        #  ...   end class  DefaultOrder      def  order(data)          data      end   end puts  House.new.line(12) class  RandomOrder      def  order(data)          data.shuffle      end   end
  294. Jan 2015 @sandimetz class  House      attr_reader  :data  

       def  initialize(orderer:  DefaultOrder.new)          @data  =  orderer.order(DATA)      end        #  ...   end class  DefaultOrder      def  order(data)          data      end   end puts  House.new(                                                ).line(12) class  RandomOrder      def  order(data)          data.shuffle      end   end
  295. Jan 2015 @sandimetz class  House      attr_reader  :data  

       def  initialize(orderer:  DefaultOrder.new)          @data  =  orderer.order(DATA)      end        #  ...   end class  DefaultOrder      def  order(data)          data      end   end puts  House.new(orderer:  RandomOrder.new).line(12) class  RandomOrder      def  order(data)          data.shuffle      end   end
  296. Jan 2015 @sandimetz class  House      attr_reader  :data  

       def  initialize(orderer:  DefaultOrder.new)          @data  =  orderer.order(DATA)      end        #  ...   end class  DefaultOrder      def  order(data)          data      end   end puts  House.new(orderer:  RandomOrder.new).line(12)   =>  'This  is  the  rooster  that  crowed  in  the  morn  that  woke  the  farmer  sowing  his  corn   that  kept  the  dog  that  worried  the  priest  all  shaven  and  shorn  that  married  the  man   all  tattered  and  torn  that  kissed  the  horse  and  the  hound  and  the  horn  that  belonged   to  the  malt  that  lay  in  the  cow  with  the  crumpled  horn  that  tossed  the  house  that  Jack   built  the  cat  that  killed  the  maiden  all  forlorn  that  milked  the  rat  that  ate.' class  RandomOrder      def  order(data)          data.shuffle      end   end
  297. Jan 2015 @sandimetz class  House      attr_reader  :data  

       def  initialize(orderer:  DefaultOrder.new)          @data  =  orderer.order(DATA)      end        #  ...   end class  DefaultOrder      def  order(data)          data      end   end puts  House.new(orderer:  RandomOrder.new).line(12)   =>  'This  is  the  rooster  that  crowed  in  the  morn  that  woke  the  farmer  sowing  his  corn   that  kept  the  dog  that  worried  the  priest  all  shaven  and  shorn  that  married  the  man   all  tattered  and  torn  that  kissed  the  horse  and  the  hound  and  the  horn  that  belonged   to  the  malt  that  lay  in  the  cow  with  the  crumpled  horn  that  tossed  the  house  that  Jack   built  the  cat  that  killed  the  maiden  all  forlorn  that  milked  the  rat  that  ate.' class  RandomOrder      def  order(data)          data.shuffle      end   end
  298. Jan 2015 @sandimetz class  House      attr_reader  :data  

       def  initialize(orderer:  DefaultOrder.new)          @data  =  orderer.order(DATA)      end        #  ...   end class  DefaultOrder      def  order(data)          data      end   end puts  House.new(orderer:  RandomOrder.new).line(12)   =>  'This  is  the  rooster  that  crowed  in  the  morn  that  woke  the  farmer  sowing  his  corn   that  kept  the  dog  that  worried  the  priest  all  shaven  and  shorn  that  married  the  man   all  tattered  and  torn  that  kissed  the  horse  and  the  hound  and  the  horn  that  belonged   to  the  malt  that  lay  in  the  cow  with  the  crumpled  horn  that  tossed  the  house  that  Jack   built  the  cat  that  killed  the  maiden  all  forlorn  that  milked  the  rat  that  ate.' class  RandomOrder      def  order(data)          data.shuffle      end   end
  299. Jan 2015 @sandimetz class  House      attr_reader  :data  

       def  initialize(orderer:  DefaultOrder.new)          @data  =  orderer.order(DATA)      end        #  ...   end class  DefaultOrder      def  order(data)          data      end   end puts  House.new(orderer:  RandomOrder.new).line(12)   =>  'This  is  the  rooster  that  crowed  in  the  morn  that  woke  the  farmer  sowing  his  corn   that  kept  the  dog  that  worried  the  priest  all  shaven  and  shorn  that  married  the  man   all  tattered  and  torn  that  kissed  the  horse  and  the  hound  and  the  horn  that  belonged   to  the  malt  that  lay  in  the  cow  with  the  crumpled  horn  that  tossed  the  house  that  Jack   built  the  cat  that  killed  the  maiden  all  forlorn  that  milked  the  rat  that  ate.' class  RandomOrder      def  order(data)          data.shuffle      end   end
  300. Jan 2015 @sandimetz class  House      attr_reader  :data  

       def  initialize(orderer:  DefaultOrder.new)          @data  =  orderer.order(DATA)      end        #  ...   end class  DefaultOrder      def  order(data)          data      end   end puts  House.new(orderer:  RandomOrder.new).line(12)   =>  'This  is  the  rooster  that  crowed  in  the  morn  that  woke  the  cat  that  killed  the  cow   with  the  crumpled  horn  that  tossed  the  horse  and  the  hound  and  the  horn  that  belonged   to  the  farmer  sowing  his  corn  that  kept  the  priest  all  shaven  and  shorn  that  married   the  man  all  tattered  and  torn  that  kissed  the  house  that  Jack  built  the  malt  that  lay   in  the  rat  that  ate  the  maiden  all  forlorn  that  milked  the  dog  that  worried.' class  RandomOrder      def  order(data)          data.shuffle      end   end Composition
  301. Jan 2015 @sandimetz class  House      attr_reader  :data  

       def  initialize(orderer:  DefaultOrder.new)          @data  =  orderer.order(DATA)      end        #  ...   end class  DefaultOrder      def  order(data)          data      end   end puts  House.new(orderer:  RandomOrder.new).line(12)   =>  'This  is  the  rooster  that  crowed  in  the  morn  that  woke  the  cat  that  killed  the  cow   with  the  crumpled  horn  that  tossed  the  horse  and  the  hound  and  the  horn  that  belonged   to  the  farmer  sowing  his  corn  that  kept  the  priest  all  shaven  and  shorn  that  married   the  man  all  tattered  and  torn  that  kissed  the  house  that  Jack  built  the  malt  that  lay   in  the  rat  that  ate  the  maiden  all  forlorn  that  milked  the  dog  that  worried.' class  RandomOrder      def  order(data)          data.shuffle      end   end Inject an object to play the role of the thing that varies
  302. Jan 2015 @sandimetz class  EchoFormatter      def  format(parts)  

           parts.zip(parts).flatten      end   end
  303. Jan 2015 @sandimetz class  DefaultFormatter      def  format(parts)  

           parts      end   end   class  EchoFormatter      def  format(parts)          parts.zip(parts).flatten      end   end
  304. Jan 2015 @sandimetz class  House      attr_reader  :data  

       def  initialize(orderer:  DefaultOrder.new)          @data  =  orderer.order(DATA)      end        #  ...   end
  305. Jan 2015 @sandimetz class  House      attr_reader  :data  

       def  initialize(orderer:  DefaultOrder.new)          @data  =  orderer.order(DATA)      end        #  ...   end class  DefaultFormatter      def  format(parts)          parts      end   end
  306. Jan 2015 @sandimetz class  House      attr_reader  :data  

       def   initialize(orderer:   DefaultOrder.new,   formatter:   DefaultFormatter.new)          @data  =  orderer.order(DATA)      end        #  ...   end class  DefaultFormatter      def  format(parts)          parts      end   end
  307. Jan 2015 @sandimetz class  House      attr_reader  :data  

       def   initialize(orderer:   DefaultOrder.new,   formatter:   DefaultFormatter.new)          @data  =  orderer.order(DATA)      end        #  ...   end class  DefaultFormatter      def  format(parts)          parts      end   end
  308. Jan 2015 @sandimetz class  House      attr_reader  :data  

       def   initialize(orderer:   DefaultOrder.new,   formatter:   DefaultFormatter.new)          @formatter  =  formatter          @data  =  orderer.order(DATA)      end        #  ...   end class  DefaultFormatter      def  format(parts)          parts      end   end
  309. Jan 2015 @sandimetz class  House      attr_reader  :data  

       def   initialize(orderer:   DefaultOrder.new,   formatter:   DefaultFormatter.new)          @formatter  =  formatter          @data            =  orderer.order(DATA)      end        #  ...   end class  DefaultFormatter      def  format(parts)          parts      end   end
  310. Jan 2015 @sandimetz class  House      attr_reader    

                         :data      def   initialize(orderer:   DefaultOrder.new,   formatter:   DefaultFormatter.new)          @formatter  =  formatter          @data            =  orderer.order(DATA)      end        #  ...   end class  DefaultFormatter      def  format(parts)          parts      end   end
  311. Jan 2015 @sandimetz class  House      attr_reader  :formatter,  :data

         def   initialize(orderer:   DefaultOrder.new,   formatter:   DefaultFormatter.new)          @formatter  =  formatter          @data            =  orderer.order(DATA)      end        #  ...   end class  DefaultFormatter      def  format(parts)          parts      end   end
  312. Jan 2015 @sandimetz class  House      attr_reader  :formatter,  :data

         def   initialize(orderer:   DefaultOrder.new,   formatter:   DefaultFormatter.new)          @formatter  =  formatter          @data            =  orderer.order(DATA)      end        #  ...   end class  DefaultFormatter      def  format(parts)          parts      end   end
  313. Jan 2015 @sandimetz class  House      attr_reader  :formatter,  :data

         def   initialize(orderer:   DefaultOrder.new,   formatter:   DefaultFormatter.new)          @formatter  =  formatter          @data            =  orderer.order(DATA)      end      def  parts(number)        data.last(number)      end        #  ...   end class  DefaultFormatter      def  format(parts)          parts      end   end
  314. Jan 2015 @sandimetz class  House      attr_reader  :formatter,  :data

         def   initialize(orderer:   DefaultOrder.new,   formatter:   DefaultFormatter.new)          @formatter  =  formatter          @data            =  orderer.order(DATA)      end      def  parts(number)                                            data.last(number)      end        #  ...   end class  DefaultFormatter      def  format(parts)          parts      end   end
  315. Jan 2015 @sandimetz class  House      attr_reader  :formatter,  :data

         def   initialize(orderer:   DefaultOrder.new,   formatter:   DefaultFormatter.new)          @formatter  =  formatter          @data            =  orderer.order(DATA)      end      def  parts(number)          formatter.format(data.last(number))      end        #  ...   end class  DefaultFormatter      def  format(parts)          parts      end   end
  316. Jan 2015 @sandimetz class  House      attr_reader  :formatter,  :data

         def   initialize(orderer:   DefaultOrder.new,   formatter:   DefaultFormatter.new)          @formatter  =  formatter          @data            =  orderer.order(DATA)      end        #  ...   end class  DefaultFormatter      def  format(parts)          parts      end   end
  317. Jan 2015 @sandimetz class  House      attr_reader  :formatter,  :data

         def   initialize(orderer:   DefaultOrder.new,   formatter:   DefaultFormatter.new)          @formatter  =  formatter          @data            =  orderer.order(DATA)      end        #  ...   end class  DefaultFormatter      def  format(parts)          parts      end   end
  318. Jan 2015 @sandimetz class  House      attr_reader  :formatter,  :data

         def   initialize(orderer:   DefaultOrder.new,   formatter:   DefaultFormatter.new)          @formatter  =  formatter          @data            =  orderer.order(DATA)      end        #  ...   end puts  House.new.line(12) class  DefaultFormatter      def  format(parts)          parts      end   end
  319. Jan 2015 @sandimetz class  House      attr_reader  :formatter,  :data

         def   initialize(orderer:   DefaultOrder.new,   formatter:   DefaultFormatter.new)          @formatter  =  formatter          @data            =  orderer.order(DATA)      end        #  ...   end puts  House.new.line(12) =>  'This  is  the  horse  and  the  hound  and  the  horn  that  belonged  to  the  farmer  sowing  his  corn  that  kept  the   rooster  that  crowed  in  the  morn  that  woke  the  priest  all  shaven  and  shorn  that  married  the  man  all  tattered   and  torn  that  kissed  the  maiden  all  forlorn  that  milked  the  cow  with  the  crumpled  horn  that  tossed  the  dog   that  worried  the  cat  that  killed  the  rat  that  ate  the  malt  that  lay  in  the  house  that  Jack  built.' class  DefaultFormatter      def  format(parts)          parts      end   end
  320. Jan 2015 @sandimetz class  DefaultFormatter      def  format(parts)  

           parts      end   end class  House      attr_reader  :formatter,  :data      def   initialize(orderer:   DefaultOrder.new,   formatter:   DefaultFormatter.new)          @formatter  =  formatter          @data            =  orderer.order(DATA)      end        #  ...   end class  EchoFormatter      def  format(parts)          parts.zip(parts).flatten      end   end
  321. Jan 2015 @sandimetz class  DefaultFormatter      def  format(parts)  

           parts      end   end class  House      attr_reader  :formatter,  :data      def   initialize(orderer:   DefaultOrder.new,   formatter:   DefaultFormatter.new)          @formatter  =  formatter          @data            =  orderer.order(DATA)      end        #  ...   end puts  House.new(formatter:  EchoFormatter.new).line(12) class  EchoFormatter      def  format(parts)          parts.zip(parts).flatten      end   end
  322. Jan 2015 @sandimetz class  DefaultFormatter      def  format(parts)  

           parts      end   end class  House      attr_reader  :formatter,  :data      def   initialize(orderer:   DefaultOrder.new,   formatter:   DefaultFormatter.new)          @formatter  =  formatter          @data            =  orderer.order(DATA)      end        #  ...   end puts  House.new(formatter:  EchoFormatter.new).line(12) =>  'This  is  the  horse  and  the  hound  and  the  horn  that  belonged  to  the  horse  and  the  hound  and  the  horn  that   belonged  to  the  farmer  sowing  his  corn  that  kept  the  farmer  sowing  his  corn  that  kept  the  rooster  that   crowed  in  the  morn  that  woke  the  rooster  that  crowed  in  the  morn  that  woke  the  priest  all  shaven  and  shorn   that  married  the  priest  all  shaven  and  shorn  that  married  the  man  all  tattered  and  torn  that  kissed  the  man class  EchoFormatter      def  format(parts)          parts.zip(parts).flatten      end   end
  323. Jan 2015 @sandimetz class  DefaultOrder      def  order(data)  

           data      end   end class  RandomOrder      def  order(data)          data.shuffle      end   end Orderer Role
  324. Jan 2015 @sandimetz class  DefaultFormatter      def  format(parts)  

           parts      end   end class  EchoFormatter      def  format(parts)          parts.zip(parts).flatten      end   end class  DefaultOrder      def  order(data)          data      end   end class  RandomOrder      def  order(data)          data.shuffle      end   end Orderer Role Formatter Role
  325. Jan 2015 @sandimetz puts  House.new.recite puts  House.new(orderer:  RandomOrder.new).recite puts  House.new(formatter:

     EchoFormatter.new).recite puts  House.new(orderer:      RandomOrder.new,                                formatter:  EchoFormatter.new).recite
  326. Jan 2015 @sandimetz puts  House.new.recite   puts  House.new(orderer:  RandomOrder.new).recite  

    puts  House.new(formatter:  EchoFormatter.new).recite   puts  House.new(orderer:      RandomOrder.new,                                  formatter:  EchoFormatter.new).recite More code?
  327. Jan 2015 @sandimetz puts  House.new.recite   puts  House.new(orderer:  RandomOrder.new).recite  

    puts  House.new(formatter:  EchoFormatter.new).recite   puts  House.new(orderer:      RandomOrder.new,                                  formatter:  EchoFormatter.new).recite
  328. Jan 2015 @sandimetz puts  House.new.recite   puts  House.new(orderer:  RandomOrder.new).recite  

    puts  House.new(formatter:  EchoFormatter.new).recite   puts  House.new(orderer:      RandomOrder.new,                                  formatter:  EchoFormatter.new).recite Less code!
  329. Jan 2015 @sandimetz puts  House.new.recite   puts  House.new(orderer:  RandomOrder.new).recite  

    puts  House.new(formatter:  EchoFormatter.new).recite   puts  House.new(orderer:      RandomOrder.new,                                  formatter:  EchoFormatter.new).recite Less code! No duplication
  330. Jan 2015 @sandimetz puts  House.new.recite   puts  House.new(orderer:  RandomOrder.new).recite  

    puts  House.new(formatter:  EchoFormatter.new).recite   puts  House.new(orderer:      RandomOrder.new,                                  formatter:  EchoFormatter.new).recite Less code! Pluggable behavior
  331. Jan 2015 @sandimetz puts  House.new.recite   puts  House.new(orderer:  RandomOrder.new).recite  

    puts  House.new(formatter:  EchoFormatter.new).recite   puts  House.new(orderer:      RandomOrder.new,                                  formatter:  EchoFormatter.new).recite
  332. Jan 2015 @sandimetz puts  House.new.recite   puts  House.new(orderer:  RandomOrder.new).recite  

    puts  House.new(formatter:  EchoFormatter.new).recite   puts  House.new(orderer:      RandomOrder.new,                                  formatter:  EchoFormatter.new).recite Composition
  333. Jan 2015 @sandimetz puts  House.new.recite   puts  House.new(orderer:  RandomOrder.new).recite  

    puts  House.new(formatter:  EchoFormatter.new).recite   puts  House.new(orderer:      RandomOrder.new,                                  formatter:  EchoFormatter.new).recite Composition + Dependency Injection
  334. Jan 2015 @sandimetz puts  House.new.recite   puts  House.new(orderer:  RandomOrder.new).recite  

    puts  House.new(formatter:  EchoFormatter.new).recite   puts  House.new(orderer:      RandomOrder.new,                                  formatter:  EchoFormatter.new).recite Object-Oriented Design
  335. Jan 2015 @sandimetz Isolate the thing that varies Name the

    concept Define the role Inject the players