Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> зачем нужно обеспечивать защиту членов класса вООП, Реальное практическое применение? 
:(
    Опции темы
v_enom
Дата 12.10.2008, 00:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 101
Регистрация: 11.10.2006

Репутация: нет
Всего: нет



Объясните пожалуйста, нужно ли и зачем (действительно важные случаи) писать код таким образом, чтобы у "пользователя" не было доступа к членам класса и он мог обращаться к ним только через методы???
Об этом часто пишут в книгах, например у Дж.Либерти. что вот, мол, надо чтобы пользователь имел доступ к закрытым членам только через методы, а то "нарушается защита данных и концепция ООП, поэтому лучше не делать члены открытыми а писать private или protected".

Мне не понятно это, если все равно прога будет скомпилирована и конечный пользователь все равно будет работать с окошками, а не с моим классом напрямую.

Объясните пожалуйста.
PM MAIL   Вверх
Daevaorn
Дата 12.10.2008, 00:14 (ссылка) |  (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: нет
Всего: 70



Цитата(v_enom @  12.10.2008,  01:10 Найти цитируемый пост)
Мне не понятно это, если все равно прога будет скомпилирована и конечный пользователь все равно будет работать с окошками, а не с моим классом напрямую.

Ваш код может быть импользован другим программистом(да и вам самим), для вас он будет клиентом. Вот от него и надо защищать внутреннюю инфраструктуру класса. Она ему не нужна.
PM MAIL WWW   Вверх
jonie
Дата 12.10.2008, 00:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 6
Всего: 118



это как минимум помогает в отладке Вашего приложения. Вы можете отслеживать когда идет доступ к Вашим данным. Кроме того конечный пользователь можжет неправильно истоковать открытый член класса... ну например:
Код

class Price{
 public:
  float priceOne;
  int qty;
 private:
  float totalPrice;
  bool isCached;
 public:
  float GetTotalPrice() {
   if(!isCached)
    {
     isCached = true;
     totalPrice = qty*priceOne;
    }
    return totalPrice;
  }
....другие методы
};

представим что пользователь уже когда-то вычислял GetTotalPrice(), потом он меняет qty, и ожидает что GetTotalPrice() вернет ему новое значение... только этого не происходит... это непонятно.


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
v_enom
Дата 12.10.2008, 03:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 101
Регистрация: 11.10.2006

Репутация: нет
Всего: нет



Цитата(Daevaorn @  12.10.2008,  00:14 Найти цитируемый пост)
Ваш код может быть импользован другим программистом(да и вам самим), для вас он будет клиентом. Вот от него и надо защищать внутреннюю инфраструктуру класса. Она ему не нужна.

вот и я говорил только что об этом. Одни общие слова, ни чего конкретного. Зачем мне от самого себя защищать? зачем от программиста защищать? чтобы соблюдать догмы ? тогда это ни разу  не причина.

Добавлено через 1 минуту и 8 секунд
Цитата(jonie @  12.10.2008,  00:44 Найти цитируемый пост)
только этого не происходит... это непонятно.

поясните пожалуйста. ( или это вопрос к кому-то?)
PM MAIL   Вверх
IKM2007
Дата 12.10.2008, 07:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зима близко
**


Профиль
Группа: Участник
Сообщений: 702
Регистрация: 26.4.2008
Где: olmedreca

Репутация: 3
Всего: 40



Цитата(v_enom @  12.10.2008,  03:21 Найти цитируемый пост)
вот и я говорил только что об этом. Одни общие слова, ни чего конкретного. Зачем мне от самого себя защищать? зачем от программиста защищать?

Это называется принцип наименьших привилегий. Ты говоришь, что все надо писать открытым доступом, но зачем, если этого не нужно для реализации класса? Так давайте не будем закрывать двери, когда уходим из дома. К кому придет такая бредовая идея в голову, взобраться в чужой дом днем? Ведь соседи все узнают. Или эта бредовая идея прийдет на ум к одному из соседей? Но ведь это безнравственно. Такого просто не может быть!


--------------------
"К чёрту обстоятельства, я создаю возможности."
Брюс Ли
PM MAIL Skype   Вверх
jonie
Дата 12.10.2008, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 6
Всего: 118



Цитата

поясните пожалуйста. ( или это вопрос к кому-то?)
это не вопрос. это баг, вызванный ошибкой кеша. если будут методы set\get , то такое просто избежать (сбрасывая флаг "кешировано"). в случае прямого доступа к данным такого нельзя сделать.


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Daevaorn
Дата 12.10.2008, 13:05 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: нет
Всего: 70



Цитата(v_enom @  12.10.2008,  04:21 Найти цитируемый пост)
Зачем мне от самого себя защищать? з

Поимеете опыт, тогда поймете.
Цитата(v_enom @  12.10.2008,  04:21 Найти цитируемый пост)
зачем от программиста защищать?

Чтобы потом проблем с сапортом не иметь.
Цитата(v_enom @  12.10.2008,  04:21 Найти цитируемый пост)
чтобы соблюдать догмы ?

Чтобы продуктивнее работать.

Суть в том, что в интерфейсе должно быть только то что нужно для работы подсистемы/класса. Всё остальное детали реализации и знать о них никому не надо(на уровне кода конечно). Вы меняете реализацию, но оставляете интерфейс и поведение, что происходит? Правильно, клиентский код работает как и раньше, а вы уже приступили к следующей задаче.
PM MAIL WWW   Вверх
mes
Дата 12.10.2008, 13:52 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(v_enom @  12.10.2008,  03:21 Найти цитируемый пост)
Зачем мне от самого себя защищать? 

Слово "защищать" не очень подходит, лучше слово "скрывать".  "От самого себя" тоже не верное словосочетание. 
В ООП нет как такового понятия "программист" .  Есть понятия "объект" и "взаимодействие". 
1.   Каждый объект должен максимально полно  и эффективно  выполнять возложенные на него обязанности, т.е должен иметь эффективную реализацию. Как он это делает никому(другим объектам) знать не нужно, поэтому вся внутренняя логика работы (реализация)  должна быть скрыта. Это поможет избежать ненужных связей и  скрытых непредвиденных эффектов.
2.  Каждый объект должен максимально удобно взаимодействовать с другими объектами, т.е предоставлять удобный интерфейс. Естественно интерфейс является открытым для других объектов.

ООП язык предоставляет средства для удобной организации объектов и их взаимодействий, и позволяет обеспечить не пересечение этих понятий. 
А уж дело программиста пользоваться ли этими средствами и облегчать себе жизнь или считать их догмами.

П.С. Хочу заметить что есть и другие подходы(стратегии) помимо ООП, например процедурное, функциональное  или аспектное программированние,
у каждого из которых есть свои преимущества и недостатки. Но для успешного воплощения стратегии , язык программирования должен поддерживать ее.
Раз выбрали С++, то надо учитывать, что ориентирован он на ООП.  smile 




Это сообщение отредактировал(а) mes - 12.10.2008, 15:17


--------------------
PM MAIL WWW   Вверх
Acer
Дата 12.10.2008, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 652
Регистрация: 5.9.2007
Где: UA::DN

Репутация: нет
Всего: 8



PM MAIL   Вверх
v_enom
Дата 12.10.2008, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 101
Регистрация: 11.10.2006

Репутация: нет
Всего: нет



я не пытаюсь противоречить ООП, я пытаюсь понять "зачем нужно это и это". А в ответ получаю "наберетесь опыта - узнаете."
PM MAIL   Вверх
Daevaorn
Дата 12.10.2008, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: нет
Всего: 70



Цитата(v_enom @  12.10.2008,  17:49 Найти цитируемый пост)
я не пытаюсь противоречить ООП, я пытаюсь понять "зачем нужно это и это". А в ответ получаю "наберетесь опыта - узнаете." 

Ну если вы не можете этого понять на основе имеющейся теории, тогда поймете на основе своей практики.
PM MAIL WWW   Вверх
mes
Дата 12.10.2008, 23:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(v_enom @  12.10.2008,  16:49 Найти цитируемый пост)
зачем нужно это и это

для удобства - чтоб достичь цели с наименьшими затратами.

Добавлено через 9 минут и 9 секунд
Цитата(v_enom @  12.10.2008,  00:10 Найти цитируемый пост)
писать код таким образом, чтобы у "пользователя" не было доступа к членам класса 


Цитата(v_enom @  12.10.2008,  00:10 Найти цитируемый пост)
Мне не понятно это, если все равно прога будет скомпилирована и конечный пользователь все равно будет работать с окошками, а не с моим классом напрямую.


Так про конечного пользователя никто и не говорит. Есть два объекта. Один предоставляет какие то функции, другой пользуется ими. Первый является сервисом (сервером), второй пользователем(клиентом). Для разных операций один и тот же объект может выступать в роли сервера, а может в роли клиента. 
Это все рассматривается на уровне языка - процесс компиляции и что из этого получится не рассматривается.  Хотя бы потому, что абсолютно одинаковый программный код, дает в результате компиляции разные машинные коды на разных платформах. 


--------------------
PM MAIL WWW   Вверх
Fazil6
Дата 12.10.2008, 23:43 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 7
Всего: 60



Цитата(v_enom @  12.10.2008,  16:49 Найти цитируемый пост)
я не пытаюсь противоречить ООП, я пытаюсь понять "зачем нужно это и это". А в ответ получаю "наберетесь опыта - узнаете."

закрывать реализацию нужно  для того, чтобы ею не пользовались за пределами класса, ибо если ею будут пользоваться, то внести исправления в этот класс будет очень трудно (если не невозможно), потому как эти изменения будут касаться других частей программы
PM MAIL   Вверх
bsa
Дата 13.10.2008, 09:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(v_enom @ 12.10.2008,  16:49)
я не пытаюсь противоречить ООП, я пытаюсь понять "зачем нужно это и это". А в ответ получаю "наберетесь опыта - узнаете."

Повторю то, что уже сказали Daevaorn и Fazil6... Есть понятие интерфейс - набор доступных всем методов и свойств объекта. Как работают эти методы и как используются свойства - не важно. Важно что они делают.
Например, есть такой стандартный класс string (#include <string>). У него есть куча всяких методов (begin(), end(), operator[], empty(), resize(), data(), c_str() и пр.), при этом ты и понятия не имеешь, как они все работают, и в каком виде хранятся данные. Ведь можно реализовать этот класс через один указатель на строку (char*), можно через 2 (указатель на начало строки и на ее конец), можно через 3 (начало, конец, конец буфера), а можно через указатель и одно(два) целых числа (указатель на строку, (размер зарезервированный области) и количество символов в строке). Вот видишь сколько вариантов реализации? А теперь скажи, как бы все программы работали под разными реализациями STL, если бы данные свойства класса были публичными? Тут получается или все реализуют одинаково (ограничивает возможности оптимизации), или одна версия несовместима с другой.
PM   Вверх
v_enom
Дата 14.10.2008, 00:12 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 101
Регистрация: 11.10.2006

Репутация: нет
Всего: нет



Цитата(Fazil6 @  12.10.2008,  23:43 Найти цитируемый пост)
закрывать реализацию нужно  для того, чтобы ею не пользовались за пределами класса, ибо если ею будут пользоваться, то внести исправления в этот класс будет очень трудно (если не невозможно), потому как эти изменения будут касаться других частей программы

спасибо, вот этот пример я почему-то понял лучше остальных.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0673 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.