LINUX.ORG.RU

Геттер и сеттер: что они дают?

 ,


1

1

Уточняю: понятно что некоторые поля классов и т.д. должны быть закрыты от доступа извне. Однако что дает сеттер и геттер вся работа которых, просто тупо присвоить значение без каких-либо проверок или же отдать значение без проверок. В чем сакральное преимущество перед обычным присвоением или прямым доступом к полю у такого сеттера\геттера? Когда внутри сеттера есть проверки на корректность входного значения, то зачем он-- понятно

★★★★★

Последнее исправление: pylin (всего исправлений: 2)

Ответ на: комментарий от dzidzitop

Не согласны с объективной реальностью? Ну покажи мне как инлайнится лямбда, переданная параметром в рекурсивную функцию. В map, например.

anonymous
()
Ответ на: комментарий от arturpub

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

pulo
()
Ответ на: комментарий от anonymous

Что за map я хз. А в своей одной программе имею соотношение инлайнутые лямбды/неинлайнутые где-то 9/1.

dzidzitop ★★
()

дополнительный слой абстракции создающий «не ломающийся» API.

например:

v0 имеем только одно частное поле

Class {
  private string address

  void|boolean setAddress(string address)
  string getAddress(void)
}

v1 добавляем порт, в set распарсиваем, в get собираем uri

Class {
  private string address
  private int port

  void|boolean setAddress(string uri)
  string getAddress(void)
}

v2 добавляем протокол, в set распарсиваем, в get собираем uri

Class {
  private string address
  private int port
  private enum protocol

  void|boolean setAddress(string uri)
  string getAddress(void)
}

в итоге снаружи класса ничего не изменилось и все что было написано для первого варианта не придется переделывать

exception13 ★★★★★
()

без каких-либо проверок или же отдать значение без проверок

А если потом проверка понадобится? Добавлять ее в 100500 местах где ты эту переменную присваивал?

drull ★☆☆☆
()
Ответ на: комментарий от drull

Сферический пример? Понадобилось на один параметр добавить кучу проверок - сделал сеттер и сделал установку значения через сеттер. В чем проблема?

pulo
()
Ответ на: комментарий от dzidzitop

С этим согласен, интерфейс предоставляемый наружу в другие модули или сошки должен быть универсальным. Если смотреть на классы внутри одного проекта - большого смысла не вижу везде делать геттеры и сеттеры.

pulo
()
Ответ на: комментарий от pulo

Понадобилось на один параметр добавить кучу проверок - сделал сеттер и сделал установку значения через сеттер. В чем проблема?

В том что эта переменная уже изменяется в сотне мест? И везде надо менять присваивание на сеттер.

drull ★☆☆☆
()
Ответ на: комментарий от drull

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

pulo
()
Ответ на: комментарий от pulo

а то что вы пишете тысячи никогда не пригодившихся сеттеров и геттеров это нормально, где логика?

очень удобно ставіть туда брейкпойнты + возможно добавлять logging

dzidzitop ★★
()
Ответ на: комментарий от dzidzitop

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

pulo
()
Ответ на: комментарий от pulo

Я брейкпойнты ставлю в set/get достаточно часто (в чужом коде).

А так - инкапсуляции достаточно чтобы писать set/get. Остальное - бонусы.

dzidzitop ★★
()

Проблема нагороженных геттеров и сеттеров идет от факта, что объекты мутабельны. Поля объекта устанавливаются и меняются из тысяче мест, в результате чего часто необходима валидация и там и тут и ненужные обертки. Вопрос, а как вы красиво реализовываете валидацию в сеттерах? Вешаете на определенные сеттеры и кидаете иксепшн?

podelkin
()
Ответ на: комментарий от pulo

Длиннее хелло ворда что-нибудь писалось? Особенно евент дривен или ассинхронное? Поговаривают, что очень быстро приучает писать геттеры и сеттеры везде, ну может быть кроме приватных структур. :)

zJes ★★
()
Ответ на: комментарий от podelkin

Вопрос, а как вы красиво реализовываете валидацию в сеттерах?

if (!cond) throw SomeException;

dzidzitop ★★
()
Ответ на: комментарий от zJes

Естественно писалось, а судя по вашей записи «поговаривают» - сами вы это на опыте не поняли, лишь потому что «умный» дядя сказал так делать - делаете

pulo
()

сеттер и геттер как раз таки нужно нагружать проверочной логикой

насчет геттера не уверен.

geometer
()
Ответ на: комментарий от geometer

ну с геттером я и сам не уверен, там наверно ничего делать не надо кроме подготовки данных к отдаче)

pylin ★★★★★
() автор топика

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

Именно так и сделаны property в Object Pascal. property X read PrivateVarX на раз превращается в property X read GetX.

redgremlin ★★★★★
()
Ответ на: комментарий от pulo

«поговаривают» это был словесный оборот, для придания небольшой доли сарказма. :)
Да я и не против слушать умных дядей, чай не буратин.

zJes ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.