User's collector

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

Долгое время я жил в заблуждении, что методы оболочки типа 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 и что мы с ним будем делать?

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

3 комментария