Преимущества геттера / сеттера VS общедоступных варов?

Есть ли польза от использования:

private var _someProp:String;

public function set someProp(value:String):void
{
    _someProp = value;
}
public function get someProp():String
{
    return _someProp;
}

В отличие от простого использования:

public var someProp:String;

Я понимаю, что использование геттера / сеттера может быть полезно, когда вам нужна дальнейшая обработка или вам нужно получать уведомление о том, когда свойство изменяется следующим образом:

public function set someProp(value:String):void
{
    _someProp = value;
    _somePropChanged = true;
    doSomethingElse();
}

Но если вам это не нужно, то есть ли причина использовать геттер / сеттер вместо использования общедоступной переменной?

Спасибо!!


person JD Isaacks    schedule 22.12.2009    source источник
comment
Дубликат этого stackoverflow.com/questions/1568091/why- методы получения и установки   -  person Andreas Brinck    schedule 23.12.2009


Ответы (6)


В зависимости от вашего языка вы должны предпочесть геттер / установщик заранее, потому что вы не можете представить их позже (я смотрю на вас, Java), если окажется, что они вам действительно нужны.

person Hank Gay    schedule 22.12.2009
comment
Почему вы не можете изменить его позже в Java? - person JD Isaacks; 23.12.2009
comment
Потому что у него нет понятия свойства: есть переменные экземпляра и методы экземпляра. Итак (при условии соглашений о компонентах), чтобы получить доступ к свойству foo, вы вызываете getFoo() и устанавливаете свойство foo, которое вызываете setFoo(myFoo). - person Hank Gay; 23.12.2009
comment
(и в случае, если это не было ясно из контекста, будет переменная экземпляра private с именем foo, которую используют как getFoo(), так и setFoo(). - person Hank Gay; 23.12.2009

Это действительно немного зависит от языка / фреймворка / инструментария, который вы используете -

Однако при использовании геттеров и сеттеров часто есть преимущества, связанные с управлением версиями и совместимостью API. Это может быть очень полезной причиной для их самостоятельного использования.

person Reed Copsey    schedule 22.12.2009

На это действительно невозможно ответить, не зная языка. Геттеры и сеттеры на большинстве языков стоят дороже, но в будущем они дадут вам гибкость. На некоторых языках вы не можете изменить общедоступный объект на Getter / Setter, не изменив код в вызывающих объектах, поскольку изменяется синтаксис использования. Но это не проблема C #, о которой я пишу в основном.

Геттеры и сеттеры позволяют выполнять проверку параметров. Они позволяют отложить создание объектов до первого обращения. У них много преимуществ, и я использую их всякий раз, когда мне нужно одно из этих преимуществ с самого начала.

Но я использую геттеры и сеттеры ТОЛЬКО тогда, когда они мне нужны сразу или когда я почти уверен, что мне понадобится гибкость. В противном случае я считаю их раздутыми.

person John Knoeller    schedule 22.12.2009

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

person NotMe    schedule 22.12.2009
comment
Однако это обычно нарушает двоичную совместимость. - person Anon.; 23.12.2009

Если ваше свойство совершенно тупое и не имеет побочных эффектов для остальной части класса - тогда в любом случае просто выставьте его как общедоступное поле.

Просто во многих случаях ваши свойства будут иметь побочные эффекты, поэтому вам нужно контролировать их установку и доступ.

В качестве тривиального примера: что произойдет, если ваша общедоступная переменная не будет установлена ​​на что-то в вашем конструкторе? Вы согласны с тем, что это возвращается как null? Или вы хотите установить для этой переменной что-то, а не возвращать null? Это простой пример, в котором есть смысл использовать собственный геттер.

person Alex    schedule 22.12.2009

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

bool setAge(int age){
   bol retVal = true;

   if(age <= 0)
       retVal = false;

   return retVal;
}

Без установщика значение могло быть установлено равным нулю, и могли случиться плохие вещи.

person Sean    schedule 22.12.2009