如何从Ruby方法中删除多重收益?

时间:2020-06-15 06:47:48

标签: ruby class error-handling return refactoring

我有一个A类来处理错误, 如何重构它以从调用方法中删除多个返回。

基本上是在if true之后以errorsuccess为假的方法返回。

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

2 个答案:

答案 0 :(得分:0)

由于true始终为true,因此第一个条件始终为true,因此第一个return将始终被执行。因此,第一个return之后的所有内容都只是死代码,永远不会到达。您可以将call方法简化为此方法,它等效于您的代码100%:

def call
  method1
end

或者,或者

alias_method :call, :method1

由于method2method3不再从任何地方调用,因此您只需删除它们即可。

由于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,如果消息密钥为空(成功的话),它将删除消息密钥。

相关问题