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

Зачем скрывать данные?

19.12.2018, 16:46. Показов 3413. Ответов 41
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Я не понимаю, зачем в языке С++ предусмотрены private данные. От кого их нужно скрывать? Зачем хорошему программисту сокрытие, если и без него можно написать правильный код и организовать в нём правильное разграничение доступа к данным?

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

Эти возможности языка представляются мне избыточными.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.12.2018, 16:46
Ответы с готовыми решениями:

сегодня наконец то понял что такое КЛАСС, и ОБЪЕКТ. понято всё, кроме одного - зачем всё это? в смысле, можно же без этого? так зачем жизнь усложнять?
сегодня наконец то понял что такое КЛАСС, и ОБЪЕКТ. понято всё, кроме одного - зачем всё это? в смысле, можно же без этого? так зачем жизнь...

Зачем биты нужны это меньше байтов но int 32 бита но я не допер зачем это нужно это 4 байта то есть int не может больше 4 байт весить?
Вот еще один вопрос зачем биты нужны это меньше байтов но int 32 бита но я не допер зачем это нужно это 4 байта то есть int не может...

скрывать заголовок группы, если в отчете отсутствуют данные
Здравствуйте!Помогите пожалуйста с отчетом! Мне нужно в отчете скрывать заголовок группы, если в подчиненном отчете отсутствуют данные! ...

41
309 / 221 / 74
Регистрация: 23.05.2011
Сообщений: 981
29.12.2018, 01:35
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от eva2326 Посмотреть сообщение
Зачем вообще тут что-либо запихивать в read-only memory?
Незачем, но ведь Вы сами раньше говорили, что он обязательно запишет.

В общем, Вы со мной согласились, и это хорошо.
0
 Аватар для eva2326
1685 / 513 / 107
Регистрация: 17.05.2015
Сообщений: 1,524
29.12.2018, 10:37
Цитата Сообщение от New man Посмотреть сообщение
но ведь Вы сами раньше говорили, что он обязательно запишет.
Перечитайте еще раз мои сообщения. Потом еще раз отпишитесь тут. Буду ждать
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
29.12.2018, 11:17
Цитата Сообщение от Jzx Посмотреть сообщение
Я не понимаю, зачем в языке С++ предусмотрены private данные. От кого их нужно скрывать? Зачем хорошему программисту сокрытие, если и без него можно написать правильный код и организовать в нём правильное разграничение доступа к данным?
Я не знаю почему все тут скромничают, но я не буду и скажу страшно слово: инвариант. Если набор данных должен быть логически согласован, то говорят, что есть правило (инвариант), описывающее эту связь. Класс должен её поддерживать. Сокрытие, - один из инструментов, реализующих данное действо.
Ещё можно бы сказать об отделении реализации от интерфейса. Это один из путей локализации по сути. То есть, если Вы понимаете почему глобальная переменная хуже локальной (конфликты имён, непреднамеренная тень, трудности с отладкой), то сокрытие не должно вызывать вопросов.
Кроме всего есть, также и разделение кода разработчика и клиентского кода (авторское право, лицензирование, деньги), хотя в этом случае и применяется поставка объектных файлов, но запрет на доступ внутрь остается и он становится более трудно устраним.
0
 Аватар для eva2326
1685 / 513 / 107
Регистрация: 17.05.2015
Сообщений: 1,524
29.12.2018, 11:48
Цитата Сообщение от IGPIGP Посмотреть сообщение
Сокрытие, - один из инструментов, реализующих данное действо.
Этим занимается "инкапсуляция".

"Сокрытие" же преследует цель "скрыть данные (и/или код).
Инкапсуляция здесь скорее просто побочный эффект.

Никогда не задумывались: почему приватная часть класса отсвечивает в хедерах?
И совсем никак не скрывается где-то в недрах "реализации" ?
1
 Аватар для COKPOWEHEU
4070 / 2704 / 433
Регистрация: 09.09.2017
Сообщений: 12,023
29.12.2018, 12:48
Только потому что для создания объекта нужно знать его размер. Вообще-то, лучше было бы как раз скрыть приватную часть класса, но это оказалось слишком сложно технически.
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
29.12.2018, 13:24
Цитата Сообщение от eva2326 Посмотреть сообщение
И совсем никак не скрывается где-то в недрах "реализации" ?
Для скрытия в недрах есть Pimpl, в частности d-pointer и его аналоги.
А скрывать недра хедера нельзя по той причине, что компилятору обязательно нужно знать размер класса и смещения всех полей класса вне зависимости от того, можно их трогать или нельзя.

