私は Java から来ましたが、今は Ruby を使っています。
私がよく知らない言語機能の 1 つは、module
. a とは正確には何なのか、いつ使用するのmodule
か、なぜ a よりも a を使用するのmodule
か疑問に思っていますclass
。
╔═══════════════╦═══════════════════════════╦═════════════════════════════════╗
║ ║ class ║ module ║
╠═══════════════╬═══════════════════════════╬═════════════════════════════════╣
║ instantiation ║ can be instantiated ║ can *not* be instantiated ║
╟───────────────╫───────────────────────────╫─────────────────────────────────╢
║ usage ║ object creation ║ mixin facility. provide ║
║ ║ ║ a namespace. ║
╟───────────────╫───────────────────────────╫─────────────────────────────────╢
║ superclass ║ module ║ object ║
╟───────────────╫───────────────────────────╫─────────────────────────────────╢
║ methods ║ class methods and ║ module methods and ║
║ ║ instance methods ║ instance methods ║
╟───────────────╫───────────────────────────╫─────────────────────────────────╢
║ inheritance ║ inherits behaviour and can║ No inheritance ║
║ ║ be base for inheritance ║ ║
╟───────────────╫───────────────────────────╫─────────────────────────────────╢
║ inclusion ║ cannot be included ║ can be included in classes and ║
║ ║ ║ modules by using the include ║
║ ║ ║ command (includes all ║
║ ║ ║ instance methods as instance ║
║ ║ ║ methods in a class/module) ║
╟───────────────╫───────────────────────────╫─────────────────────────────────╢
║ extension ║ can not extend with ║ module can extend instance by ║
║ ║ extend command ║ using extend command (extends ║
║ ║ (only with inheritance) ║ given instance with singleton ║
║ ║ ║ methods from module) ║
╚═══════════════╩═══════════════════════════╩═════════════════════════════════╝
最初の答えは適切で、いくつかの構造的な答えが得られますが、もう 1 つのアプローチは、自分が何をしているのかを考えることです。モジュールとは、複数のクラスで使用できるメソッドを提供することです。モジュールを「ライブラリ」と考えてください (Rails アプリで見られるように)。クラスはオブジェクトに関するものです。モジュールは機能に関するものです。
たとえば、認証および認可システムはモジュールの良い例です。認証システムは複数のアプリ レベルのクラス (ユーザーが認証され、セッションが認証を管理し、他の多くのクラスは認証状態に基づいて異なる動作をします) で機能するため、認証システムは共有 API として機能します。
複数のアプリでメソッドを共有している場合にも、モジュールを使用できます (ここでもライブラリ モデルが適しています)。
まだ誰もこれを言っていないことに驚いています。
質問者は Java のバックグラウンドを持っているので (そして私もそうでした)、ここで役立つ類推があります。
クラスは単純に Java クラスに似ています。
モジュールは、Java の静的クラスに似ています。Math
Java のクラスについて考えてみましょう。インスタンス化せず、静的クラスのメソッドを再利用します (例: Math.random()
)。
基本的に、モジュールはインスタンス化できません。クラスにモジュールが含まれている場合、すべてのモジュール メソッドとクラス メソッドへのアクセスを提供するプロキシ スーパークラスが生成されます。
モジュールは複数のクラスに含めることができます。モジュールは継承できませんが、この「ミックスイン」モデルは便利なタイプの「多重継承」を提供します。OO の純粋主義者はその意見に同意しませんが、純粋さによって仕事を成し遂げることができないようにしてはなりません。
(この回答はもともと にリンクされていましhttp://www.rubycentral.com/pickaxe/classes.html
たが、そのリンクとそのドメインはアクティブではなくなりました。)
Module
Ruby では、ある程度、Java抽象クラスに対応します。インスタンス メソッドがあり、クラスはそれから継承できます ( include
Ruby では「ミックスイン」と呼ばれます)。ただし、インスタンスはありません。他にも小さな違いがありますが、これだけの情報で十分です。