Slide 1

Slide 1 text

Jan 2015 @sandimetz Sandi Metz Nothing is Something

Slide 2

Slide 2 text

Jan 2015 @sandimetz

Slide 3

Slide 3 text

Jan 2015 @sandimetz

Slide 4

Slide 4 text

Jan 2015 @sandimetz Smalltalk Infected

Slide 5

Slide 5 text

Jan 2015 @sandimetz 1.to_s  

Slide 6

Slide 6 text

Jan 2015 @sandimetz 1.to_s   =>  "1"

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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]  

Slide 28

Slide 28 text

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]  

Slide 29

Slide 29 text

Jan 2015 @sandimetz ‘Special’ syntax for booleans

Slide 30

Slide 30 text

Jan 2015 @sandimetz Smalltalk keywords true,  false,  nil,  self,  super,  thisContext

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

Jan 2015 @sandimetz if  (1  ==  1)      code  to  eval  when  ‘true’   else      code  to  eval  when  ‘false’   end true

Slide 37

Slide 37 text

Jan 2015 @sandimetz if  (  truthy  )      code  to  eval  when  ‘truthy’   else      code  to  eval  when  ‘falsey’   end

Slide 38

Slide 38 text

Jan 2015 @sandimetz if  (some  object  whose  type  I  know)      code  to  do  some  stuff   else      code  to  do  some  other  stuff   end

Slide 39

Slide 39 text

Jan 2015 @sandimetz I just want to send a message to an object

Slide 40

Slide 40 text

Jan 2015 @sandimetz

Slide 41

Slide 41 text

Jan 2015 @sandimetz if

Slide 42

Slide 42 text

Jan 2015 @sandimetz if is an enabler

Slide 43

Slide 43 text

Jan 2015 @sandimetz ‘Message sending’ syntax for TrueClass / FalseClass

Slide 44

Slide 44 text

Jan 2015 @sandimetz class  TrueClass   end

Slide 45

Slide 45 text

Jan 2015 @sandimetz class  TrueClass      def  if_true          yield      end   end

Slide 46

Slide 46 text

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

Slide 47

Slide 47 text

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

Slide 48

Slide 48 text

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

Slide 49

Slide 49 text

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

Slide 50

Slide 50 text

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

Slide 51

Slide 51 text

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

Slide 52

Slide 52 text

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

Slide 53

Slide 53 text

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

Slide 54

Slide 54 text

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

Slide 55

Slide 55 text

Jan 2015 @sandimetz (1  ==  1).if_true  {puts  "evaluated  block"}

Slide 56

Slide 56 text

Jan 2015 @sandimetz (1  ==  1).if_true  {puts  "evaluated  block"}

Slide 57

Slide 57 text

Jan 2015 @sandimetz (1  ==  1).if_true  {puts  "evaluated  block"} true

Slide 58

Slide 58 text

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

Slide 59

Slide 59 text

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

Slide 60

Slide 60 text

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

Slide 61

Slide 61 text

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

Slide 62

Slide 62 text

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

Slide 63

Slide 63 text

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

Slide 64

Slide 64 text

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

Slide 65

Slide 65 text

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

Slide 66

Slide 66 text

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

Slide 67

Slide 67 text

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

Slide 68

Slide 68 text

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

Slide 69

Slide 69 text

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

Slide 70

Slide 70 text

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

Slide 71

Slide 71 text

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

Slide 72

Slide 72 text

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

Slide 73

Slide 73 text

Jan 2015 @sandimetz ‘Message sending’ syntax for truthy/falsey

Slide 74

Slide 74 text

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

Slide 75

Slide 75 text

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

Slide 76

Slide 76 text

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

Slide 77

Slide 77 text

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

Slide 78

Slide 78 text

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/

Slide 79

Slide 79 text

Jan 2015 @sandimetz    (1  ==  1).if_true    {puts  "evaluated  block"}

Slide 80

Slide 80 text

Jan 2015 @sandimetz

Slide 81

