Пространства имен

Пространства имен чем-то напоминают блоки Scope. Их основной принцип тоже ограничивать доступ, но все таки это несколько другой инструмент. Представьте себе, вы подключаете две, три библиотеки функций от других разработчиков и у этих библиотек функций одинаковые имена. Что делать? Выходы конечно есть, но извращенные. А если бы эти разработчики позаботились о таком варианте, используя свои пространства имен, тогда все было бы просто. Работая в команде, пространства имен будут просто незаменимы. Это своего рода карточка доступа к вашим данным, или пароль. Всегда быстрее поменять пароль, чем все данные.

 И так  синтаксис такого блока:

 Namespace Name
       .......
      Здесь вашие процедуры, переменные, массивы, структуры и прочее.
       .......
 End NameSpace

Начинается блок с ключевого слова NameSpace , далее идет любое имя, через которое и будет доступ к телу блока. Внутри блока размещаются любые нужные вам блоки , объявления. И заканчивается блок словосочетанием End NameSpace.
В этих блоках можно размещать практически все, однако нельзя делать обычные операции командами, например размещать условные блоки, циклы, складывать переменные и прочее...

  Пример блока NameSpace:

Namespace MyName
    Sub Print()
        ? "this procedure"
    End Sub
    Dim a As Integer
End Namespace

Namespace AnotherName
    Dim a As String*20="AnotherName"
    Function Print() As String
        ? "this function"
        Return a
    End Function    
End Namespace

MyName.Print
? AnotherName.Print
Sleep


В примере выше у нас 2 пространства имен: MyName и AnotherName. Обратите внимание, в обоих блоках две переменные с одним именем, но разными типами. А так же появилась возможность назвать процедуру и функцию именем как у встроенных функций FreeBasic. Речь конечно же идет о функции Print. Теперь функция Print у нас может не просто выводить какие то значения на экран, а делать то, что нам нужно, например подсчитывать годовой доход сотрудников. Это я сделал ее такой же как у FreeBasic, но никто не мешает вам изменить внутренности любой из функций Print.
Обратите внимание на то, как мы ее вызываем. Делается это только через имя блока, в котором она находится. Тоже и с переменными. Если мы хотим получить к ним доступ, то сначала нужно написать имя блока, а потом через точку имя самой переменной или функции. С другой стороны, в самом блоке можно обращаться к данным напрямую без точки. И это вы надеюсь заметили во втором блоке в строке Return a           
Наверно вы уже поняли, что функции в блоках NameSpace с именем Print и  встроенная функция Print языка FreeBasic совершенно разные функции, иначе бы компилятор FreeBasic не позволил нам скомпилировать программу, выдав ошибку.

Когда в коде, пространства имен имеют разные имена функций(не пересекаются), или же просто в коде одно пространство имен, то зачастую программисты применяют команду Using. Эта команда объявленная с именем блока таким образом: Using AnotherName позволяет обращаться к внутренностям блока без имени. То есть делает внутренности блока глобальными:

Namespace MyName
    Sub MyOne()
        ? "this one procedure"
    End Sub
    Sub MyTwo()
        ? "this two procedure"
    End Sub
End Namespace

Using MyName

MyOne()
MyTwo()
Sleep


После того как мы раскрыли пространства имен с помощью Using обращение к функциям стало напрямую без имени блока, как будто NameSpace и не существует.
Если в блоке NameSpace будет имя, которое уже есть в вашем основном коде и вы раскрыли блок как глобальный с помощью Using, то использоваться будет функция  из основного кода (вспоминаем области видимости). Если же все таки необходимо использовать функцию из блока NameSpace в такой ситуации, то нужно писать имя блока. Пример:

Namespace MyName
    Sub Print()
        ? "this procedure"
    End Sub
    Dim a As Integer
End Namespace

Using MyName

Print "Global Code"
MyName.Print
Sleep


Вот и все, что пожалуй стоит знать про пространства имен. Вам советую потренироваться, создавая блоки NameSpace, имеющие массивы и свои типы данных. Всего доброго!

содержание | назад | вперед