What is Replace Conditional with Polymorphism Refactoring? How is it implemented in Ruby? -


i came across replace conditional polymorphism refactoring while asking elimination of if..else conditional in ruby.the link

can explain me how can implement same in ruby?(a simple sweet code do)

the replace conditional polymorphism refactoring rather simple , pretty sounds like. have method conditional this:

def speed   case @type   when :european       base_speed   when :african        base_speed - load_factor * @number_of_coconuts   when :norwegian_blue if nailed? 0 else base_speed(@voltage) end end 

and replace polymorphism this:

class european   def speed     base_speed   end end  class african   def speed     base_speed - load_factor * @number_coconuts   end end  class norwegianblue   def speed     if nailed? 0 else base_speed(@voltage)   end end 

you can apply refactoring again norwegianblue#speed creating subclass of norwegianblue:

class norwegianblue   def speed     base_speed(@voltage)   end end  class nailednorwegianblue < norwegianblue   def speed     0   end end 

voilĂ , conditionals gone.

you might ask yourself: always work? can always replace if message dispatch? , answer is: yes, can! in fact, if didn't have if, can implement using nothing message dispatch. (this is, in fact, how smalltalk it, there no conditionals in smalltalk.)

class trueclass   def iff(thn:, els: ->{})     thn.()   end    def &     yield   end    def |     self   end    def !     false   end end  class falseclass   def iff(thn:, els: ->{})     els.()   end    def &     self   end    def |     yield   end    def !     true   end end  (3 > 4).iff(thn: ->{ 'three bigger four' }, els: ->{ 'four bigger three' } ) # => 'four bigger three'  true.& { puts 'hello' } # hello  true.| { puts 'hello' } # => true 

also relevant: anti-if campaign


Comments

Popular posts from this blog

PHP DOM loadHTML() method unusual warning -

python - How to create jsonb index using GIN on SQLAlchemy? -

c# - TransactionScope not rolling back although no complete() is called -