синтезировать геттеры/сеттеры в AS3

Есть ли способ синтезировать геттеры/сеттеры в AS3? Очень часто у вас есть класс с большим количеством переменных, особенно в математических вычислениях (модель в шаблоне MVC), которые вы хотели бы предоставить. Есть ли что-то вроде свойства синтеза в Objective-C, которое позволяет генерировать геттеры/сеттеры?

Спасибо,

Нава


person Nava Carmon    schedule 16.11.2009    source источник


Ответы (4)


РЕДАКТИРОВАТЬ: Если вы хотите использовать IDE (eclipse). Вы можете пойти вправоНажмите на класс->Источник->Создать геттеры и сеттеры

Это не то же самое, что и синтез, но если вы хотите просто показать их и не использовать нотацию getMethod(), это может помочь вам объявить методы с ключевыми словами get/set, как это.

public function get example() : int
{
             return example;
}
public function set example( value : String ) : void
{
             example = value;
}

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

person Diego Dias    schedule 16.11.2009
comment
Спасибо, я знаю, как работать с геттерами/сеттерами, мой вопрос был, есть ли какой-то атрибут, который просто говорит: сгенерируйте их для меня. Писать геттеры/сеттеры для 20 переменных вручную — это много грязной работы и перегрузки кода. Вы получаете 40 функций с очень высокой вероятностью копирования/вставки ошибок. Я думал, что есть более элегантный способ сделать это - person Nava Carmon; 16.11.2009
comment
Если вы хотите использовать IDE (eclipse). Вы можете пойти вправо. Нажмите на класс->Источник->Создать геттеры и сеттеры - person Diego Dias; 16.11.2009

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

Например, если ваши переменные private имеют имя _str, а вы хотите, чтобы public геттер/сеттер назывался str, вы можете использовать следующие шаблоны. Нажмите Ctrl-F в flex builder (или eclipse), установите флажок регулярного выражения и добавьте следующие шаблоны в поля поиска и замены соответственно. Теперь нажмите «Найти», чтобы найти объявление свойства, и нажмите «Заменить», чтобы сгенерировать сеттер и геттер.

^((\t)+)private\s+var\s+_(\w+):(\w+)\s*;\s*(\n)

$0$5$1public function set $3(value:$4):void$5$1{$5$1$2_$3 = value;$5$1}$5$5$1public function get $3():$4$5$1{$5$1$2return _$3;$5$1}$5$5

Этот шаблон был протестирован на

        private var _str:String;//indented by two tabs

И он успешно сгенерировал:

    private var _str:String;

    public function set str(value:String):void
    {
        _str = value;
    }
    public function get str():String
    {
        return _str;
    }
person Amarghosh    schedule 16.11.2009

Для тех, кто использует Flex Builder 3 IDE, есть плагины для создания и размещения фрагментов кода, например. здесь: http://www.insideria.com/2008/04/flex-builder-enhancements-snippets-and-todo.html (на этом сайте есть несколько других небольших, но полезных инструментов)

Их можно использовать для более или менее удобной генерации геттера/сеттера.

Однако я создаю явные геттеры и сеттеры только в том случае, если мне нужно разместить там дополнительный код. Некоторые говорят, что инкапсуляция нарушается, если вы не используете геттеры и сеттеры. Однако с языком, в котором вы можете добавлять геттеры и сеттеры позже, не меняя интерфейс, я не думаю, что это уже верно. Для пользователя совершенно прозрачно, использует ли он простое назначение переменной или набор функций varName(arg:object):void.

А также имейте в виду, что если вы сделаете переменную [Bindable] (т.е. без явного имени события), компилятор создаст геттеры и сеттеры для вашей переменной, даже не заметив этого (кроме того, что геттеры и сеттеры уже есть). Это, кстати, быстрый и грязный способ реализации интерфейсов, которые объявляют функции получения и установки.

person Jörg Reichardt    schedule 16.11.2009
comment
Это мило. Жаль, что нельзя выбрать пару ответов в качестве ответа, но я всегда могу проголосовать :) - person Nava Carmon; 16.11.2009
comment
Это всегда ценится :) - person Jörg Reichardt; 16.11.2009
comment
Я согласен с этим - если все, что вы делаете, это создаете оболочку getter/setter без какого-либо особого поведения, тогда нет никакой разницы в том, чтобы просто иметь общедоступное свойство непосредственно для переменной. - person Sly_cardinal; 17.11.2009

Если вы просто сделаете его общедоступным, вам не нужно беспокоиться о геттерах и сеттерах:

public var str:String;

Однако, если вам нужно что-то вроде диспетчеризации событий, чтобы уведомлять себя об изменениях свойств, вам нужно будет написать код самостоятельно. Надеюсь, какая бы IDE вы ни использовали, она может помочь вам сгенерировать такой код, или вам может понадобиться настроить какой-то фрагмент кода, который DIE может внедрить для вас.

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

person Rhysyngsun    schedule 16.11.2009
comment
Я использую затмение. Я бы хотел, чтобы эти свойства были частными, например: private var _str:String; и сгенерируйте публичный геттер и сеттер. Вы знаете, как мне сделать это в eclipse? Спасибо, Нава - person Nava Carmon; 16.11.2009