Страницы

Поиск по вопросам

вторник, 2 апреля 2019 г.

Использование геттеров и сетторов

Есть ли смысл использовать геттеры и сеттеры внутри классов их содержащих?


Ответ

Смотрите.
Есть большая разница между использованием сеттера, и использованием ассоциированного поля. Эта разница — в семантике операции.
Использование сеттера означает «установить логическое значение свойства, и выполнить все связанные с этим побочные эффекты». Например, если у вас есть несколько связанных полей, это может обновить значения других полей тоже. Если у вас модификация свойства должна отправлять нотификацию подписчикам, нотификация будет отправлена.
Использование поля означает «изменить физическое хранилище свойства», тут внимание акцентируется не на логике, а на механизме хранения. Это низкоуровневая операция, и после её выполнения, возможно, вам понадобится выполнить нужные побочные эффекты вручную.
Отсюда следует и различие в использовании. Большую часть времени вам нужно присвоение через сеттер: код сеттера позаботится о том, чтобы данные остались в консистентном состоянии, и контракты были выполнены.
Но существуют и случаи, когда вам нужно, наоборот, обратить внимание на механику и воспользоваться полем. Типичный случай этого — это ситуация, когда у вас значения двух полей связаны, и сеттер одного свойства должен установить значение и другого свойства тоже. В этом случае он, скорее всего, должен записывать непосредственно в поле связанного свойства, чтобы избежать бесконечной рекурсии. Другой типичный случай — сеттер производит затратную валидацию значения, а вам точно известно, что значение правильное, и вы хотите этой валидации избежать.

То, что в текущей реализации ваш сеттер лишь присваивает значение полю, не так уж и важно. Через некоторое время, с увеличением сложности вашего кода, сеттер может разрастись, и тогда, если вы не пользовались сеттером, вам придётся пересмотреть код класса, чтобы понять, в каком из случаев вам нужен логический (класс остаётся в правильном состоянии), а в каком — физический эффект присвоения (просто значение поля меняется, и всё). Поэтому лучше подумать заранее и установить значение нужной образом.

А с геттером ситуация точно такая же. Единственная разница — геттер реже имеет побочные эффекты. (Но вполне может, например, если у вас ленивое вычисление начального значения свойства.)

Комментариев нет:

Отправить комментарий