Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.60/47: Рейтинг темы: голосов - 47, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 05.12.2016
Сообщений: 53

Зачем нужны "set" и "get" в классах

30.01.2017, 21:58. Показов 9740. Ответов 25

Студворк — интернет-сервис помощи студентам
Зачем нужны "set'еры" и "get'еры", если к public членам можно обращаться через указатель на класс. Видел ответы типо: "Так принято", но ведь при обращении к члену класса напрямую быстродействие увеличивается, чем при вызове целой функции. Вообще хочу чётких доказательств "ЗА" и "ПРОТИВ".
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
30.01.2017, 21:58
Ответы с готовыми решениями:

Зачем нужны get и set?
я перечитал всю литературу предлагаемую на cyberforume, все равно не понял что означает get и set. В частности, как читать на русском языке...

Зачем нужны автоматические свойства? {get; set}
Я прочел все темы в этом форуме касательно свойств. Но никто толком не может ответить зачем нужны автоматические свойства, почему они...

Зачем нужны {get; set;} и что это такое?
Объясните пожалуйста чайнику, зачем нужны и что это такое, аксессоры get и set, заранее спасибо!) class A { int Num { get;...

25
331 / 283 / 78
Регистрация: 02.08.2016
Сообщений: 1,008
30.01.2017, 22:16
При обращении через ссылку:
C++
1
const Type& getSomething();
практически также, как напрямую.
А зачем это нужно? Ну, например, set методы позволяют контролировать устанавливаемые значения, допустим, у нас есть класс Player и мы хотим установить громкость для плеера, тогда разумно сделать метод void setVolume(int value); который будет проверять, что аргумент находится в пределах [0, 100] и если это не так либо генерить исключение, либо округлять до ближайшей границы. Ну и конечно "так принято", если в какой-то библиотеке часть переменных класса будут устанавливаться через get/set, а часть напрямую, пользоваться ей будет не удобно.

Добавлено через 2 минуты
Но использовать их везде, как в мире джавы, тоже мне кажется не лучшей идеей, для совсем тривиальных вещей, которые просто хранят данные, имхо, можно обойтись без геттеров и сеттеров
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
30.01.2017, 22:17
buridan, Довод "ЗА" один и простой - это инкапсуляция, один из "столпов" ООП вообще.
Цитата Сообщение от 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
Цитата Сообщение от avgoor Посмотреть сообщение
Быстро и хорошо - не одно и то же (если не верите - спросите у своей девушки )
а если её нет?
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12937 / 6804 / 1821
Регистрация: 18.10.2014
Сообщений: 17,219
30.01.2017, 22:31
Цитата Сообщение от buridan Посмотреть сообщение
Зачем нужны "set'еры" и "get'еры", если к public членам можно обращаться
Это называется "инкапсуляция" и/или "разделение интерфейса и реализации".

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

Наличие set/get ничего подобного не констатирует. За set/get может не стоять никакого поля вообще. А может и стоять, но располагаться совсем в другом месте, а не в этом классе. И через set/get с полем (даже если оно существует) не получится делать что угодно, а получится делать только set/get.

Это - гигантская разница, ради которой и делается доступ через set/get.

Вот и все доказательства. Вообще ваш вопрос как будто построен на предположении какой-то эквивалентности/взаимозаменяемости между публичным полем и парой set/get. На самом деле никакой эквивалентности нет - интерфейс set/get существенно более ограничивающий. Поэтому тут не может быть никаких "за" и "против". Это разные средства, применяющиеся в разных ситуациях для разных целей.
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
30.01.2017, 22:41
Цитата Сообщение от buridan Посмотреть сообщение
но ведь при обращении к члену класса напрямую быстродействие увеличивается
Большинство компиляторов оптимизируют все ваши get/set'ы таким образом как они бы выглядели при прямом доступе к полям.
1
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
31.01.2017, 12:56
Цитата Сообщение от buridan Посмотреть сообщение
Зачем нужны "set'еры" и "get'еры", если к public членам можно обращаться через указатель на класс.
Избегая setter/getters, ты привязываешь клиентов класса к его внутреннему устройству.
Если класс будет использоваться в 100500 местах, то поменять его интерфейс потом
будет очень трудно. Представь, что когда-нибудь тебе потребуется перед записью или
чтением данного поля захватывать какую-нибудь блокировку или изменять счетчик ссылок.
Без setter/getter это превратится в объемный рефакторинг и неизбежные опечатки, ошибки...
А если setter/getter уже есть, правки займут несколько минут.
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
31.01.2017, 14:30
Цитата Сообщение от Someone007 Посмотреть сообщение
Большинство компиляторов оптимизируют все ваши get/set'ы таким образом как они бы выглядели при прямом доступе к полям.
А как проверить была ли оптимизация или нет?

Думаю если мы пишем вызов метода нужно быть готовым платить за это
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
31.01.2017, 14:41
Раз уж сказали все "ЗА", расскажу про ситуацию "Против".
Если вся реализация класса состоит лишь из скрытых(private/protected) свойств и набора get-set методов для них, при этом нам не нужно (и с высокой вероятностью никогда не будет нужно) дополнительно что-то делать при изменении/обращении к свойству, то смысла в таком классе нет. Гораздо прозрачнее назвать его структурой и обращаться к полям напрямую. Хотя это моё личное мнение и нигде не стандартизировано.

Добавлено через 1 минуту
Цитата Сообщение от sys_beginner Посмотреть сообщение
А как проверить была ли оптимизация или нет?
АСМ.

Да и методы из одной тривиальной инструкции с присваиванием почти наверняка будут встроены. Тут и inline не пиши к бабке не ходи.
1
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
31.01.2017, 14:45
Цитата Сообщение от MrGluck Посмотреть сообщение
при этом нам не нужно (и с высокой вероятностью никогда не будет нужно) дополнительно что-то делать при изменении/обращении к свойству
Заранее же неизвестно
А если приспичит то платить придется дорого

Добавлено через 1 минуту
Цитата Сообщение от MrGluck Посмотреть сообщение
АСМ.
Жесть. Это весь код нужно в АСМ читать, причем для всех компиляторов, причем стабильно с выходом новой версии на случай "а вдруг что то поменяли"
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
31.01.2017, 14:53
Цитата Сообщение от sys_beginner Посмотреть сообщение
Заранее же неизвестно
А если приспичит то платить придется дорого
За просчёты в проектировании всегда приходиться дорого платить. Но это не значит, что нужно надевать кастрюлю на голову и обматывать всё фальгой усложнять систему на ровном месте. Найти тонкую грань между паранойей и предусмотрительностью и есть настоящее искусство.

Добавлено через 4 минуты
Цитата Сообщение от sys_beginner Посмотреть сообщение
Жесть. Это весь код нужно в АСМ читать, причем для всех компиляторов, причем стабильно с выходом новой версии на случай "а вдруг что то поменяли"
Если вы параноидально занимаетесь оптимизацией на спичках, то да.
Можно ещё и inline-ов с register по всему коду напихать (хотя в этом даже больше смысла будет).
Как бы это не такое узкое место, чтобы настолько его проверять. Если вы не спите по ночам из-за вопроса о производительности в get-методе, ну проверьте вы его один раз в АСМ.

Вообщем, чушь какая-то.
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
31.01.2017, 14:56
Цитата Сообщение от MrGluck Посмотреть сообщение
Найти тонкую грань между паранойей и предусмотрительностью и есть настоящее искусство.
Проблема в том что заранее неизвестно ведь нужно ли будет это или нет
Вот вы написали полезную библиотеку и я ею пользуюсь в 1000 местах, вы дали допустим к вашим классам через поля напрямую. Потом вам пришла идея чего-то добавить и прямого обращения недостаточно.
И что мне 1000 участков переписать что бы продолжить пользоваться вашей библиотекой?

В C# это решили немного по другому. Там можно обращаться напрямую к полям но потом их можно переделать под свойства (т.е будет вызвано тело поля - оно уже станет свойством) и там можно реализовать свою логику

Добавлено через 40 секунд
Цитата Сообщение от MrGluck Посмотреть сообщение
Вообщем, чушь какая-то.
Так на С++ и пишут для получения высокой производительности
Почему чушь?
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
Цитата Сообщение от socslm Посмотреть сообщение
И обычно там многое известно и можно предвидеть.
Предвидеть можно но нельзя дать гарантии что так будет всегда

Цитата Сообщение от socslm Посмотреть сообщение
А под это уже можно сделать новый интерфейс
Ага и заставлять переписывать код пользователей этой самой библиотеки когда можно было просто потянуть с гита актуальную версию библиотеки и скомпилить её
0
17 / 17 / 4
Регистрация: 10.05.2015
Сообщений: 60
31.01.2017, 15:22
Цитата Сообщение от sys_beginner Посмотреть сообщение
Предвидеть можно но нельзя дать гарантии что так будет всегда
Гарантий конечно дать нельзя, но обычно бизнес область менее подвижна, чем обслуживающее её ПО

Цитата Сообщение от sys_beginner Посмотреть сообщение
Ага и заставлять переписывать код пользователей этой самой библиотеки когда можно было просто потянуть с гита актуальную версию библиотеки и скомпилить её
А зачем старый интерфейс убивать? Или убивать не сразу.
Кому новый функционал не нужен, пусть ничего не переписывают и продолжают старый интефейс использовать.

"Засорение" кода не используемыми фишками, которые сделана на "а вдруг потребуется" может доставить больше хлопот. чем поддержка 2-х используемых интерфейсов.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
31.01.2017, 15:25
Цитата Сообщение от sys_beginner Посмотреть сообщение
и заставлять переписывать код пользователей этой самой библиотеки
проблемы индейцев шерифа не...
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
31.01.2017, 15:26
Цитата Сообщение от socslm Посмотреть сообщение
Гарантий конечно дать нельзя
Ну вот об этом и речь Поэтому минусом не считаю если сеттер или геттер ничего не делает кроме установки и возвращения значения. Плюс даже при такой реализации это наличие страховки и стоит очень дешево.

Цитата Сообщение от socslm Посмотреть сообщение
А зачем старый интерфейс убивать? Или убивать не сразу.
Как минимум потому что он больше не актуален

Цитата Сообщение от socslm Посмотреть сообщение
Кому новый функционал не нужен, пусть ничего не переписывают и продолжают старый интефейс использовать.
А кому нужен - пусть мучается Превосходно

Добавлено через 30 секунд
Цитата Сообщение от hoggy Посмотреть сообщение
проблемы индейцев шерифа не...
Только если шериф сам не индеец
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
31.01.2017, 20:34
Цитата Сообщение от Someone007 Посмотреть сообщение
Большинство компиляторов оптимизируют все ваши get/set'ы таким образом как они бы выглядели при прямом доступе к полям.
При условии, что код написан правильно - Set и Get являются inline-методами, или (что то же самое) описаны в теле класса. В этом случае не большинство, а поголовно все более-менее известные компиляторы в режиме с оптимизациями заменят вызов на встроенный код

Цитата Сообщение от sys_beginner Посмотреть сообщение
А как проверить была ли оптимизация или нет?
Посмотреть в дизассемблере

Цитата Сообщение от sys_beginner Посмотреть сообщение
Думаю если мы пишем вызов метода нужно быть готовым платить за это
Язык программирования не является вещью в себе. Его проектировали не в вакууме, а под конкретные цели. Устройство inline-методов проектировали в том числе и под то, чтобы можно было писать короткие функции, которые компилятор заменит на встроенный код (по сути дела это есть замена C'шным макросам). Поэтому платить за Set/Get (в их классической реализации) не придётся

Добавлено через 1 минуту

Не по теме:

Цитата Сообщение от Evg Посмотреть сообщение
Его проектировали не в вакууме
Другое дело, что многие из тех, кто С++ используют, сидят в танке, но это к теме не относится

0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
31.01.2017, 21:17
Цитата Сообщение от MrGluck Посмотреть сообщение
Если вся реализация класса состоит лишь из скрытых(private/protected) свойств и набора get-set методов для них, при этом нам не нужно (и с высокой вероятностью никогда не будет нужно) дополнительно что-то делать при изменении/обращении к свойству, то смысла в таком классе нет. Гораздо прозрачнее назвать его структурой и обращаться к полям напрямую.
Я бы добавил, что здесь важна не столько неизменяемость класса, сколько его локальность.
Класс, который используется в 5-6 местах и больше нигде, можно вообще писать абы как, с
нарушением всех канонов, поскольку в случае переделок потери на его модернизацию будут
совсем небольшими. А вот если класс используется в 100500 местах, то к его проектированию
нужно подходить очень продуманно, каждая мелочь может сыграть "в минус".

На эти грабли уже приходилось наступать: имеем структуру с открытыми полями, которая
используется по всему слою приложения. Перед очередными доработками выяснилось, что одно
из полей требуется снабдить подсчетом ссылок. То есть, когда берем указатель - добавляем
ссылку, когда возвращаем обратно (или зануляем поле) - делаем декремент счетчика.
К сожалению, опухоль прямого доступа к полям структуры уже настолько поразила проект,
что пришлось выполнять очень трудный рефакторинг и переделки, тут же полезли "странные"
ошибки, падения на ровном месте и т.д.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
31.01.2017, 21:17
Помогаю со студенческими работами здесь

Для чего нужны set.keys(), set.values(), set.entries() ?
Для чего нужны set.keys(), set.values(), set.entries() ? Не могу понять документацию. Приведите примеры.

Set и Get функции в классах
Подскажите пожалуйста, есть код C++, куда нужно поставить Set и Get функции, не могу понять что нужно сделать. #include...

Get и Set в классах и объектах
Необходимо по ID изменить какую-либо строку. Не могу немного понять, как вызвать и использовать Get и Set. Подскажите. package...

Set и Get функции в классах
Не могу понять, зачем нужно ставить set-функцию в классах. Вот пример: // classes.cpp: определяет точку входа для консольного приложения....

Зачем нужно private наследование в классах?
Если можно, то покажите небольшой пример


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
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, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru