Направо към съдържанието

Именно пространство

от Уикипедия, свободната енциклопедия

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