Форум программистов, компьютерный форум 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 то получается небыло утечек памяти?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
retmas
Жарю без масла
803 / 685 / 143
Регистрация: 13.01.2012
Сообщений: 1,580
01.04.2012, 22:47     Свойства класов - зачем помещать свойство в приват #21
Страуструпу я "доверяю, но проверяю". а вот тебе и твоему автору публикации - даже не доверяю.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
OrmaJever
 Аватар для OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
01.04.2012, 23:17  [ТС]     Свойства класов - зачем помещать свойство в приват #22
Цитата Сообщение от silent_1991 Посмотреть сообщение
Начинающим-то хоть голову не забивайте, пусть учатся делать правильно, не всё же время они хеллоуворлды писать будут, в которых нет таких понятий как "расширяемость", "изменение условий задачи" и т.д.
Я не совсем нович, да я не совсем знаю весь синтаксис Си, но я могу построить у себя в голове модель программы и структуру класов, поэтому ответ "так правельно" меня не устраивает, а вот коментарий Домовёнка про указатели очень даже убедил. Спасибо.
villu
202 / 202 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
01.04.2012, 23:24     Свойства класов - зачем помещать свойство в приват #23
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;
}
В этом случае чтоб сделать все это мне придется переписать половину всего кода.
Вопрос в поддержке и расширяемости.
silent_1991
01.04.2012, 23:27
  #24

Не по теме:

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

retmas
01.04.2012, 23:30
  #25

Не по теме:

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

CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
01.04.2012, 23:35     Свойства класов - зачем помещать свойство в приват #26
Цитата Сообщение от villu Посмотреть сообщение
Так я могу бросить исключение в случае, когда c невалидный, написать thread-safe вариант класса, посчитать количество обращений к c, промониторить изменения ... и все это всего из одного места в кода.
В представленном варианте Сount должен быть обычной структурой, т.к. очевидно, что он представляет данные, а не поведение. Не стоит пихать ООП везде, где только можно и доводы о расшираемости ситуацию не изменят.
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
01.04.2012, 23:37     Свойства класов - зачем помещать свойство в приват #27
Цитата Сообщение от silent_1991 Посмотреть сообщение
Не по теме:
Сообщение от villu
Вопрос в поддержке и расширяемости.
Я уже говорил это Kuzia domovenokу в другой теме... Мой комментарий он проигнорировал.
Ок, не буду игнорировать. Как часто ты переопределяешь геттеры сеттеры, которые изначально выглядели так
C++
1
void setter(int v): value(v){}
чем то большим? Какую цену за это платишь?
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
01.04.2012, 23:39     Свойства класов - зачем помещать свойство в приват #28
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
C++
1
void setter(int v): value(v){}
Что-то кажется мне невалидным код этот.
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
01.04.2012, 23:43     Свойства класов - зачем помещать свойство в приват #29
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Что-то кажется мне невалидным код этот.
В каком месте. Я конечно признаю, что могу ошибаться, но ошибки не вижу.
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
01.04.2012, 23:47     Свойства класов - зачем помещать свойство в приват #30
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
В каком месте.
В наличии списка инициализации в методе.
villu
202 / 202 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
01.04.2012, 23:52     Свойства класов - зачем помещать свойство в приват #31
а везде и не надо совать.
В той же 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 спрашивал о вариантах, где это полезно может быть, нет разве?
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
01.04.2012, 23:55     Свойства класов - зачем помещать свойство в приват #32
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Kuzia domovenok, ну, если не учитывать, что мои геттеры/сеттеры так не выглядят, потому что список инициализации можно использовать только в конструкторе, то довольно редко. Потому что у меня классы обычно представляют поведение, а не данные, как и должно быть. Сами классы могут пользоваться несколько более высокоуровневыми данными, чем сырые данные стандартных типов, но такие данные я оборачиваю в структуры, описанные внутри классов, в приватной области. Если класс состоит из одних данных и методов доступа, т.е. представляет данные, то надо пересмотреть надобность использования класса.
Asya
Сообщений: n/a
02.04.2012, 00:25     Свойства класов - зачем помещать свойство в приват #33
Скрытие определённых полей класса(инкапсуляция) - базовый принцип объектно-ориентированного программирования.
для справки:
Инкапсуляция (пакетирование) представляет собой механизм, связывающий вместе данные и код, обрабатывающий эти данные, и сохраняющий их от внешнего воздействия и ошибочного использования. Инкапсуляция позволяет создавать объект, являющийся логическим целым, включающим данные и код для работы с этими данными. Объект обеспечивает защиту против случайной или несанкционированной модификации частных (private) составляющих его членов. Закрытые данные или коды (методы) доступны только для других частей этого объекта и недоступны вне его. Открытая часть объекта предназначена для обеспечения контролируемого интерфейса его закрытой части.

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