Slide 81 text

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

Slide 82

Slide 82 text

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

Slide 83

Slide 83 text

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

Slide 84

Slide 84 text

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

Slide 85

Slide 85 text

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

Slide 86

Slide 86 text

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

Slide 87

Slide 87 text

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

Slide 88

Slide 88 text

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"

Slide 89

Slide 89 text

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

Slide 90

Slide 90 text

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'

Slide 91

Slide 91 text

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'

Slide 92

Slide 92 text

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'

Slide 93

Slide 93 text

Jan 2015 @sandimetz I don't want to change Ruby

Slide 94

Slide 94 text

Jan 2015 @sandimetz I want to change you

Slide 95

Slide 95 text

Jan 2015 @sandimetz What if there were no 'if' ?

Slide 96

Slide 96 text

Jan 2015 @sandimetz Smalltalk Infected

Slide 97

Slide 97 text

Jan 2015 @sandimetz Smalltalk Infected

Slide 98

Slide 98 text

Jan 2015 @sandimetz Smalltalk Infected Condition Averse

Slide 99

Slide 99 text

Jan 2015 @sandimetz Animal.find('pig')   =>  #

Slide 100

Slide 100 text

Jan 2015 @sandimetz Animal.find('pig')   =>  #   Animal.find('')   =>  nil

Slide 101

Slide 101 text

Jan 2015 @sandimetz ids  =  ['pig',  '',  'sheep']

Slide 102

Slide 102 text

Jan 2015 @sandimetz ids  =  ['pig',  '',  'sheep']   animals  =  ids.map  {|id|  Animal.find(id)}

Slide 103

Slide 103 text

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

Slide 104

Slide 104 text

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

Slide 105

Slide 105 text

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

Slide 106

Slide 106 text

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

Slide 107

Slide 107 text

Jan 2015 @sandimetz Sometimes nil is nothing

Slide 108

Slide 108 text

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

Slide 109

Slide 109 text

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

Slide 110

Slide 110 text

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

Slide 111

Slide 111 text

Jan 2015 @sandimetz

Slide 112

Slide 112 text

Jan 2015 @sandimetz But if you send it a message

Slide 113

Slide 113 text

Jan 2015 @sandimetz But if you send it a message nil is something

Slide 114

Slide 114 text

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

Slide 115

Slide 115 text

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

Slide 116

Slide 116 text

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

Slide 117

Slide 117 text

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

Slide 118

Slide 118 text

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

Slide 119

Slide 119 text

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

Slide 120

Slide 120 text

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

Slide 121

Slide 121 text

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

Slide 122

Slide 122 text

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

Slide 123

Slide 123 text

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

Slide 124

Slide 124 text

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

Slide 125

Slide 125 text

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

Slide 126

Slide 126 text

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

Slide 127

Slide 127 text

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

Slide 128

Slide 128 text

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

Slide 129

Slide 129 text

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

Slide 130

Slide 130 text

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

Slide 131

Slide 131 text

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

Slide 132

Slide 132 text

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

Slide 133

Slide 133 text

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

Slide 134

Slide 134 text

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

Slide 135

Slide 135 text

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

Slide 136

Slide 136 text

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

Slide 137

Slide 137 text

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

Slide 138

Slide 138 text

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

Slide 139

Slide 139 text

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

Slide 140

Slide 140 text

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

Slide 141

Slide 141 text

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

Slide 142

Slide 142 text

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

Slide 143

Slide 143 text

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

Slide 144

Slide 144 text

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

Slide 145

Slide 145 text

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

Slide 146

Slide 146 text

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

Slide 147

Slide 147 text

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

Slide 148

Slide 148 text

Jan 2015 @sandimetz

Slide 149

Slide 149 text

Jan 2015 @sandimetz conditions

Slide 150

Slide 150 text

Jan 2015 @sandimetz conditions breed

Slide 151

Slide 151 text

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

Slide 152

Slide 152 text

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

Slide 153

Slide 153 text

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

