Синтаксис ActionScript

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

Пробельные символы
Языки программирования очень похожи на языки речи. В них есть слова, предложения, знаки препинания. При простом письме слова разделяются пустыми промежутками (или разносятся по разным линиям), строки выравниваются друг относительно друга при помощи отступов. Похожим образом формируется и код программы. Реализуется же приведение его текста к «человеческому» виду при помощи так называемых пробельных символов: пробела (пустой промежуток), возврата каретки (обозначает переход на новую строку) и знаков табуляции (отвечают за отступы). Представляете, если бы их не было, как сложно было бы разобраться в сценарии, записанном в одну строку!

В ActionScript две разные лексемы (проще говоря, слова) должны быть обязательно разделены одним из пробельных символов.


В противном случае интерпретатор воспримет их как единое целое:

varmyVar; // Неверное объявление переменной: нет разделения
// пробельным символом
var myVar; // Верно: ключевое слово и идентификатор
// разделены пробелом
var
myVar; // Верно: ключевое слово и идентификатор разделены
// символом возврата каретки

Не имеет значения, сколько пробелов или пустых линий разделяют лексемы — при интерпретации сценария лишние знаки будут просто проигнорированы.x=y * z; // Полным аналогом данного кода является нижележащий х = у *z;

Не обязательно использовать пробельные символы, если между словами имеются такие разделители, как операторы (+, &, * и т. д.), круглые или фигурные скобки, символ «;». Однако часто это необходимо делать, иначе код будет нечитабельным.

// Плохо отформатированный код функции, вычисляющей факториал
function fact(n) {if (n>1) {n=n*fact(n-1);}return n;}
// Код после добавления необходимого числа пробельных символов
function fact(n) {
if (n > 1) {
n = n*fact(n-1);
}
return n;
}

Обратите внимание, насколько в приведенном примере скрипте «лишними» пробельными символами воспринимается лучше кода без них!

Качественное форматирование кода — это один из признаков профессионализма программиста.


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

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


Любая программа представляет собой последовательность предложений (точно так же, как в литературе из них складывается произведение). Например:

var a="Hello, "; // Предложение 1: создает переменную, хранящую строку
var b="World!!!"; // Предложение 2: аналогично предыдущему
trace(a+b); // Предложение 3: соединяет значения переменных,
// выводя результат

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

// Приведенный выше код корректно работает и без завершения предложений
// при помощи ";"
var a="Hello, "
var b="World!!!"
trace(a+b)

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

// Определение двух переменных на одной линии без использования ";" вызывает
// ошибку
var A=[l,2,3] var B=l
// При применении правильного синтаксиса код работает корректно
var A=[1,2,3]; var B=l;

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

function func(a,b){ // Открываем блок предложений
var c=a*b; // Предложение 1: ставим ";"
return с; // Предложение 2: ставим ";"
} // Закрываем блок предложений: ";" не требуется

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

_root.onEnterFrame = function() {
trace(_root._currentframe);
}; // После анонимной функции ";" ставится

Также точка с запятой не ставится после таких директив ActionScript, как #include (импортирует код из внешнего текстового файла), #initclip (начало инициализации компонента), #endinitclip (конец инициализации клипа).

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

Чувствительность к регистру
Стандарт ЕСМА-262, на котором основан ActionScript, требует полной чувствительности идентификаторов к регистру. Однако s ActionScript FlashMX и Flash 5 это требование исполнено не было (вернее, оно было исполнено частично: к регистру были чувствительны лишь ключевые слова).

Это связано с тем, что необходимо было обеспечить полную обратную совместимость с фильмами четвертой версии Flash, вскриптовом языке которой чувствительности к регистру не было. Кроме того, считалось, что в большинстве своем флешеры далеки от программирования, поэтому Action-Script должен быть максимально простым и нестрогим. Чувствительность же к регистру значительно усложняет разработку кода, требуя от программиста большего внимания и дисциплинированности.

В ActionScript 2.0 наконец появилась полная чувствительность к регистру. Это означает, что теперь «date» и «Date» — это различные идентификаторы, и следующая строчка не сделает класс Date недоступным для данного кода, что неизбежно произошло бы в предыдущих версиях Flash:

var date = new Date();

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

• Если лексема является именем класса, глобальной функцией или свойством, то вы просто не сможете получить доступ к соответствующему элементу.

• Если вы допустили ошибку при задании зарезервированного слова, то при компиляции произойдет сбой. Зарезервированные слова — это небольшая группа лексем, играющих ключевую для корректной работы транслятора роль. К ним относятся слова, объявляющие переменные и функции (var и function), предложения циклов (while, continue, break) и условий (if, else, switch, case, default), а также некоторые другие.

While(1) {} // Строка вызывает синтаксическую ошибку – // в имени цикла не должно Сыть символов // в верхнем регистре

Главная сложность, которая связана с чувствительностью к регистру, заключается в том, что созданные вами во Flash MX или Flash 5 фильмы либо библиотеки, будучи опубликованными под Flash 7, могут перестать работать. Если это произойдет, в первую очередь нужно проверить, одинаково ли прописаны имена идентификаторов. Упростить эту работу позволяет инструмент Find And Replace (Найти и заменить) панели Actions с отключенной настройкой Match Case (Учитывать регистр).

Можно долго спорить, чего больше — хорошего или плохого — от появления в ActionScript чувствительности к регистру. Одно несомненно; для компании Macromedia стало очевидно, что уровень Flash-разработчиков вырос и усложнение языка не снизит популярность программы.

