什么是多态重构的条件替换?它是如何在Ruby中实现的?

Ano*_*use 3 ruby

我最近遇到了替换条件与多态重构,同时要求消除if..elseruby中的条件.链接

任何人都可以向我解释我如何在ruby中实现相同的功能?(一个简单的甜蜜代码可以做到)

Jör*_*tag 7

与多态重构更换条件是相当简单,它是非常正是这听起来像.你有一个带有条件的方法,如下所示:

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

你用这样的多态替换它:

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? then 0 else base_speed(@voltage)
  end
end
Run Code Online (Sandbox Code Playgroud)

您可以NorwegianBlue#speed通过创建以下子类再次应用重构NorwegianBlue:

class NorwegianBlue
  def speed
    base_speed(@voltage)
  end
end

class NailedNorwegianBlue < NorwegianBlue
  def speed
    0
  end
end
Run Code Online (Sandbox Code Playgroud)

Voilà,你所有的条件都消失了.

你可能会问自己:这总是有效吗?我可以随时更换if消息发送吗?答案是:是的,你可以!事实上,如果你没有if,你可以自己实现它,只使用消息发送.(事实上​​,这是Smalltalk如何做到的,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 is bigger than four' }, els: ->{ 'four is bigger than three' } )
# => 'four is bigger than three'

true.& { puts 'Hello' }
# Hello

true.| { puts 'Hello' }
# => true
Run Code Online (Sandbox Code Playgroud)

同样相关:IF运动

  • 另外两个用于Python(Monty变种)参考.微课程有时候非常方便; 我可以使用额外的类来获得更干净的主线代码. (2认同)