Slide 154

Slide 154 text

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

Slide 155

Slide 155 text

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'

Slide 156

Slide 156 text

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'

Slide 157

Slide 157 text

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'

Slide 158

Slide 158 text

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'

Slide 159

Slide 159 text

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'   !!!!

Slide 160

Slide 160 text

Jan 2015 @sandimetz Change?

Slide 161

Slide 161 text

Jan 2015 @sandimetz Shotgun Surgery

Slide 162

Slide 162 text

Jan 2015 @sandimetz Shotgun Surgery

Slide 163

Slide 163 text

Jan 2015 @sandimetz Smalltalk Infected Condition Averse

Slide 164

Slide 164 text

Jan 2015 @sandimetz Smalltalk Infected Condition Averse Message Centric

Slide 165

Slide 165 text

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

Slide 166

Slide 166 text

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

Slide 167

Slide 167 text

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

Slide 168

Slide 168 text

Jan 2015 @sandimetz class  Animal      def  name        ...      end   end

Slide 169

Slide 169 text

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

Slide 170

Slide 170 text

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

Slide 171

Slide 171 text

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

Slide 172

Slide 172 text

Jan 2015 @sandimetz Prefer knowing an object to duplicating behavior

Slide 173

Slide 173 text

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

Slide 174

Slide 174 text

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

Slide 175

Slide 175 text

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

Slide 176

Slide 176 text

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

Slide 177

Slide 177 text

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

Slide 178

Slide 178 text

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

Slide 179

Slide 179 text

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

Slide 180

Slide 180 text

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

Slide 181

Slide 181 text

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

Slide 182

Slide 182 text

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

Slide 183

Slide 183 text

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

Slide 184

Slide 184 text

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

Slide 185

Slide 185 text

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

Slide 186

Slide 186 text

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'

Slide 187

Slide 187 text

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'

Slide 188

Slide 188 text

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'

Slide 189

Slide 189 text

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

Slide 190

Slide 190 text

Jan 2015 @sandimetz

Slide 191

Slide 191 text

Jan 2015 @sandimetz Null Object Pattern

Slide 192

Slide 192 text

Jan 2015 @sandimetz Null Object Pattern 'Active Nothing'

Slide 193

Slide 193 text

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'

Slide 194

Slide 194 text

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

Slide 195

Slide 195 text

Jan 2015 @sandimetz Prefer knowing an object to duplicating behavior

Slide 196

Slide 196 text

Jan 2015 @sandimetz Prefer knowing few objects

Slide 197

Slide 197 text

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

Slide 198

Slide 198 text

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

Slide 199

Slide 199 text

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  

Slide 200

Slide 200 text

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  

Slide 201

Slide 201 text

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

Slide 202

Slide 202 text

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

Slide 203

Slide 203 text

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

Slide 204

Slide 204 text

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

Slide 205

Slide 205 text

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   ???

Slide 206

Slide 206 text

Jan 2015 @sandimetz class  Animal      def  self.find(id)          #  nil  or  an  Animal      end          #  …   end

Slide 207

Slide 207 text

Jan 2015 @sandimetz class  Animal   def  self.find

Slide 208

Slide 208 text

Jan 2015 @sandimetz class  GuaranteedAnimal   def  self.find class  Animal   def  self.find

Slide 209

Slide 209 text

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

Slide 210

Slide 210 text

Jan 2015 @sandimetz animals  =  ids.map  {|id|Animal.find(id)||MissingAnimal.new}

Slide 211

Slide 211 text

Jan 2015 @sandimetz animals  =  ids.map  {|id|Animal.find(id)||MissingAnimal.new}

Slide 212

Slide 212 text

