我最近遇到了替换条件与多态重构,同时要求消除if..elseruby中的条件.链接
任何人都可以向我解释我如何在ruby中实现相同的功能?(一个简单的甜蜜代码可以做到)
在与多态重构更换条件是相当简单,它是非常正是这听起来像.你有一个带有条件的方法,如下所示:
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运动
| 归档时间: |
|
| 查看次数: |
1166 次 |
| 最近记录: |