Добавлено через 18 минут
Цитата Сообщение от Jzx Посмотреть сообщение
организовать в нём правильное разграничение доступа к данных
Вот как раз для задания разграничения вида "использовать только в пределах этого класса, больше оно нигде не потребуется" и используется private . Нет, именно подобное разграничение используется всё же реже public и protected (особенно если во время создания класса нет уверенности, что его наследники никогда не будут пользоваться данным полем/методом ), но тем не менее такое вполне встречается.

С const - аналогично. Если есть уверенность, что данное поле никем никогда изменяться не будет и не должно (только задаваться при инициализации) - ставим const, иначе не ставим.
1
 Аватар для eva2326
1685 / 513 / 107
Регистрация: 17.05.2015
Сообщений: 1,524
29.12.2018, 13:28
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Только потому что для создания объекта нужно знать его размер. Вообще-то, лучше было бы как раз скрыть приватную часть класса, но это оказалось слишком сложно технически.
1. Нет здесь никаких технических ограничений.
2. Скрыть приват из хедера можно уже сегодня:
С++ идиомы - обсуждение
С поддержкой компилятора было бы веселее.
3. В своей книге "Дизайн и эволюция с++", Бьярн Страуструп особенное внимание уделяет такому аспекту:
"Нет задачи скрывать что либо от программистов. В этом нет смысла.
Смысл в том, что бы защитить данные и код от случайных поломок, но при этом не мешать программисту с ними
работать"
(ц) Вольная цитата по памяти.

Что примечательно, Страуструп вообще, проектируя дизайн синтаксиса,
думал, что в начале будет идти самая важная - приватная часть, и только затем публичная.
Поэтому для классов по умолчанию [b]private[b]

C++
1
2
3
4
5
6
class sample
{
    int data;
public:
    sample(int);
};
На практике оказалось, что приватную часть по большому счету не хочется ни знать, ни видеть)))
И почти весь мир начинает описание класса со слова public

Если бы изначально для классов по умолчанию поля были бы открыты - сэкономили бы целых 7 букв на каждый класс в исходниках.
1
322 / 174 / 78
Регистрация: 09.10.2014
Сообщений: 809
29.12.2018, 13:53
Цитата Сообщение от eva2326 Посмотреть сообщение
1. Нет здесь никаких технических ограничений.
да вы шо

Добавлено через 2 минуты
Иногда за (Идиома "reference to implementation" (rImpl)) платить никто не хочет.
0
 Аватар для COKPOWEHEU
4070 / 2704 / 433
Регистрация: 09.09.2017
Сообщений: 12,023
29.12.2018, 14:44
Цитата Сообщение от eva2326 Посмотреть сообщение
2. Скрыть приват из хедера можно уже сегодня:
С++ идиомы - обсуждение
Теоретически возможно. Да хотя бы оставить в приватных полях один void* на реальные данные. Вот только это либо неудобно, либо небезопасно, либо неэффективно, либо все вместе.
Реализация на уровне языка могла бы решить эти проблемы, но, похоже, оказалась слишком сложной, либо терялась совместимость с Си. Да и видимость приватных данных не настолько серьезная проблема чтобы переписывать кучу кода.
Цитата Сообщение от eva2326 Посмотреть сообщение
3. В своей книге "Дизайн и эволюция с++", Бьярн Страуструп особенное внимание уделяет такому аспекту:
"Нет задачи скрывать что либо от программистов. В этом нет смысла.
Смысл в том, что бы защитить данные и код от случайных поломок, но при этом не мешать программисту с ними
работать"
(ц) Вольная цитата по памяти.
Что примечательно, Страуструп вообще, проектируя дизайн синтаксиса,
думал, что в начале будет идти самая важная - приватная часть, и только затем публичная.
Вот видите, Страуструп изначально выбрал неудачное решение, которое теперь тянется ради совместимости.
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
29.12.2018, 14:50
Цитата Сообщение от eva2326 Посмотреть сообщение
Если бы изначально для классов по умолчанию поля были бы открыты
Для этого есть struct - в ней по-умолчанию как раз все поля открыты. Правда нет возможности наследовать от неё классы или от класса структуры.

