1. ホーム
  2. ruby

[解決済み] ネストされたクラスとモジュールにネストされたクラスはいつ使用するのですか?

2022-02-14 16:42:09

質問内容

サブクラスやモジュールを使うタイミングはよく分かっているのですが、最近、このようにクラスがネストしているのを見かけるようになりました。

class Foo
  class Bar
    # do some useful things
  end
end

というように、モジュールの中にネストされたクラスも同様です。

module Baz
  class Quux
    # more code
  end
end

ドキュメントや記事がまばらなのか、私が適切な検索キーワードを探り当てられるほど教養がないのか、このトピックに関する情報があまり見つからないようです。

どなたか、なぜ、どのような場合にそのような技術が使われるのか、例や投稿へのリンクを提供していただけませんか?

解決方法は?

他のOOP言語では 内部クラス は、上位のクラスに束縛されないとインスタンス化できない。例えば、Javaでは

class Car {
    class Wheel { }
}

の中のメソッドだけが Car クラスが作成できるのは Wheel s.

Rubyにはそのような動作はありません。

Rubyの場合。

class Car
  class Wheel
  end
end

とは異なります。

class Car
end

class Wheel
end

クラス名のみ Wheel vs. Car::Wheel . この名前の違いによって、プログラマは Car::Wheel クラスは、一般的な車輪とは対照的に、車の車輪だけを表現することができます。Rubyのクラス定義のネストは好みの問題ですが、2つのクラスの間の契約をより強く強制し、そうすることでクラスとその用途に関するより多くの情報を伝えるという意味で、目的を果たします。

しかし、Rubyのインタープリターにとっては、名前の違いに過ぎない。

2つ目の意見ですが、モジュールの中にネストされたクラスは、一般的にクラスの名前空間として使用されます。例えば

module ActiveRecord
  class Base
  end
end

とは異なります。

module ActionMailer
  class Base
  end
end

モジュールの中にクラスがネストされている使い方はこれだけではありませんが、一般的に最もよく使われます。