Январь 2011

Руководство по 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:

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

Package zoo { internal class VirtualPet { // Переменная экземпляра ‘calories’ private var calories = 1000:

// Метод с параметром ‘calories’ public function eat (calories) {

this. calories += calories;

}

}

}

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

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

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

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

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

Связанные методы

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

Например, в следующем коде создается новый объект класса VirtualPet, после чего локальной переменной consume присваивается метод eat ( ) созданного объекта. Обратите внимание, что в операторе присваивания после имени метода не ставятся круглые скобки ( ) вызова метода. В результате переменной с о n s ume присваивается сам метод, а не его возвращаемое значение.

package zoo { public class VirtualZoo { private var pet:

public function VirtualZoo ( ) { pet = new VirtualPet(«Stan»): // Присваивание переменной метода eat( ) var consume = pet. eat;

}

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

package zoo { public class VirtualZoo { private var pet:

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

// Присваивание связанного метода переменной consume var consume = pet. eat:

// Вызов метода, на который ссылается переменная consume consume(300);

}

}

}

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

Когда метод присваивается переменной и затем вызывается через нее, код выполняется над тем объектом, который изначально использовался для обращения к методу. Например, в предыдущем коде, когда метод eat ( ) присваивается переменной consume, обращение к методу происходит через объект класса VirtualPet с именем 11 Stan11. Таким образом, при вызове метода eat ( ) через переменную consume код будет выполняться над объектом класса VirtualPet с именем «Stan».

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

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

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

Внутри тела связанного метода ключевое слово this ссылается на объект, с которым связан данный метод. Например, внутри тела связанного метода, который был присвоен переменной consume, ключевое слово this ссылается на объект класса VirtualPet с именем «Stan».

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

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

Использование методов для получения и изменения состояния объекта

Ранее в этой книге мы узнали, что хорошей практикой объектно-ориентированного программирования является объявление переменных экземпляра с использованием модификатора private. Это значит, что их значения нельзя прочитать или изменить в коде за пределами класса, в котором они объявлены.

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

Ранее мы определили переменную экземпляра с именем currentCalories в классе Vi rtual Pet. Концептуально эта переменная описывает степень голода каждого животного. Чтобы внешний код мог изменять степень голода животного, мы можем сделать переменную currentCalories открытой. В этом случае внешний код будет присваивать переменной, описывающей степень голода, любое произвольное значение, как показано в следующем коде:

somePet. currentCalories = 5000:

Тем не менее предыдущий подход обладает серьезным недостатком. Если внешний код сможет непосредственно изменять значение переменной currentCalories, то у класса VirtualPet не будет никакой возможности убедиться, что значение, присваиваемое переменной, является допустимым, или осмысленным. Например, внешний код может присвоить переменной currentCalories значение 1 ООО ООО, позволив животному жить сотни лет, не испытывая голода. Или, если внешний код присвоит переменной currentCalories отрицательное значение, может произойти сбой программы.



Полезные ссылки
Случайные записи
  • 12.06.2010">Самоучитель по креативному веб-дизайну. Книга 4, стр.113
  • 07.03.2011">Руководство по actionscript. часть 4, стр. 108
  • 14.03.2011">Руководство по actionscript. часть 3, стр. 063
  • 18.05.2010">Самоучитель по креативному веб-дизайну. Книга 2, стр.58
  • 17.03.2011">Руководство по actionscript. часть 2, стр. 141
  • 13.03.2011">Руководство по actionscript. часть 3, стр. 105
  • 17.05.2010">Самоучитель по креативному веб-дизайну. Книга 2, стр.117
  • 17.06.2010">Самоучитель по креативному веб-дизайну. Книга 4, стр.12
  • 02.06.2010">Самоучитель по креативному веб-дизайну. Книга 3, стр.115
  • 08.03.2011">Руководство по actionscript. часть 4, стр. 097
  • 25.05.2012">Facebook тестирует обновленный интерфейс Timeline
  • 10.03.2011">Руководство по actionscript. часть 4, стр. 039
  • 05.11.2012">Gmail стал самым популярным почтовым сервисом в мире
  • 10.05.2010">Самоучитель по креативному веб-дизайну. Книга 1, стр.61
  • 10.05.2010">Самоучитель по креативному веб-дизайну. Книга 1, стр.131
Опрос

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

View Results

Loading ... Loading ...