Jan 2015 @sandimetz animals  =  ids.map  {|id|   GuaranteedAnimal.find(id)}   =>  [#,          #,          #]

Slide 213

Slide 213 text

Jan 2015 @sandimetz animals  =  ids.map  {|id|   GuaranteedAnimal.find(id)}   =>  [#,          #,          #]

Slide 214

Slide 214 text

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

Slide 215

Slide 215 text

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

Slide 216

Slide 216 text

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

Slide 217

Slide 217 text

Jan 2015 @sandimetz Smalltalk Infected Condition Averse Message Centric

Slide 218

Slide 218 text

Jan 2015 @sandimetz Smalltalk Infected Condition Averse Message Centric Abstraction Seeking

Slide 219

Slide 219 text

Jan 2015 @sandimetz    'This  is  the  house  that  Jack  built.' 1

Slide 220

Slide 220 text

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

Slide 221

Slide 221 text

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

Slide 222

Slide 222 text

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

Slide 223

Slide 223 text

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'  ]  

Slide 224

Slide 224 text

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  

Slide 225

Slide 225 text

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  

Slide 226

Slide 226 text

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  

Slide 227

Slide 227 text

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']  

Slide 228

Slide 228 text

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  

Slide 229

Slide 229 text

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  

Slide 230

Slide 230 text

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  

Slide 231

Slide 231 text

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  

Slide 232

Slide 232 text

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  

Slide 233

Slide 233 text

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  

Slide 234

Slide 234 text

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  

Slide 235

Slide 235 text

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

Slide 236

Slide 236 text

Jan 2015 @sandimetz

Slide 237

Slide 237 text

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

Slide 238

Slide 238 text

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.'

Slide 239

Slide 239 text

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.'

Slide 240

Slide 240 text

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.'

Slide 241

Slide 241 text

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

Slide 242

Slide 242 text

Jan 2015 @sandimetz

Slide 243

Slide 243 text

Jan 2015 @sandimetz New Feature Request:

Slide 244

Slide 244 text

Jan 2015 @sandimetz New Feature Request: RandomHouse

Slide 245

Slide 245 text

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'  ]  

Slide 246

Slide 246 text

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']

Slide 247

Slide 247 text

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']

Slide 248

Slide 248 text

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']

Slide 249

Slide 249 text

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']

Slide 250

Slide 250 text

Jan 2015 @sandimetz    'This  is  the  rat  that  ate.' 1

Slide 251

Slide 251 text

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

Slide 252

Slide 252 text

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

Slide 253

Slide 253 text

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

Slide 254

Slide 254 text

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

Slide 255

Slide 255 text

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

Slide 256

Slide 256 text

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

Slide 257

Slide 257 text

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?

Slide 258

Slide 258 text

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

Slide 259

Slide 259 text

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

Slide 260

Slide 260 text

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

Slide 261

Slide 261 text

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

Slide 262

Slide 262 text

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

Slide 263

Slide 263 text

Jan 2015 @sandimetz

Slide 264

Slide 264 text

Jan 2015 @sandimetz randomhouse  =  RandomHouse.new

Slide 265

Slide 265 text

Jan 2015 @sandimetz randomhouse  =  RandomHouse.new puts  randomhouse.line(1) =>  'This  is  the  rat  that  ate.'

Slide 266

Slide 266 text

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.'

Slide 267

Slide 267 text

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.'

Slide 268

Slide 268 text

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.'

Slide 269

Slide 269 text

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.'

Slide 270

Slide 270 text

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.'

Slide 271

Slide 271 text

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.'

Slide 272

Slide 272 text

Jan 2015 @sandimetz

Slide 273

Slide 273 text

Jan 2015 @sandimetz New Feature Request:

Slide 274

Slide 274 text

Jan 2015 @sandimetz New Feature Request: EchoHouse

Slide 275

Slide 275 text

Jan 2015 @sandimetz

Slide 276

Slide 276 text

Jan 2015 @sandimetz This  is  the  house  that  Jack  built  the  house  that  Jack  built.

Slide 277

Slide 277 text

Jan 2015 @sandimetz This  is  the  house  that  Jack  built  the  house  that  Jack  built.

Slide 278

Slide 278 text

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.

Slide 279

Slide 279 text

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.

Slide 280

Slide 280 text

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.

Slide 281

Slide 281 text

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

Slide 282

Slide 282 text

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

Slide 283

Slide 283 text

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

Slide 284

Slide 284 text

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

Slide 285

Slide 285 text

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

Slide 286

Slide 286 text

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

Slide 287

Slide 287 text

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

Slide 288

Slide 288 text

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

Slide 289

Slide 289 text

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

Slide 290

Slide 290 text

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

Slide 291

Slide 291 text

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

Slide 292

Slide 292 text

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

Slide 293

Slide 293 text

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

Slide 294

Slide 294 text

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

Slide 295

Slide 295 text

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?

Slide 296

Slide 296 text

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

Slide 297

Slide 297 text

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

Slide 298

Slide 298 text

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

Slide 299

Slide 299 text

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

Slide 300

Slide 300 text

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

Slide 301

Slide 301 text

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

Slide 302

Slide 302 text

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']

Slide 303

Slide 303 text

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)

Slide 304

Slide 304 text

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)

