アプリ版:「スタンプのみでお礼する」機能のリリースについて

javascriptを勉強し始めた初心者です。

『名前空間』の意味が分からずインターネットで調べてみましたが
自分にはぼんやりとしか理解できませんでした。
対象(言語)ごとに少し解釈が異なったりするのですか?
javascriptに限ってではなく、プログラムにおける名前空間とは何か、
という事をなんとなくでも理解したいです。

名前空間とは何かをわかりやすく説明していただける方、どうかご回答ください。
できれば小学生でもわかるような簡単な例え話と併せて、
実際のサンプル等も用いて説明してくださると非常に助かります。

よろしくお願いいたします。

A 回答 (3件)

基本的に概念として存在します。


言語によって扱いも実装も違います。

簡単にいえば、変数名などがどこに存在しているかを考える概念です。
これが不適切だと、変数の中身があらぬところで書き変わったり、呼び出せなかったりします。
たとえば、「太郎」という名前だけでは個人を特定することはできません。
しかし、「東京都○○区○○▲▲ 佐藤家」という名前空間に属する「太郎」ということであれば特定が可能。
この「東京~~」が名前空間だと考えればわかりやすいはずです。
実際には宣言や参照のこともあるんでこのままってわけではないですが・・・。

上記の通り言語で扱いは変わります。
というか概念なので、明示的に名前空間と呼ばない言語もあります。
JavaScriptにおいては、名前空間自体よりもスコープが重要です。
複数の関数に同じ名前の変数を作ってみて、それぞれコールしてみるとわかりやすいかもしれない。
*スコープは、参照できる範囲と考えればいいです。

Ex1)
function foo(){
var hoge = "huga";
}

function bar(){
var hoge = "geko";
}

どちらの関数でもhogeを使っていますが、それぞれスコープが違うために中身は別です。
また、スコープが関数内に存在するため関数外からは参照できません。
関数foo()とbar()を順番に実行したとしても、alertなどでhogeを出力した場合はundefinedになります。

Ex2)
var hoge = "boko";
function foo(){
hoge = "huga";
}

function bar(){
hoge = "geko";
}

Ex1との違いは、関数の外で変数が宣言されています。
この場合、名前空間がグローバル(スクリプト全体って考えるといいかな)となります。
そのため、foo()とbar()で使われているhoge変数は、グローバルに宣言していあるhogeと同じものになります。
foo()を実行すれば、中身がbokoだったhogeの中身はhugaに、bar()の場合はgekoになります。
スコープもグローバルになりますから、その時の内容が出力されます。

オブジェクト指向言語の場合、インスタンスでの扱いなどでさらに複雑になったりします。
    • good
    • 0

JavaScriptに名前空間は存在しません。



名前空間とは、#1で既に回答がある通り、対象のクラス、命令などを
決定する住所みたいなもんです。

http://programming-10000.hatenadiary.jp/entry/20 …
ここでは「JSTEST」という名前空間を実現する為の方法のように記されていますが、
これはどちらかというと名前空間ではなく「オブジェクト」の中に、「Person」クラスが
定義されているにすぎません。
それによって、『一意となる住所を作りだしている』に過ぎないのです。

その為、このページでも
var person = JSTEST.Person;
などとしていますが、いちいち使いたいクラスを別変数に格納してあげる必要があります。
厳密にいうと格納してあげる必要はありませんが、Personクラスが存在する位置が
JSTEST.ABC.DEF.GHI.JKL.MNO.PQR.Personだとしたら、毎度毎度それを書いてあげなければ
Personを特定させることができないから、別変数に格納し直しています。


名前空間の概念は以下の通りです。
A県A市の山田
A県B市の山田

この2つの情報から、A県A市の山田をどうのこうのしようとしたいと考えた時、
以下2つのパターンが存在します。
 ・そもそもA県A市しか対象として考えていない場合
 ・A県A市、A県B市ともに対象として考える場合

前者の場合、いちいちA県A市であることを考えなくてもいいことになります。
後者の場合、「山田」はA県A市であることを明示しなくてはなりません。

JavaScriptでは前者の振る舞いはできません。
なぜなら名前空間という概念が存在しないから。
でもみんなその概念を欲しがるから作っているだけで、JavaScriptの概念としては
存在しません。
だから自前で作った『名前空間』が、他のライブラリなどのものとぶつかると
正しく動作させることができません。
    • good
    • 0

本当の意味ではイロイロあるんでしょうが、素直に「名前をかぶらせない仕組み」と覚えるのが簡単です。



複数人でソフト開発をすると、関数名やクラス名の名前かぶりが発生する可能性があります。
例) 太郎さんと calc_kiriage を実装 → 次郎さん calc_kiriage を実装 → コンパイルエラー!

これを避けるために、命名規則を設けて名前がかぶらないように調整します
例) 太郎さんは TARO_calc_kiriage を実装 → 次郎さん JIRO_calc_kiriage を実装 → OK

しかしこれでは、名前が無駄に長くなる可能性があります
例) えぐざんぶる株式会社の銀行向けソフトの金額計算関数 EXAMPLE_CO_BANK_LIB_KEISAN_kiriage

だからといってコード化して短縮するのも感心しません
例) えぐざんぶる株式会社(C1)の銀行向けソフト(S2)の金額計算(F3)関数 C1S2F3_kiriage

そこで言語仕様として用意されている名前空間を使えば
例) えぐざんぶる株式会社の銀行向けソフトの金額計算関数 jp.co.exmaple.bank.lib.keisan.Kiriage

名前空間の省略記法が使えるので、書きやすく読みやすいコードになります
例) import jp.co.exmaple.bank.lib.keisan.*;
例) Kiriage obj; // jp.co.exmaple.bank.lib.keisan.Kiriage と同様

さて JavaScript には名前空間が言語仕様として存在しません。
なのでオブジェクトを多段定義して名前空間「っぽい」書き方をすることを、名前空間と呼ぶのが普通です。
例) var name = { space:{ func:function(){return name.space.value}, value:123 } };
例) name.space.func(); // 123

名前空間の省略記法「っぽい」も可能です。
例) var f = name.space.func;
例) f(); // 123

JSDoc も書いとけば万全でしょう
例) /** @namespace えぐざんぶる株式会社の名前空間 */ var example = {};
例) /** @namespace ダイジェスト計算の名前空間 */ example.digest = { calc:function(){} };
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!