Namespace
Namespaceと検索すると名前空間という言葉が出てきた。
名前空間とは?
p265
クラス名の予期せぬ衝突を防ぐ
「名前空間(ネームスペース)」
を作る場合によく使われます。たし、名前空間を作る場合はクラスよりもモジュールが使われることが多い
です。名前空間やモジュールについては第8章で説明します。
- 名前空間とnamespaceは同じのようだ。
- 名前空間はクラスよりもモジュールが使われることが多いです。
名前空間を分けて名前の衝突を防ぐ
自分だけ使う小さなプログラムを書いているうちはあまり問題になりませんが、大規模なプログラム>や外部に公開するライブラリを作ったりするときはクラス名の重複が問題になることがあります。例えば、ある人が「野球の二塁手」という意味でSecondクラスを定義したとします。
class Second def initialize(player, uniform_number) @player = player @uniform_number = uniform_number end end
またある人は「時計の秒」という意味でSecondクラスを定義しました。
class Second def initialize(digits) @digits = digits end end
- 同じ名前のクラスを同時に使用する場合に区別する必要がある
p304
こんな時に登場するのが「名前空間(ネームスペース)」としてのモジュールです。
モジュール構文の中にクラス定義を書くと「そのモジュールに属するクラス」という意味
になるため、同名のクラスがあっても外側のモジュール名さえ異なっていれば名前の衝突が発生しなくなります。module Baseball class Second def initialize(player, uniform_number) @player = player @uniform_number = uniform_number end end end => :initialize module Clock class Second def initialize(digits) @digits = digits end end end => :initialize Baseball::Second.new("Alice", 13) => #<Baseball::Second:0x0000000106a8d318 @player="Alice", @uniform_number=13> Clock::Second.new(13) => #<Clock::Second:0x0000000106498598 @digits=13> module Baseball
- モジュールを使うことによってクラスを同じ名前にしても判別に問題なくなる
名前空間でグループやカテゴリを分ける
名前空間は名前の衝突を防ぐためだけではなく、クラスのグループ分け/カテゴリ分けをする目的で使われる場合もあります。クラスが何十、何百もあるような大きなプログラムになってくると、カテゴリ別にモジュール(名前空間)を作って整理しないと、どれがなんのクラスなのかパッと把握しにくくなるためです。
...
このように、大規模なプログラムや不特定多数の開発者が利用する外部ライブラリでは、モジュールは名前空間を作成する目的でもよく使われています。
- 用途によってrailsのモジュールで名前空間を守る
- なんのクラス、モジュールをどうするかをわかりやすくしている。
ネストなしでも名前空間つきのクラスを定義する
名前空間として使うモジュールがすでにどこかで定義されている場合は、モジュール構文やクラス構文をネストさせなくても、”モジュール名::クラス名"のような形でクラスを定義することもできます。
module Baseball end class Baseball::Second ... end
感想
rails apiを調べるとnamespaceという言葉が出てきたので理解しかった。
rails apiにおいて例えばActionDispatchをみるとnamespaceの欄にいつくものモジュールとクラスがある。つまりそれらの名前の衝突を防ぎ、カテゴリ・グループ分けしていることがわかった。