Руководство по actionscript. часть 2, стр. 133

К пространствам имен

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

1ЛШ17

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

В самых общих чертах, пространство имен — это набор имен, не содержащий дубликатов. Иными словами, внутри этого набора каждое имя является уникальным. Например, в английском языке названия фруктов могут считаться пространством имен, поскольку каждый фрукт имеет уникальное имя: apple (яблоко), реаг (груша), orange (апельсин) и т. д. Подобным образом пространством имен могут считаться названия цветов, поскольку каждый цвет обладает своим уникальным именем: blue (синий), green (зеленый), orange (оранжевый) и т. д.

Обратите внимание, что имя orange встречается в обеих группах имен. Имя orange само по себе не является уникальным — оно уникально только внутри каждой группы. В зависимости от того, идет разговор о фрукте или цвете, одно и то же имя orange может обозначать два различных предмета. В этом и заключается смысл пространств имен. Они позволяют одному и тому же имени (идентификатору) иметь различные значения в зависимости от контекста, в котором оно используется.

Что касается программирования, данная особенность пространств имен — «то же имя — другое значение» — обладает двумя общими преимуществами:

? позволяет программистам избежать конфликтов имен;

? дает возможность программе адаптировать свое поведение в соответствии с текущим контекстом.

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

Словарь пространств имен

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

Локальное имя — локальная часть уточненного идентификатора, то есть имя, которое уточняется пространством имен. Например, orange в fruit: : orange.

Руководство по actionscript. часть 2, стр. 134

Название пространства имен — уникальное идентифицирующее название пространства имен, представленное в виде унифицированного идентификатора ресурса (URI — Uniform Resource Identifier). В языке ActionScript название пространства имен доступно через переменную экземпляра uri класса Namespace. В XML название пространства имен доступно через атрибут xmlns.

Префикс пространства имен — псевдоним названия пространства имен. Префиксы пространств имен используются только в языке XML, однако в ActionScript для упрощения операций расширения Е4Х к ним можно обращаться через переменную prefix класса Namespace.

Идентификатор пространства имен — идентификатор, используемый при определении пространства имен в языке ActionScript. Например, в следующем определении пространства имен fruit является идентификатором:

namespace fruit = «http://www. example. com/games/kidsgame/fruit»:

Открытое пространство имен — пространство имен, которое было добавлено в набор открытых пространств имен с помощью директивы use namespace.

Открытые пространства имен — набор пространств имен, просматриваемый компилятором при попытке разрешить неуточненные ссылки.

Уточняющее пространство имен — пространство имен, которое квалифицирует определение переменной или метода либо идентификатор пространства имен как уточненный идентификатор.

Уточненный идентификатор — идентификатор языка ActionScript, состоящий из двух частей и включающий идентификатор пространства имен и локальное имя, разделенные двумя двоеточиями. Например, fruit: : orange.

Пространства имен в языке ActionScript

В языке ActionScript пространство имен — это описатель для имени переменной, метода, XML-тега или XML-атрибута. Описатель ограничивает, или уточняет, значение идентификатора, позволяя нам сказать в коде, что «переменная orange является фруктом, а не цветом», или «метод search ( ) применяется для поиска в японском языке, а не в английском», или «тег

описывает разметку HTML-страницы, а не часть мебели».

Используя пространства имен в языке ActionScript для уточнения имен переменных и методов, мы можем выполнить следующее.

? Предотвратить конфликты именования (подробную информацию можно найти в разд. «Пространства имен для модификаторов управления доступом»).

? Реализовать пользовательские уровни видимости методов и переменных во всей программе, независимо от структуры пакетов программы (обратитесь к примеру

пространства имен mx internal, рассмотренному в подразд. «Пример: управление видимостью на уровне прикладной среды» разд. «Практические примеры использования пространств имен»).

Руководство по actionscript. часть 2, стр. 135

? Реализовать контроль доступа, основанный на разрешениях, когда классы должны запрашивать доступ к переменным или методам (обратитесь к листингу 17.5 в подразд. «Пример: управление доступом на основании разрешений» разд. «Практические примеры использования пространств имен»).

? Реализовать различные «режимы» в программе (обратитесь к листингу 17.7 в подразд. «Пример: реализация режимов работы программы» разд. «Практические примеры использования пространств имен»).

