名前空間

ウィキペディアから、無料の百科事典
ナビゲーションにジャンプ 検索にジャンプ

コンピューティングでは、名前空間は、さまざまな種類のオブジェクトを識別および参照するために使用される一連の記号(名前)です。名前空間は、オブジェクトの特定のセットすべてに一意の名前を付けて、簡単に識別できるようにします。

名前空間は通常、階層として構造化されており、さまざまなコンテキストで名前を再利用できます。例えとして、各人が名を持っている人の名前付けのシステムと、親戚と共有されている家族の名前を考えてみましょう。家族の名が各家族内でのみ一意である場合、各人は名と家族名の組み合わせによって一意に識別できます。Jane Doeは1つだけですが、Janeはたくさんあるかもしれません。Doeファミ​​リーの名前空間内では、「ジェーン」だけでこの人物を明確に指定できますが、すべての人々の「グローバル」名前空間内では、フルネームを使用する必要があります。

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

同様に、階層ファイルシステムはファイルをディレクトリに編成します。各ディレクトリは個別の名前空間であるため、ディレクトリ「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 = <名前空間名>セパレータ<ローカル名>

ローカル名を単独で使用する場合、名前解決を使用して、特定のローカル名によってどの特定の名前が暗示されるかを決定します。

名前空間内の名前の例
環境 名前 名前空間名 ローカル名
/home/user/readme.txt / home / user(ディレクトリ) readme.txt(ファイル名)
ドメイン名 www.example.com example.com(ドメイン名) www(リーフドメイン名)
C ++ std :: array std(C ++名前空間) 配列(構造体)
UN / LOCODE US NYC 米国(国または地域) NYC(地域)
XML xmlns:xhtml = " http://www.w3.org/1999/xhtml "
<xhtml:body>
xhtml(以前に宣言されたXML名前空間xhtml = " http://www.w3.org/1999/xhtml ") 本体(要素)
Perl $ DBI :: errstr $ DBI(Perlモジュール) errstr(変数)
Java java.util.Date java.util(Java名前空間) 日付(クラス)
ユニフォームリソース名(URN) urn:nbn:fi-fe19991055 urn:nbn(全国書誌番号) fi-fe19991055
ハンドルシステム 10.1000 / 182 10(命名権限を処理する) 1000/182(ローカル名を処理)
デジタルオブジェクト識別子 10.1000 / 182 10.1000(発行元) 182(出版物)
Macアドレス 01-23-45-67-89-ab 01-23-45(組織的に一意の識別子 67-89-ab(NIC固有)
PCIID 1234 abcd 1234(ベンダーID) abcd(デバイスID)
USB VID / PID 2341 003f [7] 2341(ベンダーID) 003f(製品ID)
SPARQL dbr:シドニー dbr(以前に宣言されたオントロジー、たとえば@prefix dbrを指定することによって:< http://dbpedia.org/resource/ >) シドニー

委任

当事者間の責任の委任は、ワールドワイドウェブの構造などの実際のアプリケーションでは重要です。名前空間を使用すると、グローバルな一意性を維持しながら、複数の名前発行組織への識別子の割り当てを委任できます。[8]中央登録局は、割り当てられた名前空間名を登録します。各名前空間名は組織に割り当てられ、組織は割り当てられた名前空間での名前の割り当てを後で担当します。この組織は、名前自体を割り当てる名前発行組織、または名前空間の一部を別の組織にさらに委任する 別の登録局の場合があります。

階層

サードパーティへの名前空間のサブ委任を可能にする命名スキームは、階層的な名前空間です。

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

非再帰階層の例は、 Internet Assigned Numbers Authority(IANA)番号 を表すUniform ResourceNameです。

urn:isbn:978-3-16-148410-0の階層的な名前空間の内訳、 KarlPopperによる本TheLogic of Scientific Discovery、第10版の識別子。
レジストリ レジストラ 識別子の例 名前空間名 名前空間
ユニフォームリソース名(URN) Internet Assigned Numbers Authority urn:isbn:978-3-16-148410-0 正式なURN名前空間
正式なURN名前空間 Internet Assigned Numbers Authority urn:isbn:978-3-16-148410-0 ISBN 統一リソース名としての国際標準図書番号
国際商品番号(EAN) GS1 978-3-16-148410-0 978 ブックランド
国際標準図書番号(ISBN) 国際ISBNエージェンシー 3-16-148410-X 3 ドイツ語圏の国
ドイツの発行者コード AgenturfürBuchmarktstandards 3-16-148410-X 16 モールジーベック

名前空間とスコープ

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

ローカルスコープとグローバルスコープ、および名前空間がある場合とない場合のネーミングシステムの例
名前空間なし 名前空間を使用
ローカルスコープ 車両登録プレート ファイルシステム階層標準
グローバルスコープ ユニバーサル一意識別子 ドメインネームシステム

プログラミング言語で

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

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

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

上記のような抽象的な言語の技術的な使用法に加えて、一部の言語には、他の用途の中でも、明示的な名前空間制御に使用される特定のキーワードがあります。以下は、C ++の名前空間の例です。

#include <iostream> 

//これは、現在のスコープに名前を取り込む方法です。この場合、
//それらをグローバルスコープに持ち込みます。
std :: coutを使用します; 
std :: endlを使用します; 

名前空間box1 {  
    int box_side = 4 ;   
}

名前空間box2 {  
    int box_side = 12 ;   
}

int main (){  
    int box_side = 42 ;   
    cout << box1 :: box_side << endl ; //出力4.cout << box2 :: box_side << endl ; //出力12.cout << box_side << endl ; //出力42。}      
          
          

コンピュータサイエンスに関する考慮事項

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

この概念は、類推で説明することができます。XとYの2つの会社が、それぞれ従業員にID番号を割り当てていると想像してください。Xには同じID番号を持つ2人の従業員がいてはならず、Yについても同様です。ただし、両社で同じID番号を使用しても問題ありません。たとえば、ビルがX社で働いていて、ジェーンがY社で働いている場合、それぞれが従業員#123であることに問題はありません。この例えでは、ID番号が識別子であり、会社が名前空間として機能します。同じ識別子が各名前空間で異なる人物を識別するのに問題は発生しません。

大規模なコンピュータプログラムやドキュメントでは、数百または数千の識別子を持つのが一般的です。名前空間(または同様の手法。名前空間のエミュレートを参照)は、ローカル識別子を非表示にするメカニズムを提供します。これらは、論理的に関連する識別子を対応する名前空間にグループ化する手段を提供し、それによってシステムをよりモジュール化したものにします。

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

一般的な言語で使用する

C

C99以降、 Cでは匿名構造体を名前空間として使用できます

// helper.c 
static int _add int a int b {      
    a + bを返します;   
}

const struct {  
    ダブルパイ; _ 
    int * add int int );   
}ヘルパー= { 3.14 _add };      

// helper.h 
const struct {  
    ダブルパイ; _ 
    int * add int int );   
}ヘルパー; 

// main.c 
#include <stdio.h> 
#include "helper.h" 

int main (){ 
    printf ( " 3 + 2 =%d \ n " helper .add 3、2 ));  
    printf ( " pi is%f \ n " helper .pi ); 
}
C ++

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

名前空間abc {  
    intバー; 
}

このブロック内では、識別子は宣言されたとおりに使用できます。このブロックの外側では、名前空間指定子の前にプレフィックスを付ける必要があります。たとえば、の外にアクセスするにはnamespace abcbarを書き込む必要がabc::barあります。C ++には、この冗長性を不要にする別の構造が含まれています。行を追加することによって

名前空間abcを使用する;  

コードの一部に対して、プレフィックスabc::は不要になりました。

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

int foo ; 

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

C ++での名前空間の解決は階層的です。これは、架空の名前空間内food::soupで、識別子がchickenを参照することを意味しfood::soup::chickenます。food::soup::chicken存在しない場合は、を参照しfood::chickenます。どちらfood::soup::chickenfood::chicken存在しない場合は、グローバル名前空間の識別子を chicken参照します。::chicken

C ++の名前空間は、名前の衝突を避けるために最もよく使用されます。名前空間は最近のC ++コードで広く使用されていますが、言語の初期バージョンには存在しなかったため、ほとんどの古いコードはこの機能を使用していません。たとえば、C ++標準ライブラリ全体が内で定義されていますnamespace stdが、標準化前は、多くのコンポーネントが元々グローバル名前空間にありました。プログラマーは、using名前空間の解決要件をバイパスし、すべての識別子がグローバル名前空間にあることを期待する古いコードとの下位互換性を取得するためのディレクティブを挿入できます。ただし、using下位互換性以外の理由(たとえば、利便性)でディレクティブを使用することは、適切なコード慣行に反すると見なされます。

