Использование методов 

для получения и изменения 

состояния объекта  ActionScript 

 

 

Ранее в этой книге мы узнали, что хорошей практикой объектно-ориентированного 

программирования является объявление переменных экземпляра с  

использованием модификатора private. Это значит, что их значения нельзя прочитать или 

изменить в коде за пределами класса, в котором они объявлены. 

Хорошая практика объектно-ориентированного программирования также  

предписывает следующее: вместо того чтобы предоставлять возможность внешнему 

коду непосредственно изменять значения переменных экземпляра, мы должны 

определять методы экземпляра для получения или изменения состояния  

объекта. 

Ранее мы определили переменную экземпляра с именем cur rentCalor ies в  

классе Vi rtual Pet. Концептуально эта переменная описывает степень голода каждого 

животного. Чтобы внешний код мог изменять степень голода животного, мы можем 

сделать переменную currentCalories открытой. В этом случае внешний код 

будет присваивать переменной, описывающей степень голода, любое произвольное 

значение, как показано в следующем коде: 

somePet.currentCalories = 5000: 

Тем не менее предыдущий подход обладает серьезным недостатком. Если внешний 

код сможет непосредственно изменять значение переменной currentCalories, 

то у класса VirtualPet не будет никакой возможности убедиться, что  

значение, присваиваемое переменной, является допустимым, или осмысленным.  

Например, внешний код может присвоить переменной currentCalories значение 

1 000 000, позволив животному жить сотни лет, не испытывая голода. Или, если 

внешний код присвоит переменной currentCalories отрицательное значение, 

может произойти сбой программы. 

Для того чтобы избежать подобных проблем, мы должны объявить переменную 

currentCalories закрытой (как мы сделали это раньше в классе VirtualPet). 

Вместо того чтобы позволять внешнему коду непосредственно изменять  

значение переменной currentCalories, мы добавим один или несколько открытых 

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

голода каждого животного допустимым способом. Наш класс VirtualPet уже 

обладает методом eat ( ) для утоления голода животного. Тем не менее этот 

метод позволяет добавлять любое количество калорий к значению переменной 

currentCalories. Модифицируем метод eat ( ) класса VirtualPet таким 

образом, чтобы значение переменной currentCalories не могло превышать 

2000: 