Кроме того, пространства имен в языке ActionScript предоставляют непосредственный доступ к пространствам имен языка XML в X ML-доку ментах. Эта тема рассматривается в разд. «Использование пространств имен XML» гл. 18.

Пространства имен в языке С++ в сравнении с пространствами имен в языке ActionScript. Хотя отчасти синтаксис пространств имен в ActionScript похож на синтаксис пространств имен в языке С++, в ActionScript пространства имен используются иначе, нежели в С++.

В языке С++ пространство имен является синтаксическим контейнером, подобно пакетам в языках ActionScript и Java. Здесь идентификатор считается находящимся в конкретном пространстве имен только в том случае, если он физически находится в операторе блока этого пространства имен. Например, в следующем коде переменная а находится в пространстве имен п, поскольку физическое размещение объявления переменной находится внутри блока пространства имен:

namespace п {

int а: } ‘

Таким образом, пространства имен в языке С++ в основном используются для того, чтобы предотвратить конфликты именования между различными частями кода и запретить одной части кода обращаться к другой части кода.

В отличие от этого в языке ActionScript пространство имен может включать любую переменную или метод, независимо от физической структуры кода. Пространства имен в языке ActionScript определяют правила видимости для методов и переменных, которые выходят за структурные границы (за границы классов и пакетов) программы.

Программисты на С++, пытающиеся отыскать в ActionScript эквивалент пространств имен языка С++, должны рассмотреть возможность использования пакетов ActionScript, которые описаны в гл. 1. В С++ не существует непосредственных аналогов пространств имен языка ActionScript.

Перед тем как перейти к рассмотрению примеров применения пространств имен, познакомимся с основными концепциями и синтаксисом, необходимыми при использовании пространств имен в ActionScript. В следующих нескольких вводных разделах мы создадим два пространства имен — fruit и color, после чего ис-

пользуем их для уточнения определений двух переменных и, наконец, обратимся к этим переменным с помощью так называемых уточненных идентификаторов. Изложенный материал мы будем рассматривать на примере простого приложения: детской игры «Учусь читать». Начнем.

Создание пространств имен

Чтобы создать пространство имен, мы должны присвоить ему название. Название каждого пространства имен, формально именуемое названием пространства имен, — это строка, которая по соглашению представляет унифицированный идентификатор ресурса, или URI. Идентификатор URI однозначно идентифицирует пространство имен среди остальных пространств имен в программе и потенциально даже в любой другой программе по всему миру.

Руководство по actionscript. часть 2, стр. 136

Термин URI относится к обобщенному стандарту идентификации ресурсов, подвидом которого является известный стандарт адресации в Интернете — URL Спецификацию Щ стандарта можно найти по адресу http://www. ietf. org/rfc/rfc2396.txt.

Использование идентификаторов URI в качестве названий пространств имен в языке ActionScript основано на стандарте, установленном консорциумом World Wide Web (W3C) в их рекомендации «Namespaces in XML». Текст документа доступен по адресу http://www. w3.org^R/xml-namesl 1.

Первым шагом на пути создания пространства имен является выбор идентификатора URI для названия будущего пространства.

Выбор идентификатора URI для пространства имен

Обычно идентификатором URI, используемым в качестве названия пространства имен, является указатель URL, который находится в управлении организации, создающей данный код. Например, моим сайтом является www. moock. org, поэтому для нового имени пространства имен я мог бы использовать идентификатор URI, имеющий следующую структуру:

http: //www. moock. org/приложение/пространство_имен

Мы воспользуемся следующими идентификаторами URI для пространств имен fruit и color, которые будут применены в создаваемой нами детской игре:

http://www. examplе. com/games/kidsgame/fruit http://www. example. com/games/ki dsgame/col or

Стоит отметить, что идентификатор URI не обязан — а зачастую так и происходит — существовать в действительности. Он применяется лишь для идентификации пространства имен. Это не адрес веб-страницы, XML-документа или любого другого сетевого ресурса. Можно использовать любой идентификатор URI, однако применение в качестве названия пространства имен указателя URL со своего собственного сайта позволяет минимизировать вероятность того, что другие организации будут использовать такое же название.

