名前空間

コンピューティングにおいて名前空間とは、様々な種類のオブジェクトを識別および参照するために使用される一連の記号(名前)です。名前空間は、特定のオブジェクトセットのすべてに一意の名前が付けられることを保証するため、オブジェクトを容易に識別できます。

名前空間は、異なるコンテキストで名前を再利用できるように、一般的に階層構造になっています。例として、各人が名と、親族と共有する姓を持つ人の命名システムを考えてみましょう。家族のメンバーのファーストネームが各家族内でのみ一意である場合、各人はファーストネームと姓の組み合わせで一意に識別できます。Jane Doeは1人だけですが、Janeという名前は複数存在する可能性があります。Doe家の名前空間内では、「Jane」という名前だけでこの人物を一意に識別できますが、すべての人々の「グローバル」名前空間内では、フルネームを使用する必要があります。

名前空間の代表的な例としては、ファイルに名前を割り当てるファイルシステムが挙げられます。 [1]一部のプログラミング言語では、変数サブルーチンを名前空間で管理します[2] [3] [4]コンピュータネットワーク分散システムは、コンピュータプリンタウェブサイト、リモートファイルなどのリソースに名前を割り当てます。オペレーティングシステムは、仮想化コンテナ をサポートするために、カーネルリソースを分離された名前空間で分割することができます。

同様に、階層型ファイルシステムでは、ファイルをディレクトリに整理します。各ディレクトリは独立した名前空間を持つため、「letters」ディレクトリと「invoices」ディレクトリの両方に「to_jane」というファイルが含まれている可能性があります。

コンピュータプログラミングでは、通常、名前空間は、特定の機能に関するシンボルと識別子をグループ化し、同じ名前を共有する複数の識別子間の名前の衝突を回避するために使用されます。

ネットワークではドメイン ネーム システムによってWeb サイト (およびその他のリソース) が階層型の名前空間に編成されます。

名前の競合

要素名は開発者によって定義されます。そのため、異なるXMLアプリケーションのXMLドキュメントを混在させると、競合が発生することがよくあります。

この XML はHTML テーブル情報を伝えます。

<table> <tr> <td>リンゴ</td> <td>オレンジ</td> </tr> </table>    

この XML はテーブル(つまり家具) に関する情報を伝えます。

<table> <name>マホガニーコーヒーテーブル</name> <width> 80 </width> <length> 120 </length> </table>     

これらのXMLフラグメントを結合すると、名前の競合が発生します。どちらにも<table>...</table>要素が含まれていますが、要素の内容と意味が異なります。

XML パーサーはこれらの違いをどのように処理するかを知りません。

接頭辞による解決策

XML 内の名前の競合は、名前プレフィックスを使用することで簡単に回避できます。

次の XML は、要素の先頭に「h」と「f」を付けることによって、HTML テーブルと家具に関する情報を区別します。

<h:table> <h:tr> <h:td>リンゴ</h:td> <h:td>オレンジ</h:td> </h:tr> </h:table>    <f:table> <f:name>マホガニーコーヒーテーブル</f:name> <f:width> 80 </f:width> <f:length> 120 </f:length> </f:table>     

命名システム

名前空間内の名前は、名前空間名とローカル名で構成されます。[5] [6]名前空間名は通常、ローカル名の接頭辞として適用されます。

拡張バッカス・ナウア形式では

name = <名前空間>セパレーター<ローカル>      

ローカル名が単独で使用される場合、名前解決を使用して、特定のローカル名によって参照される特定の名前 (ある場合) を決定します。

