我有一个A
类来处理错误,
如何重构它以从调用方法中删除多个返回。
基本上是在if true
之后以error
和success
为假的方法返回。
Class A
def call
return method1 if true/false
return method2 if true/false
return method3 if true/false
{ success: true }
end
private
def method1
{
success: false
errors: 'X Not Found.'
}
end
def method2
{
success: false
errors: 'Y Not Found.'
}
end
def method3
{
success: false
errors: 'Z Not Found.'
}
end
end
答案 0 :(得分:0)
由于true
始终为true
,因此第一个条件始终为true
,因此第一个return
将始终被执行。因此,第一个return
之后的所有内容都只是死代码,永远不会到达。您可以将call
方法简化为此方法,它等效于您的代码100%:
def call
method1
end
或者,或者
alias_method :call, :method1
由于method2
和method3
不再从任何地方调用,因此您只需删除它们即可。
由于method1
仅从一个地方调用,即call
,因此您可以内联它,因此整个类都变成这样:
class A
def call
{
success: false
errors: 'X Not Found.'
}
end
end
这等同于您的代码100%,并且在所有情况下都做完全相同的事情。 (模数通过无限制反射违反封装。)
答案 1 :(得分:0)
如果您也可以添加条件代码,那就太好了,否则很难提出解决方案。无论如何,您可以有一个success?
和message
方法,只需将其格式化为类方法即可。
Class A
def call
{
success: success?
errors: message
}.compact
end
private
def success?
if x || y || z
false
else
true
end
end
def message
if x
'Y Not Found.'
elsif y
'Y Not Found.'
elsif z
'Z Not Found.'
end
end
end
请注意电话方法中的compact
,如果消息密钥为空(成功的话),它将删除消息密钥。