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

Address. charAt(0);

Подобным образом результатом следующего выражения вызова является значение » @ «, поскольку в позиции 2 находится символ @:

address. charAt(2);

В теле цикла индекс получаемого символа задается динамически через итератор i, как показано в следующем примере кода:

while (i < address.length) { if (address.charat(i) == "(a") { isvalidaddress = true:

}

i++:

}

Код проверки адреса электронной почты целиком:

var address = «me@inoock. org»: var isValidAddress = false: var i = 0:

while (i < address.length) { if (address.charat(i) == "@") { isvalidaddress = true;

}

i++;

}

В качестве упражнения рассмотрим, как среда выполнения Flash будет выполнять предыдущий оператор while.

Сначала среда Flash вычисляет значение условного выражения:

i < address.length

Здесь значение переменной i равно 0, а значение выражения address. length равно 12. Число 0 меньше 12, поэтому результатом условного выражения является true, среда выполнения Flash выполняет тело цикла:

if (address. charAt(i) == «@») { isValidAddress = true:

}

i++:

В теле цикла среда Flash сначала должна определить, нужно ли выполнять код в условном операторе:

if (address. charAt(i) == «@») { isValidAddress = true:

}

Чтобы определить, нужно ли выполнять код в предыдущем условном операторе, Flash проверяет, совпадает ли результат выражения вызова address. charAt (i) со строкой «@». При выполнении тела цикла в первый раз значение переменной i равно 0, поэтому выражение вызова address. charAt (i) преобразуется в выражение address. charAt (0), которое, как мы видели раньше, возвращает символ «т» (первый символ в адресе электронной почты). Символ «т» не равен символу » @ «, поэтому среда Flash не выполняет код в условном операторе.

После этого Flash выполняет корректор цикла, увеличивая значение переменной i на 1:

i++;

После выполнения тела цикла наступает время повторить его.

При выполнении цикла во второй раз среда Flash снова проверяет значение условного выражения. На этот раз значение переменной i равно 1, а значение выражения address. length по-прежнему равно 12. Число 1 меньше 12, поэтому результатом условного выражения является значение true и Flash выполняет тело цикла во второй раз. Как и раньше, в теле цикла определяется, нужно ли выполнять код в условном операторе:

if (address. charAt(i) == «@») { isValidAddress = true;

}

Значение переменной i равно 1, поэтому выражение вызова address. charAt (i) преобразуется в выражение address. charAt (1), которое возвращает символ «е»

(второй символ в адресе электронной почты). Символ «е» вновь не равен символу » @ «, поэтому среда Flash не выполняет код в условном операторе.

После этого Flash выполняет корректор цикла, увеличивая значение переменной i до 2. И снова наступает время повторить цикл.

При выполнении цикла в третий раз Flash проверяет значение условного выражения. На этот раз значение переменной i равно 2, а значение выражения address. length по-прежнему равно 12. Число 2 меньше 12, поэтому результатом условного выражения является значение true и среда Flash выполняет тело цикла в третий раз. Как и раньше, в теле цикла определяется, нужно ли выполнять код в условном операторе:

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

If (address. charAt(i) == «@») { isValidAddress = true;

}

Значение переменной i равно 2, поэтому выражение вызова address. charAt (i) преобразуется в выражение addres s. charAt (2), которое возвращает символ «@». Символ «@» равен символу «@», поэтому среда Flash выполняет код в условном операторе, присваивая переменной isValidAddress значение true. После этого Flash выполняет корректор цикла, увеличивая значение переменной i до 3.

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

Завершение цикла с помощью оператора break

Цикл, описанный в предыдущем разделе, был работоспособным, но неэффективным. В соответствии с упрощенной логикой гипотетического алгоритма проверки адреса, если адрес электронной почты содержит символ @, он считается корректным. Чтобы определить наличие символа @, в цикле из предыдущего раздела проверялся каждый отдельный символ в указанном адресе электронной почты. В случае с адресом me@mock. org тело цикла выполнялось целых 12 раз, хотя уже после проверки третьего символа было ясно, что адрес является корректным. Следовательно, девять раз тело цикла выполнялось без надобности.

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

var address = «me@iTioock. org»; var isValidAddress = false; var i = 0;

