Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.09.2015, 19:43   #11
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Под инкапсуляцией обычно имеют в виду не только связывание данных, но и скрытие.
https://ru.wikipedia.org/wiki/%D0%98...D0%B8%D0%B5%29
у инкапсуляции нет задачи скрывать данные.

инкапсуляция - это языковый механизм,
который позволяет изолировать вызывающую сторону от деталей реализации вызываемой.

что позволяет менять детали реализации
без необходимости править код вызывающей стороны.

в контексте языка с++ - положите данные в приватную секцию класса,
и вы уже их инкапсулировали.
_Bers вне форума Ответить с цитированием
Старый 23.09.2015, 19:54   #12
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Ого! Дьявол и к сотворению ООП причастен? О_о
Я рад.
Не-не-не. Это я так, с горяча. Он туда не залезет, пока не позовёшь. Ты не зовёшь, а я - открещиваюсь.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 23.09.2015, 20:56   #13
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Ты не зовёшь, а я - открещиваюсь.
Я не специалист по призывам )
К моему глубочайшему сожалению...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 23.09.2015, 21:19   #14
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
Сообщение от _Bers Посмотреть сообщение
у инкапсуляции нет задачи скрывать данные.

инкапсуляция - это языковый механизм,
который позволяет изолировать вызывающую сторону от деталей реализации вызываемой.

что позволяет менять детали реализации
без необходимости править код вызывающей стороны.

в контексте языка с++ - положите данные в приватную секцию класса,
и вы уже их инкапсулировали.
Ну википедия говорит, что в первую очередь инкапсуляция — это про связывание данных/функций в один компонент, но часто под инкапсуляцией подразумевают и сокрытие/information hiding

Цитата:
The term encapsulation is often used interchangeably with information hiding. Not all agree on the distinctions between the two though; one may think of information hiding as being the principle and encapsulation being the technique. A software module hides information by encapsulating the information into a module or other construct which presents an interface
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 24.09.2015, 00:12   #15
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Ну википедия говорит, что в первую очередь инкапсуляция — это про связывание данных/функций в один компонент, но часто под инкапсуляцией подразумевают и сокрытие/information hiding
1.
"связывание данных/функций" в один компонент
не имеет никакого отношения к инкапсуляции.

поскольку сам процесс такого "связывания" ни что иное,
как описание собственно класса.

пример:

Код:
// --- связал данные и методы их обработки
struct sample
{
    int a = 10;
    void foo() { a = 100; }
};

int main()
{
    sample s;
    s.a = 300;  //<--- обратите внимание
        // вызывающая сторона имеет полный доступ к данным

    // класс sample уже поимел легаси
    // теперь нельзя поменять детали реализации так
    // без риска затронуть код вызывающей стороны
    // а сам он зависит от её корректности
    // что означает, что вызывающая сторона должна быть в курсе
    // нюансов, что бы просто использовать механизм sample 

    // такую ситуацию называют "нарушением инкапсуляции"
}
детали реализации sample не были инкапсулированны:
они public, а значит не изолированны от окружающей среды.
что может приводить к печальным последствиям.



сокрытие данных так же не имеет к
инкапсуляции никакого отношения.
не нужно путать эти понятия.

пример:

Код:
// --- связал данные и методы их обработки
class sample
{
    int a = 10;  //<--- данные не спрятаны
    // вот они, пожалуйста, смотрите

    // у инкапсуляции нет задачи
    // скрывать данные от программиста 

    // но они изолированны от окружающей среды
    // потому что приватные данные 
    // снаружи никому не доступны


public:
    void foo() { a = 100; }
};

