Rubyのモジュールに関する基礎知識
モジュールはクラスと非常によく似ており、インスタンス化できないクラスと表現することができます"quot;。ClassクラスはModuleクラスのサブクラスなので、class = module + instantiation capability"と表現した方がよいでしょう。
モジュールは具体的にどのようなことに使われるのですか?モジュールには大きく分けて2つの種類があります。ミックスインと名前空間です。
ミックスインとは、実は多重継承を制限したものです。継承関係は、実際には特定のクラスに多少の "embellishment" を許容するために作られています。実際、ミックスインという言葉は、アイスクリームの上にクッキーやナッツを乗せるという発想からきています。
多重継承の仕組みが引き起こす問題は、オブジェクト指向設計の歴史においてよく知られている。そのため、現代の多くのオブジェクト指向設計言語は、Rubyが採用している単一継承のアプローチのみをサポートしています。
しかし、多重継承には切り離せない魅力があります。そこでRubyはMix-inを採用することで、多重継承のメリットの多くを導入しています。
一度に複数のクラスを継承するクラスは、オブジェクト指向の設計において多くの問題を引き起こしやすい。そこで、Rubyでは以下のような制限を加えている。
1. 継承できるクラスは1つだけ
2. いわゆる "クラスっぽいけどクラスっぽくない" モジュールを複数継承することができる
また、Rubyでは、"モジュールをクラスに追加する動作"をincludeと呼びます。
モジュールのもう一つの機能は、名前空間を提供することです。
大規模なプログラム開発では、ネーミングの衝突の問題がしばしば発生する。例えば、読者はプログラム中にServiceというクラスを作る必要があるが、Serviceという名前はすでにプログラムライブラリで使われており、命名上の競合が発生する。
最近の多くのプログラミング言語では、名前の衝突の問題を避けるために、基本的に名前空間やパッケージが用意されています。異なる名前空間に存在するサービスクラスは、同じクラス名であっても異なるオブジェクトとして扱われます。
Rubyでは、このような名前空間を提供するために、モジュールを利用することが一般的である。
class Service; end
module Library
class Service; end
end
一番最初のServiceクラスはTop Levelネームスペースに属し、それ以降のServiceクラスはLibraryモジュールに属します。
これは、実際には、Top LevelモジュールとLibraryモジュールでそれぞれ定義されたServiceという名前の定数です(クラス名は実際にはクラスオブジェクトを指す定数です)。
そのため、あたかも定数であるかのように使用される。
Service for ::Service #Top Level
Service for Library::Service #Library
関連
-
Ruby正規表現とサンプルコード
-
Rubyにおけるフックメソッドとメソッド呼び出しへのフックの追加例
-
Ruby on Railsフレームワークの設計構造をMVCマインドで理解する
-
Rubyのブロック機能をより深く理解するために
-
UbuntuでRuby on RailsフレームワークとRubyMine IDEを設定する
-
Rubyのデザインパターン開発におけるProxyパターンの利用について
-
Rubyのデザインパターン開発におけるobserverパターンの一例
-
文字列のマッチングと置換のためのRuby正規表現
-
Rubyのバージョンを管理するためのrbenvの使い方
-
Ruby WebDriverガイド
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Ruby on RailsのWebプロジェクト構築のためのシンプルガイド
-
Rubyブロックチュートリアル
-
RubyとRuby on Railsフレームワーク環境構築の簡潔なチュートリアル
-
Rubyプログラムにおける正規表現の基本的な使い方に関するチュートリアル
-
Rubyのオブジェクト指向のアプローチによるプログラミング学習雑学
-
RubyでXMLデータ処理ライブラリREXMLを使うための手引き
-
RubyのプログラムでXML形式のデータをパースするためにREXMLを呼び出す例
-
Rubyのデザインパターン。プログラミングにおけるアピアランスパターンの応用
-
Rubyでの例外処理コードの記述例
-
ブログのスパムメッセージを簡単にブロックする方法