9

これと似たような質問が以前にもありましたが、モジュール mixin を使用する代わりにコンポジションを使用することについて具体的に質問しています。

class Helper
  def do_somthing
  end
end

クラスを「使用」する必要があるが、それを継承しない場合は、単純に作成して使用します。

class MyStuff
  def initialize
    helper = Helper.new
    helper.do_something
  end
end

このためのモジュールを作成したい理由は次のとおりです。

 module Helper
   def do_something
   end
 end

class MyStuff
  include Helper
end

私が見る唯一の違いはHelper、モジュールを使用すると、周りに多くのオブジェクトが存在しないことです。しかし、より多くのオブジェクトが横たわっているのに比べて、より大きなオブジェクトが少ないということは何もありません。

さらに、将来サブクラス化する必要があるかどうかもわかりません。では、ライブラリのユーザーがモジュール mixin を使用するか、コンポジションを使用するかをどのように判断すればよいでしょうか?

4

4 に答える 4

18

HelperMyStuffクラスの関係が所有権の 1 つである場合は、合成を使用します。これは「has-a」関係として知られています。たとえば、PersonクラスとクラスがあるとしますCar。人は車を持っているので、合成を使用します。

class Person
  def initialize
    @car = Car.new
  end
end

class Car
  def accelerate
    # implementation
  end
end

Helper 「のように振る舞う」 場合は、モジュール mixinMyStuffを使用します。、この場合、 の役割を果たします。これは、従来の継承を使用する必要があることを意味する"is-a" 関係とは少し異なります。たとえば、クラスとモジュールがあるとします。人は時々寝台車の役割を引き受けますが、他のオブジェクトも同様です - 、、または. これらの他の各クラスは、スリープ状態になる可能性があるものを表します。HelperMyStuffPersonSleeperDogFrogComputer

module Sleeper
  def go_to_sleep
    # implementation
  end
end

class Person
  include Sleeper
end

class Computer
  include Sleeper
end

Sandi Metz の Practical Object-Oriented Design in Rubyは、これらのトピックに関する優れたリソースです。

于 2014-12-18T14:39:44.667 に答える