Руководство разработчика

Видимость имен

Под видимостью имен подразумевается доступность той или иной сущности языка по ее идентификатору (имени) в данной части исходного текста.

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

В пространство имен типов попадают:

В глобальное пространство имен попадают следующие объявления:

В локальное пространство имен попадают следующие объявления:

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

Синтаксис:

<экземпляр>.<имя поля или метода>

Пример:

ПЕРЕМ ССЫЛКА: с
с.код = "Контрагенты/СПР/1" // обращение к полю "код"
с.СЧИТАТЬ                   // вызов метода "СЧИТАТЬ"

Имена из локального пространства имен могут совпадать с именами в глобальном пространстве имен. При этом совпадающие имена из глобального пространства становятся недоступными в пределах действия данного локального пространства имен. Для явного использования имени из глобального пространства перед ним указывается точка.

Синтаксис:

.<глобальное имя>

Пример

Явное обращение к глобальной функции:

// некий тип А, имеющий метод Ф
ТИП А
[
  ФУНКЦИЯ Ф(СТРОКА: текст)
    .Ф(текст) // вызов глобальной функции Ф, а не рекурсивно метода Ф
  КОНЕЦ_ФУНКЦИИ
]

// глобальная функция Ф
ФУНКЦИЯ Ф(СТРОКА: текст)
  СООБЩЕНИЕ(текст)
КОНЕЦ_ФУНКЦИИ

Существует риск изменить в функции значение глобальной переменной, полагая, что объявлена новая локальная переменная. Неявное объявление переменных разрешено только для переменных-счетчиков циклов ДЛЯ и ИНДЕКС (а также при использовании соотвествующей опции совместимости). Неявное объявление переменных затрудняет понимание исходного кода и затрудняет его сопровождение.

Пример

Непредвиденное изменение глобальной переменной:

// Глобальная переменная "и".
// Может быть объявлена где-то далеко, в другой библиотеке.
ПЕРЕМ и = 0; 

ФУНКЦИЯ Пример
  // Функция изменяет значение глобальной переменной "и".
  // Скорее всего, разработчик функции не ожидал такого эффекта
  // и полагал "и" локальной переменной
  ЦИКЛ ДЛЯ (и = 1, 100) 
    //...
  КОНЕЦ_ЦИКЛА
КОНЕЦ_ФУНКЦИИ

Для минимизации риска непредвиденного изменения глобальных переменных необходимо следовать соглашению об именовании, принятому в коллективе разработчиков. Также следует избегать объявления чрезмерного количества глобальных переменных.


См. также: