gpt4 book ai didi

ruby - 什么是 Replace Conditional with Polymorphism 重构?它是如何在 Ruby 中实现的?

转载 作者:数据小太阳 更新时间:2023-10-29 07:46:09 26 4
gpt4 key购买 nike

我最近在要求消除 ruby​​ 中的 if..else 条件时遇到了用多态性重构替换条件the link

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

最佳答案

Replace Conditional with Polymorphism Refactoring非常简单,而且几乎就是它听起来的样子。您有一个带有如下条件的方法:

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

然后用这样的多态替换它:

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

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

class NorwegianBlue
def speed
base_speed(@voltage)
end
end

class NailedNorwegianBlue < NorwegianBlue
def speed
0
end
end

瞧,你所有的条件都没有了。

您可能会问自己:这总是有效吗?我可以总是用消息发送替换if吗?答案是:yes, you can !事实上,如果您没有 if,您可以只使用消息分派(dispatch)来自己实现它。 (事实上​​,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

也相关:Anti-IF Campaign

关于ruby - 什么是 Replace Conditional with Polymorphism 重构?它是如何在 Ruby 中实现的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30922788/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com