Slide 305

Slide 305 text

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)

Slide 306

Slide 306 text

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']

Slide 307

Slide 307 text

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

Slide 308

Slide 308 text

Jan 2015 @sandimetz

Slide 309

Slide 309 text

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

Slide 310

Slide 310 text

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.'

Slide 311

Slide 311 text

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.'

Slide 312

Slide 312 text

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.'

Slide 313

Slide 313 text

Jan 2015 @sandimetz class  House      def  recite      def  line(number)      def  phrase(number)      def  parts(number)      def  data   end

Slide 314

Slide 314 text

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

Slide 315

Slide 315 text

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

Slide 316

Slide 316 text

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

Slide 317

Slide 317 text

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

Slide 318

Slide 318 text

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?

Slide 319

Slide 319 text

Jan 2015 @sandimetz

Slide 320

Slide 320 text

Jan 2015 @sandimetz New Feature Request:

Slide 321

Slide 321 text

Jan 2015 @sandimetz New Feature Request: RandomEchoHouse

Slide 322

Slide 322 text

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

Slide 323

Slide 323 text

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

Slide 324

Slide 324 text

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

Slide 325

Slide 325 text

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?

Slide 326

Slide 326 text

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

Slide 327

Slide 327 text

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

Slide 328

Slide 328 text

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

Slide 329

Slide 329 text

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

Slide 330

Slide 330 text

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

Slide 331

Slide 331 text

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

Slide 332

Slide 332 text

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

Slide 333

Slide 333 text

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

Slide 334

Slide 334 text

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

Slide 335

Slide 335 text

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

Slide 336

Slide 336 text

Jan 2015 @sandimetz class  RandomHouse  <  House   class  EchoHouse  <  House  

Slide 337

Slide 337 text

Jan 2015 @sandimetz class  RandomHouse  <  House   class  EchoHouse  <  House   Duplicate all of the code!

Slide 338

Slide 338 text

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

Slide 339

Slide 339 text

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

Slide 340

Slide 340 text

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

Slide 341

Slide 341 text

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

Slide 342

Slide 342 text

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

Slide 343

Slide 343 text

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

Slide 344

Slide 344 text

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

Slide 345

Slide 345 text

Jan 2015 @sandimetz House

Slide 346

Slide 346 text

Jan 2015 @sandimetz House Random House Echo House

Slide 347

Slide 347 text

Jan 2015 @sandimetz House Echo House Random House

Slide 348

Slide 348 text

Jan 2015 @sandimetz House Echo House Random House

Slide 349

Slide 349 text

Jan 2015 @sandimetz House Echo House Random House Random House

Slide 350

Slide 350 text

Jan 2015 @sandimetz House Echo House Random House Random House

Slide 351

Slide 351 text

Jan 2015 @sandimetz House Echo House Random House Random House

Slide 352

Slide 352 text

Jan 2015 @sandimetz House Echo House Random House Random House Echo House

Slide 353

Slide 353 text

