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)
4条答案
按热度按时间omjgkv6w1#
在我写reek的几年前,我在这里写了一篇关于这种代码气味的博客:
http://silkandspinach.net/2004/07/15/avoid-boolean-parameters/
布尔参数的问题都与重复和SRP有关:被调用的方法有两个责任,调用者知道它想要调用哪一个。
2mbi3lxu2#
老问题,但我想我会添加我的想法的人谁来自谷歌:
在某些情况下,单独的方法是好的,但在我看来,更好的选择通常是:
这也可以包括检查标志是否实际上是布尔值:
9rygscc13#
标志变量被认为是不好的做法。这是因为它本质上违反了函数应该做一件事的原则。通过传入一个布尔标志,你可以说,“如果它是真的,就这样做,如果它是假的,就那样做”,这是两件事。
5vf7fwbs4#
要在Ruby中创建通过Linters检查的默认布尔参数(如RuboCop),请使用:用途:
然后像这样打电话:
最重要的是要注意的是,任何具有可选参数的方法定义都必须使用指定的所有可选参数的名称进行调用。