Территория Flash/Flex

Итак, это очередная территория Flash/Flex. Наверняка тем, кто уже владеет Flash на уровне программирования реальных и действующих приложений, скучно читать вводную часть по ActionScript2. Посему я предлагаю вам два тестовых задания из серии "Что лучше". Можете попробовать, времени это займет не много. Причем данные задания и не совсем флэшевые, и могут реализовываться в любых других языках. Мы просто покрутим алгоритмы.


Задание №1. ListBox

ListBox - это стандартная компонента, без которой не обходится ни одно приложение. Если ее писать с нуля в коде, то по стандартной методе это делается с помощью панели, на которую помещаются Item'ы, а потом мы меняем ее положение с помощью скролл-баров. Сверху ставим маскирующий слой. Это стандартное решение для данной компоненты.

Но есть и другой вариант. Например, у нас есть определенное количество текстовых полей (допустим, шесть), и мы по ним крутим массив, содержащий Item'ы.

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


Задание №2. Случайный цвет

Конечно, мы знаем, что каждый цвет в ActionScript2 задается в шестнадцатеричной форме, а для ее обозначения запись начинается с "0х". Допустим, у нас есть текстовое поле с любым текстом и кнопка, по нажатии на которую цвет этого текста автоматически меняется на любой случайный.

Причем (это я для начинающих) цвет задается по модели RGB (красный, зеленый, синий - эта цветовая модель называется аддитивной, в то время как CMYK - субтрактивная, она не используется), а саму запись можно представить так: 0хFFFFFF, где первые два символа после "0х" отвечают за красный, следующие два - за зеленый, последние два - за синий. В шестнадцатеричном представлении для записи используются цифры от 0 до 9 и буквы от A до F. Как вы понимаете, у каждого из трех основополагающих цветов в рамках данной записи может быть 256 градаций интенсивности, а суммарное количество возможных цветов составляет около 16 млн.

Так вот, стоит задача сделать режим подбора случайных чисел для выбора цвета. Это можно сделать как random для 16 млн. в десятичном представлении и последующим переходом на шестнадцатеричный вариант, а можно и по-другому, а именно - разбить шестнадцатеричную запись после "0х" на шесть символов и сделать подбор каждого из них случайным образом (запустить шесть операций random из 16 значений). После этого сделать конкатенацию результатов в одну строку и обозначить как цвет.

Для каких случаев второй вариант будет лучше?


Переходим к истокам

А теперь, после того как "старики" загружены, есть о чем поговорить и с начинающими. Напомню, что мы обсуждаем типы переменных, вернее, пока мы остановились на типах данных. В прошлый раз мы обсудили три элементарных number, string, boolean, сегодня очередь трех следующих - undefined, null и object.


Тип undefined

Если говорить простыми словами, то "у вашей переменной нет конкретного значения". Именно это и обозначается как undefined. То есть, если вы его не определили заранее, или же мы имеем нечто типа sin(0), вам выведется undefined. Почему я произнес "выведется"? Дело в том, что undefined очень часто используется в модулях обработчиков ошибок и при отладке приложений. Он достаточно удобен, причем при конвертации в числовой тип он становится "NaN" (не определено), а в строчном виде выводится как "undefined". Данные введения появились только в ActionScript2, до этого все преобразовывалось в "0" или пустую строку соответственно, что было отклонением от стандарта ECMA-262.

Суть undefined нужно понимать. Например, многие, кто начинает работу с чтением XML-файлов с помощью рекурсивной функции, уже знают, что данные внутри функции чтения видны и доступны, но при их использовании за ее рамками выводится "undefined". Для исправления этой ошибки необходимо конкретно указать тип считываемых данных (string), тогда все будет работать нормально. То есть, говоря специфическим языком, код изначально не "видит" переменные и/или их значения.


Тип null

Очень похоже на undefined с одной тонкой разницей, что этот тип предназначен для задания переменных и параметров в коде. То есть, если простыми словами: "Мы обозначаем, что переменная или параметр существуют, однако никакой информации на данном этапе им передавать не нужно". И, внимание (!), при преобразовании в числовой тип null становится NaN, а не нулем как в предыдущей версии ActionScript. То есть, практически полная идентичность с undefined.

Почему я так подробно останавливаюсь на результатах преобразования этих двух типов в другие элементарные? Чтобы показать, что коды, написанные в более ранних версиях Flash, могут оказаться полностью несовместимыми с тем, что есть во Flash MX 2004/8.

А общими словами, undefined необходим большей частью для локализации ошибок, а null - для задания переменных и параметров с неопределенными значениями.


Тип object

Теперь мы подходим к самому интересному. Объекты в ActionScript - это ассоциативные массивы (термин, известный разработчикам на Perl и PHP), неупорядоченно хранящие в себе списки свойств. Под свойствами в данном случае может пониматься любая элементарная величина, функция или объект. Таким образом, можно ввести разделение на элементарные и составные объекты, а под их свойствами - контейнеры данных. Читаем определение переменной из прошлого выпуска "Территории", да, она тоже является контейнером данных. Дело в том, что термины "свойство" и "переменная" обозначают практически одно и то же. Только переменные мы задаем в рамках кода, а свойства обозначаем при формировании объекта, они являются его частью. Например, тот же объект Math. Пишем строку:

trace (Math.PI);

При запуске на исполнение в окне Output отобразится "3.14159265358979". То есть, константа, соответствующая числу пи, хранится как свойство объекта Math. Это самый простейший пример, но он показывает, что разница между понятиями "переменная" и "свойство объекта" не велика. В случае, когда свойство содержит в себе функцию, применимо понятие "метод".

А теперь взгляните внимательно на нашу введенную строчку и заметьте, что свойство или метод пишутся после ".". Такой вариант записи называется точечной нотацией и известен всем по С-подобным языкам (С++, Java). Но точечная нотация - это не единственный метод вызова свойств, нашу строку можно записать и так:

trace (Math ["PI"]);

То есть, свойство у нас взято в квадратные скобки, и обратите внимание, само свойство записывается как строка, то есть берется в кавычки. Для чего это делается? Просто само имя свойства может включать нестандартные для обычных имен символы, которые в обычной нотации не прочитаются или не правильно интерпретируются, например, "//", также они могут начинаться с цифр, что запрещено стандартом. То есть, о таком способе записи вы должны просто знать. К тому же это вам пригодится при самостоятельном задании свойств объекта, например:

var NObj = {};
NObj ["//"] = "Кот";
NObj [18] = "Кошка";
trace (NObj ["//"]+NObj ["18"]);

При запуске выведет "КотКошка". Но если вы напишете, например, trace (NObj.18), то, естественно, сигнализируется ошибка, поскольку идентификатор не может начинаться с цифры, так же, как и содержать символы операторов. Но если вы напишете так:

NObj ["absj"] = "Кошка";
trace (NObj.absj);

то все будет нормально работать, и окно Output выведет "Кошка". Параллельно с этим вы научились на примитивном уровне задавать свойства для объекта и поняли, что если идентификатор не содержит символов операторов и не начинается с цифры, записи NObj ["absj"] и NObj.absj являются идентичными.

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

В следующем выпуске мы продолжим говорить о типе object и постепенно перейдем на последний, седьмой тип данных - movieclip, который для ActionScript во многом является основополагающим.

Кристофер,
christopher@tut.by

Версия для печатиВерсия для печати

Номер: 

13 за 2007 год

Рубрика: 

Software
Заметили ошибку? Выделите ее мышкой и нажмите Ctrl+Enter!

Комментарии

Аватар пользователя Foreigner
FYI NaN - Not a Number

http://ru.wikipedia.org/wiki/NaN

Аватар пользователя Кристофер
А в чем разница между Not-A-Number и "числовое значение не определено", или "неопределенное числовое значение"?

Или вас как научили, так вы точь-в-точь и повторяете определение?

Аватар пользователя Foreigner
Ключевое слово в NaN "числовое".

Вот отрывок: [undefined] "при конвертации в числовой тип он становится "NaN" (не определено)"

Без слова "числовое" немножко не понятно зачем undefined (не определено) становится NaN (не [определённое] число). В описываем языке разница не очень значительная но она всё-таки есть. Иначе незачем иметь выше описанную конвертацию.

Аватар пользователя Кристофер
Понятно. Но в принципе, в данном отрывке нет ошибки, поскольку при переходе в числовой тип, это неопределнное значение становится неопределенным там, т.е. NaN.

Это приближение к ECMA-262, хотя в первом ActionScript undefined преобразовывался в ноль.

Я не вижу никакой ошибки в данном предложении.