混合模块时的功能羡慕

Feature Envy when Mixing in Modules

我目前正在编写一个非常简单的测试工具入门。我的想法是,您可以拥有包含我的 "Testable" 模块的 classes。例如:

class Veilus
  include Testable
end

site = Veilus.new

可测试模块具有以下内容:

module Testable
  module_function

  def included(caller)
    caller.extend Testable::Interface::Page::Attribute
    caller.__send__ :include, Testable::Interface::Page
  end
end

当 Reek 检出这个文件时,returns:

FeatureEnvy: Testable#included refers to 'caller'
more than self (maybe move it to another class?)

但这不是包含方法的要点之一吗?

我意识到我可以关闭 Reek 的这方面检查,但我很好奇我将如何在这里遵循它的建议?在这种情况下,class 不是我提前知道的东西。 类别人写的会包含我的模块

同样,我知道我可以关闭检查,但似乎我可能想要在其他情况下进行检查。然后我开始怀疑我是否在做 "mixin" 方法错误,这就是 Reek 指出的。

我找到了一种 "handle" 方法,本质上就是使用 self 来引用 included 调用。因此,例如,我可以这样做:

module Testable
  def self.included(caller)
    caller.extend Testable::Interface::Page::Attribute
    caller.__send__ :include, Testable::Interface::Page
  end
end

我所做的是更改上面的代码,以便不再使用对 module_function 的调用。 (尽管这确实 运行 违反了一些 other 风格指南规则。)然后我只是在 included 消息前面使用了 self.

当我这样做时,不再出现 FeatureEnvy 警告。老实说,这似乎是标记 FeatureEnvy 条件的一种非常薄弱的​​方式。

这一点,连同其他各种问题,说服了我不要使用 Reek,而是坚持使用 Rubocop。 (我意识到,在很多情况下,他们看的是非常不同的东西。)我不提倡这种用于企业类型开发的方法,但在编写测试工具方面,我发现你实际上做了很多 "clever" 事情像臭佬这样的西洋跳棋就是不喜欢。