![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
Furchtlos |
|
|||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 23.11.2011 Репутация: нет Всего: нет |
Не могу понять ДЛЯ ЧЕГО она нужна? Везде твердят примерно одно и то-же. Инкапсуляция связывает код и данные, и скрывает ненужный код и данные от пользователя а также защищает код от неправильного использования(это писал по памяти). Определение запомнил. А понять не могу. Каким образом можно неправильно использовать код? Приведите пожалуйста пример РЕАЛЬНОГО преимущества инкапсуляции. Левый пример про автомобиль и например давление в камере сгорания прошу не приводить, т.к обычный юзер может залезть в двигло и покопаться, естесственно что он может его обратно и не собрать, однако залезть в двигатель, мне кажется, намного легче, чем каким-то образом влезть в код(поправьте, если не прав). Также что конкретно означает понятие "интерфейс"? Это то, что взаимодействует с юзером? Т.е все эти сообщения в окне, и то, что туда можно вводить? Ок, тогда почему не написать код, чтобы юзер не мог уничтожить данные? В общем я слегка начал это понимать когда увидел пример про файловую систему. Т.е чтобы обратиться в файловую систему через, например, C++ мы используем специальные функции, а не обращаемся напрямую. Т.е инкапсуляция ограничивает наши возможности в данном случае. Ну а что значит тогда обращаться "напрямую"? Нашел на википедии пример кода для C#:
Но я не понял тут что значит например "public double Value"? Это поле класса? Если так, то почему оно похоже на метод? Что значит это "value" с маленькой буквы? Оно нигде не объявлено, это то значение, которое мы можем задать нашей "double Value" посредством метода "set"? Зачем внизу создается временная переменная "tmp_value"? Если можно было-бы сразу запихнуть в "valueDouble" значение "Convert.ToDouble(value)". И какое тут может возникнуть исключение? Не правильное приведение типа? А какой тип мы можем сюда неправильно засунуть? Так, чтобы компилятор запустил все это? Заранее благодарю! Это сообщение отредактировал(а) Furchtlos - 23.11.2011, 21:13 |
|||
|
||||
newbee |
|
|||
![]() Бревно ![]() ![]() Профиль Группа: Участник Сообщений: 703 Регистрация: 24.8.2011 Репутация: 3 Всего: 19 |
Инкапсуляция в широком смысле означает скрытие множества сущностей и связей между ними за термином одной сущности. Например автомобиль инкапсулирует в себе четыре колеса, руль, сидение и механизм управления колесами рулем. Они в свою очередь тоже инкапсулируют что-то и так до разумных пределов. В программировании смысл инкапсуляции такой же: ты разбиваешь задачу на множество подзадач и объектов, связываешь и манипулируешь ими. Например в задаче упрощенного моделирования движения автомобиля ты только автомобилю "скажешь" переместиться на сто метров вперед, а весь свой хлам внутри включая человеков он передвинет сам.
Добавлено через 1 минуту и 12 секунд Исходник я конечно не читала. Его тебе кто-нибудь другой объяснит. -------------------- You're face to face With man who sold the world |
|||
|
||||
Furchtlos |
|
|||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 23.11.2011 Репутация: нет Всего: нет |
Это я понимаю, что скрывает. Но каким образом можно навредить коду, не скрыв?
|
|||
|
||||
newbee |
|
|||
![]() Бревно ![]() ![]() Профиль Группа: Участник Сообщений: 703 Регистрация: 24.8.2011 Репутация: 3 Всего: 19 |
Это в первую очередь вопрос удобства. Но повредить тоже можно. Вот есть у объекта двигатель функция "включить", внутри она что-то делает и выставляет флаг "включен". По этому флагу ты всегда можешь узнать, жужжит в данный момент мотор или нет. А теперь мы берем и снаружи этого объекта выставляем флаг в "выкл". В лучшем случае мы просто будем получать недостоверную информацию о состоянии мотора, а в худшем во время повторного вызова функции "включить" она попытается завести уже работающий мотор, в процессе что-нибудь пойдет не так и ба-бах! Кровь, сопли, кишки, слезы!
Ты можешь сказать, ну и сам себе злобный буратино, раз изменил флаг, но тут важно понимать следующую вещь: кода очень много, подавляющая часть кода - чужой. Случайно сломать где-нибудь корректное внутреннее состояние объекта (как в случае с мотором) очень легко. Поэтому желательно скрывать. -------------------- You're face to face With man who sold the world |
|||
|
||||
Furchtlos |
|
|||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 23.11.2011 Репутация: нет Всего: нет |
Как пользователь может сломать состояние объекта? Вводом неправильных данных?
|
|||
|
||||
newbee |
|
|||
![]() Бревно ![]() ![]() Профиль Группа: Участник Сообщений: 703 Регистрация: 24.8.2011 Репутация: 3 Всего: 19 |
Ну и дополню себя же любимую. Именно скрытие - в том смысле, что до каких-то частей объекта нельзя получить доступ - это не инкапсуляция, а просто эдакое дополнение к ней. Непосредственно инкапсуляция подразумевает именно составление совокупностей объектов и работа с совокупностью как с единым объектом. Есть такое понятие - системный подход, это из области методов исследований. Вот инкапсуляция как раз лежит в его основе.
Добавлено через 1 минуту и 7 секунд
![]() -------------------- You're face to face With man who sold the world |
|||
|
||||
Furchtlos |
|
|||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 23.11.2011 Репутация: нет Всего: нет |
Это уже совсем другое дело.Большое спасибо! Всё-равно осталось не совсем ясно, но теперь с другой стороны.
|
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
|
|||
|
||||
mes |
|
||||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
как видно из примера мы можем установить размер произвольно от реальной длины строки, это приведет к непредвиденным проблемам.. Поэтому у нас два варианта: 1. напрягать пользователя ответсвенностью за каждое изменение 2. предоставить ему интерфейс (сокрыв данные) для удобного пользования ими.. условно так :
мы можем получить, но не изменить размер отдельно от изменения строки данных.. Это сообщение отредактировал(а) mes - 23.11.2011, 22:34 |
||||
|
|||||
Furchtlos |
|
|||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 23.11.2011 Репутация: нет Всего: нет |
А зачем тут нужны константы?
|
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
в методе get квалификатор неизменности состояния объекта.. (т.е. можно только запросить данные но не изменить) const char * - си-строка |
|||
|
||||
Lols |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 144 Регистрация: 21.10.2011 Репутация: нет Всего: нет |
1. напрягать пользователя ответсвенностью за каждое изменение
а мне вот этот вариант больше нравится... |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
Lols, С (не C++) как раз того и предлагает..
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |