Именно пространство – Уикипедия

Именното пространство (на английски: Namespace) представлява контейнер, съдържащ набор от идентификатори (имена), и осигурява пояснение на омонимните идентификатори, които се намират в различни именни пространства. Именните пространства обикновено обединяват имената, базирайки се на функционалността им.

Система на именуване[редактиране | редактиране на кода]

Името в едно именно пространство се състои от именен идентификатор и локално име. Обикновено именното пространство се добавя към локалното име като представка.

Във следната ABNF (Backus-Naur Form) форма:

name = <namespace identifier> separator <local name> 

Примери[редактиране | редактиране на кода]

Примери за имена в именно пространство
Контекст Идентификатор Именен идентификатор Локално име
Path /home/user/readme.txt /home/user (path) readme.txt (file name)
Domain name www.example.com example.com (domain) www (host name)
C++ std::array std array
UN/LOCODE US NYC US (country) NYC (locality)
XML xmlns:xhtml="http://www.w3.org/1999/xhtml"
<xhtml:body>
http://www.w3.org/1999/xhtml body
Uniform resource name (URN) urn:nbn:fi-fe19991055 urn:nbn (National Bibliography Numbers) fi-fe19991055
Handle System 10.1000/182 10 (Handle naming authority) 1000/182 (Handle local name)
Digital object identifier 10.1000/182 10.1000 (publisher) 182 (publication)
MAC address 01-23-45-67-89-ab 01-23-45 (organizationally unique identifier) 67-89-ab (NIC specific)
PCI ID 1234 abcd 1234 (Vendor ID) abcd (Device ID)
USB VID/PID 2341 003f 2341 (vendor ID) 003f (product ID)

Именни пространства в езика C#[редактиране | редактиране на кода]

Именните пространства са широко използвани в езика C#. Всички класове в средата за програмиране .NET (.NET Framework) са организирани в именни пространства, за да се използват по предназначение, без да настъпи объркване. Освен това, програмистите много често създават собствени именни пространства като по този начин организират по-добре работата си и избягват дублиране на имена. Когато използваме даден клас, той трябва да съдържа и именното пространство, в което се намира,

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

или се добавя using последвано от именното пространство, което се използва, по този начин се избягва пълното изписване на името на класа.

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

В горните примери, System представлява именно пространство, а Console и Convert са класове, намиращи се в него.

В следващия пример се вижда елементарно приложение на именно пространство, в което се намират три класа:

using System; using WikiArticle;  namespace WikiArticle {     class First     {         public void WriteSomething()         {             Console.WriteLine("Wikipedia");         }     }     class Second     {         public void Language()         {             Console.WriteLine("CSharp");         }     }  }  namespace Performance {      class Program     {         static void Main(string[] args)         {             First something = new First();             something.WriteSomething();              Second codingLanguage = new Second();             codingLanguage.Language();         }     } } 

Именни пространства в езика C++[редактиране | редактиране на кода]

В C++ именно пространство се дефинира с именен блок.

namespace abc {  int bar; } 

В този блок, идентификаторите се използват точно както са декларирани. Извън него, пространствения спецификатор трябва да бъде използван с представка. Например, извън именното пространство abc, bar трябва да се изпише abc::bar, за да се осигури достъп до него. Езикът C++ поддържа друга конструкция, която улеснява програмиста. Чрез добавянето на реда

using namespace bcd; 

към кода, представката bcd:: не е нужна.

Код, който не е изрично деклариран в именно пространство, по подразбиране се намира в глобалното именно пространство.

Класифицирането по именни пространства в C++ е йерархично. Например, ако разгледаме именното пространство храна::супа, идентификаторът пиле се отнася до храна::супа::пиле. Ако храна::супа::пиле не съществува, тогава се отнася до храна::пиле. Ако нито храна::супа::пиле, нито храна::пиле съществуват, тогава пиле се отнася до ::пиле, идентификатор в глобалното именно пространство.

Именните пространства в C++ най-често се използват, за да се избегнат т.нар „сблъсъци“ при именуване. въпреки че именните пространства са широко използвани в този език, по-старите програми, които са писани на него, не ползват тази негова функционалност. Например, цялата стандартна библиотека на C++(standard library) е дефинирана в namespace std, но преди стандартизацията много от компонентите ѝ се намират в глобалното именно пространство.

Следният пример демонстрира употребата на именни пространства в C++:

#include <iostream> using namespace std;  // first namespace namespace first_space {    void functionOne()    {       cout << "Inside first_space" << endl;    } } // second namespace namespace second_space {   class Example   {     public:     static void functionTwo()     {       cout << "Inside second_space" << endl;     }   }; } int main () {     // Calls function from first namespace.    first_space::functionOne();     // Calls function from second namespace.    second_space::Example::functionTwo();     return 0; } 

Пакет (package) в езика Java[редактиране | редактиране на кода]

В Java, идеята за именно пространство е пренесена в пакети(packages). Целият код представлява част от пакет, въпреки че изричното му посочване не е задължително. Достъпът до код от други пакети се осъществява чрез използването на името на пакета като представка пред съответния идентификатор, например класът String в пакета java.lang може да бъде извикан като: java.lang.String(тази конструкция представлява цялото име на даден клас). Подобно на C++, Java предлага конструкция, която прави ненужно изписването името на пакета.

Въпреки това, определени функции (като отражението) изискват от програмиста да използва пълната конструкция при извикването им. За разлика от C++, в Java именните пространства не са подредени йерархично по отношение на синтаксиса на езика. Въпреки това, именуването на пакетите е йерархично. Например, всички пакети започващи с java са част от платформата на езика – пакетът java.lang съдържа основните класове в Java и пакетът java.lang.reflect съдържа основните класове се отнасят конкретно за отражението.

В Java(както и Ada, C# и др.), именните пространства/пакетите изразяват семантични категории код. Например, в C# именното пространство System съдържа код, осигурен от .NET Framework.

Колко специфични са тези категории и от колко задълбочена йерархия са част, е различно при различните езици.

Обхватът на функция или клас може да се разглежда като скрито именно пространство, в което имената са неразривно свързани откъм видимост, достъпност и живот на обекта.

В този пример виждаме как се дефинира и използва пакет в Java:

Дефинирането се осъществява по следния начин:

package animals;  interface Animal {    public void eat();    public void travel(); } 

А това е изпълнението (имплементацията):

package animals;  /* File name : MammalInt.java */ public class MammalInt implements Animal {     public void eat()    {       System.out.println("Mammal eats");    }     public void travel()    {       System.out.println("Mammal travels");    }     public int noOfLegs()    {       return 0;    }     public static void main(String args[])    {       MammalInt m = new MammalInt();       m.eat();       m.travel();    } } 

Източници[редактиране | редактиране на кода]