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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.11.2011, 21:19   #11
Furchtlos
Пользователь
 
Регистрация: 23.11.2011
Сообщений: 20
По умолчанию

Всё-равно не понял, каким образом можно использовать код неправильно.
Furchtlos вне форума Ответить с цитированием
Старый 23.11.2011, 23:50   #12
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,964
По умолчанию

Цитата:
Сообщение от Furchtlos Посмотреть сообщение
Всё-равно не понял, каким образом можно использовать код неправильно.
А вот таким. Если, мы в своём классе используем переменные и функции открыто для всех, то каждый "дурак" сможет использовать эти функции и переменные по своему усмотрению, а это чревато серьёзными ошибками.
Никто и ничто не мешает Вам лично изменить что-то в любом классе, но если над проектом работает 20 - 100 человек, никто не будет разбираться в реализации каждого класса отдельно, а должен получить то, что желает.
Например. Мне дали задание - написать класс который должен делать то-то и то-то. У него должны быть такие-то функции, с такими-то и такими-то входными и выходными параметрами. Допустим две функции выдающие значение в виде double и входные в виде double и int. Для реализации этих двух функций, к примеру, мне требуется 10 вспомогательных функций, 5 массивов и 20 переменных. Если сделать всё это видимым для конечного пользователя, представьте себе его ужас, когда он откроет этот класс.
Ему придётся долго и нудно объясня, что вот этой и этой функцией пользоваться нельзя, а эта переменная может взорать комп.
Но, скрыв это всё от лишних глаз, мы щадим, прежде всего конечного пользователя.
Геттеры и сеттеры используют "продвинутые" программисты, которые точно знают, чего они хотят получить в данном классе, но не хотят менять его исходный код.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder

Последний раз редактировалось Smitt&Wesson; 23.11.2011 в 23:52.
Smitt&Wesson вне форума Ответить с цитированием
Старый 24.11.2011, 00:12   #13
_Ч_
Форумчанин
 
Регистрация: 07.01.2010
Сообщений: 141
По умолчанию

По поводу интерфейса:
Интерфейс - это не только интерфейс пользователя (GUI), не только окошки, кнопочки и т.п. GUI - это частный случай этого понятия.

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

Интерфейс класса - это то, что что этот класс позволяет делать с собой пользователю. В этом случае пользователем класса выстапает программист ну или какой-то код. Класс позволяет пользователю вводить/выводить какие-то данные (get/set ф-ии), или позволяет выполнять надо собой какие-то команды (прочие ф-ии класса). Вот все, что в классе публичное - это интерфейс этого класса.
_Ч_ вне форума Ответить с цитированием
Старый 24.11.2011, 00:41   #14
Furchtlos
Пользователь
 
Регистрация: 23.11.2011
Сообщений: 20
По умолчанию

Цитата:
Сообщение от Smitt&Wesson Посмотреть сообщение
А вот таким. Если, мы в своём классе используем переменные и функции открыто для всех, то каждый "дурак" сможет использовать эти функции и переменные по своему усмотрению, а это чревато серьёзными ошибками.
Никто и ничто не мешает Вам лично изменить что-то в любом классе, но если над проектом работает 20 - 100 человек, никто не будет разбираться в реализации каждого класса отдельно, а должен получить то, что желает.
Например. Мне дали задание - написать класс который должен делать то-то и то-то. У него должны быть такие-то функции, с такими-то и такими-то входными и выходными параметрами. Допустим две функции выдающие значение в виде double и входные в виде double и int. Для реализации этих двух функций, к примеру, мне требуется 10 вспомогательных функций, 5 массивов и 20 переменных. Если сделать всё это видимым для конечного пользователя, представьте себе его ужас, когда он откроет этот класс.
Ему придётся долго и нудно объясня, что вот этой и этой функцией пользоваться нельзя, а эта переменная может взорать комп.
Но, скрыв это всё от лишних глаз, мы щадим, прежде всего конечного пользователя.
Геттеры и сеттеры используют "продвинутые" программисты, которые точно знают, чего они хотят получить в данном классе, но не хотят менять его исходный код.
А откуда конечный пользователь может знать, что я описываю в классе? Откуда ему знать структуру? Как он сможет изменить значение какой-то переменной, если я, например, не предусмотрел ввод переменной, на которую нужно заменить?
Furchtlos вне форума Ответить с цитированием
Старый 24.11.2011, 13:18   #15
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 18,136
По умолчанию

