Другие языки программирования и технологии

Зачем нужны геттеры и сеттеры? Не нарушают ли они принцип инкапсуляции?

Oleg Saltovskij
Oleg Saltovskij
1 530
Я только учусь так что мои слова могут не являться истинной. Мое предположение что в таком виде как у вас не имеет смысла использовать. Но например вы знаете что значение property не может быть больше чем 31(число взято от болды) и как вы тогда будете это отслеживать? А посредством метода set() вы легко можете это отслеживать и в случае чего править значение либо бить в тревогу! Это один из вариантов использования.
Миночкин Денис
Миночкин Денис
15 408
Лучший ответ
Дильшод Сафаров Немного дополню ответ: на свойства еще можно накрутить валидационные атрибуты, как встроенные ([Required], [StringLength], [Range] и т. д.), так и кастомные, в которые можно вынести всю логику проверки значения свойства, не захламляя при этом сложной логикой код модели.
>Зачем нужны геттеры и сеттеры?
Для контроля доступа, проверки правильности значений.

>Не нарушают ли они принцип инкапсуляции?
Сами по себе - не нарушают. А уж что ты там УНУТРЕ наворотишь - это всецело на твоей совести.
Я бы даже сказал, что принципиально они помогают инкапсуляции, не позволяя тебе путем прямого изменения значений привести объект в некоторое непредвиденное состояние.
ko
kondakov_a_62
89 753
Они нужны именно для того, чтобы НЕ нарушать инкапсуляцию. Ты работаешь только с интерфейсными функциями - ничего не зная о том, где и как хранятся значения.

Таким образом, класс может полностью контролировать, что тебе отдать и что ты можешь записать. Вместо совершенно бесконтрольного доступа к public-полю.

P.S. Разумеется, а разных языках семантика и возможности get/set различаются.
DB
Doszhan Bekmagambetov
66 357
Если тебе нужно не тупо вернуть значение или присвоить что попало, тогда геттеры и сеттеры придут на помощь.
К примеру, свойство не обязательно должно соответствовать какому-то физическому полю в объекте, оно может возвращать результат выполнения какой-то функции над полями в объекте, это поведение и описывается в геттере.
Точно также, сеттер может не обязательно тупо присваивать переданное ему значение полю, он может проверять его на валидность, может как-нибудь его модифицировать, может при присвоении выполнять какие-то ещё действия.
Не нарушают, потому что они дают нужную функцию. Свойствами объектов иногда требуется управлять извне. Иногда они нужны для чтения, а иногда и для записи.
Игорь Лим
Игорь Лим
79 451
ну по сути нарушают. так как в инкапсуляции заложена идеология изолирования методов и полей от прямого воздействия.

А вот так вы не сможете object.property
Только если свойство вы перенесете в паблик секцию.

Смысл гетов и сетов не только в том чтобы можно было получить доступ к свойству... например при наследовании объект дочернего класса сможет получить доступ к закрытым полям родительского только если в родительском будут геты и сеты)))) таким образом если объектов для родительского не будет, то вся конструкция в целом будет придерживаться идеологии....
Александр Karpov
Александр Karpov
10 755
Oleg Saltovskij Просто сделаю property public'ом и буду обращаться через точку. Просто не понимаю в чем разница.