2

モジュールはモジュールにA依存しB、クラスCはモジュールAとモジュールに依存しますB。とをに含めるAと、これは機能しますが、 が別のモジュールに依存しているという事実は気に入りません。BCA

この状況でモジュールを混在させる「正しい」方法は何ですか? それ自体Aを混ぜるべきですか?また、直接使用するBとどうなりますか?CB

module B
  def g
    12
  end
end

module A
  def f
    2 * g
  end
end

class C
  include A, B

  def h
    3 * f
  end
end
4

5 に答える 5

1

include重複して書いても問題ありません。ACの両方が に依存している場合は、 との両方にB含めます。BAC

module B
  def g; 12 end
  def i; 7 end
end

module A
  include B
  def f; 2 * g end
end

class C
  include A, B
  def h; 3 * f * i end
end

Cに依存しない場合は、 にのみB含めます。BA

module B
  def g; 12 end
end

module A
  include B
  def f; 2 * g end
end

class C
  include A
  def h; 3 * f end
end
于 2013-06-11T03:10:05.910 に答える
0

モジュール A には、モジュール B にある機能に依存するメソッドがあります [...]。この状況でモジュールを混在させる「正しい」方法は何ですか? B自体にAを混ぜるべきですか?C も B を直接使用するとどうなりますか?

選択肢はほとんどありません。A、B、C の関係に応じて、それぞれを選択する必要があります。

1 つ目は、とDの間の共有機能を定義するモジュールを宣言することです。このようにして、あまり心配することなく、 と の両方を簡単に組み合わせることができます。ABDAB

module D; ...; end
module A; include D; ...; end
module B; include D; ...; end

私が考えることができるもう 1 つの方法は、継承を使用するためにAandをクラスに変換することです。B強い依存関係を持つ 2 つのクラスを持つ場合、継承は有効です。によって使用される機能A十分に強力な場合は、間違いなくこれを選択する必要があります。

class B; ...; end
class A < B; ...; end
class C < A; ...; end
于 2013-06-10T23:28:20.223 に答える
0

A が B に依存し、モジュールがインスタンス メソッドのみを定義している場合、B を A 内に含めるだけで問題はないと思います。クラス メソッドが必要な場合は、http://api.rubyonrails.org/classes/ActiveSupport/Concern.htmlを検討してください。

module B
  def method_b
    "B instance method"
  end
end

module A
  include B

  def method_a
    "A instance method is using #{method_b}"
  end
end

class Klass
  include A
end

k = Klass.new
puts k.method_a  #=> A instance method is using B instance method
puts k.method_b  #=> B instance method
puts k.class.ancestors.inspect  #=> [Klass, A, B, Object, Kernel, BasicObject]
于 2013-06-11T02:09:11.710 に答える