Преимущества геттера / сеттера по сравнению с публичными переменными? - PullRequest
4 голосов
/ 23 декабря 2009

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

private var _someProp:String;

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

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

public var someProp:String;

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

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

Но если вам это не нужно, то есть ли причина использовать getter / setter вместо простого публичного var?

Спасибо !!

Ответы [ 6 ]

4 голосов
/ 23 декабря 2009

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

1 голос
/ 23 декабря 2009

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

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

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

1 голос
/ 23 декабря 2009

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

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

0 голосов
/ 23 декабря 2009

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

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

   if(age <= 0)
       retVal = false;

   return retVal;
}

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

0 голосов
/ 23 декабря 2009

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

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

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

0 голосов
/ 23 декабря 2009

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

...