Определение пространства имен

Теперь, когда мы выбрали идентификатор URI, который будет использован в качестве названия нашего пространства имен, мы создаем пространство имен с помощью ключевого слова namespace, за которым следует идентификатор пространства имен, знак = и, наконец, само название пространства имен (идентификатор URI):

namespace идентификатор = URI:

Идентификатор пространства имен — это имя константы языка ActionScript, которой присваивается значение пространства имен (значением пространства имен является экземпляр класса Namespace, генерируемый в результате выполнения предыдущей инструкции). URI — пространство имен.

Руководство по actionscript. часть 2, стр. 137

Например, чтобы создать пространство имен с идентификатором fruit и URI «http: / /www. example. com/games/kidsgame/fruit», мы используем:

namespace fruit = «http://www. example. com/games/kidsgame/fruit»:

Чтобы создать пространство имен с идентификатором color и URI «http: // www. example. com/games/kidsgame/color», мы применяем:

namespace color = «http://www. example. com/games/kidsgame/color»;

Обратите внимание на отсутствие объявления типа — в данном случае его использование не допускается. Неявным типом данных идентификатора пространства имен всегда является Namespace. Пространства имен могут определяться везде, где могут определяться переменные, а именно:

? на верхнем уровне определения пакета;

? на верхнем уровне определения класса;

? в функции или методе;

? на временной шкале клипа в FLA-файле.

Фактически пространства имен почти всегда определяются на верхнем уровне определения пакета или класса (если они не используются для XML-документов); дополнительную информацию можно найти в гл. 18. Пока мы будем определять все наши пространства имен на уровне пакета.

Чтобы создать пространство имен на уровне пакета, которое можно использовать в любом месте программы, поместите его определение в отдельный файл с расширением AS, имя которого полностью совпадает с именем идентификатора пространства имен, как показано в следующем примере для пространства имен fruit:

// Файл fruit. as package kidsgame { namespace fruit = «http://www. example. com/games/kidsgame/fruit»:

}

и для пространства имен color:

// Файл color. as package kidsgame { namespace color = «http://www. example. com/games/kidsgame/color»;

Далее, в разд. «Доступность пространств имен», мы рассмотрим примеры пространств имен, определенных на уровне класса или функции. Пространства имен, определенные на временной шкале клипа, рассматриваются так, будто они были определены на уровне класса в классе, который представляет клип, содержащий данные пространства имен (более подробную информацию об определениях на уровне временной шкалы можно найти в разд. «Класс документа» гл. 29).

Руководство по actionscript. часть 2, стр. 138

Явные идентификаторы URI в сравнении с неявными

До сих пор все наши определения пространств имен включали явный идентификатор URI, аналогичный тому, который выделен полужирным шрифтом в следующем определении пространства имен:

namespace fruit = «http://www. example. сош/games/kidsgame/fruit»;

Но когда объявление пространства имен явно не включает название пространства (URI), это название генерируется средой выполнения автоматически. Например, следующее определение пространства имен не включает идентификатор URI, поэтому среда автоматически создает его:

package { namespace nsl;

}

Чтобы доказать это, мы можем отобразить автоматически сгенерированный идентификатор URI для пространства имен nsl, как показано ниже:

namespace nsl:

traceCnsl. uri); // Выводит: nsl

Метод экземпляра toString ( ) класса Namespace также возвращает значение переменной экземпляра uri, так что вызов функции trace ( ) можно сократить до:

trace(nsl): // Также выводит: nsl

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

1 Хорошей практикой является включение идентификатора URI в определения любых

«4

пространств имен. 3?-

Обзор терминологии по пространствам имен

Всего на нескольких коротких страницах текста мы встретились с множеством новых терминов. Рассмотрим их.

Руководство по actionscript. часть 2, стр. 139

Название пространства имен — это идентификатор URI, который идентифицирует пространство имен.

Класс Namespace представляет пространство имен в объектно-ориентированном виде.

Значение пространства имен — это экземпляр класса Namespace.

Идентификатор пространства имен — это имя константы языка ActionScript, которая ссылается на значение пространства имен.

