7

reek在我的代码中用作最佳实践的分析工具。但是最近我发现如果在方法中,我有布尔参数,例如。

def method (flag = true)

reek给我一个警告。为什么reek告诉我这是一个警告?

4

3 回答 3

4

在我写 reek 的几年前,我在这里写了一篇关于这种代码气味的博客:http: //silkandspinach.net/2004/07/15/avoid-boolean-parameters/

布尔参数的问题都与重复和 SRP 有关:被调用的方法有两个职责,调用者知道要调用哪一个。

于 2012-02-25T18:50:17.790 回答
1

老问题,但我想我会为来自谷歌的人添加我的想法:

在某些情况下,单独的方法很好,但在我看来,更好的选择通常如下:

def method(option = {:flag => false})
  options[:flag] ? doFoo : doBar
end

method(:flag => true)

这也可能包括检查标志是否实际上是布尔值:

def method(option = {:flag => false})
  flag = options.fetch(:flag) { false }
  unless [true, false].include?(flag)
    raise ArgumentError, ':flag option should be true or false'   
  end
  flag? doFoo : doBar
end

method(:flag => true)
于 2016-01-31T13:05:57.153 回答
0

标志变量被认为是不好的做法。这是因为它本质上违反了函数应该做一件事,而且只做一件事的原则。通过传入一个布尔标志,您是在说,“如果它是真的就做这个,如果它是假的就做那个”,这是两件事。

于 2012-02-24T05:28:32.270 回答