Под конечным пользователем он имеет ввиду другого программиста. Того кто будет пользоваться Вашим кодом. Например, Вы сами через год. Вкратце, также как и пример с двигателем внутреннего сгорания - Вы знаете как к примеру работает современный плазменный телевизор? Какие частоты использует пульт дистанционного управления? Однако, Вам это абсолютно не мешает переключать каналы, пользоваться спутниковым телевидением, телетекстом и пр. Смысл ясен? Вы не проходите в школе кучу всяких дополнительных предметов - только основы. А интерфейс уже построен так, чтобы Вы могли только жать кнопки не задумываюсь о процессоре, обрабатывающем сигнал, блоке питания и пр.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика

Последний раз редактировалось Utkin; 24.11.2011 в 13:23.
Utkin вне форума Ответить с цитированием
Старый 24.11.2011, 13:55   #16
the_deer_one
Участник клуба
 
Аватар для the_deer_one
 
Регистрация: 04.04.2010
Сообщений: 1,554
По умолчанию

Furchtlos
Цитата:
Меня уже, мягко говоря, задрало что я не могу понять ДЛЯ ЧЕГО она нужна?
Ну вот две абстракции.
1. sender.sendMessage();
2. sender.sendMessage();
В первой класс Sender, инкапсулирует в себе всё необходимое ему для работы.
То есть, я возьму этот класс и скопипащу в другую программу и метод sendMessage() у меня будет работать.

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

Тоесть для повторного использования нужно, и для простоты.
the_deer_one вне форума Ответить с цитированием
Старый 24.11.2011, 16:49   #17
Furchtlos
Пользователь
 
Регистрация: 23.11.2011
Сообщений: 20
По умолчанию

Т.е инкапсуляция и сокрытие это разные вещи? Инкапсуляция обеспечивает сокрытие? Тогда что именно делает сама инкапсуляция? Каким образом она "объединяет код и данные"? Т.е чтобы я например через год смог воспользоваться каким-либо классом, мне не нужно было изучать его работу? Чтобы в списке методов не было лишних? Или полей. Т.е были видны только те вещи, которые мне нужны для использования этого класса. Но тогда преимущество чисто в удобстве? И то оно пока что мне настолько ясным не кажется.
Furchtlos вне форума Ответить с цитированием
Старый 24.11.2011, 17:18   #18
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 18,136
По умолчанию

Цитата:
Но тогда преимущество чисто в удобстве?
Инкапсуляция это абстракция. Она предназначена для программирования программиста - компилятору пофигу, он и в стиле бейсика с глобальными переменными скомпилирует и программа будет работать (и даже наверно быстрей). Но программист в первую очередь читатель и только во вторую писатель.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 24.11.2011, 19:35   #19
the_deer_one
Участник клуба
 
Аватар для the_deer_one
 
Регистрация: 04.04.2010
Сообщений: 1,554
По умолчанию

Utkin
Цитата:
Инкапсуляция это абстракция.
Абстракция это то чем оперируют, это когда мы группой чего-то, оперируем как целым, а инкапсуляция это локализация внутренних механизмов.
Например, если функция манипулирует чем то, за своими пределами, то у неё фиговая инкапсуляция, и без этих внешних значений функция работать не будет.

А какая-нибудь библиотечная функция вычисления синуса, все свои вычислительные механизмы инкапсулирует в себе, и её можно спокойно использовать в любом окружении.
the_deer_one вне форума Ответить с цитированием
Старый 24.11.2011, 20:26   #20
Furchtlos
Пользователь
 
Регистрация: 23.11.2011
Сообщений: 20
По умолчанию

Спасибо большое! Теперь чуть более понятно.
Furchtlos вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Негативные анекдоты про Россию и про всё в ней происходящее... Ваше мнение? Вадим Мошев Свободное общение 16 26.09.2011 08:02
.net c# про инкапсуляцию flcl Помощь студентам 2 24.02.2011 11:42
[Turbo Pascal] - задачи про подбрасывание монеты и про определение истины. Sent Tools Помощь студентам 10 28.10.2010 18:11
Вопрос про Свойство Visible и про иконки в imagelist Kappi4 Компоненты Delphi 2 21.05.2010 13:10
У меня вопрос про базы данных,а точнее про таблицы!!! Alexij Общие вопросы Delphi 1 13.04.2008 23:24