mixin应该对他们的包括类做出假设吗?

use*_*818 4 ruby oop mixins

我找到了一个mixin的例子,它假设包含类的实例变量.像这样的东西:

module Fooable
  def calculate
    @val_one + @val_two
  end
end

class Bar
  attr_accessor :val_one, :val_two
  include Fooable
end
Run Code Online (Sandbox Code Playgroud)

我发现支持和反对这是一个好习惯的论据.显而易见的替代方案是传递val_oneval_two作为参数,但这似乎并不常见,并且具有更多参数化方法可能是一个缺点.

关于mixin对阶级状态的依赖,是否存在传统观点?从实例变量中读取值与将它们作为参数传递有什么优点/缺点?或者,如果您开始修改实例变量而不是仅仅读取它们,答案是否会改变?

saw*_*awa 5

在模块中假设一些关于包含/预先包含它的类的属性,这根本不是问题.通常这样做.实际上,该Enumerable模块假定包含/ prepending的类有一个each方法,并且有许多依赖它的方法.同样,该Comparable模块假定包含/前置类具有<=>.我不能立即想出一个实例变量的例子,但是关于这一点的方法和实例变量之间没有关键的区别; 关于实例变量应该说同样的.

不使用实例变量传递参数的缺点是您的方法调用将是冗长且不太灵活的.