поиск

Сеттером по геттеру (Баллада о резонности применения явных геттеров и сеттеров и функций оболочек)

Намусорил: Юрий «Бармалей» Яровой
В категории: Теория разработки

Долгое время я жил в заблуждении, что методы оболочки типа getValue() и setValue(), предпочтительнее чем явные геттеры и сеттеры — get value и set value — поскольку каждая из них может как принимать парамерты, так и возвращать какое-либо значение. Оказывается я ошибался. Но теперь я знаю истину и даю ее вам. Используйте ООП на благо своего отечества.

Большая часть информация для этой статьи почерпнута из беседы с одним более опытным чем я программистом, за что я выражаю ему огромную благодарность. Спасибо, Григорий! =)

Итак, поехали.

Все знают, что существуют два способа создать функции чтения-установки свойств:

  1. Воспользоваться явными функциями чтения и установки при помощи конструкций, подерживаемых языком. Пример:
    // Закрытая переменная.
    private var _something:Type;
    
    // Явный геттер переменной something;
    public function get something():Type {
    	return _something;
    }
    // Явный сеттер переменной something;
    public function set something(s:Type):Void {
    	_something = s;
    }
  2. Использовать функции оболочки над приватной переменной:
    // Закрытая переменная.
    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 и что мы с ним будем делать?

Ну вот теперь вы тоже все знаете. Спасибо за внимание. Удачи!



Kомментариев - 3 к «Сеттером по геттеру (Баллада о резонности применения явных геттеров и сеттеров и функций оболочек)»

iv [13 апреля, 2007 в 00:23]

К сожалению, водораздел между get value и getValue происходит по другой полосе и это никак в статье не описано.
Основная проблема - невозможность наследования геттеров-сеттеров.
Простейший пример - попробуй создать пользовательское свойство мувиклипа _x или _yscale и т.п.
По сравнению с этой проблемой, вопросы удобочитаемости -писаемости - говно вопрос.

да, и еще: интерпрЕтатор.

пасиб,
желаю удачи и активного развития твоему блогу.
iv

Юрий Яровой [13 апреля, 2007 в 01:10]

Спасибо, ошибку исправил.

На самом деле эта статья была опубликована еще в моем старом блоге. И там в комментариях Костя «Constantiner» Ковалев высказал одну очень важную мысль по этому поводу:

Смысл в том, что использование гет/сет методов в Java-стиле (getSomething, setSomething) было актуально в AS2 (вместо геттеров/сеттеров function get something, function set something). Ибо там реализация геттеров/сеттеров была ужасно непродуманной. Их нельзя было описать в интерфейсе, от них нельзя было отнаследоваться (вызов super для таких методов отсутствовал). Думаю, что именно оттуда пошло пренебрежение геттерами/сеттерами у программистов в ООП-стиле. Я лично сам всех старался предостерегать от бездумного использования геттеров/сеттеров.

В AS3 геттеры/сеттеры приобрели все черты, которые должны у них быть. И теперь геттеры/сеттеры просто являются методами, которые используются особым способом. И использовать их стало удобнее в большинстве случаев. Ну а с учетом декларативности MXML - это вообще панацея.

iv [13 апреля, 2007 в 12:51]

Да. Костя всё верно по полочкам разложил.
Я имел ввиду только AS2.

Написать комментарий:

 

Bы можете использовать следующие теги для форматирования: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>



User's collector

Внимание!
Эта опция станет доступной только после того как вы авторизуетесь.


 запомнить меня 
Я новый пользователь

На правах рекламы