• ベストアンサー

『名前空間』の意味を教えてください。

javascriptを勉強し始めた初心者です。 『名前空間』の意味が分からずインターネットで調べてみましたが 自分にはぼんやりとしか理解できませんでした。 対象(言語)ごとに少し解釈が異なったりするのですか? javascriptに限ってではなく、プログラムにおける名前空間とは何か、 という事をなんとなくでも理解したいです。 名前空間とは何かをわかりやすく説明していただける方、どうかご回答ください。 できれば小学生でもわかるような簡単な例え話と併せて、 実際のサンプル等も用いて説明してくださると非常に助かります。 よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

JavaScriptに名前空間は存在しません。 名前空間とは、#1で既に回答がある通り、対象のクラス、命令などを 決定する住所みたいなもんです。 http://programming-10000.hatenadiary.jp/entry/20130917/1379372877 ここでは「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の概念としては 存在しません。 だから自前で作った『名前空間』が、他のライブラリなどのものとぶつかると 正しく動作させることができません。

その他の回答 (2)

  • Ogre7077
  • ベストアンサー率65% (170/258)
回答No.3

本当の意味ではイロイロあるんでしょうが、素直に「名前をかぶらせない仕組み」と覚えるのが簡単です。 複数人でソフト開発をすると、関数名やクラス名の名前かぶりが発生する可能性があります。 例) 太郎さんと 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(){} };

  • neko-ten
  • ベストアンサー率55% (1287/2335)
回答No.1

基本的に概念として存在します。 言語によって扱いも実装も違います。 簡単にいえば、変数名などがどこに存在しているかを考える概念です。 これが不適切だと、変数の中身があらぬところで書き変わったり、呼び出せなかったりします。 たとえば、「太郎」という名前だけでは個人を特定することはできません。 しかし、「東京都○○区○○▲▲ 佐藤家」という名前空間に属する「太郎」ということであれば特定が可能。 この「東京~~」が名前空間だと考えればわかりやすいはずです。 実際には宣言や参照のこともあるんでこのままってわけではないですが・・・。 上記の通り言語で扱いは変わります。 というか概念なので、明示的に名前空間と呼ばない言語もあります。 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になります。 スコープもグローバルになりますから、その時の内容が出力されます。 オブジェクト指向言語の場合、インスタンスでの扱いなどでさらに複雑になったりします。

