Пять причин использовать сеттеры и геттеры в ActionScript 3.0

Из предыдущего урока вы уже знаете, что такое сеттеры и геттеры в ActionScript 3.0. Но стоит ли их использовать? Зачем возиться с созданием дополнительных функций (методов класса) только для «обертывания» свойства? В данном уроке рассмотрим пять достаточно полезных причин использования сеттеров и геттеров:

  1. Вы можете использовать свойства только для чтения (или только для записи)
  2. Вы можете выполнять проверку данных и автоматическую корректировку входящих значений
  3. Вы можете синтезировать данные
  4. Вы можете скрыть наиболее важную логику за простым свойством
  5. Вы можете спровоцировать визуальные изменения через изменение свойства

Лично я использую эти подходы в программировании классов довольно часто.

Причина 1: Вы можете использовать свойства только для чтения (или только для записи).

Делая свойство личным (директива private) и описывая только общий (public) геттер (который не совпадает с сеттером), вы можете установить доступ для чтения значения, но отключить возможность изменения значения свойства вне класса. Это полезно для неизменяемых объектов, которые содержат и передают кучу данных, но не должны изменяться после создания.

private var _value: String = "test";

public function get value (s:String):void {
  return _value;
}

Если описать только геттер, но не описывать сеттер, то при попытке присвоения значений свойству value компилятор выдаст сообщение об ошибке «1059: Property is read-only.» (свойство только для чтения).

Причина 2: Вы можете выполнять проверку данных и автоматическую корректировку входящих значений

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

Точно так же вы можете указать значения по умолчанию или обработать значения типа null с какой-то логикой. Предположим у вас есть объект Person, у которого есть свойства firstName и lastName. Допустим деловая логика приложения диктует чтобы свойства не были типа null. Они могут быть пустыми строковыми значениями (String), но не могут быть со значением null (ну, потому что, скажем, мы будет производить поиск в этих данных и было бы намного легче знать наверняка, что значения имеют тип String, а не проверять каждый раз данные на значение null).

Итак, в вашем сеттере должно быть что-то вроде этого:

public function set firstName(s:String):void {
if (!s) s = "";
_firstName = s;
}

Если вы думаете, что сможете выполнить этот код со значениями по умолчанию в качестве аргументов, то взгляните на сообщение компилятора «error #1123: «A setter definition cannot have optional parameters.» (Определение сеттера не может иметь дополнительные параметры).

public function set firstName(s:String = ""):void {
  _firstName = s;
}

Причина 3: Вы можете синтезировать данные

Представьте тот же объект Person из предыдущего примера со свойствами firstName и lastName. Чтобы также выполнить свойство fullName, вы можете создать фактическое свойство и проверять обновлять свойство fullName каждый раз когда назначаете данные свойству firstName и/или свойству lastName. Или вы можете просто создавать геттер fullName, который возвращает автоматически соединенные строки из двух переменных:

public function get fullName():String {
  return firstName + " " + lastName;
}

Причина 4: Вы можете скрыть наиболее важную логику за простым свойством

У вас может быть кнопка, которая содержит спрайт и обрабатывает основную интерактивность. «Активный» сеттер может принимать простое значение типа Boolean и превращать его в более сложную логику, которая добавляет или удаляет слушатели событий, включает или выключает курсор мыши, включает или выключает свойства спрайта mouseEnabled.

Давайте создадим такой класс кнопки. Нарисуйте какой-нибудь объект на сцене и конвертируйте его в Button, укажите в поле Class название нового класса «ButtonTest». Код класса кнопки будет следующим:

package  {

import flash.display.SimpleButton;
import flash.events.MouseEvent;

public class ButtonTest extends SimpleButton {
  private var _isEnabled: Boolean = true;

  public function ButtonTest() {
    addEventListener(MouseEvent.CLICK,onClick);
  }

  public function set isEnabled (value:Boolean){
    _isEnabled = value;

    if (value) {
      addEventListener(MouseEvent.CLICK,onClick);
      useHandCursor = true;
      mouseEnabled = true;
    }
    else {
      removeEventListener(MouseEvent.CLICK,onClick);
      useHandCursor = false;
      mouseEnabled = false;
    }
  }

  public function get isEnabled ():Boolean{
    return _isEnabled;
  }

  public function onClick (e:MouseEvent){
    trace("button clicked!");
  }

}
}

Теперь, если в основном коде, например, на кадре в окне редактирования кода, изменить свойство кнопки isEnabled, то произойдут и другие изменения через этой свойство.

Исходники этого примера вы можете скачать здесь.

Причина 5: Вы можете спровоцировать визуальные изменения через изменение свойства

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

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

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

Смотрите также:

ActionScript 3: Что такое сеттеры и геттеры?ActionScript 3: Что такое сеттеры и геттеры?


ActionScript 3: Сохранение данных при помощи SharedObject в AdobeFlashActionScript 3: Сохранение данных при помощи SharedObject в AdobeFlash


Комментировать

Почта не публикуется.Обязательные поля отмечены *