ruby-on-rails 方法中的布尔参数,为什么不呢?

shyt4zoc  于 2023-10-21  发布在  Ruby
关注(0)|答案(4)|浏览(146)

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

def method (flag = true)

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

omjgkv6w

omjgkv6w1#

在我写reek的几年前,我在这里写了一篇关于这种代码气味的博客:
http://silkandspinach.net/2004/07/15/avoid-boolean-parameters/
布尔参数的问题都与重复和SRP有关:被调用的方法有两个责任,调用者知道它想要调用哪一个。

2mbi3lxu

2mbi3lxu2#

老问题,但我想我会添加我的想法的人谁来自谷歌:
在某些情况下,单独的方法是好的,但在我看来,更好的选择通常是:

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)
9rygscc1

9rygscc13#

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

5vf7fwbs

5vf7fwbs4#

要在Ruby中创建通过Linters检查的默认布尔参数(如RuboCop),请使用:用途:

def method (flag: true)
end

然后像这样打电话:

method (flag: true)
method (flag: false)

最重要的是要注意的是,任何具有可选参数的方法定义都必须使用指定的所有可选参数的名称进行调用

相关问题