while (i < address.length) { if (address.charat(i) == "@") { isvalidaddress = true; break;

}

i++;

В предыдущем примере кода, как только символ @ будет найден в строке, хранящейся в переменной address, переменной isValidAddress будет присвоено значение true, после чего оператор break завершит выполнение цикла.

Если создаваемый вами цикл используется для поиска определенного элемента в списке, *v л ^ то всегда применяйте оператор break для завершения цикла сразу после нахождения х — Jp: искомого элемента.

Упражнение: попробуйте модифицировать предыдущий цикл, чтобы адреса, начинающиеся или заканчивающиеся символом @ либо содержащие несколько символов @, считались некорректными. Кроме того, вы можете попробовать изменить цикл, чтобы некорректными считались и адреса, не содержащие ни одного символа. (точка).

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

Оператор do-while

Как уже отмечалось ранее, оператор while говорит среде выполнения Flash многократно выполнять блок кода до тех пор, пока результатом указанного условия является значение true. Из-за особенностей структуры цикла while его тело будет полностью пропущено, если при проверке условного выражения в первый раз его результатом не является значение true. Оператор do-while гарантирует, что тело цикла будет выполнено по крайней мере один раз с минимальными затратами. Синтаксис оператора do-while отчасти напоминает перевернутый синтаксис оператора while:

do {

блокКода } while (условноеВыражение):

Описание цикла начинается с ключевого слова do, за которым следует блок блок-Кода тела цикла. При первом прохождении цикла do-while блок блокКода выполняется даже до проверки результата выражения условноеВыражение. Если после завершения блока блокКода результатом выражения условноеВыражение является значение true, то цикл начинается заново и блок блокКода выполняется снова. Цикл выполняется до тех пор, пока выражение условноеВыражение не примет значение false.

Оператор for

Цикл for, по существу, является синонимом цикла while, однако для его записи применяется более компактный синтаксис. Выражения инициализации и корректирования цикла размещаются вместе с условным выражением в верхней части цикла for. Вот его синтаксис:

for (инициализация: условноеВыражение: корректирование) { блокКода

}

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

значения одной или нескольким переменным итераторов. Как и в случае с другими циклами, если результатом выражения условноеВыражение является значение true, то блок блокКода выполняется. В противном случае цикл завершается. И хотя выражение корректирование размещается в заголовке цикла, оно выполняется в конце каждой итерации, перед очередной проверкой результата выражения условноеВыражение на допустимость продолжения цикла.

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

Вот пример цикла for, используемого для возведения числа 2 в степень 3:

var total = 2;

for (var i = 0; i < 2; i++) { total = total * 2;

}

Для сравнения приведем эквивалентный цикл while:

var total = 2: var i = 0;

while (i < 2) { total = total * 2; i++;

}

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

var address = «me@inoock. org»; var isValidAddress = false;

for (var i = 0: i < address.length; i++) { if (address.charat(i) == "@") { isvalidaddress = true; break;

}

}

Однажды применив на практике синтаксис цикла for, вы увидите, что он позволяет экономить место и в нем существует четкая грань между телом цикла и управляющими элементами.

Булева логика

Ранее в этой главе мы увидели, как принимаются логические решения с использованием условных выражений, которые возвращают логические значения. Решения принимались на основании одного фактора, например, «если значением переменной language является «english», отображать сообщение «Не 11 о»». Но не вся программная логика настолько проста. В программах зачастую приходится рассматривать сразу несколько факторов в логике ветвлений (то есть принимать решение). Для объединения нескольких факторов в одном условном

выражении применяются логические операторы: | | (логическое ИЛИ) и && (логическое И).

Логическое ИЛИ

Оператор логического ИЛИ чаще всего применяется для инициирования определенного действия, когда выполняется по крайней мере одно из двух условий. Например, «если я голоден или испытываю жажду, я пойду на кухню». Оператор логического ИЛИ обозначается символами | |. Обычно символ | можно ввести, нажав одновременно клавишу Shift и клавишу с изображением обратного слэша (\), расположенную в правом верхнем углу большинства западных клавиатур. Оператор логического ИЛИ имеет следующий обобщенный вид:

выражение1 \ \ выражение2

Если оба выражения (выражение1 и выражение2) или результаты вычисления этих выражений являются логическими значениями, то оператор логического ИЛИ возвращает значение true, когда результатом одного из выражений является true, а значение false только в том случае, когда результатом обоих выражений является false.

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

True || false // true, поскольку первый операнд равен true

false jj true // true, поскольку второй операнд равен true

true jj true // true (достаточно, чтобы любой операнд был равен true)

false jj false // false, поскольку оба операнда равны false

Когда результат выражения выражение1 не является логическим значением, среда Flash сначала преобразует результат в логическое значение. Если результатом преобразования окажется значение true, то оператор логического ИЛИ вернет значение выражения выражение!. В противном случае оператор логического ИЛИ вернет значение выражения выражение2. Описанное правило продемонстрировано в следующих примерах:

О || «hi there!» // результат выражения выражение1 не преобразуется // в значение true, поэтому оператор возвращает // значение выражения выражение2: «hi there!»

«hey» || «dude» // выражение выражение1 представляет непустую строку.

// поэтому результат этого выражения преобразуется

// в значение true и оператор возвращает значение

// выражения выражение].: «hey»

false || 5 + 5 // результат выражения выражение1 не преобразуется // в значение true, поэтому оператор возвращает // значение выражения выражение2 (то есть 10)

Результаты преобразования различных типов данных к логическим значениям перечислены в разд. «Преобразование в примитивные типы» гл. 8.

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

var х = 10; var у = 15; if (х || у) {

// Этот блок кода выполняется в том случае, когда значение // одной из переменных х или у не равно 0

}

В третьей строке вместо логического значения условного выражения оператора if мы видим оператор логического ИЛИ (х | | у). Первый шаг в вычислении значения выражения х | | у заключается в преобразовании числа 10 (которое является значением первого операнда — х) в логическое значение. Любое ненулевое конечное число преобразуется в логическое значение true. Оператор логического ИЛИ возвращает значение переменной х, равное 10. Таким образом, для среды выполнения Flash оператор if выглядит следующим образом:

if (10) {

// Этот блок кода выполняется в том случае, когда значение // одной из переменных х или у не равно О

}

Однако 10 является числом, а не логическим значением. Что же происходит дальше? Оператор if преобразует результат выполнения оператора логического ИЛИ к логическому значению. В данном случае 10 преобразуется в логическое значение true и среда Flash представляет наш код следующим образом:

if (true) {

// Этот блок кода выполняется в том случае, когда значение // одной из переменных х или у не равно О

}

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

Обратите внимание, что, если значение результата первого выражения оператора логического ИЛИ равно true, вычисление результата второго выражения является ненужным и, как следствие, неэффективным действием. По этой причине среда выполнения Flash вычисляет результат второго выражения только тогда, когда значение результата первого выражения равно false. Эту особенность полезно использовать в тех случаях, когда вы не хотите вычислять второе выражение до тех пор, пока результатом первого выражения не окажется f а 1 s е. В следующем примере выполняется проверка, входит ли указанное число в заданный диапазон. Если число слишком маленькое, нет необходимости в выполнении второй проверки, которая определяет, является ли число слишком большим.

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

If (xPosition < 0 || xposition > 100) { // Этот блок кода выполняется, если значение переменной // xPosition находится в диапазоне от 1 до 100 включительно

}

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

// Ой! Забыли включить переменную xPosition в сравнение со значением 100 if (xPosition < 0 11 > 100) {

// Этот блок кода выполняется, если значение переменной

// xPosition находится в диапазоне от 1 до 100 включительно

}