public function eat (numberOfCalories) { 
currentCalories += numberOfCalories; 
Чтобы ограничить максимальное значение переменной currentCalories числом 
2000, мы просто добавим оператор if в метод eat ( ), как показано в следующем 
коде: 
public function eat (numberOfCalories) { 
// Рассчитать новое предложенное количество калорий 
// для данного животного 
var newCurrentCalories = currentCalories + numberOfCalories; 
// Если новое предложенное количество калорий для данного животного 
// больше максимально допустимого значения (то есть 2000)... 
if (newCurrentCalories > 2000) { 
// ...присвоить переменной currentCalories максимально 
// допустимое значение B000) 
currentCalories = 2000: 
} else { 
// ...в противном случае увеличить значение переменной currentCalories 
// на указанное количество калорий 
currentCalories = newCurrentCalories; 
Метод eat ( ) класса VirtualPet предоставляет внешнему коду безопасный 
способ4изменения степени голода выбранного объекта VirtualPet. Однако до 
сих пор класс VirtualPet не предоставлял внешнему коду никакой  
возможности для определения степени голода. Чтобы предоставить внешнему коду доступ 
к этой информации, определим метод getHunger ( ), возвращающий оставшееся 
количество калорий у объекта VirtualPet, выраженное в процентах. Код нового 
метода выглядит следующим образом: 
public function getHunger ( ) { 
return currentCalories / 2000: 
Теперь у нас есть методы для получения и изменения текущей степени голода  
объекта VirtualPet (getHunger ( ) Heat( )). В традиционной терминологии  
объектно-ориентированного программирования метод, который получает состояние 
объекта, называется методом-аксессором, или, более неофициально,  
методом-читателем. С другой стороны, метод, который изменяет состояние объекта, называется 
методом-мутатором, или, более неофициально, методом-писателем. Тем не менее 
в языке ActionScript 3.0 термин «метод-аксессор» относится к особой  
разновидности методов, которые оформляются с использованием синтаксиса чтения и записи 
значения переменной и рассматриваются далее, в разд. «Get- и set-методы». Как 
отмечалось ранее, чтобы избежать путаницы в этой книге, мы не будем употреблять 
традиционные термины «аксессор», «мутатор», «читатель» и «писатель». Вместо 
этого мы воспользуемся неофициальными терминами метод-получатель и метод- 
модификатор при обсуждении методов-аксессоров и методов-мутаторов. Более 
того, мы будем применять термины «get-метод» и «set-метод» только в отношении 
специальных автоматических методов языка ActionScript. 
Чтобы немного попрактиковаться в использовании методов-получателей и  
методов-модификаторов, снова изменим класс VirtualPet. Раньше для получения 
и присвоения имени объекту VirtualPet мы обращались непосредственно к  
переменной petName, как показано в следующем коде: 
somePet.petName = "Erik"; 
Предыдущий подход тем не менее в дальнейшем может стать источником проблем 
в нашей программе. Он позволяет присваивать переменной petName очень  
длинные значения, которые могут не вместиться на экране при отображении имени 
животного. Кроме того, переменной petName может быть присвоена пустая строка 
(""), которая вообще не отобразится на экране. Чтобы избежать описанных  
проблем, объявим переменную petName закрытой и определим метод-модификатор 
для задания имени животного. Наш метод-модификатор se tName ( )  
ограничивает максимальную длину имени 20 символами и предотвращает попытки присвоить 
переменной petName пустую строку (" "): 
public function setName (newName) { 
// Если длина заданного нового имени больше 20 символов... 
if (newName.length > 20) { 
// ...обрезать имя. используя собственный метод String.substr( ). 
// возвращающий указанную часть строки, над которой 
// выполняется данный метод 
newName = newName.substr@. 20); 
} else if (newName == "") { 
// ...в противном случае, если заданное новое имя является 
// пустой строкой, завершить выполнение метода, не изменяя 
// значения переменной petName 
return; 
// Присвоить новое проверенное имя переменной petName 
petName = newName; 
Теперь, когда мы объявили переменную petName закрытой, необходимо  
определить метод-получатель, с помощью которого внешний код сможет получить  
доступ к имени объекта VirtualPet. Мы присвоим нашему методу-получателю имя 
getName ( ). Пока этот метод будет просто возвращать значение переменной 
petName (зачастую возвращение значения переменной экземпляра является  
единственной задачей метода-получателя). Рассмотрим код метода: 
public function getName ( ) { 
return petName; 
В настоящее время метод getName ( ) очень прост, однако он добавляет гибкость 
в нашу программу. Например, в будущем может понадобиться, чтобы имена  
животных формировались с учетом пола. Для этого мы просто обновим метод, как 
Глава 3. Пересмотр методов экземпляра 
показано далее (следующая гипотетическая версия метода getName ( )  
предполагает, что в классе VirtualPet определена переменная экземпляра gender, 
хранящая пол каждого животного): 
public function getName ( ) { 
if (gender == "male") { 
return "Mr. " + petName; 
} else { 
return "Mrs. " + petName; 
В листинге 3.2 продемонстрирован новый код класса VirtualPet, в который были 
добавлены определения методов getName ( ) и setName ( ). Для лучшей  
читабельности метод экземпляра ge tAge ( ) и переменная экземпляра creat ionTime 
были удалены из описания класса VirtualPet. 
Листинг 3.2. Класс VirtualPet 
package zoo { 
internal class VirtualPet { 
private var petName; 
private var currentCalories = 1000; 
public function VirtualPet (name) { 
petName = name; 
public function eat (numberOfCalories) { 
var newCurrentCalories = currentCalories + numberOfCalories; 
if (newCurrentCalories > 2000) { 
currentCalories = 2000; 
} else { 
currentCalories = newCurrentCalories; 
public function getHunger ( ) { 
return currentCalories / 2000; 
public function setName (newName) { 
// Если длина заданного нового имени больше 20 символов... 
if (newName.length > 20) { 
// ...обрезать имя 
newName = newName.substr@. 20): 
} else if (newName == "") { 
// ...в противном случае, если заданное новое имя является 
// пустой строкой, завершить выполнение метода, не изменяя 
// значения переменной petName 
return; 
юэ 
// Присвоить новое проверенное имя переменной petName 
petName = newName: 
public function getName ( ) { 
return petName; 
Теперь рассмотрим пример использования наших новых методов getName ( ) 
и setName ( ): 
package zoo { 
public class Virtual Zoo { 
private var pet; 
public function Virtual Zoo ( ) { 
pet = new Virtual Pet("Stan"): 
// Присвоить старое имя животного локальной переменной oldName 
var oldName = pet.getNameC ); 
// Дать животному новое имя 
pet.setNameCMarcos"); 
Используя метод-модификатор для промежуточного присваивания значения  
переменной, мы можем разрабатывать приложения, способные адекватно реагировать 
на ошибки времени выполнения путем определения и обработки недопустимых 
или неподходящих значений. Значит ли это, что доступ ко всем переменным  
экземпляра должен осуществляться через методы? Например, рассмотрим метод- 
конструктор нашего класса VirtualPet: 
public function VirtualPet (name) { 
petName = name; 
Теперь, когда у нас появился метод для изменения значения переменной petName, 
должны ли мы модифицировать метод-конструктор класса VirtualPet  
следующим образом? 
public function VirtualPet (name) { 
setName(name): 
Ответ зависит от имеющихся условий. Вообще говоря, непосредственное  
обращение к закрытым переменным, описанным в данном классе, является вполне 
приемлемым. Тем не менее, если существует вероятность, что имя или роль  
переменной в будущем будут изменены, или если метод-модификатор или  
метод-получатель выполняют определенные действия при обращении к переменной  
(например, проверку на наличие ошибок), имеет смысл применять методы везде, даже 
внутри класса, в котором описана данная переменная. Например, в предыдущем 
модифицированном методе-конструкторе класса Virtual Pet разумно  
присваивать значение переменной petName именно через метод setName ( ), поскольку 
это гарантирует, что указанное имя не окажется слишком длинным или коротким. 
И все-таки, в тех случаях, когда решающим фактором является быстродействие, 
благоразумнее использовать непосредственный доступ к переменной (его получить 
всегда быстрее, чем доступ через метод). 
Программисты, предпочитающие использовать стиль непосредственного доступа 
к переменным, но при этом не желающие отказываться от преимуществ методов- 
получателей и методов-модификаторов, обычно применяют автоматические get- 
и set-методы языка ActionScript, рассматриваемые в следующем разделе. 




BACK NEXT

Сайт является частным собранием материалов и представляет собой любительский информационно-образовательный ресурс. Вся информация получена из открытых источников. Администрация не претендует на авторство использованных материалов. Все права принадлежат их правообладателям