関連するQ&A

  • PHPの名前空間インポートについて

    PHPのグローバル空間において useキーワードを用いた際のインポートについて質問です。 ---------------------------------------------------------------------------------------------------------- sample.php <?php //グローバル空間 namespace{ use SAMPLE;//はインポートできない。 use ¥SAMPLEはインポートできる。 print "名前空間のインポート"; print PHP_EOL; $hoge = new SAMPLE\TestClass(); } //任意の名前空間 namespace SAMPLE{ class TestClass{ public function __construct (){ print __NAMESPACE__; } } } ---------------------------------------------------------------------------------------------------------- とあった場合、グローバル空間内でuseキーワードを用いる場合 use ¥SAMPLE; だとインポートができて use SAMPLE: だとインポートできない理由(というか仕様)が理解できません。 具体的には PHP Warning: The use statement with non-compound name 'SAMPLE' has no effect in という警告がでます。 上記の例の場合たとえ use ¥SAMPLEでインポートしても 実際にクラスを使用する場合は new SAMPLE¥TestClass(); と修飾名でコールしなければならないので コードを書く労力としてはあまり意味がないのですが。。。。。 どなたか グローバル空間内で上記の様に use ¥SAMPLEだとインポートできるのに use SAMPLEだとインポートできない理由(仕様)、このように理解すればよいという理由を ご教授ください。よろしくお願いします。

    • ベストアンサー
    • PHP
  • C言語 キーワードとは??

    プログラミング初心者です。 初歩的な質問ですがよろしくお願いいたします。 現在C言語入門書を読んでいるのですが、「キーワード」と言うのが理解出来ません。 また当該入門書ではキーワードについて 「キーワードとは C 言語が仕様レベルで予約済みの名前のことで、前回のプログラムで紹介した return などはキーワードに属します。」と記載されていいますが理解出来ません。 初心者ですので、例え話なども用い解説してくれれば幸いです。 よろしくお願いいたします。

  • プログラミングについて

    僕は今15歳でプログラミングに最近興味を持ち自分でプログラムを作りたいと思ってます。言語は何がいいのかさっぱり分からなく、インターネットで調べると、初心者には[javascript]が向いているらしくそれを勉強したいのですがどのサイトをみてもさっぱり意味がわかりません。 プログラムを書いているのをみると英語やいろいろな文字で書かれていて、自分は何を使ってどのように書いていいのかわかりません。僕が今作りたいプログラムは携帯やパソコンのアプリケーション、ソフトウェア、簡単ゲームなどです。わかりやすく最初から説明してくれているサイト、本などを教えてください。 分かりづらくてすいませんが、本当にすごく困っているのでよろしくお願いします。

  • javascriptのおすすめ教科書

    javascriptを半年くらい前から勉強始めている者です。 javascriptをかじってみて思うのは、対象のデータがどういう風に変化してい るかがよくわからない、という感じです。 マイクロソフトのAccessをいじってみると、テーブルがクエリーの条件で変化 していく様子が手に取るようにわかります。 それに比べて、javascriptの世界では、javascriptのプログラムの動きと、そ のプログラムが扱っている実際の対象データの変化の関連を逐語訳的に理解す るのがむずかしいな。説明している説明書って無いナ。あれば売れるのでは。 と思っている次第です。 javascriptのプログラムの動きと、そのプログラムが扱っている実際の対象データの変化の関連を逐語訳的に解説している書籍(または、それに準じるもの)がございましたらご紹介お願いいたします。 (年季を積めば、javascriptのプログラムを見るだけで、実際の対象データの 変化が目に浮かぶようになるのものでしょうか?)

  • 関数ポインタの利点

    こんにちは。 C言語初心者ですが今勉強中です。 その中でポインタについては理解できたのですが、 関数ポインタの利点、使うべき所などが理解できません。 ポインタの基本は理解しています。 値渡し、アドレス渡しも理解しています。 関数ポインタを使うと何がいい、またはどんなとき使わなければならないのか 教本を読んでいてもさっぱりわかりません。 サンプルプログラムを打っても何のために使ってるのかわからないです。 どなたか教えていただけませんでしょうか? よろしくお願いします。

  • javascriptについて

    よろしくお願いします。 javascriptで○×形式のクイズのようなもの(診断テストのようなもの) を作りたいと思っています。 ・・・が、恥ずかしながら私はプログラミング初心者です。 どのくらい初心者かというとHTMLの基礎が分かっていて、タグを調べながら HTMLであればwebページが作れるかな。ってくらいの初心者です。。。 javascriptで作りたいページというのは、自分に当てはまるかどうか、 ○か×かで答えていき、最後に診断が出る。。。というようなページです。 「javascript 入門 初心者」などのキーワードでgoogleで検索して、 インターネットで独学で勉強はしているのですが、あまり分かりません。。。 これくらいのレベルの私が見て勉強しやすいようなページってありますか? また、勉強するのに、コツとか、理解しやすい勉強法ってありますでしょうか? また、上記の診断テストについて、「こういう記述したらいいんじゃない?」 ってサンプルを教えてくれる方がいらっしゃいましたら、教えていただけたら大変嬉しいです。 お手数ですが、よろしくお願いします。

  • autocad ペーパー空間に何も表示されません。

    超初心者です。autocad2013を使用していますが、古いバージョンのものでも教えていただけたら とてもありがたいです。。。 モデル空間で作図したものをペーパー空間で表示して加工したいのですが。 ペーパー空間には枠しかありません。 ネットで調べていますが、私には理解できずに本当に困っています。 サイトにはペーパー空間をクリックするとモデルで作図したものが表示されるので それを加工する時の説明はたくさんあります。 そこまで至っていないのです。 どうかよろしくお願いいたします。

  • C言語でのファイルの作成について(超初心者です)

    C言語を独学で勉強しています。 のちのち、C++も使えるようにと思い、ソフトも購入し使っています。 本(C言語のみ)などを見てサンプルプログラムを入力して実行はできるのですが、 フォルダとファイルの関係が全くわかりません。 1つサンプルプログラムを作るごとにフォルダを作成して 実行を繰り返しているのですが、 本当にそうしないといけないのでしょうか? 例えば、2つ以上のファイルを使ったプログラムは どうしたらいいのでしょうか? 超初心者なので コンパイルした後にできるファイルの意味も よくわかりません。 うまく説明できないのですが、このあたりのファイルの流れと意味を わかりやすく教えてもらえませんか? また こうした方がいいというものがあれば教えてください。 よろしくお願いします。

  • CPUの構造を理解する意味は?

    CPUの構造を理解する意味は? よくプログラムの勉強をするときにCPUの内部構造である制御装置、演算装置、レジスタなどの解説があって、さらにそれらがどういう繋がりがあって、どうお互いを利用しているか、ということを説明する本に出会います。 しかし実際アセンブリ言語で開発しようという人間以外に、誰がこの知識を必要とするのか全くわかりません。 C言語以上の高級言語を使用するのであればこれらの知識は不要ですよね?? ※C言語の勉強でメモリーの構造を理解する必要があるのはわかります。

  • スマートフォンアプリ開発について

    スマートフォンアプリの勉強をこれから始めようと思っているのですが、アンドロイド携帯のアプリを作るプログラム言語とiPhoneのアプリを開発するプログラム言語は全く別のものなのでしょうか? 当方、HTML、CSS、JavaScript、PHPなどを使ったサイト作りにはなじみがあるのですが、スマートフォンの開発にはJAVAやC言語のような知識がなければ立ち入れない領域でしょうか? まったくゼロからなのでどこから手をつけていいか分かりません、初心者からでも理解できるようなおすすめサイト、書籍などありましたら教えていただけると幸いです。

専門家に質問してみよう