Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.60/30: Рейтинг темы: голосов - 30, средняя оценка - 4.60
 Аватар для OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241

Свойства класов - зачем помещать свойство в приват

01.04.2012, 18:23. Показов 7397. Ответов 54
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Очень часто встречал такие классы
C++
1
2
3
4
5
6
7
8
claas A
{
 public:
  int getCount( void ) { return count; };
  void setCount( int c ) { count = c; };
 privte:
  int count;
}
Но зачем помещать свойство в приват и затем делать 2 лишних метода для работы с ним? Почему бы не поместить это свойство в паблик и не работать с ним на прямую? Просто если так делают значит есть этому логическое обьяснение, и хочется его понять.

PS. тут ещё мысля возникла, если в Си (не C++, а простой Си) небыло оператора new то получается небыло утечек памяти?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
01.04.2012, 18:23
Ответы с готовыми решениями:

Зачем свойство !hover в QSS
Доброго времени суток, зачем свойство !hover в стилях, если можно обойтись простым QPushButton{}? Или он чем то отличается?

Зачем нужно свойство @property (assign)
Для чего нужно свойство property (assign)? Как мне обратиться к полю класса, если оно под @property? Что будет, если убрать его? Я так...

Свойство column свойства margin
Есть свойства: p { column-count: 4; /*Количество колонок в многоколоночном тексте*/ column-fill: balance; /*Определяет как...

54
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
01.04.2012, 22:47
Студворк — интернет-сервис помощи студентам
Страуструпу я "доверяю, но проверяю". а вот тебе и твоему автору публикации - даже не доверяю.
0
 Аватар для OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
01.04.2012, 23:17  [ТС]
Цитата Сообщение от silent_1991 Посмотреть сообщение
Начинающим-то хоть голову не забивайте, пусть учатся делать правильно, не всё же время они хеллоуворлды писать будут, в которых нет таких понятий как "расширяемость", "изменение условий задачи" и т.д.
Я не совсем нович, да я не совсем знаю весь синтаксис Си, но я могу построить у себя в голове модель программы и структуру класов, поэтому ответ "так правельно" меня не устраивает, а вот коментарий Домовёнка про указатели очень даже убедил. Спасибо.
0
204 / 205 / 16
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
01.04.2012, 23:24
C++
1
2
3
4
5
6
7
8
claas A
{
 public:
  int getCount( void ) { return count; };
  void setCount( int c ) { count = c; };
 privte:
  int count;
}
Так я могу бросить исключение в случае, когда c невалидный, написать thread-safe вариант класса, посчитать количество обращений к c, промониторить изменения ... и все это всего из одного места в кода.
C++
1
2
3
4
5
claas A
{
 public:
  int count;
}
В этом случае чтоб сделать все это мне придется переписать половину всего кода.
Вопрос в поддержке и расширяемости.
0
01.04.2012, 23:27

Не по теме:

Цитата Сообщение от villu Посмотреть сообщение
Вопрос в поддержке и расширяемости.
Я уже говорил это Kuzia domovenokу в другой теме... Мой комментарий он проигнорировал.

0
01.04.2012, 23:30

Не по теме:

Цитата Сообщение от silent_1991 Посмотреть сообщение
Мой комментарий он проигнорировал.
зачастую таким людям и не нужны комментарии. им главное сказать своё мнение громко и несмотря ни на что.

2
Эксперт С++
 Аватар для CyBOSSeR
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
01.04.2012, 23:35
Цитата Сообщение от villu Посмотреть сообщение
Так я могу бросить исключение в случае, когда c невалидный, написать thread-safe вариант класса, посчитать количество обращений к c, промониторить изменения ... и все это всего из одного места в кода.
В представленном варианте Сount должен быть обычной структурой, т.к. очевидно, что он представляет данные, а не поведение. Не стоит пихать ООП везде, где только можно и доводы о расшираемости ситуацию не изменят.
0
 Аватар для Kuzia domovenok
4268 / 3328 / 926
Регистрация: 25.03.2012
Сообщений: 12,545
Записей в блоге: 1
01.04.2012, 23:37
Цитата Сообщение от silent_1991 Посмотреть сообщение
Не по теме:
Сообщение от villu
Вопрос в поддержке и расширяемости.
Я уже говорил это Kuzia domovenokу в другой теме... Мой комментарий он проигнорировал.
Ок, не буду игнорировать. Как часто ты переопределяешь геттеры сеттеры, которые изначально выглядели так
C++
1
void setter(int v): value(v){}
чем то большим? Какую цену за это платишь?
0
Эксперт С++
 Аватар для CyBOSSeR
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
01.04.2012, 23:39
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
C++
1
void setter(int v): value(v){}
Что-то кажется мне невалидным код этот.
0
 Аватар для Kuzia domovenok
4268 / 3328 / 926
Регистрация: 25.03.2012
Сообщений: 12,545
Записей в блоге: 1
01.04.2012, 23:43
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Что-то кажется мне невалидным код этот.
В каком месте. Я конечно признаю, что могу ошибаться, но ошибки не вижу.
0
Эксперт С++
 Аватар для CyBOSSeR
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
01.04.2012, 23:47
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
В каком месте.
В наличии списка инициализации в методе.
0
204 / 205 / 16
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
01.04.2012, 23:52
а везде и не надо совать.
В той же std есть pair, который структура

а вот такой вариант
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class A {
    int count;
public:
#ifdef _DEBUG
    void set(int new_val, char *file = get__FILE__(), int line=get__LINE__() ) {
        g_log_device() << "Change 'с' to  " << new_val << " " << file << ":" << line << "\n";
        if( new_val > MAX_VALUE ) throw std::runtime_error("Invalid value");
        count = new_val;
    }
#else
    void set(int new_val) {
        count = new_val;
    }
#endif
    int get() { return count;}
};
мне однажды очень много времени сэкономил и даже помог отловить бажину в железке. а класс, на сколько помню, у меня тогда просто данные с кардио-датчика содержал, то есть фактически несколько полей (как тот самый вектор x y z), которые можно было сделать структурой.
Тут же TC спрашивал о вариантах, где это полезно может быть, нет разве?
1
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
01.04.2012, 23:55
Лучший ответ Сообщение было отмечено как решение

Решение

Kuzia domovenok, ну, если не учитывать, что мои геттеры/сеттеры так не выглядят, потому что список инициализации можно использовать только в конструкторе, то довольно редко. Потому что у меня классы обычно представляют поведение, а не данные, как и должно быть. Сами классы могут пользоваться несколько более высокоуровневыми данными, чем сырые данные стандартных типов, но такие данные я оборачиваю в структуры, описанные внутри классов, в приватной области. Если класс состоит из одних данных и методов доступа, т.е. представляет данные, то надо пересмотреть надобность использования класса.
4
0 / 0 / 0
Регистрация: 21.06.2014
Сообщений: 5
02.04.2012, 00:25
Скрытие определённых полей класса(инкапсуляция) - базовый принцип объектно-ориентированного программирования.
для справки:
Инкапсуляция (пакетирование) представляет собой механизм, связывающий вместе данные и код, обрабатывающий эти данные, и сохраняющий их от внешнего воздействия и ошибочного использования. Инкапсуляция позволяет создавать объект, являющийся логическим целым, включающим данные и код для работы с этими данными. Объект обеспечивает защиту против случайной или несанкционированной модификации частных (private) составляющих его членов. Закрытые данные или коды (методы) доступны только для других частей этого объекта и недоступны вне его. Открытая часть объекта предназначена для обеспечения контролируемого интерфейса его закрытой части.

проще говоря, это нужно для обеспечения защиты данных, которые не должны быть доступны пользователю на прямую. Например, телевизор: мы нажимаем только на определённые кнопки, которые выполняют те или иные функции. Мы же не имеем доступа ко внутренним компонентам телевизора, которые принимают участие в реализации команды. Ибо если мы будем иметь прямой доступ к важным частям телевизора, мы можем что-нибудь изменить и телевизор не будет работать. Так и с программой. Пользователя не должна волновать реализация. Главное, чтобы выполнялись его команды. А программист всегда получит доступ к защищённым данным, если ему нужно исправить неисправность или добавить какую-нибудь функцию. Вот как-то так
0
02.04.2012, 01:28

Не по теме:

Цитата Сообщение от Asya Посмотреть сообщение
мы можем что-нибудь изменить и телевизор не будет работать
умиляет... А то геттерами ты не можешь ничё ошибочно изменить...

0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
02.04.2012, 01:29
kravam, нет, если принять, что геттер написан верно и не пропустит неправильные данные. Отладка классов - отдельная история, мы говорим о законченном рабочем коде.
0
 Аватар для Buckstabue
179 / 127 / 25
Регистрация: 12.01.2012
Сообщений: 623
02.04.2012, 02:50
ИМХО, сокрытие в первую очередь нужно, чтобы упростить отладку программы. Например, при моделировании органайзера, мы должны быть твёрдо уверены, что встреча, намеченная в декабре, может проходить только в числах от 1 до 31. В то же время инкапсуляция позволяет делать программы более масштабируемыми. Например, если мы грамотно напишем обобщенный интерфейс доступа к базе данных, то в случае изменения самого сервера( или библиотеки ) БД нам придётся изменить код только в интерфейсе
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
02.04.2012, 02:54
Цитата Сообщение от Buckstabue Посмотреть сообщение
В то же время инкапсуляция позволяет делать программы более масштабируемыми
Именно для этого она и существует. Например, в одной версии вектора размер может храниться отдельным полем, указатель на начало вектора - отдельным, а в другой могут храниться указатели на начало и конец вектора, а размер вычисляться как разность начала и конца (т.е. размер не хранится явным образом). Тогда реализации методов size будут различными, но если бы не инкапсуляция и методы доступа, то весь код типа "vec.size" лутул бы к чертям, потому что в новой версии класса вообще нету поля "size". Зато обращайся мы сразу через метод доступа, нам не важно, что в новой версии поменяли внутреннюю реализацию, ведь интерфейс, через который мы общались с вектором раньше, остался прежним.
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
02.04.2012, 03:07
Цитата Сообщение от silent_1991 Посмотреть сообщение
kravam, нет, если принять, что геттер написан верно и не пропустит неправильные данные. Отладка классов - отдельная история, мы говорим о законченном рабочем коде.
не пойдёт. Ты вызовешь самый правильный суперпупергеттер в ненужном месте и весь код насмарку. Это я и называю (и оно по-моему такое и по сути)- ошибочно изменить поле класса.

И сразу же вопрос- большая ли разница чем ошибочно изменять поля класса- подобными вызовами геттеров или непосредственно обращаясь к полю, сделав его public? Разницы никакой, что так плохо, что эдак. Так что следите, что называется за руками, а не за уровнем доступа к полю.
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12844 / 7593 / 1766
Регистрация: 25.07.2009
Сообщений: 13,981
02.04.2012, 03:23
А меня аргумент "потому, что так правильно" вполне устраивает, если произнесён кем-то сведующим в вопросе. Причины, по которым "так надо", станут понятны по мере приобретения опыта. Читаю книжку Perl Cookbook Тома Кристиансена и Натана Торкингтона (по мере прочтения проникся искренним уважением к авторам, к тому же в самой документации perl сплошь и рядом ссылки на эту книгу). В perl поддержка ООП вообще весьма своеобразно сделана. В частности нет стандартных средств языка для ограничения доступа к данным класса (что, в прочем не мешает истинным параноикам запрятать данные так, что захочешь - не доберёшься), но вот, что пишут авторы по этому поводу:
Работа методов зависит от того, как вы организуете открытый интерфейс к объекту. Нормальный класс не любит, чтобы окружающие копались у него во внутренностях. Для каждого атрибута данных должен существовать метод, обеспечивающий его чтение или обновление. Если пользователь пишет фрагмент вида:
Perl
1
2
3
$him = Person->new();
$him->{NAME} = "Sylvester";
$him->{AGE} = 23;
он нарушает интерфейс объекта и напрашивается на неприятности.
Ну а в С++, где есть способ запретить пользователю прямой доступ к данным класса, просто грех этим не воспользоваться. Разумеется, если класс не просто хранит значения переменной plain типа, при этом не заботясь о смысле и допустимости этих самых значений...
2
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
02.04.2012, 10:16
kravam, Крайне интересно, это каким же макаром, вызов геттера может изменить нечто в классе? Геттер обязан быть константным методом, геттер обязан ничего не менять в классе. И тогда не будет таких проблем, которые вы описываете.
А вот сеттером изменить можешь.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.04.2012, 10:16

Зачем всегда инкапсулировать переменные в свойства
Давно хотел спросить. Вопрос возникает постоянно, когда я вижу код типа такого: class cls { private int _iii; ...

Зачем нужны автоматически реализуемые свойства?
Зачем нужны автоматически реализуемые свойства в c#? Что, нельзя просто пометить поле как public? Зачем надо, чтобы доступ получался только...

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

Зачем использовать поля, если есть свойства?
Приветствую. Объясните новичку: для чего нужно использовать поля, если есть такая штука, как свойства? Попробую добавить конкретики. ...

Как назначить свойства блоку div через свойство SetAttribute?
Здравствуйте, уважаемые форумчане! Обращаюсь сюда, потому что возникла проблема: не получается добавить свойства к div элементу. Подскажите...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последнея моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Nekobox - outbounds[0].transport: unknown transport type: raw
damix 01.10.2026
Фикс ошибки Правым кликом по серверу -> отладочная информация -> edit Заменить "net": "raw", на "net": "tcp", Нажать кнопку reload.
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru