名前空間という言葉を勘違いしたまま使っている人を良く見かける。名前空間が何なのか解説しているところでも、名前空間とはどういう機能なのかを説明するにとどまり、名前空間という名称そのものの定義はおざなりになっている。
名前空間という名称の定義
名前空間というのは文字通り、名前が所属する空間の事だ。名前空間という言葉を分類するならそれは仕様(概念)であり、決してツール(道具)ではない。
名前空間では上位をouter、下位をinnerと表す。クラス構造で言えば外部クラスと内部クラスがこれに相当する。つまり視点を変えて説明するとこうなる。
outerから見た名前空間の表現
- 名前空間を構築する(※ベスト)
- 名前空間を定義する(多くのプログラミング言語の実装に合う)
- 名前空間を開く(Rubyの
class定義文やmodule定義文など) - 名前空間を作る(古いJavaScriptにおける擬似名前空間ハックなど)
- 名前空間を宣言する(Javaの
package宣言やphpのnamespace宣言など)
innerから見た名前空間の表現
- 名前空間に所属する(※ベスト)
- 名前空間に入る(完全に
inner視点なので文脈によっては違和感) - 名前空間に含まれる(客観的に説明するなら妥当)
間違い表現
上記の定義から下記のような表現は間違いである事がわかる。
- 名前空間を付ける(空間を付ける、は日本語表現が破綻している)
- 名前空間を用いる(破綻しているほどではないが名前空間を道具として捉えている)
- 名前空間を切る(名前空間で区切る、ならまだ通じるが切るでは誤解を招く)
名前空間の「名前」の意味
ここで言う名前とは、クラス名であったりモジュール名であったりパッケージ名であったりする。それが指し示すものは名前空間を実装しているプログラミング言語によって異なる。
例えばRubyであれば定数名を指す。Rubyはクラス名(モジュール名)も定数なのでouterはクラス名定数、innerは一般定数とクラス名定数の両方を含む。一般定数はouterにはなれないため、クラス名定数は入れ子にできるが一般定数は入れ子にできない、という構造が生まれる。
わかりやすい覚え方
名前空間に所属するというのは、outerという町にinnerが引越し、outerの住所録にinnerが含まれることである。他の町にいながら勝手に住所だけ名乗れば問題が発生する(この例はRubyの定数がわかりやすい1)。
またはouterという雑居ビルとinnerというテナントが契約し、雑居ビル内のフロアにinnerが入居することである。その結果innerの住所は「outerビル内inner」になる。
-
Rubyの定数はレキシカル名前空間と継承経路を合わせた参照経路を持っており、引越して参照(物理的な入れ子)する分にはouterの定数を参照できるが、外から住所を名乗る(名前空間プリフィクスを付ける)場合はouterの定数を参照できない。 ↩