Логическое И

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

выражение1 && выражение2

Выражения выражение1 и выражение2 могут быть любыми допустимыми. В простейшем случае, когда результатами обоих выражений являются логические значения, оператор логического И возвращает f а 1 s е в тех случаях, когда результатом одного из выражений является значение false, a true — только в том случае, когда результатом обоих выражений является значение true.

true && false // false, поскольку результат второго выражения равен false false && true // false, поскольку результат первого выражения равен false true && true // true, поскольку результаты обоих выражений равны true false && false // false, поскольку результаты обоих выражений равны false

// (достаточно, чтобы результат одного из выражений был

// равен false)

Рассмотрим использование оператора логического И в двух примерах. В первом примере некоторый блок кода выполняется только в том случае, когда значения обеих переменных больше 50:

х = 100; У = 51:

if (х>50 && у>50) { // Этот блок кода выполняется только в том случае, // когда значения переменных х и у больше 50

}

Теперь представим сайт с форумом, посвященным Новому году. Доступ к форуму пользователи могут получить только при вводе правильного пароля и только 1 января. Следующий код демонстрирует использование оператора логического И для проверки выполнения обоих условий (правильным паролем является слово fun):

var now = new Date( ); // Создает новый объект Date

var day = now. getDate( ); // Возвращает целое число в диапазоне

