名前空間 (namespace)

名前空間 (namespace)


言葉が多様な意味を持つことによるコミュニケーション エラー

「CD」という言葉は割りと良く使われる言葉であるが,色々な意味を持っている.

例えば,会話中に「CD」という言葉が出てきたとする. ところが,話して行くうちにどうも変だ,話が伝わっていない. 確認してみると,相手はコンパクト ディスクの話をしていてこちらは銀行のキャッシュ ディスペンサーの話をしていた,というようなことが有ったりする.


コミュニケーション エラーである.


「CD」という言葉が色々な意味に取れてしまうのである.

ただ,「CD」という言葉を使えばいつも誤解が生じるか,と言えばそうでもない. コミュニケーション エラーを生じない状況の方が普通である.

この,コミュニケーション エラーを生じない状況を幾つか考えてみたい.

  1. どの意味で使っているかを一々明示している. 例えば,毎度「音楽CD」「銀行のCD」のように言う.
  2. 音楽業界人同志とか,同じ前提条件があれば,明示の必要がない. 「CD」だけで十分通じる.
  3. 環境や状況で判断できる場合も,明示の必要がない. 例えば,CD ショップ内では「CD」だけでも十分通じる.

大体,以上のような状況ではコミュニケーション エラーを生じないようである.


「マニフェスト」という言葉と「名前空間」

別の例をあげてみたい.


2003年には総選挙が行われたが,この時さかんにニュースで使われた言葉に「マニフェスト」という言葉が有る. これは,「この場合は『政権公約』の意味である」. つまり,「マニフェスト」という言葉の元々の意味は,「団体等の宣言や声明」のようなものであり「政権公約」より広いのだが,ニュースで使われた状況では,「マニフェスト」で十分に誤解無く通じたのである.


この,「この場合は×××の意味である」のような表現における「この場合」に当たるのが「名前空間 (namespace)」である.


上記の「この場合は『政権公約』の意味である」という文を,名前空間という言葉を使って「この名前空間で『マニフェスト』と言えば,『政権公約』の意味である」と言い換えることが出来る.


「名前空間」とプログラミング言語

名前空間 (namespace) と言うのは,プログラミング言語等で良く使われる概念である.


例えば,シンボル名 (変数名やメソッド名,クラス名等) が使用している複数のライブラリ等でぶつかってしまい支障があるような状況,所謂 "名前の衝突" と呼ばれる状況を避ける目的で良く使われる.

名前空間というのは,一般的には,中に同じ名前のものが複数存在しないように分けたもののことである.或る名前空間の中では,名前から特定のものを一意に決定できる.別の名前空間内にあるものは,名前空間と名前を組み合わせることで一意に特定できる.


プログラミング言語以外では,UML やインターネットで使われる URI (Uniform Resource Identifier: URL もこの一種) 等でも使われている概念である.


C# による「CD」の例

ここでは,試しに,上で箇条書きにしたコミュニケーション エラーを生じさせない三つの状況をプログラミング言語で表してみよう.


使用する言語は,C# という言語である.

この言語では,"namespace" というキーワードを使う. 例えば,"namespace 音楽" とあれば,「『音楽』という名前空間」という意味になる. 名前空間を一々明示するには,名前空間名と "." を使う."音楽.CD" で「『音楽』という名前空間でいうところの CD」の意味である. 更に,名前空間の使用を宣言してしまうには "using 名前空間名;" のような表記を使うことになっている.


実際にやってみよう. 次のような感じである.


/* 「CD」ったって色々有りますからね…
  気を付けないと誤解を生みますよ. */

namespace 音楽
{
   public class CD // (Compact Disc: コンパクト ディスク)
   {}
}

namespace 金融機関
{
   public class CD // (Cash Dispenser: 現金自動支払機)
   {}
}


/* 1. どの意味で使っているかを一々明示している.
  例えば,毎度「音楽CD」「銀行のCD」のように言う.*/


class// 一般の人
{
//  public void 話す(         CD cd) {} // × いきなり CD って言われてもどの意味か判りませんな.
   public void 話す(音楽    .CD cd) {} // ○ ちゃんと音楽の CD とか,
   public void 話す(金融機関.CD cd) {} // ○ 金融機関でいう CD とか言って頂かないと.
}

namespace 音楽
{
   public class// 音楽業界の人
   {
       public void 話す(         CD cd) {} // ○ 僕に CD って言えば,そりゃコンパクト ディスクの意味にとるよ.
       public void 話す(金融機関.CD cd) {} // ○ 金融機関でいう CD なら,はっきりとそう言ってくれなきゃね.
   }
}

namespace 金融機関
{
   class// 金融業界の人
   {
       public void 話す(     CD cd) {} // ○ 私に単に CD って言えば現金自動支払機の意味にとります.
       public void 話す(音楽.CD cd) {} // ○ 音楽の CD のことなら,そうはっきりと言って頂ければ判ります.
   }
}


/* 2. 音楽業界人同志とか,同じ前提条件があれば,明示の必要がない.
  「CD」だけで十分通じる.*/


namespace 音楽 // 音楽業界では,
{
   class 業界
   {
       void 会話(人 或る人, CD cd)
       {
           // 単に CD と言えばコンパクト ディスクのことだよね.
           或る人.話す(cd);
       }
   }
}


/* 3. 環境や状況で判断できる場合も,明示の必要がない.
  例えば,CD ショップ内では「CD」だけでも十分通じる.*/


using 音楽; // CD ショップ内とか,音楽の話をするのが前提の場所だったら,

class CDショップ
{
   void 会話(金融機関.人 或る金融業界の人, CD cd)
   {
       // いくら金融業界の人だって,
       // CD だけでコンパクト ディスクのことだって判りますよ.
       或る金融業界の人.話す(cd);
   }
}


(まと)

名前空間というのは,通常は余り意識せずに使っているものではないかと思う. 名前空間という概念を認識しつつ利用することで,コミュニケーション エラーを防ぐことができるのではないだろうか.