Jan 2015 @sandimetz House Echo House Random House Random House Echo House

Slide 354

Slide 354 text

Jan 2015 @sandimetz Echo House Random House Random House Echo House

Slide 355

Slide 355 text

Jan 2015 @sandimetz Random House Echo House

Slide 356

Slide 356 text

Jan 2015 @sandimetz Random House Echo House

Slide 357

Slide 357 text

Jan 2015 @sandimetz Random House Echo House RandomEcho House

Slide 358

Slide 358 text

Jan 2015 @sandimetz Random House Echo House RandomEcho House

Slide 359

Slide 359 text

Jan 2015 @sandimetz Random House Echo House RandomEcho House

Slide 360

Slide 360 text

Jan 2015 @sandimetz Random House Echo House RandomEcho House

Slide 361

Slide 361 text

Jan 2015 @sandimetz Random House Echo House RandomEcho House

Slide 362

Slide 362 text

Jan 2015 @sandimetz Random House Echo House RandomEcho House

Slide 363

Slide 363 text

Jan 2015 @sandimetz Random House Echo House RandomEcho House

Slide 364

Slide 364 text

Jan 2015 @sandimetz Random House Echo House RandomEcho House

Slide 365

Slide 365 text

Jan 2015 @sandimetz Random House Echo House

Slide 366

Slide 366 text

Jan 2015 @sandimetz Random House Echo House

Slide 367

Slide 367 text

Jan 2015 @sandimetz Random House Echo House

Slide 368

Slide 368 text

Jan 2015 @sandimetz

Slide 369

Slide 369 text

Jan 2015 @sandimetz Inheritance

Slide 370

Slide 370 text

Jan 2015 @sandimetz Inheritance is for specialization

Slide 371

Slide 371 text

Jan 2015 @sandimetz Inheritance is for specialization is not for sharing code

Slide 372

Slide 372 text

Jan 2015 @sandimetz RandomHouse is-a House?

Slide 373

Slide 373 text

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

Slide 374

Slide 374 text

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?

Slide 375

Slide 375 text

Jan 2015 @sandimetz Reveal how things differ by making them more alike

Slide 376

Slide 376 text

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

Slide 377

Slide 377 text

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

Slide 378

Slide 378 text

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

Slide 379

Slide 379 text

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

Slide 380

Slide 380 text

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

Slide 381

Slide 381 text

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

Slide 382

Slide 382 text

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

Slide 383

Slide 383 text

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

Slide 384

Slide 384 text

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

Slide 385

Slide 385 text

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

Slide 386

Slide 386 text

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?

Slide 387

Slide 387 text

Jan 2015 @sandimetz Name the concept

Slide 388

Slide 388 text

Jan 2015 @sandimetz House RandomHouse

Slide 389

Slide 389 text

Jan 2015 @sandimetz House DATA RandomHouse DATA

Slide 390

Slide 390 text

Jan 2015 @sandimetz House DATA RandomHouse DATA shuffle

Slide 391

Slide 391 text

Jan 2015 @sandimetz class House DATA RandomHouse DATA shuffle

Slide 392

Slide 392 text

Jan 2015 @sandimetz class data House DATA RandomHouse DATA shuffle

Slide 393

Slide 393 text

Jan 2015 @sandimetz class data ????? House DATA RandomHouse DATA shuffle

Slide 394

Slide 394 text

Jan 2015 @sandimetz class data random?? House DATA RandomHouse DATA shuffle

Slide 395

Slide 395 text

Jan 2015 @sandimetz class data order! House DATA RandomHouse DATA shuffle

Slide 396

Slide 396 text

Jan 2015 @sandimetz class data order House DATA RandomHouse DATA shuffle

Slide 397

Slide 397 text

Jan 2015 @sandimetz class data order House DATA RandomHouse DATA shuffle This is not nothing

Slide 398

Slide 398 text

Jan 2015 @sandimetz class data order House DATA RandomHouse DATA shuffle It's an order algorithm

Slide 399

