我reek
在我的代码中用作最佳实践的分析工具。但是最近我发现如果在方法中,我有布尔参数,例如。
def method (flag = true)
reek
给我一个警告。为什么reek
告诉我这是一个警告?
我reek
在我的代码中用作最佳实践的分析工具。但是最近我发现如果在方法中,我有布尔参数,例如。
def method (flag = true)
reek
给我一个警告。为什么reek
告诉我这是一个警告?
在我写 reek 的几年前,我在这里写了一篇关于这种代码气味的博客:http: //silkandspinach.net/2004/07/15/avoid-boolean-parameters/
布尔参数的问题都与重复和 SRP 有关:被调用的方法有两个职责,调用者知道要调用哪一个。
老问题,但我想我会为来自谷歌的人添加我的想法:
在某些情况下,单独的方法很好,但在我看来,更好的选择通常如下:
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)
标志变量被认为是不好的做法。这是因为它本质上违反了函数应该做一件事,而且只做一件事的原则。通过传入一个布尔标志,您是在说,“如果它是真的就做这个,如果它是假的就做那个”,这是两件事。