Цитата Сообщение от lArtl Посмотреть сообщение
Иногда за (Идиома "reference to implementation" (rImpl)) платить никто не хочет
Ну нельзя сказать компилятору "выдели памяти столько не знаю сколько, и размести объекты там так не знаю как". Поэтому либо открытые заголовки, либо динамическое выделение памяти во время работы.
0
 Аватар для COKPOWEHEU
4070 / 2704 / 433
Регистрация: 09.09.2017
Сообщений: 12,023
29.12.2018, 16:00
Цитата Сообщение от TRam_ Посмотреть сообщение
Ну нельзя сказать компилятору "выдели памяти столько не знаю сколько, и размести объекты там так не знаю как".
Лично я вижу два варианта:
1. Раз речь идет об объекте, можно модифицировать оператор new чтобы он возвращал объем занимаемой памяти.
2. Отказаться от совместимости с Си-шным стилем многофайловых программ и использовать вместо пары *.h+*.o что-то более сложное, где будет храниться объем объекта.
И оба эти варианта сложны в реализации и грозят потерей совместимости, то есть это будет уже не С++.
0
 Аватар для eva2326
1685 / 513 / 107
Регистрация: 17.05.2015
Сообщений: 1,524
29.12.2018, 16:22
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Реализация на уровне языка могла бы решить эти проблемы, но, похоже, оказалась слишком сложной
Скорее не нужной)))

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
либо терялась совместимость с Си
щ_Щ

Как добавление подобной фичи может нарушить совместимость с языком си?

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
видимость приватных данных не настолько серьезная проблема чтобы переписывать кучу кода.
щ_Щ

Как добавление подобной фичи может сломать уже написанный код?

Вы вообще понимаете что такое "обратная совместимость"?

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Вот видите, Страуструп изначально выбрал неудачное решение, которое теперь тянется ради совместимости.
Какое "такое неудачное решение"?
Вы это о чем?


Цитата Сообщение от TRam_ Посмотреть сообщение
Правда нет возможности наследовать от неё классы или от класса структуры
Вам религия не позволяет?

Цитата Сообщение от TRam_ Посмотреть сообщение
Ну нельзя сказать компилятору "выдели памяти столько не знаю сколько, и размести объекты там так не знаю как". Поэтому либо открытые заголовки, либо динамическое выделение памяти во время работы.
Вы отдаете себе отчет, что цитата, которую вы прокомментировали - отсылка к паттерну rImpl

Который внезапно именно для того и существует, чтобы сказать компилятору:
"выдели мне память под объект, я пока ещё не знаю, какой именно"

И о боже! это - работает.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
29.12.2018, 16:37
Цитата Сообщение от eva2326 Посмотреть сообщение
Этим занимается "инкапсуляция".
Именно. Инкапсуляция это общее понятие, а сокрытие при помощи секций доступа - частный случай.
Цитата Сообщение от eva2326 Посмотреть сообщение
Никогда не задумывались: почему приватная часть класса отсвечивает в хедерах?
И совсем никак не скрывается где-то в недрах "реализации" ?
Буквальное понимание это не всегда удачный ход мысли. Никто не играет в прятки, хотя в сях именно это и остаётся. А ещё есть френды. Никогда не задумывались почему?

Не по теме:

в альпинизме френды тоже очень классные помощники. В хороших руках.


0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
29.12.2018, 16:49
Цитата Сообщение от eva2326 Посмотреть сообщение
Который внезапно именно для того и существует, чтобы сказать компилятору:
"выдели мне память под объект, я пока ещё не знаю, какой именно" И о боже! это - работает.
Вот как раз уже знает, потому что в "скрытом хедере" (который скомпилирован, но не предоставляется) этот объект полностью описан. Но знает только в момент вызова конструктора, и потому может выделять память только в куче, т.е. медленно, в чём и претензия.

Ну либо можно сделать выделение в специально зарезервированном месте в классе с помощью placement new, но тут проверка размеров и прочее остаётся уже на программисте.

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

Не по теме:

Цитата Сообщение от eva2326 Посмотреть сообщение
Вам религия не позволяет?
предубеждения. Проверил - таки да, можно...