Java

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

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

Java(およびAdaC#など)では、名前空間/パッケージはコードのセマンティックカテゴリを表します。たとえば、C#では、システム( .NET Frameworknamespace System )によって提供されるコードが含まれていますこれらのカテゴリがどれほど具体的で、階層がどの程度深くなるかは、言語ごとに異なります。

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

C#

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

システムコンソールWriteLine "Hello World!" ); 
int  i  = システム変換します。ToInt32 "123" );

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

 システムを使用する;

コンソールWriteLine "Hello World!" ); 
int  i  =  Convert ToInt32 "123" );

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

Python

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

#moduleaが2つの関数を定義すると仮定します:func1()とfunc2()と1つのクラス:Class1 
import  Modulea

Modulea func1 ()
Modulea func2 ()
a  =  Modulea クラス1 ()

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

#Moduleaが2つの関数(func1()とfunc2())と1つのクラス:
ModuleaからのClass1を定義すると仮定します import func1  

func1 ()
func2 () #これは未定義の名前として失敗します。フルネームも同様です。Modulea.func2()
a  =  Class1 () #これは未定義の名前として失敗します。フルネームはModulea.Class1()です。

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

ステートメントの特殊な形式は、from ... import *名前付きパッケージで定義されているすべての名前を呼び出し元のモジュールの名前空間に直接インポートするものです。この形式のインポートの使用は、言語内でサポートされていますが、呼び出し元のモジュールの名前空間を汚染し、名前が衝突した場合に定義済みの名前が上書きされるため、通常はお勧めしません。[14]

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

 numpy  npとしてインポートします

a  =  np アレンジ1000 
XML名前空間

XMLでは、XML名前空間仕様により、プログラミング言語での名前空間の役割と同様に、XMLドキュメント内の要素と属性の名前を一意にすることができます。XML名前空間を使用すると、XMLドキュメントに複数のXMLボキャブラリの要素名または属性名を含めることができます。

PHP

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

#ファイルphpstar / foobar.php

名前空間 phpstar ;

class  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:名前空間のインポートとエイリアス化は
phpstar \ FooBarFBとして使用します ; $ obj_foobar = new FB ();  
   

#通常の方法でプロパティとメソッドにアクセスします
$ obj_foobar- > foo (); 
$ obj_foobar- > bar ();

名前空間のエミュレート

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

png_create_write_struct
png_get_signature
png_read_row
png_set_invalid

この命名規則は、識別子が一意であり、したがって、命名の衝突なしに大規模なプログラムで使用できるという合理的な保証を提供します[15]同様に、元々Fortranで書かれた多くのパッケージ(BLASLAPACKなど)は、関数の名前の最初の数文字を予約して、それが属するグループを示します。

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

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

いくつかの利点があります。

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

も参照してください