名前空間内の名前の例
コンテクスト名前名前空間名ローカル名
ドメイン名www.example.comexample.com(ドメイン名)www(サブドメイン名)
ウィキペディアトーク:モナ・リザ話すモナ・リザ
パス( UNIX )/home/admin/Documents/readme.txt/home/admin/Documents (ディレクトリ)readme.txt (ファイル名)
パス(WindowsC:\Users\Admin\Documents\readme.txtC:\Users\Admin\Documents (ディレクトリ)readme.txt (ファイル名)
C++標準ライブラリの名前空間std::chrono::system_clockstd::chrono(C++名前空間)system_clock(クラス)
C++名前空間Poco::Net::HTTPClientSessionPoco::Net(C++名前空間)HTTPClientSession(クラス)
C#名前空間System.Collections.Generic.DictionarySystem.Collections.Generic(C# 名前空間)Dictionary(クラス)
Java標準ライブラリパッケージjava.util.Datejava.util(Javaパッケージ)Date(クラス)
Javaパッケージorg.apache.commons.math3.special.Gammaorg.apache.commons.math3.special(Javaパッケージ)Gamma(クラス)
国連ロコード米国ニューヨーク米国(国または地域)NYC(地域)
XMLxmlns:xhtml="http://www.w3.org/1999/xhtml"
<xhtml:body>
xhtml(以前に宣言されたXML名前空間xhtml="http://www.w3.org/1999/xhtml"body(要素)
パール$DBI::errstr$DBI(Perlモジュール)errstr(変数)
ユニフォームリソース名(URN)urn:nbn:fi-fe19991055urn:nbn(全国書誌番号)fi-fe19991055
ハンドルシステム10.1000/18210(ハンドル命名権限)1000/182 (ハンドルのローカル名)
デジタルオブジェクト識別子10.1000/18210.1000(出版社)182(出版物)
MACアドレス01-23-45-67-89-ab01-23-45 (組織固有の識別子)67-89-ab (NIC 固有)
PCI ID1234 abcd1234 (ベンダーID)abcd(デバイスID)
USB VID/PID2341 003f [7]2341 (ベンダーID)003f(製品ID)
スパーQLdbr:Sydneydbr(以前に宣言されたオントロジー、例えば指定することによって@prefix dbr: <http://dbpedia.org/resource/>Sydney

委任

当事者間の責任の委任は、ワールドワイドウェブの構造など、現実世界のアプリケーションにおいて重要です。名前空間は、グローバルな一意性を維持しながら、識別子の割り当てを複数の名前発行組織に委任することを可能にします。[8]中央登録機関は、割り当てられた名前空間名を登録します。各名前空間名は、割り当てられた名前空間における名前の割り当てを担当する組織に割り当てられます。この組織は、名前を自ら割り当てる名前発行組織である場合もあれば、名前空間の一部を他の組織に委任する 別の登録機関である場合もあります。

階層

名前空間を第三者に再委任できる命名スキームは、階層型名前空間です。

名前空間名の構文が各サブ委任で同じである場合、階層は再帰的です。再帰階層の例として、ドメインネームシステムがあります。

非再帰階層の例としては、Internet Assigned Numbers Authority (IANA) 番号を表すUniform Resource Nameがあります。

カール・ポパー著『科学的発見の論理』第 10 版の識別子であるurn:isbn:978-3-16-148410-0の階層的名前空間の内訳。
レジストリレジストラ識別子の例名前空間名名前空間
ユニフォームリソース名(URN)インターネット割り当て番号局urn:isbn:978-3-16-148410-0正式なURN名前空間
正式なURN名前空間インターネット割り当て番号局urn:isbn:978-3-16-148410-0ISBN統一資源名としての国際標準図書番号
国際商品番号(EAN)GS1978-3-16-148410-0978ブックランド
国際標準図書番号(ISBN)国際ISBN機関3-16-148410-X3ドイツ語圏の国
ドイツの出版社コードBuchmarkt規格の代理人3-16-148410-X16モール・ジーベック

名前空間とスコープ

名前空間名は、名前にコンテキスト(コンピュータサイエンスではスコープ)を与えることがあり、これらの用語は互換的に使用されることがあります。ただし、名前のコンテキストは、名前が出現する場所や名前の構文など、他の要因によっても提供される場合があります。

ローカルスコープとグローバルスコープ、名前空間の有無による命名システムの例
名前空間なし名前空間を持つ
ローカルスコープ車両登録プレートファイルシステム階層標準
グローバルスコープユニバーサルユニーク識別子ドメインネームシステム

プログラミング言語では

多くのプログラミング言語において、名前空間は識別子のコンテキストです。オペレーティングシステムにおける名前空間の例として、ディレクトリが挙げられます。ディレクトリ内の各名前は、1つのファイルまたはサブディレクトリを一意に識別します。[9]

原則として、名前空間内の名前は複数の意味を持つことはできません。つまり、同じ名前空間内で異なる意味を持つ名前が複数存在することはありません。名前空間はコンテキストとも呼ばれますこれは、同じ名前が異なる名前空間内で異なる意味を持つ場合があり、それぞれがその名前空間に適切な意味を持つためです。

名前空間のその他の特性は次のとおりです。

上述のような抽象的な言語技術的使用法に加え、一部の言語では、明示的な名前空間制御などに使用される特定のキーワードが存在します。以下はC++における名前空間の例です。

stdをインポートします // これは、名前を現在のスコープに持ち込む方法です。この場合は、グローバルスコープに持ち込んでいます。using std :: println ; 名前空間box1 { constexpr int BOX_SIDE = 4 ; }       名前空間box2 { constexpr int BOX_SIDE = 12 ; }       int main () { constexpr int BOX_SIDE = 42 ; println ( "{}" , box1 :: BOX_SIDE ); // 出力は 4 です。println ( "{}" , box2 :: BOX_SIDE ); // 出力は 12 です。println ( "{}" , BOX_SIDE ); // 出力は 42 です。 }                

コンピュータサイエンスの考察

コンピュータサイエンスにおける名前空間(名前空間とも呼ばれる)は、一意の識別子またはシンボル(つまり名前)の論理的なグループを保持するために作成された抽象的なコンテナまたは環境です。名前空間で定義された識別子は、その名前空間にのみ関連付けられます。同じ識別子を複数の名前空間で独立して定義することができます。つまり、ある名前空間で定義された識別子は、別の名前空間で定義された同じ識別子と同じ意味を持つ場合もあれば、そうでない場合もあります。名前空間をサポートする言語は、識別子(その定義ではなく)がどの名前空間に属するかを決定する規則を規定します。[10]

この概念はアナロジーで説明できます。X社とY社という2つの会社が、それぞれ従業員にID番号を割り当てているとします。X社には同じID番号を持つ従業員が2人存在してはなりません。Y社も同様です。ただし、両方の会社で同じID番号が使用されても問題ありません。例えば、ビルがX社で働き、ジェーンがY社で働いている場合、それぞれの従業員番号が123であっても問題ありません。このアナロジーでは、ID番号が識別子であり、会社が名前空間の役割を果たします。同じ識別子がそれぞれの名前空間で異なる人物を識別しても、問題は発生しません。

大規模なコンピュータプログラムやドキュメントでは、数百、数千もの識別子が存在するのが一般的です。名前空間(または類似の手法、名前空間のエミュレーションを参照)は、ローカルな識別子を隠蔽するメカニズムを提供します。名前空間は、論理的に関連する識別子を対応する名前空間にグループ化する手段を提供し、システムのモジュール化を促進します。

データストレージデバイスと多くの現代的なプログラミング言語は名前空間をサポートしています。ストレージデバイスはディレクトリ(またはフォルダ)を名前空間として使用します。これにより、異なるディレクトリに保存されている限り、同じ名前を持つ2つのファイルをデバイスに保存できます。一部のプログラミング言語(C++Pythonなど)では、名前空間を表す識別子自体が、それを囲む名前空間に関連付けられています。したがって、これらの言語では名前空間がネストされ、名前空間ツリーを形成できます。このツリーのルートには、名前のないグローバル名前空間があります。

共通言語での使用

C

C99以降、Cでは匿名構造体を名前空間として使用できるようになりました

数学.h :

#プラグマワンスconst構造体{ double PI ; double ( * sin )( double ); }数学;       

数学.c :

#include <math.h> 静的double _sin ( double arg ) { return sin ( arg ); }      const構造体{ double PI ; double ( * sin )( double ); } Math = { M_PI _sin };            

メイン.c :

#include <stdio.h> #include "Math.h"  int main ( ) { printf ( "sin(0) = %d \ n " , Math.sin ( 0 ) ); printf ( "piは%f \n " , Math.PI ) ; }      
C++

C++では、名前空間は名前空間ブロックで定義されます。[11]

名前空間abc { int bar ; }    

このブロック内では、識別子は宣言されたとおりに使用できます。このブロックの外では、名前空間指定子をプレフィックスとして付ける必要があります。例えば、 の外ではnamespace abc、にアクセスするには とbar記述する必要がありますabc::bar。C++には、この冗長な記述を不要にする別の構文があります。次の行を追加することで、

名前空間abcを使用します  

コードの一部にプレフィックスを追加する場合、プレフィックスはabc::不要になります。

名前空間内で明示的に宣言されていない識別子は、グローバル名前空間内にあると見なされます。

int foo ; 

これらの識別子は宣言されたとおりに使用することもできますが、グローバル名前空間には名前が付けられていないため、名前空間指定子を::プレフィックスとして付加することもできます。例えば、fooは と表記することもできます::foo

C++ における名前空間解決は階層的です。つまり、仮想的な名前空間 内ではfood::soup、識別子 はChickenを参照しますfood::soup::Chickenfood::soup::Chickenが存在しない場合は、 を参照しますfood::Chicken。 も も存在しfood::soup::Chickenない場合は、 はグローバル名前空間内の識別子を参照します。food::ChickenChicken::Chicken

C++における名前空間は、名前の衝突を避けるために最もよく使用されます。最近のC++コードでは名前空間が広く使用されていますが、古いコードのほとんどは、言語の初期バージョンには存在しなかったため、この機能を使用していません。例えば、C++標準ライブラリ全体は内で定義されていますnamespace stdが、標準化以前は、多くのコンポーネントがグローバル名前空間にありました。usingステートメントを使用して、シンボルを現在のスコープにインポートできます。

using後方互換性以外の理由(利便性など)でヘッダー内でステートメントを使用することは、そのusingステートメントがヘッダーを含むすべての翻訳単位に伝播するため、適切なコード プラクティスに反すると見なされます。ただし、モジュールはusing、明示的に とマークされていない限りステートメントをエクスポートしないためexport、ステートメントの使用はより安全になります。たとえば、一致する名前空間を持つusingモジュールをインポートしその名前空間のシンボルに対して ステートメントを使用して、冗長な名前空間を簡素化できます。Java や Rust などの他の言語とは異なり、C++ のモジュール、名前空間、およびソース ファイル構造は必ずしも一致しませんが、わかりやすくするために一致させるのが慣例となっています(たとえば、モジュールは名前空間クラスと一致し、ファイル に存在します)。org.wikipedia.project.utilorg::wikipedia::project::utilusingabc.def.uvw.XYZabc::def::uvw::XYZabc/def/uvw/XYZ.cppm

usingモジュール翻訳単位が使用されるときに、冗長なネストされた名前空間を簡素化するために使用する必要があります。

エクスポートモジュールorg.wikipedia.project.App ;  stdをインポートします org.wikipedia.project.fsインポートますorg.wikipedia.project.utilインポートます  org :: wikipedia :: project :: fs :: Fileを使用します。org :: wikipedia :: project :: util :: ConfigLoader使用します。org :: wikipedia :: project :: util :: logging :: Logger を使用します。org :: wikipedia :: project :: util :: logging :: LoggerFactory使用します    エクスポート名前空間org :: wikipedia :: project {   class App { private : Logger logger ; // プライベート フィールドとメソッドpublic : App () : logger { LoggerFactory :: getLogger ( "Main" )} { ConfigLoader cl ( File ( "config/config_file.txt" )); logger . log ( "Application starting..." ); // 残りのコード} };             }

C++11ではインライン名前空間が導入されました。これは、そのメンバーが外側の名前空間のメンバーであるかのように扱われるものです。これは と記述することで宣言されますinline namespace。これは暗黙の文に似ておりusing namespace、その中の修飾シンボルは任意です。

インラインプロパティは推移的です。名前空間aにインライン名前空間が含まれb、さらにそのインライン名前空間に別のインライン名前空間が含まれる場合c、 のメンバーはまたはcのメンバーであるかのようにアクセスできますab

インライン名前空間の主な使用例は、ABIの互換性とバージョン管理です。APIの異なるバージョンを別々のインライン名前空間(例:v1v2)に配置し、現在必要なバージョンをインライン化することで、ライブラリ開発者はABIの互換性を管理できます。新しいバージョンがリリースされると、inlineキーワードを新しいバージョンの名前空間に移動できるため、ユーザーは新しいバージョンに自動的にリンクしながら、明示的な修飾によって古いバージョンへのアクセスも可能にすることができます。

namespace mylib :: utils { namespace v1 { void func () { // 古い実装} }            // v2 は現在アクティブなバージョンですinline namespace v2 { void func () { // 新しい実装} } }          int main () { // mylib::utils::v2::func() を暗黙的に呼び出しますmylib :: utils :: func ();     // mylib::utils::v2::func() を明示的に呼び出しますmylib :: utils :: v2 :: func ();  // mylib::utils::v1::func() を明示的に呼び出しますmylib :: utils :: v1 :: func ();  0を返す; } 
C#

C#言語では、名前空間が頻繁に使用されます。.NET Frameworkのすべてのクラスは、より明確に使用し、混乱を避けるために、名前空間に整理されています。さらに、カスタム名前空間は、作業を整理し、名前の衝突を避けるために、プログラマーによって広く使用されています。クラスを参照する場合は、名前空間の後にクラス名を続ける完全修飾名を指定する必要があります。

System.Console.WriteLine ( " Hello World ! " ) ; int i = System.Convert.ToInt32 ( " 123 " ) ;   

またはusingステートメントを追加します。これにより、その名前空間内のすべてのクラスの完全な名前を指定する必要がなくなります。

システムを使用します Console.WriteLine ( "Hello World!" ) ; int i = Convert.ToInt32 ( " 123 " ) ;   

上記の例では、Systemは名前空間であり、Consoleおよび はConvert内で定義されたクラスですSystem

Console クラスと Convert クラスを含む UML ダイアグラム。

C++とは異なり、名前空間内のすべてのシンボルのみをインポートできます( C++、Rust、Javaとusing同様)。Javaのように個々のシンボルやクラスをインポートすることはできません。using namespaceuse *import *

名前空間Wikipedia.Project ; Systemを使用します。System.IO使用します  Microsoft.Extensions.Loggingを使用します Wikipedia.Project.Utilityを使用します クラスApp {プライベート静的ILogger <プログラム>ロガー;      public App () { ConfigLoader cl = new ConfigLoader ( Path . Combine ( "config" , "config_file.txt" )); LoggerFactory loggerFactory = LoggerFactory . Create ( builder => { builder . AddConsole (); }); logger = loggerFactory . CreateLogger < Program > (); logger . LogInformation ( "Application starting..." ); // 残りのコード} }                       

C++とは異なり、C#の名前空間ではシンボルの相対参照は許可されません。例えば、クラスは名前空間内から参照されている場合でも、Foo.Bar.Baz.Quxとして参照することはできません。クラスを参照するには、名前空間をインポートするか、完全修飾名で指定する必要があります。Baz.QuxFoo.BarFoo.Bar.BazQuxFoo.Bar.Baz.Qux

ジャワ

Javaでは、名前空間の概念はJava パッケージに具体化されています。すべてのコードはパッケージに属しますが、そのパッケージに明示的に名前を付ける必要はありません。他のパッケージのコードにアクセスするには、適切な識別子の前にパッケージ名を付加します。例えば、class String(これは完全修飾クラス名と呼ばれます)として参照できます。C++ と同様に、Java にはパッケージ名 ( ) を入力する必要がない構文が用意されています。ただし、特定の機能(リフレクションなど)では、プログラマは完全修飾名を使用する必要があります。package java.langjava.lang.Stringimport

C++とは異なり、Javaの名前空間は言語構文の観点からは階層的ではありません。ただし、パッケージ名は階層的に命名されます。例えば、 で始まるすべてのパッケージはJavaプラットフォームjavaの一部であり、このパッケージには言語のコアとなるクラスと、リフレクションに特に関連するコアクラスが含まれています。java.langjava.lang.reflect

Java(およびAdaC#など)では、名前空間/パッケージはコードの意味的なカテゴリを表します。例えばC#では、namespace Systemシステム(.NET Framework)が提供するコードが含まれます。これらのカテゴリの具体性や階層の深さは言語によって異なります。

関数スコープクラス スコープは、可視性、アクセシビリティ、オブジェクトの有効期間と密接に関連している暗黙的な名前空間として見ることができます。

Javaでは、C++のようにパッケージを部分的に修飾することはできません。例えば、名前空間をインポートしてから として参照することはできませんjavaシンボルは完全修飾するか、スコープ内に完全にインポートする必要があります。文は推移的ではなく、C++のように意図的にマークすることもできません。すべての文はファイルの先頭に記述する必要があり、他のスコープに記述することはできません。これは、 と記述することで名前空間をインポートしとして参照できるC++とは対照的ですjava.util.ArrayListutil.ArrayListimportexportimportstdusing namespace std;std::chrono::system_clockchrono::system_clock

パッケージorg.wikipedia.project ; java.nio.file.Pathsをインポートします。java.util.logging.Levelをインポートします。java.util.logging.Loggerインポートします   org.wikipdia.project.util.ConfigLoaderをインポートします パブリッククラスApp {プライベート静的最終Logger logger = Logger . getLogger ( Main . class . getName ());           public App () { ConfigLoader cl = new ConfigLoader ( Paths . get ( "config/config_file.txt" )); logger . log ( Level . INFO , "Application starting..." ); // 残りのコード} }           

Javaはクラス外での独立した関数をサポートしていないため、静的クラスメソッドといわゆる「ユーティリティクラス」(プライベートコンストラクタを持ち、すべてのメソッドとフィールドがstaticであるクラス)はC++スタイルの名前空間と同等です。例としてはjava.lang.Math、のような定数を含むMath.PIや、のようなメソッドが含まれますMath.sin()

import文はパッケージ内のすべてのシンボルをインポートするために使用できます。これはusing namespaceC++の に似ています。例えば、 はパッケージ内のすべてのクラスをインポートします。ただし、これはファイル内でシンボル汚染を引き起こす可能性があります。さらに、同じ名前のクラスを持つパッケージに glob import 文を使用すると、曖昧さが生じ、コンパイルに失敗する可能性があります。ただし、はデフォルトですべてのJavaソースファイルに暗黙的にインポートされます。import java.util.*;java.utiljava.lang.*

import java.sql.* ; // java.sql.Date を含む java.sql のすべてのクラスをインポートします。import java.util .* ; // java.util.Date を含む java.util のすべてのクラスをインポートします。    Date d = new Date (); // あいまいな日付参照のためコンパイルエラーが発生します     // 代わりに、完全修飾名を使用する必要があります: java . sql . Date sqlDate = new java . sql . Date ( System . currentTimeMillis ()); java . util . Date utilDate = new java . util . Date ();        
PHP

名前空間はPHPバージョン5.3以降で導入されました。クラス、関数、変数の名前の衝突を回避できます。PHPでは、名前空間はnamespaceブロックで定義されます。

# ファイル phpstar/foobar.php名前空間 phpstar ;クラス FooBar {  public  function  foo () :  void  {  echo  'Hello world, from function foo' ;  } public  function  bar () :  void  {  echo  'Hello world, from function bar' ;  } }

PHP 名前空間は、次のさまざまな方法で参照できます。

# ファイル index.php# ファイルをインクルードしますinclude  "phpstar/foobar.php" ;# オプション 1: クラス名の前に名前空間を直接付ける$obj_foobar  =  new  \phpstar\FooBar ();# オプション 2: 名前空間をインポートするuse  phpstar\FooBar ; $obj_foobar  =  new  FooBar ();# オプション 2a: 名前空間をインポートしてエイリアスするuse  phpstar\FooBar  as  FB ; $obj_foobar  =  new  FB ();# 通常の方法でプロパティとメソッドにアクセスします$obj_foobar -> foo (); $obj_foobar -> bar ();

FooBar クラスを含む phpstar パッケージの UML 図。

パイソン

Pythonでは、名前空間は個々のモジュールによって定義され、モジュールは階層的なパッケージに含めることができるため、名前空間も階層的になります。[12] [13]一般的に、モジュールがインポートされると、モジュールで定義された名前はそのモジュールの名前空間を介して定義され、呼び出し元のモジュールからは完全修飾名を使用してアクセスされます。

# ModuleA が 2 つの関数 func1() と func2() と 1 つのクラス Class1 を定義していると仮定します。import ModuleA ModuleA.func1 ( ) ModuleA.func2 ( ) a : ModuleA.Class1 = Modulea.Class1 ( )   

このfrom ... import ...ステートメントを使用すると、関連する名前を呼び出しモジュールの名前空間に直接挿入することができ、それらの名前には修飾名なしで呼び出しモジュールからアクセスできます。

# ModuleA が 2 つの関数 func1() と func2() と 1 つのクラス Class1 を定義していると仮定します。from ModuleA import func1   func1 () func2 ()  # これは未定義の名前として失敗します。完全な名前 ModuleA.func2() も同様です。a :  Class1  =  Class1 ()  # これは未定義の名前として失敗します。完全な名前 ModuleA.Class1() も同様です。

これは名前を直接インポートするため (修飾なし)、警告なしで既存の名前を上書きできます。

文の特殊な形式は、from ... import *指定されたパッケージで定義されているすべての名前を呼び出し元モジュールの名前空間に直接インポートするものです。この形式のインポートは言語ではサポートされていますが、呼び出し元モジュールの名前空間を汚染し、名前衝突が発生した場合に既に定義されている名前が上書きされるため、一般的には推奨されません。[14]ただし、from importPythonでは を使用すると、ネストされた名前空間などの冗長な名前空間を簡素化できます。

selenium.webdriverからFirefoxをインポートselenium.webdriver.common.action_chainsからActionChainsをインポートselenium.webdriver.common.byからByをインポートselenium.webdriver.common.keysからKeysをインポートselenium.webdriver.remote.webelementからWebElementをインポート               if  __name__  ==  " __main__ " :  driver :  Firefox  =  Firefox ( )  element :  WebElement  =  driver.find_element ( By.ID , " myInputField " ) element.send_keys ( f " Hello World { Keys.ENTER } " ) action : ActionChains = ActionChains ( driver ) action.key_down ( Keys.CONTROL ) .send_keys ( ' a ' ) . key_up ( Keys.CONTROL ) .perform ( )       

Python は、import x as y呼び出しモジュールで使用するためのエイリアスまたは別名を提供する方法として、次のものもサポートしています。

numpy をnpとしてインポートし、 numpy.typingからNDArray float32 をインポートします。       a :  NDArray [ float32 ]  =  np オレンジ( 1000 )
さび

Rustでは、名前空間は「モジュール」と呼ばれ、 を使って宣言されますmod。モジュール内のシンボルはデフォルトでプライベートであり、pubそれらを公開するキーワードで宣言されない限り、外部からアクセスすることはできません。モジュールはサブモジュールを含むことができ、ネストされた名前空間を可能にします。

usingC++ の キーワードと同様に、Rust にはuse現在のスコープにシンボルをインポートする キーワードがあります。

mod my_module { pub trait Greet { fn greet ( & self ); }          pub struct Person { pub name : String , }        PersonGreet を実装します{ fn greet ( & self ) { println! ( "Hello, {}!" , self . name ); } } }           fn main () { my_module ::{ Person Greet }を使用します。      person = Person { name : String :: from ( "Alice" ) } ; person . greet (); }        

を記述すると、コンパイラーにまたはという名前のファイルを検索するように指示します。ステートメントでは、は現在の「クレート」(プロジェクト) のルートを参照し、 は親モジュールを参照するために使用できます。mod util;util.rsutil/mod.rscrateusesuper

mod util ; std :: fs :: Fileを使用します crate :: util :: ConfigLoaderを使用します。crate :: util :: logging ::{ Logger LoggerFactory }使用します。   pub構造体App { config_loader : ConfigLoader ; }     impl App { pub fn new () -> Self { config_loader = ConfigLoader :: new ( File :: open ( "config/config_file.txt" )); config_loader . load (); let logger : Logger = LoggerFactory :: get_logger ( "Main" ); logger . log ( "Application starting..." ); // 残りのコード} }                    

Rustのキーワードは、C++のuseキーワードよりも汎用性が高くなっています。単一のシンボルのインポート、シンボルのエイリアス、グロブインポートusingに加えて、括弧(ネスト可能)を使用して同一行に複数のシンボルをインポートしたり、個別の名前空間をインポートしたり、これらすべてを1つの文で実行したりできます。以下は、これらすべてを使用した例です。asuse

use std ::{ fmt :: * , // std::fmt 内のすべてのシンボルをインポートしますfs ::{ File , Metadata }, // std::fs::File と std::fs::Metadata をインポートしますio ::{ prelude :: * , BufReader , BufWriter } // std::io::prelude::*、std::io::BufReader、std::io::BufWriter 内のすべてのシンボルをインポートしますprocess , // std::process 名前空間をインポートします (たとえば、std::process::Command は process::Command として参照できます) time // std::time 名前空間をインポートします};              
XML名前空間

XMLでは、XML名前空間仕様により、XML文書内の要素名と属性名を一意にすることができます。これは、プログラミング言語における名前空間の役割に似ています。XML名前空間を使用することで、XML文書には複数のXMLボキャブラリの要素名や属性名を含めることができます。

SAP 名前空間

SAPシステム(特にABAP環境)では、標準のSAP提供オブジェクトと顧客またはパートナーの開発オブジェクト間の名前の衝突を防ぐために名前空間が使用されます。[15]

名前空間識別子は「/」で区切られ(例:`/MYNS/`)、SAPの名前空間登録プロセスによって予約されます。予約されると、その名前空間で作成されたオブジェクトは一意に識別され、SAPのアップグレードやインポートによる意図しない上書きから保護されます。[16]

最新の SAP ランドスケープ (クラウド内の ABAP や HDI コンテナーなど) では、開発成果物またはバンドルを意味的にグループ化するために名前空間も使用されます。

名前空間のエミュレーション

名前空間をサポートしていないプログラミング言語では、識別子命名規則を使用することで、ある程度名前空間をエミュレートできます。例えば、libpngなどのCライブラリでは、公開インターフェースに含まれるすべての関数と変数に固定のプレフィックスが使用されることがよくあります。libpngは次のような識別子を公開します。

png_create_write_structpng_get_signaturepng_read_rowpng_set_invalid

この命名規則により、識別子が一意であることが十分に保証され、大規模なプログラムでも名前の衝突なく使用することができます[17]同様に、もともとFortranで書かれた多くのパッケージBLASLAPACKなど)では、関数名の最初の数文字が、関数が属するグループを示すために予約されています。

この手法にはいくつかの欠点があります。

  • ネストされた名前空間には適応しません。識別子の使用はすべて完全な名前空間修飾を必要とするため、識別子が過度に長くなります。
  • 個人または組織が一貫性のない命名規則を使用することがあり、望ましくない難読化が生じる可能性があります。
  • 識別子のグループに対する複合操作または「クエリベース」の操作は、それらが宣言されている名前空間に基づいて、扱いにくくなったり実行不可能になったりします。
  • 識別子の長さが制限されている言語では、プレフィックスを使用すると、関数の動作を識別するために使用できる文字数が制限されます。これは、識別子ごとに 6 文字しか提供されなかったFORTRAN 77で最初に記述されたパッケージで特に問題になります。たとえば、BLAS関数の名前はDGEMM、倍精度浮動小数点数 ( D) と一般行列 ( GE) を操作することを示しており、最後の 2 文字 ( ) のみがMM実際の動作、つまり行列間の乗算を示しています。

また、次のような利点もいくつかあります。

  • ソースコード ファイル内の名前を見つけるのに特別なソフトウェア ツールは必要ありません。grep のような単純なプログラムで十分です。
  • 名前空間に関連した名前の競合はありません。
  • 名前を変更する必要がないため、潜在的な非互換性の問題は発生しません。

参照

参考文献

  1. ^ Aniket, Siddharth; Aditya, Anushka; Deepa, Chaya; Cermak, Batman; Chaiken, Ronnie; Douceur, John; Howell, Jon; Lorch, Jacob; Theimer, Marvin; Wattenhofer, Roger (2002). FARSITE: 不完全な信頼環境のための統合型、可用性、信頼性に優れたストレージ(PDF) . Proc. USENIX Symp. on Operating Systems Design and Implementation. オリジナル(PDF)から2010-07-28 にアーカイブ。ファイルシステムによって確立される主要な構成要素は、階層的なディレクトリ名前空間であり、これはファイルの論理リポジトリです。
  2. ^ 「C# FAQ: 名前空間とは」C# Online Net. 2013年10月20日時点のオリジナルからのアーカイブ。 2010年2月23日閲覧名前空間とは、アセンブリ、クラス、または型の集合体です。名前空間は、通常機能に基づいてグループ分けされたクラスを格納するための、ディスク上のフォルダのようなコンテナとして機能します。C#の名前空間構文では、名前空間を入れ子にすることができます。
  3. ^ 「PHPにおける名前空間の概要」PHPマニュアル名前空間とは何でしょうか?最も広い定義では、名前空間とはアイテムをカプセル化する方法です。これは多くの場面で抽象的な概念として捉えられます。例えば、どのオペレーティングシステムでも、ディレクトリは関連するファイルをグループ化する役割を果たし、ディレクトリ内のファイルの名前空間として機能します。
  4. ^ 「パッケージの作成と使用」。Javaドキュメント。Oracle。パッケージとは、アクセス保護と名前空間管理を提供する関連する型のグループです。型とはクラスインターフェース、列挙型、および注釈型を指すことに注意してください。列挙型と注釈型はそれぞれクラスとインターフェースの特殊な種類であるため、このレッスンでは型を単にクラスとインターフェースと呼ぶことがよくあります。[より良い情報源が必要]
  5. ^ XML Coreワーキンググループ (2009年12月8日). 「XML 1.0(第3版)における名前空間」. W3C . 2012年3月30日閲覧
  6. ^ Moats, Ryan (1997年5月). 「構文」. URN構文. IETF . p. 1. sec. 2. doi : 10.17487/RFC2141 . RFC 2141. 2012年3月30日閲覧
  7. ^ Stephen J. Gowdy. 「USB ID一覧」 2013年。
  8. ^ Sollins & Masinter (1994年12月). 「機能要件」. Uniform Resource Names の機能要件. IETF . p. 3. sec. 2. doi : 10.17487/RFC1731 . RFC 1731. 2012年3月30日閲覧
  9. ^ 「C# FAQ: 名前空間とは」C# Online Net . 2013年10月20日時点のオリジナルよりアーカイブ。 2010年2月23日閲覧例えば、[ Windowsの場合] 組み込みの入出力 (I/O) クラスとメンバーにアクセスするには、System.IO 名前空間を使用します。また、Web 関連のクラスとメンバーにアクセスするには、System.Web 名前空間を使用します。
  10. ^ 「名前空間とは、プログラム内で使用される名前の論理的なグループです。」Webopedia.com、2002年4月10日。 2011年7月26日閲覧
  11. ^ 「名前空間を使用すると、クラス、オブジェクト、関数などのエンティティを名前でグループ化できます」Cplusplus.com . 2011年7月26日閲覧
  12. ^ 「6. モジュール」。Pythonチュートリアル。Pythonソフトウェア財団。 2010年10月25日閲覧
  13. ^ 「Pythonのスコープと名前空間」Docs.python.org . 2011年7月26日閲覧
  14. ^ https://docs.python.org/3/tutorial/modules.html 「一般的に、モジュールまたはパッケージから * をインポートする習慣は好ましくありません」
  15. ^ 「SAP名前空間の概要」SAPVista . 2025年10月7日閲覧。SAPシステムでは、SAP標準オブジェクトと顧客固有の開発オブジェクト間の名前の競合を防ぐために名前空間を使用しています。
  16. ^ 「SAPヘルプポータル – ABAP接続および名前空間ドキュメント」。SAPヘルプポータル。 2025年10月7日閲覧。SAPアプリケーション・インターフェース・フレームワークでは、名前空間はオブジェクトと設定の論理構造化に使用されます。
  17. ^ Danny Kalev. 「なぜ名前空間が嫌いなのか」。2016年7月9日時点のオリジナルよりアーカイブ。{{cite web}}: CS1 maint: bot: 元のURLステータス不明(リンク
「https://en.wikipedia.org/w/index.php?title=名前空間&oldid=1322744923」より取得