Slide 399 text

Jan 2015 @sandimetz class data order House DATA RandomHouse DATA shuffle It's an order algorithm just as valid as this one

Slide 400

Slide 400 text

Jan 2015 @sandimetz Order is-a House?

Slide 401

Slide 401 text

Jan 2015 @sandimetz Orderer is a role

Slide 402

Slide 402 text

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

Slide 403

Slide 403 text

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

Slide 404

Slide 404 text

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

Slide 405

Slide 405 text

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

Slide 406

Slide 406 text

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

Slide 407

Slide 407 text

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

Slide 408

Slide 408 text

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

Slide 409

Slide 409 text

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

Slide 410

Slide 410 text

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

Slide 411

Slide 411 text

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

Slide 412

Slide 412 text

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

Slide 413

Slide 413 text

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

Slide 414

Slide 414 text

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

Slide 415

Slide 415 text

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

Slide 416

Slide 416 text

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

Slide 417

Slide 417 text

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

Slide 418

Slide 418 text

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

Slide 419

Slide 419 text

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

Slide 420

Slide 420 text

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)

Slide 421

Slide 421 text

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.'

Slide 422

Slide 422 text

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.'

Slide 423

Slide 423 text

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

Slide 424

Slide 424 text

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

Slide 425

Slide 425 text

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

Slide 426

Slide 426 text

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.'

Slide 427

Slide 427 text

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

Slide 428

Slide 428 text

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

Slide 429

Slide 429 text

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

Slide 430

Slide 430 text

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

Slide 431

Slide 431 text

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

Slide 432

Slide 432 text

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

Slide 433

Slide 433 text

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

Slide 434

Slide 434 text

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

Slide 435

Slide 435 text

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

Slide 436

Slide 436 text

Jan 2015 @sandimetz Echo?

Slide 437

Slide 437 text

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

Slide 438

Slide 438 text

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

Slide 439

Slide 439 text

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

Slide 440

Slide 440 text

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

Slide 441

Slide 441 text

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

Slide 442

Slide 442 text

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

Slide 443

Slide 443 text

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

Slide 444

Slide 444 text

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

Slide 445

Slide 445 text

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

Slide 446

Slide 446 text

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

Slide 447

Slide 447 text

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

Slide 448

Slide 448 text

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

Slide 449

Slide 449 text

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

Slide 450

Slide 450 text

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

Slide 451

Slide 451 text

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

Slide 452

Slide 452 text

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

Slide 453

Slide 453 text

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

Slide 454

Slide 454 text

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

Slide 455

Slide 455 text

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

Slide 456

Slide 456 text

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

Slide 457

Slide 457 text

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

Slide 458

Slide 458 text

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

Slide 459

Slide 459 text

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

Slide 460

Slide 460 text

Jan 2015 @sandimetz puts  House.new.line(12)

Slide 461

Slide 461 text

Jan 2015 @sandimetz

Slide 462

Slide 462 text

Jan 2015 @sandimetz puts  House.new.recite

Slide 463

Slide 463 text

Jan 2015 @sandimetz puts  House.new.recite puts  House.new(orderer:  RandomOrder.new).recite

Slide 464

Slide 464 text

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

Slide 465

Slide 465 text

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

Slide 466

Slide 466 text

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?

Slide 467

Slide 467 text

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

Slide 468

Slide 468 text

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!

Slide 469

Slide 469 text

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

Slide 470

Slide 470 text

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

Slide 471

Slide 471 text

Jan 2015 @sandimetz House Echo House Random House

Slide 472

Slide 472 text

Jan 2015 @sandimetz House

Slide 473

Slide 473 text

Jan 2015 @sandimetz House

Slide 474

Slide 474 text

Jan 2015 @sandimetz House 1) Isolate the thing that varies

Slide 475

Slide 475 text

Jan 2015 @sandimetz House 1) Isolate the thing that varies

Slide 476

Slide 476 text

Jan 2015 @sandimetz House 1) Isolate the thing that varies

