Есть ли преимущества в использовании свойств перед общедоступными переменными?

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

Так что я начал задаваться вопросом, в чем было преимущество, и должен сказать, что в некоторых случаях я вообще понятия не имел. Конечно, это удобно, когда при установке свойств или получении свойств необходимо выполнить какую-то другую логику, но есть ли какое-то преимущество в использовании свойств, когда вы только получаете / устанавливаете переменную? Пример того, что я имею в виду, показан ниже (As3).

private var _myVariable:SomeClass;

public function get myVariable():SomeClass{
    return _myVariable;
}

public function set myVariable(value:SomeClass):void{
    _myVariable = value;
}

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


person Michiel Standaert    schedule 14.06.2011    source источник


Ответы (2)


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

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

person DanielB    schedule 14.06.2011
comment
Итак, я должен использовать геттеры / сеттеры только тогда, когда я хочу добавить логику или когда я хочу создать класс, расширяющий этот класс? И имеет ли использование свойств какое-либо отношение к безопасности и защищенным переменным или нет? :) - person Michiel Standaert; 14.06.2011
comment
Да, если вы можете расширить этот класс позже, или если вы хотите, чтобы какой-то другой программист расширил этот класс позже, вы должны реализовать геттер / сеттер с защищенной или частной переменной. Но это не имеет ничего общего с безопасностью. В некоторых случаях вы хотите запретить другим изменять переменную, чтобы ваш код работал согласованно. В этом случае я использую частную переменную. - person DanielB; 14.06.2011
comment
Хорошо, спасибо за объяснение! Я также приму ваш ответ позже в этот же день, но пока я оставлю этот вопрос открытым, чтобы я мог получить еще несколько отзывов по этому вопросу (если у кого-то еще есть еще) :) - person Michiel Standaert; 14.06.2011
comment
Конечно, оставьте его открытым до тех пор, пока вы сможете получить чистые идеи. - person DanielB; 14.06.2011

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

Например, в .net двоичная подпись свойства отличается от подписи общедоступного поля. Таким образом, вы не можете изменить поле на свойство, не перекомпилировав код потребителя. Обычно это неприемлемо для компонента, поэтому лучше начать с использования свойств. (Не уверен, как это работает в AS.)

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

person JacquesB    schedule 14.06.2011
comment
в As3 вы всегда перекомпилируете при сборке, поэтому изменение переменных на свойства не будет проблемой. И имеет ли использование геттеров / сеттеров какое-то отношение к безопасности или нет? И спасибо за ответ! - person Michiel Standaert; 14.06.2011
comment
@Michiel: не безопасность в смысле защиты от хакеров, но проверка внутри геттеров / сеттов может улучшить модульность и надежность, гарантируя, что пользователь не приведет объект в недопустимое состояние. - person JacquesB; 14.06.2011
comment
Большое спасибо за разъяснение :) - person Michiel Standaert; 14.06.2011