4

类上的这个简单方法只是status使用安全导航运算符运行该方法。

def current_status
  account&.status
end

但是臭味报告这个警告:

MyClass#current_status performs a nil-check [https://github.com/troessner/reek/blob/master/docs/Nil-Check.md]

如何正确编写这样的方法来避免 Nil Check?

我还从thoughtbot 验证了这篇文章,但对于安全导航操作员来说似乎“太多”了。

红宝石 2.3.1

4

2 回答 2

2

链接帖子中“示例 4”的建议很冗长,但非常好:

class MyClass
  def initialize(with_account = nil)
    @account = Account.new if with_account
  end

  def current_status
    account.status
  end

  def account
    @account || NilAccount.new
  end
end

class Account
  def status
    "Up!"
  end
end

class NilAccount
  def status
    "Down!"
  end
end

puts MyClass.new(:with_account).current_status
#=> "Up!"
puts MyClass.new.current_status
#=> "Down!"

如果它对你来说“太多”,account&.status可能就好了。

无论您做什么:您都需要尽可能多地测试您的代码!

于 2017-01-12T11:16:43.350 回答
0

好吧,tell-dont-ask看起来不错,但Example 4解决这个特定案例似乎有点过头了。

@andredurao 我认为,我们可以使用此解决方法来通过检查,出于某种原因reek可以使用它:

def current_status
  return unless account

  account.status
end
于 2020-02-21T18:46:11.403 回答