Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 25, средняя оценка - 4.96
OrmaJever
 Аватар для OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
01.04.2012, 18:23     Свойства класов - зачем помещать свойство в приват #1
Очень часто встречал такие классы
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 то получается небыло утечек памяти?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
01.04.2012, 18:26     Свойства класов - зачем помещать свойство в приват #2
Геттер (программирование)
OrmaJever
 Аватар для OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
01.04.2012, 18:31  [ТС]     Свойства класов - зачем помещать свойство в приват #3
Спасибо прочитал, но так и не понял в чём преймущество? Ну если не брать тот факт что в метода можно делать всевозможные проверки. Предположим что класс написал я сам и использовать его буду тоже я, что мне даёт такой метод?
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
01.04.2012, 19:41     Свойства класов - зачем помещать свойство в приват #4
Цитата Сообщение от OrmaJever Посмотреть сообщение
Спасибо прочитал, но так и не понял в чём преймущество? Ну если не брать тот факт что в метода можно делать всевозможные проверки. Предположим что класс написал я сам и использовать его буду тоже я, что мне даёт такой метод?
Да я тоже задавал тут этот вопрос. По идее да, нет смысла. Но некоторые "неговнокодеры" считают это дурным тоном.

Вот помню, то ли у Страуструпа, то ли ещё в какой классике был пример класс "сумма чисел" и он выглядел так
C++
1
2
3
4
5
6
7
8
9
10
11
class sum{
private:
int a, b, c;
public:
sum(int m, int n){a=m, b=n; c=m+n;}
void seta(int m){a=m; c=a+b;}
void setb(int m){b=n; c=a+b;}
int geta(){return a;}
int getb(){return b;}
int getc(){return c;}
};
То есть сокрытие в этом примере необходимо, чтобы цэ всегда оставался равен a+b
Ещё скрывают поля класса-указатели, в которых выделена динамическая память,
чтобы она выделялась/удалялась по правилам (например только в конструкторе, деструкторе и при копировании) и никто другой не мог бы создать утечку. Это тоже хорошее дело! Например
C++
1
2
3
4
5
6
7
8
9
10
11
class array{
private:
int* data;
int size;
public:
array(int);
~array();
array(array&);
int& operator[] (int);
array& operator = (array&);
};
Действительно, чтобы не потекла память надо ограничивать к ней доступ в таком классе!

Но это не означает, что надо брать идиотскую моду постоянно скрывать всё что нужно и не нужно. Вообще всё! Например класс Vector3D я бы спокойно совершенно объявил так:
C++
1
2
3
4
5
class Vector3D{
public:
double x, y, z;
///...и.т.д. все конструкторы, операторы, методы всё публично
};
И не вижу ни единой причины скрывать данные.

Добавлено через 28 минут
А вообще часто скрывают поля класса, чтобы следовать концепции "сокрытия реализации". То есть для пользователя класса оставляют открытыми для использования лишь несколько "рычагов воздействия" - методов класса. При этом подразумевается, что создав класс, программист может передать его своим коллегам, или "себе самому" так, что продолжая работу с этим классом можно забыть все сложности структур и алгоритмов скрытых внутри, абстрагироваться от них.
Таким образом создавать всё более сложные программы, оперируя простыми понятиями: Например создал класс render3D и его пользователей совершенно не беспокоит DirectX так выводит 3D картинку или OpenGL. Они воздействуют на класс методами "нарисуй то" да "нарисуй сё". При этом изменения внутренних полей класса нам не важно, а мы сосредотачиваемся на более нужных вещах.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
01.04.2012, 19:59     Свойства класов - зачем помещать свойство в приват #5
Цитата Сообщение от OrmaJever Посмотреть сообщение
PS. тут ещё мысля возникла, если в Си (не C++, а простой Си) небыло оператора new то получается небыло утечек памяти?
Зато там были функции malloc/calloc/realloc, поэтому и утечки памяти там тоже имели место))

Добавлено через 3 минуты
Kuzia domovenok, опять вы за своё? Начинающим-то хоть голову не забивайте, пусть учатся делать правильно, не всё же время они хеллоуворлды писать будут, в которых нет таких понятий как "расширяемость", "изменение условий задачи" и т.д.
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
01.04.2012, 20:21     Свойства класов - зачем помещать свойство в приват #6
Цитата Сообщение от silent_1991 Посмотреть сообщение
Зато там были функции malloc/calloc/realloc, поэтому и утечки памяти там тоже имели место))

