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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Объясните пожалуйста про инкапсуляцию 
V
    Опции темы
Furchtlos
Дата 23.11.2011, 19:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Не могу понять ДЛЯ ЧЕГО она нужна? Везде твердят примерно одно и то-же. Инкапсуляция связывает код и данные, и скрывает ненужный код и данные от пользователя а также защищает код от неправильного использования(это писал по памяти). Определение запомнил. А понять не могу. Каким образом можно неправильно использовать код? Приведите пожалуйста пример РЕАЛЬНОГО преимущества инкапсуляции. Левый пример про автомобиль и например давление в камере сгорания прошу не приводить, т.к обычный юзер может залезть в двигло и покопаться, естесственно что он может его обратно и не собрать, однако залезть в двигатель, мне кажется, намного легче, чем каким-то образом влезть в код(поправьте, если не прав). Также что конкретно означает понятие "интерфейс"? Это то, что взаимодействует с юзером? Т.е все эти сообщения в окне, и то, что туда можно вводить? Ок, тогда почему не написать код, чтобы юзер не мог уничтожить данные? В общем я слегка начал это понимать когда увидел пример про файловую систему. Т.е чтобы обратиться в файловую систему через, например, C++ мы используем специальные функции, а не обращаемся напрямую. Т.е инкапсуляция ограничивает наши возможности в данном случае. Ну а что значит тогда обращаться "напрямую"? Нашел на википедии пример кода для C#:
Код

class EncapsulationExample
{
private double valueDouble;
private string valueString;

public double Value
{
get { return valueDouble; }
set 
{
valueDouble = value;
valueString = value.ToString();
}
}

public string ValueString
{
get { return valueString; }
set 
{
double tmp_value = Convert.ToDouble(value); //здесь может возникнуть исключение
valueDouble = tmp_value;
valueString = value;
}
}
}

Но я не понял тут что значит например "public double Value"? Это поле класса? Если так, то почему оно похоже на метод? Что значит это "value" с маленькой буквы? Оно нигде не объявлено, это то значение, которое мы можем задать нашей "double Value" посредством метода "set"? Зачем внизу создается временная переменная "tmp_value"? Если можно было-бы сразу запихнуть в "valueDouble" значение "Convert.ToDouble(value)". И какое тут может возникнуть исключение? Не правильное приведение типа? А какой тип мы можем сюда неправильно засунуть? Так, чтобы компилятор запустил все это? Заранее благодарю!

Это сообщение отредактировал(а) Furchtlos - 23.11.2011, 21:13
PM MAIL   Вверх
newbee
Дата 23.11.2011, 20:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бревно
**


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

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



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

Добавлено через 1 минуту и 12 секунд
Исходник я конечно не читала. Его тебе кто-нибудь другой объяснит.


--------------------
You're face to face
With man who sold the world
PM   Вверх
Furchtlos
Дата 23.11.2011, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Это я понимаю, что скрывает. Но каким образом можно навредить коду, не скрыв?
PM MAIL   Вверх
newbee
Дата 23.11.2011, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бревно
**


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

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



Цитата(Furchtlos @  23.11.2011,  21:18 Найти цитируемый пост)
Но каким образом можно навредить коду, не скрыв? 
Это в первую очередь вопрос удобства. Но повредить тоже можно. Вот есть у объекта двигатель функция "включить", внутри она что-то делает и выставляет флаг "включен". По этому флагу ты всегда можешь узнать, жужжит в данный момент мотор или нет. А теперь мы берем и снаружи этого объекта выставляем флаг в "выкл". В лучшем случае мы просто будем получать недостоверную информацию о состоянии мотора, а в худшем во время повторного вызова функции "включить" она попытается завести уже работающий мотор, в процессе что-нибудь пойдет не так и ба-бах! Кровь, сопли, кишки, слезы!

Ты можешь сказать, ну и сам себе злобный буратино, раз изменил флаг, но тут важно понимать следующую вещь: кода очень много, подавляющая часть кода - чужой. Случайно сломать где-нибудь корректное внутреннее состояние объекта (как в случае с мотором) очень легко. Поэтому желательно скрывать.


--------------------
You're face to face
With man who sold the world
PM   Вверх
Furchtlos
Дата 23.11.2011, 20:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Как пользователь может сломать состояние объекта? Вводом неправильных данных?
PM MAIL   Вверх
newbee
Дата 23.11.2011, 20:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бревно
**


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

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



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

Добавлено через 1 минуту и 7 секунд
Цитата(Furchtlos @  23.11.2011,  21:38 Найти цитируемый пост)
Как пользователь может сломать состояние объекта? Вводом неправильных данных? 
smile Под пользователем у тебя подразумевается не чувак, тыкающий кнопки на экране, а сторонний программист, который использует чужую библиотеку/код.


--------------------
You're face to face
With man who sold the world
PM   Вверх
Furchtlos
Дата 23.11.2011, 20:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Это уже совсем другое дело.Большое спасибо! Всё-равно осталось не совсем ясно, но теперь с другой стороны.
PM MAIL   Вверх
bsa
Дата 23.11.2011, 21:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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




M
bsa
Furchtlos, если ответ на вопрос получен, то пометь тему решенной

PM   Вверх
mes
Дата 23.11.2011, 22:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Код

struct string 
{
     size_t  size;
     char * data;
};

как видно из примера  мы можем установить размер произвольно от реальной длины строки, это приведет к непредвиденным проблемам.. Поэтому у нас два варианта:
1. напрягать пользователя ответсвенностью за каждое изменение
2. предоставить ему интерфейс (сокрыв данные)  для удобного пользования ими..
условно так :
Код

class string
{
           size_t get_size () const;
           void change (const char* str ) 
           {
                    _size = strlen (str);
                   _data = strcopy (str);
           }
  private:  // 
           size_t  _size;
           char * _data;
};

мы можем получить, но не изменить размер отдельно от изменения  строки данных.. 

Это сообщение отредактировал(а) mes - 23.11.2011, 22:34


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


Новичок



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

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



А зачем тут нужны константы?
PM MAIL   Вверх
mes
Дата 24.11.2011, 00:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Furchtlos @  23.11.2011,  22:42 Найти цитируемый пост)
А зачем тут нужны константы? 

в методе get квалификатор неизменности состояния объекта.. (т.е. можно только запросить данные но не изменить)
const char *  -  си-строка


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


Шустрый
*


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

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



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


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


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

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



Lols,  С (не C++) как раз  того и предлагает.. 



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

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

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

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

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


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

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


 




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


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

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