0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
29.12.2018, 16:54
TRam_, eva2326 я конечно не хочу вмешиваться, но тем не менее. Вопрос состоял в том, где искать смысл сокрытия, а не в том как оно реализовано. Глядя в начало топика и в то что он сейчас собой представляет, непонятно как они связаны.
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
29.12.2018, 17:16
IGPIGP, ну например в предоставлении вместе с библиотекой не её полные исходники, а только часть хэдеров для линкования и собственно dll-ку или файл библиотеки. Или для того, чтобы можно было, сохраняя эти хэдеры, полностью перерабатывать внутренности библиотеки, сохраняя бинарную совместимость (т.к. пользователь всё равно не знает, а потому не может привязываться к текущим внутренностям). То есть более глубокий способ разделения нежели просто разграничение по доступу.
0
 Аватар для COKPOWEHEU
4070 / 2704 / 433
Регистрация: 09.09.2017
Сообщений: 12,023
29.12.2018, 17:32
Цитата Сообщение от eva2326 Посмотреть сообщение
щ_Щ
Как добавление подобной фичи может нарушить совместимость с языком си?
Это я описал во втором варианте - усложнение модулей. В Си они предельно простые и любое усложнение ломает совместимость.
Цитата Сообщение от eva2326 Посмотреть сообщение
щ_Щ
Как добавление подобной фичи может сломать уже написанный код?
Вы вообще понимаете что такое "обратная совместимость"?
Я имел в виду код компилятора, а не прикладной
Цитата Сообщение от eva2326 Посмотреть сообщение
Какое "такое неудачное решение"?
то что поля класса по умолчанию приватные
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
29.12.2018, 17:40
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
то что поля класса по умолчанию приватные
Ну тут скорее на protected, т.к. потребуется доступ к полю в наследниках или нет на начальном этапе проектирования обычно дискуссионный. А для остального - struct для публичных полей по умолчанию, class - для прочих.
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Да хотя бы оставить в приватных полях один void* на реальные данные.
Это в С++ и называется Pimpl = pointer to implementation = указатель на реализацию
Только не void *, а всё же некий указатель на объявленный, но не определённый класс.
0
 Аватар для eva2326
1685 / 513 / 107
Регистрация: 17.05.2015
Сообщений: 1,524
29.12.2018, 18:31
Цитата Сообщение от IGPIGP Посмотреть сообщение
а сокрытие при помощи секций доступа - частный случай.
Модификаторы доступа ничего не скрывают.

Цитата Сообщение от IGPIGP Посмотреть сообщение
Никто не играет в прятки
pImpl, rImpl ? Не, не слышал

Цитата Сообщение от IGPIGP Посмотреть сообщение
А ещё есть френды
Никогда не задумывались почему?
Что бы можно было вынести в отдельный класс детали реализации.

Цитата Сообщение от TRam_ Посмотреть сообщение
Вот как раз уже знает, потому что в "скрытом хедере" (который скомпилирован, но не предоставляется) этот объект полностью описан
1.
В c++ нет понятия "компиляции хедеров"

2.
Вы вообще следите за нитью своего рассуждения?
Выше вы писали:
> скрывать недра хедера нельзя по той причине, что компилятору обязательно нужно знать размер класса и смещения всех полей класса

Теперь внезапно оказывается, что скрыть недра хедера очень даже просто.
Потому нет никаких проблем ни с размерами классов, ни со смещениями их полей.

Цитата Сообщение от IGPIGP Посмотреть сообщение
Вопрос состоял в том, где искать смысл сокрытия, а не в том как оно реализовано.
Вы не различаете "сокрытие" и "инкапсуляцию".
Сложно искать смыслы, когда каша в голове.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Это я описал во втором варианте - усложнение модулей. В Си они предельно простые и любое усложнение ломает совместимость.
Что за бред?


Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Я имел в виду код компилятора, а не прикладной
Вы знаете как устроен код компилятора?
Или на чем основаны такие высказывания?
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
29.12.2018, 19:03
Цитата Сообщение от eva2326 Посмотреть сообщение
Модификаторы доступа ничего не скрывают.
Да? Серьёзно? Я думаю вы лучше знаете ВСЁ.
Цитата Сообщение от eva2326 Посмотреть сообщение
pImpl, rImpl ? Не, не слышал
Это тоже способ. Я там писал, что что секции это один из. Прям, так и хочется брякнуть :"Подмножество, - слыхала?", но не стану. Ваши манеры леди выше всяких похвал.
Цитата Сообщение от eva2326 Посмотреть сообщение
Никогда не задумывались почему?
Что бы можно было вынести в отдельный класс детали реализации.
Нет. Причин очень много. В частности, чтобы операторы вызывать не только на экземпляре, а и если он правый операнд (для бинарных например) . И прочие радости. Не увидите вы такую функцию. И она не увидит того что ей может понадобиться.
Цитата Сообщение от eva2326 Посмотреть сообщение
Вы не различаете "сокрытие" и "инкапсуляцию".
Сложно искать смыслы, когда каша в голове.
Цитата Сообщение от wikipedia
в сообществе С++ или Java принято рассматривать инкапсуляцию без сокрытия как неполноценную. Однако, некоторые языки (например, Smalltalk, Python) реализуют инкапсуляцию в полной мере, но не предусматривают возможности скрытия в принципе.
Даже для овощей пишут. Однако я причисляю себя к сообществу С++. И раздел вроде соответствует.
Ваши манеры леди выше всяких похвал.
В адрес других участников тоже много чего лестного. Мы не следим за вашей мыслью леди. Простите, но это частенько не реализуемо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.12.2018, 19:03