Добавлено через 3 минуты
Kuzia domovenok, опять вы за своё? Начинающим-то хоть голову не забивайте, пусть учатся делать правильно, не всё же время они хеллоуворлды писать будут, в которых нет таких понятий как "расширяемость", "изменение условий задачи" и т.д.
Ой, ты надеюсь не начинающий? Нет? Ой, отлично, есть кому вопрос задать, не заморочив голову. Скажи пожалуйста, зачем в моём примере ( class Vector3D{public: int x, y, z;}; ) Зачем в нём может потребоваться скрывать поля класса. Ну хоть одна причина?

И второе, раз уж у меня голова "не тем забита", покажи мне хоть одного автора книг по Си++, который бы советовал "Скрывать все поля класса, вне зависимости от задачи". А то я конечно искренне хочу улучшить своё знание си++, но как-то авторам публикаций больше верю, чем тебе
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
01.04.2012, 20:37     Свойства класов - зачем помещать свойство в приват #7
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Зачем в нём может потребоваться скрывать поля класса. Ну хоть одна причина?
в вашем примере нет смысла его делать классом, так как ему нечего инкапсулировать кроме своих данных
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
01.04.2012, 20:39     Свойства класов - зачем помещать свойство в приват #8
Kuzia domovenok, ищите моё предыдущее сообщение, когда вы в прошлый раз подняли этот вопрос.
Относительно вашего класса - причина банальна. Если мы захотим хранить вектор в виде массива (например, std::array), чтобы, например, была возможно вернуть сразу все три координаты, то весь код, написанный с использованием предыдущей версии вектора, полетит к чертям.

Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
авторам публикаций больше верю, чем тебе
То же могу сказать в отношение вас.
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,266
01.04.2012, 20:42     Свойства класов - зачем помещать свойство в приват #9
Цитата Сообщение от OrmaJever Посмотреть сообщение
Но зачем помещать свойство в приват и затем делать 2 лишних метода для работы с ним?
Ну это старая песня типа: "Учитесь правильно на простом, чтобы не учиться на сложном, что тяжело вдвойне". Кто его знает, может это и так. Как-то внутренне дисциплинирует, что ли. А это на самом деле важно.
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
01.04.2012, 20:51     Свойства класов - зачем помещать свойство в приват #10
Цитата Сообщение от alex_x_x Посмотреть сообщение
в вашем примере нет смысла его делать классом, так как ему нечего инкапсулировать кроме своих данных
Почему нет? Я хочу сделать класс трёхмерного вектора, который хранил бы только три компоненты вектора без какого-либо динамического выделения памяти. Зачем мне их скрывать в private?

Далее, я хочу добавить в класс методы получения модуля этого вектора, операторы скалярного и векторного умножения, векторного сложения и ещё 100500 операций над векторами зачем мне делать его структурой?
Да, знаю в С++ структуры могут содержать методы, но в таком виде они мало отличаются от классов.
Ну и наконец, я этот пример с вектором не от балды взял, а реально существует куча примеров исходников, в которых авторы не прячут параноидально все поля в public, просто потому что "так модно".

Цитата Сообщение от kravam Посмотреть сообщение
Ну это старая песня типа: "Учитесь правильно на простом, чтобы не учиться на сложном, что тяжело вдвойне". Кто его знает, может это и так. Как-то внутренне дисциплинирует, что ли. А это на самом деле важно.
Чтобы учить, нужно не только показывать "как надо", но ещё и объяснять, почему "так надо". Пока что я во всей теме не нашёл ни одного объяснения. всё сводится к "это хороший тон программирования", "так надо, потому что так надо". И никто не привёл ни одного примера, когда публичное поле класса вызвало жуткие страдания у программиста.
(Разумеется имеется в виду не динам.память, о которой я уж сто раз оговорился в теме, а обычное поле, которое бы вызвало тонну ужаса из-за публичности) Ну же! Примеры где?
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
01.04.2012, 20:58     Свойства класов - зачем помещать свойство в приват #11
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Почему нет? Я хочу сделать класс трёхмерного вектора, который хранил бы только три компоненты вектора без какого-либо динамического выделения памяти. Зачем мне их скрывать в private?
я написал по тому, что написано, а не в чьих-то фантазиях

Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
в которых авторы не прячут параноидально все поля в public, просто потому что "так модно".
например?
retmas
Жарю без масла
803 / 685 / 143
Регистрация: 13.01.2012
Сообщений: 1,580
01.04.2012, 21:06     Свойства класов - зачем помещать свойство в приват #12
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
в которых авторы не прячут параноидально все поля
тогда они пишут struct
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
01.04.2012, 21:08     Свойства класов - зачем помещать свойство в приват #13
Цитата Сообщение от alex_x_x Посмотреть сообщение
например?
Вот держи. http://steps3d.narod.ru/
Автор, кстати большой сторонник ООП, и всячески использует и наследование и полиморфизм и reference counting в программах делает и.т.д.
Но делает это с умом и у него нет параноидального желания писать для каждого поля класса сеттер и геттер. Если поле скрыто - на то есть причина.
Вот тот самый его вектор, пример которого я привёл
http://sigelengine.googlecode.com/sv...ath/vector3d.h
Ещё вопросы? Может кто-нибудь возразит аргументированно, чего не хватает в этом конкретном коде, а не станет продолжать "так надо, потому что это хороший тон"
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
01.04.2012, 21:15     Свойства класов - зачем помещать свойство в приват #14
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
http://sigelengine.googlecode.com/sv...ath/vector3d.h
Ещё вопросы? Может кто-нибудь возразит аргументированно, чего не хватает в этом конкретном коде, а не станет продолжать "так надо, потому что это хороший тон"
это элементарный код и эти x, y, z относятся к внешнему интерфейсу вектора
никакого контроля значений не присутствует
в продакшене геттерами и сеттерами покрывают чуть более сложные вещи

для критического быстродействия это правильный ход, но с точки зрения расширяемости скорее всего нет
захоти он добавить какойнить thread-safety и его интерфейс развалится
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
01.04.2012, 21:34     Свойства класов - зачем помещать свойство в приват #15
Цитата Сообщение от alex_x_x Посмотреть сообщение
это элементарный код и эти x, y, z относятся к внешнему интерфейсу вектора
Ну а кто-то тут говорил о сложных вещах? Товарищ ТС просил объяснить необходимость в геттерах/сеттерах. Вот я и говорю, что в простых программах нужды нет применять их ПОВСЕМЕСТНО. когда надо контролировать динамическую память, целостность данных, строить всякие синглтоны, reference counterы и прочее - пожалуйста! используйте private!
Но скрывать то, что кто угодно может изменить геттером и сеттером - очевидная глупость!
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
01.04.2012, 21:47     Свойства класов - зачем помещать свойство в приват #16
как минимум ТСа это лишит возможности контролировать валидность устанавливаемых значений
(почему бы не сделать A().count = -1; )
с практической же точки зрения так проще отлаживать (при установке значения не через сеттеры отлавливать изменения можно лишь на уровне watchpoint'ов)
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
01.04.2012, 22:02     Свойства класов - зачем помещать свойство в приват #17
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Вот тот самый его вектор, пример которого я привёл
Как минимум несколько поводов задуматся о том хороший ли это пример:
- использование макросов, вместо констант
- конструктор копирования не делает ничего, чего бы не сделал генеренный компилятором, не нужен
- часть операторов является членами, часть нет, при ни одному из операторов не нужен доступ к закрытой части, причем все свободные операторы зачем-то объявлены друзьями
- операторы сравнения возвращают int
- почему часть методов делают inplace модификацию объекта (negative), а часть возвращают измененную копию (cross)
retmas
01.04.2012, 22:12
  #18

Не по теме:

Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Как минимум несколько поводов задуматся о том хороший ли это пример:
зато он верит авторам таких "публикаций"

Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
01.04.2012, 22:26     Свойства класов - зачем помещать свойство в приват #19
Цитата Сообщение от retmas Посмотреть сообщение
зато он верит авторам таких "публикаций"
Страуструпу ты тоже не веришь?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.04.2012, 22:44     Свойства класов - зачем помещать свойство в приват
Еще ссылки по теме:

Наследование класов C++
Преобразование типов и методы класов C++
C++ Перегрузка операторов разных класов

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

Или воспользуйтесь поиском по форуму:
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
01.04.2012, 22:44     Свойства класов - зачем помещать свойство в приват #20
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Страуструпу ты тоже не веришь?
Не нужно говоря про ООП, опираться на книги описывающие конкретный язык. В Страуструпе полно не очень хороших примеров кода с точки зрения ООП, служащих при этом неплохой иллюстрацией возможностей языка.
Yandex
Объявления
01.04.2012, 22:44     Свойства класов - зачем помещать свойство в приват
Ответ Создать тему
Опции темы

Текущее время: 00:34. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru