|
0 / 0 / 0
Регистрация: 05.12.2016
Сообщений: 53
|
|
Зачем нужны "set" и "get" в классах30.01.2017, 21:58. Показов 9740. Ответов 25
Зачем нужны "set'еры" и "get'еры", если к public членам можно обращаться через указатель на класс. Видел ответы типо: "Так принято", но ведь при обращении к члену класса напрямую быстродействие увеличивается, чем при вызове целой функции. Вообще хочу чётких доказательств "ЗА" и "ПРОТИВ".
0
|
|
| 30.01.2017, 21:58 | |
|
Ответы с готовыми решениями:
25
|
|
331 / 283 / 78
Регистрация: 02.08.2016
Сообщений: 1,008
|
||||||
| 30.01.2017, 22:16 | ||||||
|
При обращении через ссылку:
А зачем это нужно? Ну, например, set методы позволяют контролировать устанавливаемые значения, допустим, у нас есть класс Player и мы хотим установить громкость для плеера, тогда разумно сделать метод void setVolume(int value); который будет проверять, что аргумент находится в пределах [0, 100] и если это не так либо генерить исключение, либо округлять до ближайшей границы. Ну и конечно "так принято", если в какой-то библиотеке часть переменных класса будут устанавливаться через get/set, а часть напрямую, пользоваться ей будет не удобно. Добавлено через 2 минуты Но использовать их везде, как в мире джавы, тоже мне кажется не лучшей идеей, для совсем тривиальных вещей, которые просто хранят данные, имхо, можно обойтись без геттеров и сеттеров
0
|
||||||
|
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
|
||
| 30.01.2017, 22:17 | ||
|
buridan, Довод "ЗА" один и простой - это инкапсуляция, один из "столпов" ООП вообще.
) Огромная часть ошибок - ошибки входных данных. Поместить проверку на корректность в сеттер или в 100500 мест кода - что лучше? Геттер нужен для того же (чтоб шаловливыми ручками не изменяли данные внутри класса по ссылке). Можно и без них, просто это другой подход и, в частности, там где нужна скорость используют C с POD структурами и не парятся.
6
|
||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|
| 30.01.2017, 22:17 | |
|
buridan,
В дополнение к вышесказанному почитайте ещё про инкапсуляцию
0
|
|
|
331 / 283 / 78
Регистрация: 02.08.2016
Сообщений: 1,008
|
|
| 30.01.2017, 22:19 | |
|
0
|
|
|
Вездепух
12937 / 6804 / 1821
Регистрация: 18.10.2014
Сообщений: 17,219
|
||
| 30.01.2017, 22:31 | ||
|
Наличие явного открытого публичного поля явно констатирует тот факт, то такое поле физически существует и позволяет внешнему коду делать с ним, что угодно. Например - создавать указатели на него. Наличие set/get ничего подобного не констатирует. За set/get может не стоять никакого поля вообще. А может и стоять, но располагаться совсем в другом месте, а не в этом классе. И через set/get с полем (даже если оно существует) не получится делать что угодно, а получится делать только set/get. Это - гигантская разница, ради которой и делается доступ через set/get. Вот и все доказательства. Вообще ваш вопрос как будто построен на предположении какой-то эквивалентности/взаимозаменяемости между публичным полем и парой set/get. На самом деле никакой эквивалентности нет - интерфейс set/get существенно более ограничивающий. Поэтому тут не может быть никаких "за" и "против". Это разные средства, применяющиеся в разных ситуациях для разных целей.
0
|
||
|
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
|
||
| 30.01.2017, 22:41 | ||
|
1
|
||
|
Ушел с форума
|
||
| 31.01.2017, 12:56 | ||
|
Если класс будет использоваться в 100500 местах, то поменять его интерфейс потом будет очень трудно. Представь, что когда-нибудь тебе потребуется перед записью или чтением данного поля захватывать какую-нибудь блокировку или изменять счетчик ссылок. Без setter/getter это превратится в объемный рефакторинг и неизбежные опечатки, ошибки... А если setter/getter уже есть, правки займут несколько минут.
0
|
||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
||
| 31.01.2017, 14:30 | ||
|
Думаю если мы пишем вызов метода нужно быть готовым платить за это
0
|
||
|
Форумчанин
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
|
||
| 31.01.2017, 14:41 | ||
|
Раз уж сказали все "ЗА", расскажу про ситуацию "Против".
Если вся реализация класса состоит лишь из скрытых(private/protected) свойств и набора get-set методов для них, при этом нам не нужно (и с высокой вероятностью никогда не будет нужно) дополнительно что-то делать при изменении/обращении к свойству, то смысла в таком классе нет. Гораздо прозрачнее назвать его структурой и обращаться к полям напрямую. Хотя это моё личное мнение и нигде не стандартизировано. Добавлено через 1 минуту Да и методы из одной тривиальной инструкции с присваиванием почти наверняка будут встроены. Тут и
1
|
||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|||
| 31.01.2017, 14:45 | |||
|
А если приспичит то платить придется дорого Добавлено через 1 минуту
0
|
|||
|
Форумчанин
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
|
|||
| 31.01.2017, 14:53 | |||
|
Добавлено через 4 минуты Можно ещё и inline-ов с register по всему коду напихать (хотя в этом даже больше смысла будет). Как бы это не такое узкое место, чтобы настолько его проверять. Если вы не спите по ночам из-за вопроса о производительности в get-методе, ну проверьте вы его один раз в АСМ. Вообщем, чушь какая-то.
0
|
|||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|||
| 31.01.2017, 14:56 | |||
|
Вот вы написали полезную библиотеку и я ею пользуюсь в 1000 местах, вы дали допустим к вашим классам через поля напрямую. Потом вам пришла идея чего-то добавить и прямого обращения недостаточно. И что мне 1000 участков переписать что бы продолжить пользоваться вашей библиотекой? ![]() В C# это решили немного по другому. Там можно обращаться напрямую к полям но потом их можно переделать под свойства (т.е будет вызвано тело поля - оно уже станет свойством) и там можно реализовать свою логику Добавлено через 40 секунд Почему чушь?
0
|
|||
|
17 / 17 / 4
Регистрация: 10.05.2015
Сообщений: 60
|
|
| 31.01.2017, 15:11 | |
|
> Проблема в том что заранее неизвестно ведь нужно ли будет это или нет
Обычно внешний интерфейс - это отображение некоторых деталей бизнес-области (domain area?). И обычно там многое известно и можно предвидеть. > Вот вы написали полезную библиотеку и я ею пользуюсь в 1000 местах, вы дали допустим к вашим классам через поля напрямую. Потом вам пришла идея чего-то добавить и прямого обращения недостаточно. А под это уже можно сделать новый интерфейс. Кто хочет новую фишку, пусть и правит свой код.
0
|
|
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|||
| 31.01.2017, 15:13 | |||
|
0
|
|||
|
17 / 17 / 4
Регистрация: 10.05.2015
Сообщений: 60
|
|||
| 31.01.2017, 15:22 | |||
|
Кому новый функционал не нужен, пусть ничего не переписывают и продолжают старый интефейс использовать. "Засорение" кода не используемыми фишками, которые сделана на "а вдруг потребуется" может доставить больше хлопот. чем поддержка 2-х используемых интерфейсов.
0
|
|||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
| 31.01.2017, 15:25 | |
|
0
|
|
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|||||
| 31.01.2017, 15:26 | |||||
Поэтому минусом не считаю если сеттер или геттер ничего не делает кроме установки и возвращения значения. Плюс даже при такой реализации это наличие страховки и стоит очень дешево. Превосходно ![]() Добавлено через 30 секунд
0
|
|||||
|
|
||||
| 31.01.2017, 20:34 | ||||
|
Добавлено через 1 минуту
0
|
||||
|
Ушел с форума
|
||
| 31.01.2017, 21:17 | ||
|
Класс, который используется в 5-6 местах и больше нигде, можно вообще писать абы как, с нарушением всех канонов, поскольку в случае переделок потери на его модернизацию будут совсем небольшими. А вот если класс используется в 100500 местах, то к его проектированию нужно подходить очень продуманно, каждая мелочь может сыграть "в минус". На эти грабли уже приходилось наступать: имеем структуру с открытыми полями, которая используется по всему слою приложения. Перед очередными доработками выяснилось, что одно из полей требуется снабдить подсчетом ссылок. То есть, когда берем указатель - добавляем ссылку, когда возвращаем обратно (или зануляем поле) - делаем декремент счетчика. К сожалению, опухоль прямого доступа к полям структуры уже настолько поразила проект, что пришлось выполнять очень трудный рефакторинг и переделки, тут же полезли "странные" ошибки, падения на ровном месте и т.д.
1
|
||
| 31.01.2017, 21:17 | |
|
Помогаю со студенческими работами здесь
20
Set и Get функции в классах Get и Set в классах и объектах
Зачем нужно private наследование в классах? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Символьное дифференцирование
igorrr37 13.02.2026
/ *
Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет
значение производной при заданном х
Логарифм записывается как: (x-2)log(x^2+2) -. . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила»
«Время-Деньги»
«Деньги -Пуля»
|
|
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога
Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
|
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
|