Март 2011

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

Код в функции, определенной внутри метода экземпляра, может обращаться к следующим определениям:

? ко всем определениям, доступным коду в глобальной области видимости;

? ко всем определениям, доступным коду в области видимости данного метода экземпляра;

? ко всем локальным переменным, вложенным функциям и пространствам имен, определенным внутри этой функции.

Код в функции, которая определена внутри другой функции, может обращаться к таким определениям:

? ко всем определениям, доступным коду в глобальной области видимости;

? ко всем определениям, доступным коду в области видимости внешней функции;

? ко всем локальным переменным, вложенным функциям и пространствам имен, определенным внутри этой функции.

Обзор областей видимости

Приведенный далее код демонстрирует все возможные области видимости языка ActionScript:

package {

// Размещенный здесь код находится в глобальной области видимости

public class SomeClass { // Этот код находится в области видимости класса SomeClass

public static function staticMeth ( ):void { // Размещенный здесь код находится в области видимости метода // staticMeth

}

public function instanceMeth ( ):void { // Этот код находится в области видимости метода instanceMeth

function nestedFunc ( ):void { // Размещенный здесь код находится в области видимости функции // nestedFunc

}

}

}

}

// Этот код находится в глобальной области видимости

Детали реализации

Для осуществления хранения информации об определениях в цепочке областей видимости среда Flash использует список объектов. Информацию об определениях для каждой области видимости хранят следующие объекты.

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

Глобальная область видимости — глобальный объект (объект, автоматически создаваемый средой выполнения Flash для хранения глобальных определений).

Область видимости класса — объект Class данного класса (и объекты Class его предков).

Область видимости статического метода — объект Class данного класса (и объекты Class его предков).

Область видимости метода экземпляра — текущий объект (this) и объект активации (объект активации — это объект, создаваемый средой выполнения Flash и хранящийся в ней, который включает локальные переменные и параметры функции или метода).

Область видимости функции — объект активации.

Когда среда выполнения Flash встречает в программе выражение-идентификатор, она выполняет поиск этого идентификатора среди объектов в цепочке областей видимости. Например, рассмотрим следующий код:

package { public class SomeClass { public function instanceMeth ( ):void { function nestedFunc ( ):void { trace(a):

}

}

}

}

var a.-int = 15;

Когда среда Flash встречает идентификатор а, она выполняет поиск его значения в объекте активации функции nestedFunc ( ). Однако в функции nestedFunc ( ) не определено никаких локальных переменных или параметров с именем а, поэтому далее среда Flash продолжает поиск идентификатора а в текущем объекте (то есть в объекте, через который был вызван метод instanceMeth ( ) ). Но класс SomeClass не определяет и не наследует метод или переменную экземпляра

с именем а, поэтому после этого Flash продолжает поиск идентификатора а в классе объекта SomeClass. В классе SomeClass отсутствует определение статического метода или статической переменной с именем а, поэтому далее среда выполнения Flash продолжает поиск идентификатора а в объекте суперкласса класса SomeClass, которым является класс Ob j ect. Однако в классе Ob j ect отсутствует определение статического метода или статической переменной с именем а, поэтому после этого среда Flash продолжает поиск идентификатора а в глобальном объекте. В нем Flash находит идентификатор а и определяет, что значением этого идентификатора является 15. Получив значение идентификатора а, среда выполнения выводит число 15 в процессе отладки. Довольно много действий, чтобы найти маленькую а!

Вот объекты, среди которых среда выполнения Flash пыталась найти идентификатор а, перечисленные в порядке поиска:

? объект активации функции nestedFunc ( );

? объект, через который был вызван метод instanceMeth ( );

? объект класса SomeClass;

? объект класса Object;

? глобальный объект.

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

Если бы идентификатор а не был найден в глобальном объекте, среда выполнения Flash сообщила бы об ошибке обращения.

Л’т -

I Переменные, объявленные за пределами описания пакета, доступны только внутри м$ исходного файла, содержащего эти переменные.

1 9$-

Теперь, когда все известно про цепочку областей видимости, завершим эту главу, рассмотрев единственный инструмент языка ActionScript, который позволяет непосредственно управлять цепочкой областей видимости, — оператор with.

Расширение цепочки областей видимости с помощью оператора with

Оператор with предоставляет сокращенный способ обращения к переменным и методам объекта, который исключает необходимость повторно указывать имя объекта. Этот оператор имеет следующий обобщенный вид:

with (объект) { вложенныеИнструкции

}

Когда обращение к идентификатору происходит внутри блока оператора with, на наличие указанного имени проверяется объект объект до того, как будет проверена оставшаяся часть цепочки областей видимости. Другими словами, оператор with временно добавляет объект объект в конец внутреннего списка объектов, составляющих цепочку областей видимости среды выполнения Flash.

Например, чтобы обратиться к переменной РI внутреннего класса Math, мы обычно используем следующий код:

Math. PI:

Однако с помощью оператора with мы можем обратиться к переменной PI внутреннего класса Math без предварительного обращения к этому классу:

with (Math) { // Выполняем инструкции в контексте класса Math trace(PI): // Выводит: 3.1459… (поскольку переменная PI определена // в классе Math)

}

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

Руководство по 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 имяМетода (параметры)-.ВозвращаемыйТип { инструкции

}

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



Полезные ссылки
Случайные записи
  • 17.06.2010">Самоучитель по креативному веб-дизайну. Книга 4, стр.3
  • 05.03.2011">Руководство по actionscript. часть 5, стр. 017
  • 22.03.2011">Руководство по actionscript. часть 2, стр. 015
  • 18.05.2010">Самоучитель по креативному веб-дизайну. Книга 2, стр.48
  • 19.03.2011">Руководство по actionscript. часть 2, стр. 090
  • 08.03.2011">Руководство по actionscript. часть 4, стр. 075
  • 03.03.2011">Руководство по actionscript. часть 5, стр. 058
  • 04.10.2010">Определение цвета пикселя на экране
  • 10.03.2011">Руководство по actionscript. часть 4, стр. 024
  • 03.01.2010">Красивые российские или же кириллические шрифты
  • 18.05.2010">Самоучитель по креативному веб-дизайну. Книга 2, стр.74
  • 03.03.2011">Руководство по actionscript. часть 5, стр. 070
  • 17.03.2011">Руководство по actionscript. часть 2, стр. 155
  • 04.06.2010">Самоучитель по креативному веб-дизайну. Книга 3, стр.6
  • 03.03.2011">Руководство по actionscript. часть 5, стр. 065
Опрос

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

View Results

Loading ... Loading ...