参考文献

  1. ^ Adya、Atul; ボロスキー、ウィリアム; カストロ、ミゲル; セルマック、ジェラルド; チャイケン、ロニー; Douceur、ジョン; ハウエル、ジョン; ローチ、ジェイコブ; Theimer、マーヴィン; ワッテンホーファー、ロジャー(2002)。FARSITE:完全に信頼されていない環境向けのフェデレーション、可用性、および信頼性の高いストレージ(PDF)Proc。USENIXの症状。オペレーティングシステムの設計と実装について。2010年7月28日にオリジナル(PDF)からアーカイブされました。ファイルシステムによって確立される主要な構成要素は、ファイルの論理リポジトリである階層ディレクトリ名前空間です。
  2. ^ 「C#FAQ:名前空間とは」http://en.csharp-online.net/:C#オンラインネット。2013-10-20にオリジナルからアーカイブされました2010年2月23日取得名前空間は、アセンブリ、クラス、またはタイプのグループに他なりません。名前空間は、通常は機能に基づいてグループに編成されたクラスのコンテナ(ディスクフォルダのような)として機能します。C#名前空間構文を使用すると、名前空間をネストできます。 {{cite web}}:(ヘルプ外部リンク|location=
  3. ^ 「PHPの名前空間の概要」PHPマニュアル名前空間とは何ですか?最も広い定義では、名前空間はアイテムをカプセル化する方法です。これは、多くの場所で抽象的な概念と見なすことができます。たとえば、どのオペレーティングシステムでも、ディレクトリは関連ファイルをグループ化し、その中のファイルの名前空間として機能します。
  4. ^ 「パッケージの作成と使用」Javaドキュメントオラクル。パッケージは、アクセス保護と名前空間管理を提供する関連タイプのグループです。タイプは、クラス、インターフェイス、列挙、およびアノテーションタイプを指すことに注意してください。列挙型と注釈型は、それぞれ特殊な種類のクラスとインターフェイスであるため、このレッスンでは、型を単にクラスとインターフェイスと呼ぶことがよくあります。[より良い情報源が必要]
  5. ^ XMLコアワーキンググループ(2009年12月8日)。「XML1.0(第3版)の名前空間」W3C 2012年3月30日取得
  6. ^ 堀、ライアン(1997年5月)。「構文」URN構文IETFp。1秒。2. doi10.17487 / RFC2141RFC2141 _ 2012年3月30日取得
  7. ^ スティーブンJ.ガウディ。 「USBIDのリスト」2013年。
  8. ^ Sollins&Masinter(1994年12月)。「機能機能の要件」ユニフォームリソース名の機能要件IETFp。3.秒 2. doi10.17487 / RFC1731RFC1731 _ 2012年3月30日取得
  9. ^ 「C#FAQ:名前空間とは」http://en.csharp-online.net/:C#オンラインネット。2013年10月20日にオリジナルからアーカイブされました2010年2月23日取得たとえば、[ Windowsの場合]、組み込みの入出力(I / O)クラスおよびメンバーにアクセスするには、System.IO名前空間を使用します。または、Web関連のクラスとメンバーにアクセスするには、System.Web名前空間を使用します。 {{cite web}}:(ヘルプ外部リンク|location=
  10. ^ 「名前空間は、「プログラム内で使用される名前の論理グループ」です。"。Webopedia.com 。2011年7月26日取得。
  11. ^ "名前空間を使用すると、クラス、オブジェクト、関数などのエンティティを名前でグループ化できます"Cplusplus.com 2011年7月26日取得
  12. ^ 「6。モジュール」PythonチュートリアルPython SoftwareFoundation 2010年10月25日取得
  13. ^ 「Pythonスコープと名前空間」Docs.python.org 2011年7月26日取得
  14. ^ https://docs.python.org/3/tutorial/modules.html「一般的に、モジュールまたはパッケージから*をインポートする方法は眉をひそめます」
  15. ^ ダニー・カレブ。「名前空間が嫌いな理由」2016年7月9日にオリジナルからアーカイブされました。{{cite web}}:CS1 maint:bot:元のURLステータスが不明(リンク