Slide 477

Slide 477 text

Jan 2015 @sandimetz House

Slide 478

Slide 478 text

Jan 2015 @sandimetz House

Slide 479

Slide 479 text

Jan 2015 @sandimetz House 2) Name the Concept

Slide 480

Slide 480 text

Jan 2015 @sandimetz House 2) Name the Concept

Slide 481

Slide 481 text

Jan 2015 @sandimetz House Order Format

Slide 482

Slide 482 text

Jan 2015 @sandimetz House Order Format 3) Define the Role

Slide 483

Slide 483 text

Jan 2015 @sandimetz House Order Format 3) Define the Role

Slide 484

Slide 484 text

Jan 2015 @sandimetz House Orderer Formatter

Slide 485

Slide 485 text

Jan 2015 @sandimetz House Orderer Formatter 4) Inject the player

Slide 486

Slide 486 text

Jan 2015 @sandimetz House Orderer Formatter

Slide 487

Slide 487 text

Jan 2015 @sandimetz House Orderer Formatter

Slide 488

Slide 488 text

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

Slide 489

Slide 489 text

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

Slide 490

Slide 490 text

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

Slide 491

Slide 491 text

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

Slide 492

Slide 492 text

Jan 2015 @sandimetz Smalltalk Infected Condition Averse Message Centric Abstraction Seeking

Slide 493

Slide 493 text

Jan 2015 @sandimetz Smalltalk Infected Condition Averse Message Centric Abstraction Seeking

Slide 494

Slide 494 text

Jan 2015 @sandimetz Summary

Slide 495

Slide 495 text

Jan 2015 @sandimetz

Slide 496

Slide 496 text

Jan 2015 @sandimetz If you're talking to nil

Slide 497

Slide 497 text

Jan 2015 @sandimetz If you're talking to nil it's something

Slide 498

Slide 498 text

Jan 2015 @sandimetz Null Object Pattern Active Nothing

Slide 499

Slide 499 text

Jan 2015 @sandimetz

Slide 500

Slide 500 text

Jan 2015 @sandimetz Ware Inheritance

Slide 501

Slide 501 text

Jan 2015 @sandimetz Ware Inheritance It is not for sharing behavior

Slide 502

Slide 502 text

Jan 2015 @sandimetz There's no such thing as one specialization

Slide 503

Slide 503 text

Jan 2015 @sandimetz

Slide 504

Slide 504 text

Jan 2015 @sandimetz Isolate the thing that varies

Slide 505

Slide 505 text

Jan 2015 @sandimetz Isolate the thing that varies Name the concept

Slide 506

Slide 506 text

Jan 2015 @sandimetz Isolate the thing that varies Name the concept Define the role

Slide 507

Slide 507 text

Jan 2015 @sandimetz Isolate the thing that varies Name the concept Define the role Inject the players

Slide 508

Slide 508 text

Jan 2015 @sandimetz Believe in nothing

Slide 509

Slide 509 text

Jan 2015 @sandimetz Nothing is always Something

Slide 510

Slide 510 text

Jan 2015 @sandimetz Sandi Metz @sandimetz http://sandimetz.com

Slide 511

Slide 511 text

Jan 2015 @sandimetz http://poodr.com

Slide 512

Slide 512 text

Jan 2015 @sandimetz http://99bottlesbook.com Practical Programming Book 99 Bottles of OOP

Slide 513

Slide 513 text

Jan 2015 @sandimetz Next Public Course POODNYC Oct 19-21, 2015 New York City

Slide 514

Slide 514 text

Jan 2015 @sandimetz Stickers?

Slide 515

Slide 515 text

Jan 2015 @sandimetz Stickers?

Slide 516

Slide 516 text

Jan 2015 @sandimetz Temporary Tattoos!

Slide 517

Slide 517 text

Jan 2015 @sandimetz Thanks

Slide 518

Slide 518 text

Jan 2015 @sandimetz Sandi Metz @sandimetz http://sandimetz.com