Вообще говоря, сложность этих терминов можно охватить одним простым названием — «пространство имен». Например, в этой книге мы часто используем простую фразу «пространство имен fruit* вместо более точной с технической точки зрения фразы «пространство имен «http: / /www. example. com/games/kidsgame/ fruit», представленное объектом Namespace, на который ссылается идентификатор fruit*.

Чтобы упростить чтение этой книги, мы обычно будем использовать более простую и менее точную фразу «пространство имен fruit*. Тем не менее отличие между названием пространства имен и идентификатором пространства имен является важным для некоторых последующих обсуждений, поэтому вы должны познакомиться с приведенной выше терминологией.

Использование пространств имен для уточнения определений переменных и методов

Теперь, когда мы определили пространства имен fruit и color, мы можем использовать их для указания так называемого уточняющего пространства имен для новых методов и переменных. Уточняющее пространство имен — это пространство имен, внутри которого имя переменной или метода является уникальным.

Чтобы указать уточняющее пространство имен для новой переменной или метода, используем идентификатор этого пространства имен в качестве атрибута определения переменной или метода, как показано в следующем примере:

// Указываем уточняющее пространство имен для переменной идентификаторПрострднствдИмен var имяСвойства-.типДанных = необязательноеИсходноеЗначение;

// Указываем уточняющее пространство имен для метода

идентификаторПространстваИмен function имяМетода (параметры)-.ВозвращаемыйТип { инструкции

}

Следующие правила применяются к идентификатору идентификаторПространстваИмен.

Руководство по actionscript. часть 2, стр. 140

? Он должен быть доступен в области видимости, в которой определены переменная или метод, как рассматривается далее, в разд. «Доступность пространств имен».

? Идентификатор не может быть литеральным значением; в частности, строковым литералом, содержащим название пространства имен (URI).

? Он должен быть константой на этапе компиляции.

Эти три правила в действительности означают, что идентификатор идентификаторПространстваИмен может являться только идентификатором пространства имен, созданного с помощью ключевого слова namespace, и, в частности, не может быть переменной, которая ссылается на значение пространства имен (такие переменные будут рассмотрены далее, в разд. «Присваивание и передача значений пространств имен»).

Вот как можно указать уточняющее пространство имен fruit для переменной экземпляра с именем orange:

fruit var orange:String = «Round citrus fruit»;

Следующим образом можно указать уточняющее пространство имен color для переменной экземпляра с таким же именем orange:

color var orange:String = «Color obtained by mixing red and yellow»;

Допустимо и распространено использование одного уточняющего пространства имен для уточнения множества различных переменных, при котором подчеркивается тот факт, что имя каждой переменной уникально внутри данного пространства имен (в этом и заключается вся идея!). Например, рассмотрим другую переменную — purple, которая также уточняется пространством имен color:

color var purple:String = «Color obtained by mixing red and blue»;

Когда несколько переменных и методов уточняются одним и тем же пространством имен п, можно считать, что они формируют логическую группу. С теоретической точки зрения естественно полагать, что переменная или метод «принадлежит» или «находится внутри» пространства имен, в котором они объявлены. Однако на техническом уровне «пространство имен» языка ActionScript не является структурой данных, которая физически хранит переменные или методы. Пространства имен не являются ни контейнерами данных, ни массивами. Они служат лишь для уточнения имен. Чтобы избежать путаницы, с этого момента мы будем использовать фразу «пространство имен п уточняет имя переменной р» вместо фразы «переменная с именем р принадлежит пространству имен п» или «переменная с именем р находится внутри пространства имен п».

»* -*-

Пространства имен не содержат имена; они просто уточняют их.

Руководство по actionscript. часть 2, стр. 141

Обратите внимание, что для одного определения переменной или метода нельзя указать несколько пространств имен. Каждое определение может включать только одно уточняющее пространство имен. Например, следующий код недопустим:

// Попытка указать два пространства имен для одного определения, fruit color var orange:String; // Вызывает следующую ошибку:

// Only one namespace attribute

// may be used per definition

// (В определении может указываться только

// одно пространство имен)

Атрибуты пространств имен, определенных пользователем, допустимы только на верхнем уровне описания класса. В предыдущем разделе было рассказано, как использовать собственные пространства имен в качестве атрибутов при определении методов и переменных. На самом деле это единственное место, где допустимо применять пространства имен, заданные пользователем, в качестве атрибута определения.