int main()
{
    sample s;
    s.foo(); //<--- класс выполняет для нас какую то работу

   // мы не можем получить доступ к его деталям реализации
   // можем лишь дергать класс за его интерфейс
   // (публичные методы)

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

   // из этого вытекает главная задача инкапсуляции:
   // мы можем эксплуатировать класс 
   // не зная подробностей его реализации

   // когда у клиентов класса есть возможность
   // эксплуатировать его, и получать профит
   // без необходимости вникать и знать
   // о деталях реализации
   // то говорят - это грамотная инкапсуляция
}
иногда инкапсуляцию путают с сокрытием данных.
полагаю, что это от безграмотности.
википедия - не авторитет.
её пишут обычные люди.
_Bers вне форума Ответить с цитированием
Старый 24.09.2015, 06:00   #16
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Я не специалист по призывам )
К моему глубочайшему сожалению...
Не сожалей. Даже более того, не влазь. Накличешь на себя беду, а оно тебе надо? Я однажды влез. Что-бы отбрыкаться, пришлось пожертвовать трёхкомнатной квартирой в Казахстане. Еле отвертелся. Хорошо, у меня классный учитель был. А то-бы я сейчас с вами не разговаривал. Простите за холивар. Всё, переходим к теме.

Цитата:
Сообщение от _Bers Посмотреть сообщение
иногда инкапсуляцию путают с сокрытием данных.
В основном, Вы правы. Но с этим утверждением не согласен. Это Вы путаетесь. Incapsulation означает именно сокрытие реализации от пользователя. Или я Вас не понял? О каких данных речь?
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder

Последний раз редактировалось Smitt&Wesson; 24.09.2015 в 06:12.
Smitt&Wesson вне форума Ответить с цитированием
Старый 24.09.2015, 07:45   #17
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Даже более того, не влазь. Накличешь на себя беду, а оно тебе надо?
Не переживай, не накличу )
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 24.09.2015, 09:49   #18
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
Сообщение от _Bers
википедия - не авторитет.
её пишут обычные люди.
А _Bers с programmersforum.ru не обычный человек что ли?

Цитата:
"связывание данных/функций" в один компонент
не имеет никакого отношения к инкапсуляции.

поскольку сам процесс такого "связывания" ни что иное,
как описание собственно класса.
Так и в чем противоречие?
И инкапсуляция и т.п. бывает же и без классов/ООП.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 24.09.2015 в 09:55.
Alex11223 вне форума Ответить с цитированием
Старый 24.09.2015, 10:28   #19
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Не переживай, не накличу )
Вот и ладушки. А то, я уж совсем было скис .

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
А _Bers с programmersforum.ru не обычный человек что ли?
Да все мы здесь немножко "повёрнутые". А Вики пишется в общеобразовательных целях. Так, что программёрс в отношении программ, более авторитетен.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder

Последний раз редактировалось Smitt&Wesson; 24.09.2015 в 10:31.
Smitt&Wesson вне форума Ответить с цитированием
Старый 24.09.2015, 23:21   #20
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Smitt&Wesson Посмотреть сообщение
Это Вы путаетесь. Incapsulation означает именно сокрытие реализации от пользователя. Или я Вас не понял? О каких данных речь?
похоже вы ничего не поняли,
из того, что я писал выше.


пример инкапсуляции:
Код:
struct worker
{
    void work(const param&);
private:
    data mData; //<--- вот они, данные.
      // пользователь прекрасно их видит.
      // от него они не скрываются

     // тем не менее, они приватные,
     // снаружи к ним доступа нет
     // а значит, они изолированны от окружающей среды
     // данные инкапсулированы, а не скрыты

};
пример сокрытия:

Код:
//forward declaration
struct data;

struct worker
{
    void work(const param&);
private:
    data* mData; //<--- данные полностью скрыты
    // пользователь не знает ни размера, ни строения
    // класса data
    // не знает какие в нем могут быть методы
    // он вообще решительно ничего не знает 
    // о природе данных
    // это - черный ящик

    // можно поставлять пользователю 
    // уже скомпилированную библиотеку

    // и без приседаний с дизассемблером
    // невозможно понять ни устройства
    // ни принципов работы

};
разницу видите?

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


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


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
С++ ООП Leet Помощь студентам 1 24.02.2013 17:04
ООП kn0w Помощь студентам 7 11.01.2013 14:18
ООП на С++ dimys1237 Общие вопросы C/C++ 5 18.12.2012 22:28
Паскаль ООП. Примеры программ с использованием ООП SeЯgey Помощь студентам 5 13.05.2009 21:55