Долгое время я жил в заблуждении, что методы оболочки типа getValue() и setValue(), предпочтительнее чем явные геттеры и сеттеры — get value и set value — поскольку каждая из них может как принимать парамерты, так и возвращать какое-либо значение. Оказывается я ошибался. Но теперь я знаю истину и даю ее вам. Используйте ООП на благо своего отечества.
Большая часть информация для этой статьи почерпнута из беседы с одним более опытным чем я программистом, за что я выражаю ему огромную благодарность. Спасибо, Григорий! =)
Итак, поехали.
Все знают, что существуют два способа создать функции чтения-установки свойств:
- Воспользоваться явными функциями чтения и установки при помощи конструкций, подерживаемых языком. Пример:
// Закрытая переменная. private var _something:Type; // Явный геттер переменной something; public function get something():Type { return _something; } // Явный сеттер переменной something; public function set something(s:Type):Void { _something = s; } - Использовать функции оболочки над приватной переменной:
// Закрытая переменная. private var _something:Type; // Функция-оболочка над переменной something; public function getSomething():Type { return _something; } // Функция-оболочка над переменной something; public function setSomething(s:Type):Void { _something = s; }
Особенности первого способа:
- При его использовании мы получаем более чистый и понятный код. При попытке прочитать свойство
somethingинтерпретатор языка автоматически вызовет методget something()и возвратит значение закрытой переменной_something. Аналогично, при попытке присвоить что-либо свойствуsomethingинтерпретатор автоматически вызовет методset something()и передаст ему в качестве параметра присваиваемое значение.myVar = something; // Вызовет метод get something(). something = myVar; // Вызовет метод set something(myVar). - Есть возможность защитить свойство от записи попросту не создавая метод
set something():// Закрытая переменная. private var _something:Type; // Явный геттер переменной something; public function get something():Type { return _something; } myVar = something; // Вызовет метод get something(). something = myVar; // НЕВЕРНО! Нельзя присвоить значение свойству, // доступному только для чтения. - Метод чтения свойства не может принимать параметров, а метод установки возвращать какое-либо значение;
- Во Flex геттеры и сеттеры становятся параметрами MXML компонента:
<someComponent someVar="value"/>
Особенности второго способа:
- Удобочитаемость кода немного ухудшается. Вместо простого присвавивания и чтения свойств приходится использовать соответствующие методы:
myVar = getSomething(); // Используем вместо "myVar = something;". setSomithing(myVar); // Используем вместо "something = myVar;". - Метод установки свойства может принимать любое число параметров и возвращать какое-либо значение, например, подтверждающее успешность выполнения операции присваивания:
// Используем возвращаемое сеттером значение. var success:Boolean = setSomething(myVar); - Метод чтения свойства может принимать какие-либо параметры для инициализации сложных объектов.
Подведем итоги
Функции оболочки нужно использовать только в следующем случае:
- Когда необходимо получить какое-либо значение, зависящее переданного параметра:
var password:String = getUserPassoword("Barmaley");
Явные методы чтения-установки нужно использовать во всех остальных случаях, т. е.:
- Когда нужно считывать и устанавливать скалярную переменную (текст, цифра, единый простой объект и т.д.). Если это переменная типа int или что-то такое тривиальное, то мы будем знать заранее, что она сетнется. Если установка переменной может привести собой негативный результат и надо сказать что-то типа «сам дурак» то для этого есть встроенный метод обратной связи — ошибки.
Error.throw(), a в родителе при вызове нужно использовать блокtry-catch-finally.Errorможет передать комплексный результат и значительное описание ошибки, тогда какsetSomething()возвратит намtrueилиfalseи что мы с ним будем делать?
Ну вот теперь вы тоже все знаете. Спасибо за внимание. Удачи!
К сожалению, водораздел между get value и getValue происходит по другой полосе и это никак в статье не описано.
Основная проблема - невозможность наследования геттеров-сеттеров.
Простейший пример - попробуй создать пользовательское свойство мувиклипа _x или _yscale и т.п.
По сравнению с этой проблемой, вопросы удобочитаемости -писаемости - говно вопрос.
да, и еще: интерпрЕтатор.
пасиб,
желаю удачи и активного развития твоему блогу.
iv