Пространства имен, определенные пользователем, можно применять в качестве атрибутов только на верхнем уровне описания класса.

Если вы попытаетесь использовать пространство имен, заданное пользователем, в качестве атрибута определения в любом другом месте, возникнет следующая ошибка:

A user-defined namespace attribute can only be used at the top level of a class definition.

По-русски она будет выглядеть следующим образом: Атрибут пространства имен, определенного пользователем, может быть использован только на верхнем уровне описания класса.

В частности, это значит, что вы не можете указать пространство имен, определенное пользователем, при определении класса, переменной на уровне пакета, функции на уровне пакета, локальной переменной или вложенной функции. Следующие определения являются недопустимыми:

// Недопустимое определение класса. Здесь не допускается использовать // пространство имен color! color class Picker { }

public function doSomething ( ):void { // Недопустимое определение локальной переменной. Здесь не допускается // использовать пространство имен color! color var tempSwatch;

}

package p {

// Недопустимое определение переменной на уровне пакета. Здесь // не допускается использовать пространство имен color! color var favorites:Array;

}

Напротив, внутренние пространства имен языка ActionScript могут быть использованы в качестве атрибутов определения в любом месте, где это допускается языком ActionScript. Например, как будет рассказано далее, в разд. «Пространства имен для модификаторов управления доступом», модификаторы управления доступом (publ i с, internal, protected и private) являются внутренними пространствами имен, а два из них (public и internal) могут быть использованы на уровне пакета.

Руководство по actionscript. часть 2, стр. 142

Итак, вернемся к нашему коду. Мы уже знаем, как создать два пространства имен и три переменные, уточненные этими пространствами, — это показано в следующем коде:

// Создаем два пространства имен package kidsgame { namespace fruit = «http://www. example. com/games/kidsgame/fruit»;

}

package kidsgame { namespace color = «http://www. example. com/games/kidsgame/color»;

}

// В любом месте внутри класса создаем три переменные

fruit var orange:String = «Round citrus fruit»;

color var orange:String = «Color obtained by mixing red and yellow»;

color var purple:String = «Color obtained by mixing red and blue»;

Далее мы рассмотрим, как обращаться к этим переменным с помощью уточненных идентификаторов.

Уточненные идентификаторы

До сих пор все идентификаторы, с которыми мы встречались в этой книге, были так называемыми простыми идентификаторами — имеющими «простые» одноком-понентные имена, например box, height и border. Но для того, чтобы работать с пространствами имен, мы должны использовать уточненные идентификаторы. Уточненный идентификатор — это особый вид идентификатора, который включает не только имя, но и пространство имен, уточняющее это имя. Соответственно уточненные идентификаторы состоят из двух частей, а не из одной.

? Локальное имя — имя, которое является уникальным внутри указанного пространства имен.



Полезные ссылки
Случайные записи
  • 26.08.2010">Классификация сайтов для дизайнера.
  • 10.05.2010">Самоучитель по креативному веб-дизайну. Книга 1, стр.81
  • 23.01.2011">Руководство по actionscript. часть 1, стр. 034
  • 03.06.2010">Самоучитель по креативному веб-дизайну. Книга 3, стр.78
  • 19.05.2010">Самоучитель по креативному веб-дизайну. Книга 2, стр.27
  • 18.03.2011">Руководство по actionscript. часть 2, стр. 114
  • 05.03.2011">Руководство по actionscript. часть 5, стр. 024
  • 13.06.2010">Самоучитель по креативному веб-дизайну. Книга 4, стр.91
  • 08.03.2011">Руководство по actionscript. часть 4, стр. 097
  • 23.01.2011">Руководство по actionscript. часть 1, стр. 079
  • 07.10.2010">Подбор цветовой палитры с помощью web — сервиса Adobe Kuler
  • 08.09.2011">Есть ли предел у интернета?
  • 22.08.2011">Конец прекрасной эпохи
  • 13.03.2011">Руководство по actionscript. часть 3, стр. 089
  • 19.03.2011">Руководство по actionscript. часть 2, стр. 089
Опрос

Какие цвета вы предпочитаете?

View Results

Loading ... Loading ...