Не по теме:

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

silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
02.04.2012, 01:29     Свойства класов - зачем помещать свойство в приват #35
kravam, нет, если принять, что геттер написан верно и не пропустит неправильные данные. Отладка классов - отдельная история, мы говорим о законченном рабочем коде.
Buckstabue
 Аватар для Buckstabue
175 / 124 / 6
Регистрация: 12.01.2012
Сообщений: 624
02.04.2012, 02:50     Свойства класов - зачем помещать свойство в приват #36
ИМХО, сокрытие в первую очередь нужно, чтобы упростить отладку программы. Например, при моделировании органайзера, мы должны быть твёрдо уверены, что встреча, намеченная в декабре, может проходить только в числах от 1 до 31. В то же время инкапсуляция позволяет делать программы более масштабируемыми. Например, если мы грамотно напишем обобщенный интерфейс доступа к базе данных, то в случае изменения самого сервера( или библиотеки ) БД нам придётся изменить код только в интерфейсе
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
02.04.2012, 02:54     Свойства класов - зачем помещать свойство в приват #37
Цитата Сообщение от Buckstabue Посмотреть сообщение
В то же время инкапсуляция позволяет делать программы более масштабируемыми
Именно для этого она и существует. Например, в одной версии вектора размер может храниться отдельным полем, указатель на начало вектора - отдельным, а в другой могут храниться указатели на начало и конец вектора, а размер вычисляться как разность начала и конца (т.е. размер не хранится явным образом). Тогда реализации методов size будут различными, но если бы не инкапсуляция и методы доступа, то весь код типа "vec.size" лутул бы к чертям, потому что в новой версии класса вообще нету поля "size". Зато обращайся мы сразу через метод доступа, нам не важно, что в новой версии поменяли внутреннюю реализацию, ведь интерфейс, через который мы общались с вектором раньше, остался прежним.
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
02.04.2012, 03:07     Свойства класов - зачем помещать свойство в приват #38
Цитата Сообщение от silent_1991 Посмотреть сообщение
kravam, нет, если принять, что геттер написан верно и не пропустит неправильные данные. Отладка классов - отдельная история, мы говорим о законченном рабочем коде.
не пойдёт. Ты вызовешь самый правильный суперпупергеттер в ненужном месте и весь код насмарку. Это я и называю (и оно по-моему такое и по сути)- ошибочно изменить поле класса.

И сразу же вопрос- большая ли разница чем ошибочно изменять поля класса- подобными вызовами геттеров или непосредственно обращаясь к полю, сделав его public? Разницы никакой, что так плохо, что эдак. Так что следите, что называется за руками, а не за уровнем доступа к полю.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9372 / 5422 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
02.04.2012, 03:23     Свойства класов - зачем помещать свойство в приват #39
А меня аргумент "потому, что так правильно" вполне устраивает, если произнесён кем-то сведующим в вопросе. Причины, по которым "так надо", станут понятны по мере приобретения опыта. Читаю книжку Perl Cookbook Тома Кристиансена и Натана Торкингтона (по мере прочтения проникся искренним уважением к авторам, к тому же в самой документации perl сплошь и рядом ссылки на эту книгу). В perl поддержка ООП вообще весьма своеобразно сделана. В частности нет стандартных средств языка для ограничения доступа к данным класса (что, в прочем не мешает истинным параноикам запрятать данные так, что захочешь - не доберёшься), но вот, что пишут авторы по этому поводу:
Работа методов зависит от того, как вы организуете открытый интерфейс к объекту. Нормальный класс не любит, чтобы окружающие копались у него во внутренностях. Для каждого атрибута данных должен существовать метод, обеспечивающий его чтение или обновление. Если пользователь пишет фрагмент вида:
Perl 6
1
2
3
$him = Person->new();
$him->{NAME} = "Sylvester";
$him->{AGE} = 23;
он нарушает интерфейс объекта и напрашивается на неприятности.
Ну а в С++, где есть способ запретить пользователю прямой доступ к данным класса, просто грех этим не воспользоваться. Разумеется, если класс не просто хранит значения переменной plain типа, при этом не заботясь о смысле и допустимости этих самых значений...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.04.2012, 10:16     Свойства класов - зачем помещать свойство в приват
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
02.04.2012, 10:16     Свойства класов - зачем помещать свойство в приват #40
kravam, Крайне интересно, это каким же макаром, вызов геттера может изменить нечто в классе? Геттер обязан быть константным методом, геттер обязан ничего не менять в классе. И тогда не будет таких проблем, которые вы описываете.
А вот сеттером изменить можешь.
Yandex
Объявления
02.04.2012, 10:16     Свойства класов - зачем помещать свойство в приват
Ответ Создать тему
Опции темы

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