// от 1 до 31

var month = now. getMonth( ); // Возвращает целое число в диапазоне

// от 0 до 11

if ( password==»fun» && (month + day)==l ) { // Позволить пользователю войти…

С технической точки зрения поведение оператора логического И очень похоже на поведение оператора логического ИЛИ. Сначала результат выражения выражение1 преобразуется в логическое значение. Если результатом этого преобразования является false, то возвращается результат выражения выражение!. Если результатом преобразования является true, то возвращается результат выражения выражение2.

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

Как и в случае с оператором логического ИЛИ, если значение результата первого выражения оператора логического И равно false, нахождение результата второго выражения является ненужным и, как следствие, неэффективным действием. По этой причине среда выполнения Flash вычисляет результат второго выражения только тогда, когда значение результата первого выражения равно true. Эту особенность полезно использовать в тех случаях, когда вы не хотите вычислять второе выражение до тех пор, пока результатом первого выражения не окажется значение true. В следующем примере операция деления выполняется только в том случае, если делитель не равен нулю:

if ( numltems!=0 && totalCost/numItems>3 ) { // Этот блок кода выполняется только в том случае, когда количество // элементов не равно нулю и общая стоимость каждого элемента больше 3

}

Логическое НЕ

Оператор логического НЕ ( !) возвращает логическое значение, противоположное значению его единственного операнда. Этот оператор записывается в следующем обобщенном виде:

!выражение

Если результатом выражения выражение является значение true, то оператор логического НЕ возвращает false. Если результатом выражения выражение является значение false, то оператор логического НЕ возвращает true. Если результат выражения выражение не является логическим значением, то для упрощения вычислений полученный результат преобразуется в логическое значение, после чего возвращается его противоположное значение.

Как и оператор неравенства ( ! =), оператор логического НЕ удобен для проверки того, чем не является тот или иной объект, а не того, чем он является. Например, тело следующего условного оператора выполняется только в том случае, если текущей датой не является 1 января. Обратите внимание на дополнительные скобки, с помощью которых задается требуемый порядок выполнения операций (приоритет), рассматриваемый в гл. 10.

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

Var now = new Date( ); // Создает новый объект Date

var day = now. getDate( ): // Возвращает целое число в диапазоне

// от 1 до 31

var month = now. getMonth( ); // Возвращает целое число в диапазоне

// от 0 до 11

if ( !( (month + day)==l) ) { // Выполнение «непервоянварского» кода

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

soundEnabled = !soundEnabled // Переключение текущего состояния звука

if (soundEnabled) {

// Убедиться, что звуки слышны } else {

// Выключить все звуки

}

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

Возвращение к классам и объектам

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

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

ГЛАВА 3

Пересмотр методов экземпляра

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

? исключение ключевого слова this;

? связанные методы;

? методы получения и изменения состояния;

? get — и set-методы;

? дополнительные аргументы.

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

Листинг 3.1. Программа «Зоопарк»

// класс VirtualPet package zoo { internal class VirtualPet {

internal var petName:

private var currentCalories = 1000:

private var creationTime:

public function VirtualPet (name) { this. creationTime = new Date( ): this. petName = name:

}

public function eat (numberOfCalories) { this. currentCalories += numberOfCalories:

}

public function getAge ( ) { var currentTime = new Date( ): var age = currentTime. time — this. creationTime. time: return age:

}

}

}

// класс VirtualZoo package zoo {

public class VirtualZoo { private var pet:

public function VirtualZoo ( ) { this. pet = new VirtualPet(«Stan»):

}

}

}

Исключение ключевого слова this

Как известно из гл. 1, ключевое слово this используется для обращения к текущему объекту внутри методов-конструкторов или методов экземпляра. Например, в следующем коде выражение thi s. petName = name говорит среде выполнения присвоить значение переменной экземпляра petName созданного объекта:

public function VirtualPet (name) { this. petName = name;

}

В следующем коде выражение this. currentCalories += numberOfCalories говорит среде выполнения присвоить значение переменной currentCalories того объекта, метод eat ( ) которого был вызван:

public function eat (numberOfCalories) { this. currentCalories += numberOfCalories;

}

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

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

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

Например, рассмотрим, что произойдет, если мы уберем ключевое слово this из метода eat ( ), как показано в следующем коде:

public function eat (numberOfCalories) { currentCalories += numberOfCalories:

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

После этого среда выполнения Flash встречает идентификатор currentCalories и пытается найти локальную переменную, параметр или вложенную функцию по данному имени. С именем currentCalories нет ни одной переменной, параметра или вложенной функции, поэтому среда Flash пытается найти переменную или метод экземпляра по данному имени. На этот раз поиск оказывается успешным: класс VirtualPet содержит переменную экземпляра с именем currentCalories, поэтому среда выполнения Flash использует эту переменную в выражении. В результате значение параметра numberOfCalories прибавляется к значению переменной экземпляра currentCalories.

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

Следовательно, внутри метода eat ( ) выражения this. currentCalories и currentCalories являются идентичными.

Для улучшения читабельности кода многие разработчики (это относится и к данной книге) избегают частого использования ключевого слова this. С этого момента при обращении к переменным и методам экземпляра мы будем опускать ключевое слово this. Тем не менее некоторые программисты предпочитают использовать его всегда лишь для того, чтобы отличать переменные и методы экземпляра от локальных переменных.

Обратите внимание, что использование ключевого слова this допустимо только внутри методов экземпляра, методов-конструкторов, функций и кода в глобальной области видимости (рассматривается в гл. 16). Применение ключевого слова thi s в любом другом месте программы приведет к ошибке на этапе компиляции.

Процесс поиска идентификаторов средой выполнения Flash называется разрешением идентификаторов. Как будет рассмотрено в гл. 16, разрешение идентификаторов выполняется с учетом области (или области видимости) программы, в которой они встречаются.

Разрешение конфликтов имен переменных/параметров. Когда переменная экземпляра и параметр метода имеют одинаковые имена, для обращения к переменной можно использовать ключевое слово this (это называется разрешением неоднозначности между переменной и параметром). Например, в следующей модифицированной версии класса VirtualPet представлен метод eat ( ) с параметром calories, имя которого совпадает (то есть конфликтует) с именем переменной экземпляра calories:



Полезные ссылки
Случайные записи
  • 18.05.2010">Самоучитель по креативному веб-дизайну. Книга 2, стр.97
  • 17.05.2010">Самоучитель по креативному веб-дизайну. Книга 2, стр.126
  • 28.02.2011">Руководство по actionscript. часть 6, стр. 002
  • 02.06.2010">Самоучитель по креативному веб-дизайну. Книга 3, стр.100
  • 18.05.2010">Самоучитель по креативному веб-дизайну. Книга 2, стр.47
  • 28.02.2011">Руководство по actionscript. часть 6, стр. 021
  • 13.06.2010">Самоучитель по креативному веб-дизайну. Книга 4, стр.88
  • 22.03.2011">Руководство по actionscript. часть 2, стр. 006
  • 27.02.2011">Руководство по actionscript. часть 6, стр. 027
  • 23.01.2011">Руководство по actionscript. часть 1, стр. 013
  • 30.05.2013">В течение недели LG продемонстрирует гибкую панель OLED в 5 дюймов
  • 04.06.2010">Самоучитель по креативному веб-дизайну. Книга 3, стр.21
  • 17.03.2011">Руководство по actionscript. часть 2, стр. 145
  • 23.01.2011">Руководство по actionscript. часть 1, стр. 068
  • 23.02.2011">Руководство по actionscript. часть 7, стр. 030
Опрос

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

View Results

Loading ... Loading ...