Зарезервированные слова ActionScript
Стандарт ЕСМА-262 предусматривает наличие в языке так называемых зарезервированных слов (reserved words). Эти слова являются своеобразными камнями в фундаменте языка, и любое некорректное использование их неизбежно приведет к сбою при трансляции программы. Нужно знать зарезервированные слова, чтобы случайно не использовать одно из них в качестве идентификатора. Кроме того, следует помнить, что ошибка в регистре символа в зарезервированном слове приводит к сбою при компиляции, поэтому за правильностью их написания нужно следить особенно строго. Вот список зарезервированных слов ActionScript:

break extends instanceof static
case for interface switch
class function intrinsic this
continue get new typeof
default if private var
delete implements public void
dynamic import return while
else in set with

Список зарезервированных слов не является статичным: в каждой новой версии языка имеются изменения в нем. Если вам интересно, какие новые элементы могут появиться в очередном издании ActionScript, обратитесь к спецификации ЕСМА-262, где приведен полный перечень потенциальных обновлений.

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

Перечислим основные принципы создания имен.

• Любой идентификатор может быть образован при помощи букв произвольного регистра, цифр, знака подчеркивания или знака доллара. Использование всех остальных служебных символов и символов пунктуации ( – , +, @, ^, (, *, +, /,-, [ и т, д.) недопустимо, так как эти знаки зарезервированы в качестве операторов и разделителей ActionScript. Также в имя не может входить пробельный символ.

var my variable; // неверно: в идентификаторе имеется пробел
var my-variable; // Неверно: в идентификаторе имеется тире
var my2variable; // Верно: корни имени разделены цифрой
var my_variable; // Верно: использован знак подчеркивания

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

var 2myVariable // Неверно: идентификатор начинается с цифры
var _myVariable // Допустимо, но не рекомендовано: знак "_"
// в начале имени

Стандарт ЕСМА-262 рекомендует использовать знак доллара только в программно генерируемых идентификаторах.

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

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

var Date = new Date(); // Ай-яй-яй! Как бессмысленно закончил
// свое существование для данного кода
// объект Date!
var default = true; // Использовано зарезервированное слово —
// сбой неизбежен

• Имена функций (методов), переменных (свойств) и объектов должны начинаться с маленькой буквы, классов — с большой. Если имя функции (или, соответственно, метода) образовано несколькими корнями, то их начало желательно выделять большой буквой.

var obj=new Ball (] ; // Имя пользовательского класса пишем
// с большой буквы, переменной — с малой
myOwnFunction(); // Имя функции пишем с маленькой буквы,
// а корни, его образующие, с большой

Кстати, приведенным правилам подчиняются и встроенные методы, свойства и объекты Action-Script (например, goloAndPlay() или Со1ог()), так что вспоминайте их, когда будете набирать код «из головы».

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

var MAX_NUMBERS_OF_CLIPS=1000; // Константа
var numbers_of_clips = arr_of_clips . length; // Переменная
(

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

var CHISLO_SHARIKOV = 10; // Понятно: константа определяет
// количестве объектов
bedinGradientFill () // Понятно: метод осуществляет заливку градиентом
var CHISLO_SHARIKOV=ftp2n; // Непонятно: какие функции выполняет
// переменная ftp2n?

Идентификатор может быть задан кирилличными символами. И никаких сложностей из-за использования такого имени не возникнет. Дело в том, что Flash-плейер полностью поддерживает уникод еще со времен Flash 6. А начиная с Flash MX 2004, с текстом в формате уникод работает и панель Actions. Это означает, что идентификатор можно составить практически из любых из более чем 65 000 символов, входящих в уникод.

var привет="Не11о";//Имя переменной образовано кирилличными символами

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

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

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

В ActionScript, равно как и в таких языках, как С или Java, существуют два типа комментариев:

однострочные и многострочные. Однострочные комментарии задаются сочетанием //.

Любой текст в строке, расположенный после него, будет игнорироваться при трансляции (поэтому недопустимопомещать код правее комментария). Если сценарий создается на панели Actions, то текст комментария будет (по умолчанию) подсвечиваться серым цветом. Пример однострочного комментария:

var n=0; // Задаем счетчик для цикла

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

var n=0 /* При помощи этой переменной отслеживается количество экземпляров клипа ball.

Если их число превышает 100, кнопка "Дубликат" блокируется */

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

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

// Что-то тут не то... Пока обойдемся без этого фрагмента
/* this.attachMovie ("ball", "ball"+r, г., |_х: 10*п, _у:20*г.));
eval("tbis.ball"+n>._visible = false; */

Некоторые типы комментариев принято создавать стандартным образом с использованием особых сокращений. Перечислим основные из них:

• Пометка о том, что код следует доделать или внести в него коррективы:

//:ТODO: tonic

• Указание на какую-то известную ошибку (проще говоря, баг). Комментарий должен пояснять, в чем она состоит и указывать се номер (bug ID). Схема:

//:BUG: [bug ID] topic

• Пометка о том, что приведенный код не является лучшим решением. Обычно означает готовность автора его совершенствовать. Схема:

//:KLUDGE:

• Указание, что внесение изменений в данный фрагмент кода является рискованным:

//:TRICKY:

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

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела Action Script на эту тему:
Клипы (тип movieclip)
Кодировка символов. Уникод во Flash
Основные понятия
Тип undefined
Числа (тип number)