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