Зачем повторно засылать данные?
на странице имеется форма <form method='POST' id='searchform' action='http://www.weblaboratory.info/'> <label...

Зачем нужно кодировать данные?
есть функция base64_encode и у меня вопрос зачем нужно кодировать данные? где это нужно и почему существуют много способов кодирования...

Зачем закрывать поток чтобы записать данные в файл?
Не понимаю такую особенность. В книге об этом нигде не сказано, автор просто закрывает поток, не называя причин. Код public void...

Зачем в .NET в 2014 г. строгая типизация? Зачем нужно писать Convert.ToInt32(), ToString(), Int32.Parse()?
По поводу преобразования. Современный препроцессор кода сам определяет, что куда преобразовывать. Если в функцию, принимающую строку,...

Скрывать стили
Здравствуйте. Как скрывать стили если нет данных при условии: <ul id="my_menu2"> <?php $resultat = mysql_query("SELECT `id`,...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Krabik для WoW 3.3.5a, многоязычный
AmbA 02.07.2026
Допилил бота, думаю что окончательно. Изменения: - добавлена многоязычность - добавлено снятие скриншотов - добавлено поддержание бафов хождения по воде (для жреца, дк и шамана) - и так, по. . .
Алиса нашла кучу ошибок компиляции и запуска в проекте, который без проблем компилировался и запускался)))
anaschu 30.06.2026
Я пока посмеюся, но завтра проверю. А вообще интерсно. Дал алисе файл, в котором точно нет ошибок компиляции и запуска, и попросил их найти. Нашла кучу))) Критические ошибки, мешающие компиляции и. . .
сукцессия 16. Общий обзор, в основном что бы другие ии поняли
anaschu 29.06.2026
# Передаточный документ: модель микоризной сукцессии (для нового чата) Этот документ предназначен для того, чтобы новый чат Claude мог продолжить работу без необходимости заново разбираться в. . .
сукцессия 15 неявная схема
anaschu 29.06.2026
Алиса Калибровка параметров симбиотической модели: технический обзор Содержание: Введение Постановка проблемы Технические аспекты реализации Процесс внедрения изменений
сукцессия 14. Обновленная схема модели
anaschu 28.06.2026
ГЛОБАЛЬНАЯ ОПИСАТЕЛЬНАЯ СПЕЦИФИКАЦИЯ ЭКОСИСТЕМНОЙ МОДЕЛИ «SOIL CHEMISTRY & MYCORRHIZA 2. 0» https:/ / ibb. co/ NnkGpfMd Представленная интегрированная схема описывает непрерывную нелинейную. . .
сукцессия 13. Питон модель трехзонного мицелия, пока что в основном арбускулярного
anaschu 28.06.2026
## Разработка агентной модели микоризной сукцессии: от выявления артефактов к созданию комплексной системы ### Аннотация Представлено исследование по разработке агентной модели микоризной. . .
сукцессия 12. краткий список проверок модели перед запуском.
anaschu 27.06.2026
Скрытые отказы в моделях систем динамики (SD-models) экологических систем: два случая из практики Контекст Разбирался прототип модели систем динамики (SD-модели) микоризной сукцессии: пять. . .
Сукцессия 11. Проверка орудий перед войной: разработка через тестирование
anaschu 27.06.2026
Как не дать модели соврать самой себе: проверки для симуляции микоризной сукцессии Введение Когда вы строите математическую модель живой системы — грибов, растений, почвы — главная опасность. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru