Именно пространство – Уикипедия
Именното пространство (на английски: 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(); } }