Что такое инкапсуляция

Объекты Pascal, классы Object Pascal, интерфейсы, наследование, инкапсуляция и т.д
prikolist
Сообщения: 36
Зарегистрирован: 19 ноя 2008, 13:09

Что такое инкапсуляция

Сообщение prikolist » 08 окт 2009, 13:16

Скажите, всё что описано в закрытом и открытом разделе класса, есть инкапсуляция. А когда мы создаём экземпляр класса, тоесть объект, он является инкапсулированный. Правильно?


atavin-ta
Сообщения: 572
Зарегистрирован: 30 янв 2009, 06:38

Re: Что такое инкапсуляция

Сообщение atavin-ta » 09 окт 2009, 04:05

prikolist писал(а):Скажите, всё что описано в закрытом и открытом разделе класса, есть инкапсуляция. А когда мы создаём экземпляр класса, тоесть объект, он является инкапсулированный. Правильно?
Инкапсуляцией называется то, что позволяет повторно исспользовать весь код и декларации, описанные в классе, а не реализовывать поведение обекта ни в самом объекте, ни в тех местах программы, где ты хочешь к к обекту обратиться, и не декларировать в каждом объекте все его поля (члены-данные). Та что впринципе, ты угадал смысл термина "инкапсуляция", но я не уверен, что именно так следует формулировать
Вопрос: "Почему вы все сионисты? Нельзя ли писать на чём то другом?".
Ответ: "Писать можно на чём угодно. Но зачем же так себя ограничивать? Пиши на С!".

Аватара пользователя
Airhand
Сообщения: 234
Зарегистрирован: 06 окт 2005, 15:21
Откуда: Dnepropetrovsk

Re: Что такое инкапсуляция

Сообщение Airhand » 09 окт 2009, 10:34

Инкапсуляция - это сокрытие данных. Так, что atavin-ta не прав, когда говорит, что это повторное использование кода. ООП позволяет повторно использовать код, но это к инкапсуляции не имеет никакого отношения.
Оптимизация по скорости:
#define while if
Оптимизация по размеру:
#define struct union

atavin-ta
Сообщения: 572
Зарегистрирован: 30 янв 2009, 06:38

Re: Что такое инкапсуляция

Сообщение atavin-ta » 09 окт 2009, 10:48

&quot писал(а):Инкапсуляция - это сокрытие данных. Так, что atavin-ta не прав, когда говорит, что это повторное использование кода.
Не сам процесс повторного исспользования и не всякий способ повторного иисспользования, а только прибамбас, необходимый для реализации многократного исспользования кода класса для всех объектов этого класса. Он же обеспечивает и сокрытие. Ведь если весь код и декларации всех полей надо каждый раз повторять, то каким образом ты скроешь данные или алгоритмы их обработки? И даже при инкапсуляции сокрытие достигается только в том случае, если ты спрячешь исходник с реализацией класса, а навиду оставишь только декларацию. Кроме того, этот же прибамбас помогает и защитить поля обекта от неправильного изменения. Ты просто обратил внимание на одно свойство, а я - на другое. Но если говорить о чётком определении термина (которого я не дал, да и не пытался), то может быть там и говорится о сокрытии - спорить не буду.
Вопрос: "Почему вы все сионисты? Нельзя ли писать на чём то другом?".
Ответ: "Писать можно на чём угодно. Но зачем же так себя ограничивать? Пиши на С!".

Аватара пользователя
Airhand
Сообщения: 234
Зарегистрирован: 06 окт 2005, 15:21
Откуда: Dnepropetrovsk

Re: Что такое инкапсуляция

Сообщение Airhand » 09 окт 2009, 13:35

atavin-ta писал(а):Не сам процесс повторного исспользования и не всякий способ повторного иисспользования, а только прибамбас, необходимый для реализации многократного исспользования кода класса для всех объектов этого класса. Он же обеспечивает и сокрытие. Ведь если весь код и декларации всех полей надо каждый раз повторять, то каким образом ты скроешь данные или алгоритмы их обработки? И даже при инкапсуляции сокрытие достигается только в том случае, если ты спрячешь исходник с реализацией класса, а навиду оставишь только декларацию. Кроме того, этот же прибамбас помогает и защитить поля обекта от неправильного изменения. Ты просто обратил внимание на одно свойство, а я - на другое. Но если говорить о чётком определении термина (которого я не дал, да и не пытался), то может быть там и говорится о сокрытии - спорить не буду.
Incapsulation с английского переводится как сокрытие, изоляция. Вот тебе статья: http://www.intuit.ru/department/pl/pyth ... hon_4.html.
Повторное использование кода - это повторное использование кода. Один из принципов ООП, как и инкапсуляция.
Оптимизация по скорости:
#define while if
Оптимизация по размеру:
#define struct union

atavin-ta
Сообщения: 572
Зарегистрирован: 30 янв 2009, 06:38

Re: Что такое инкапсуляция

Сообщение atavin-ta » 12 окт 2009, 05:20

по адресу
http://www.programmersforum.ru/showthread.php?t=65466
говорилось, что цилидры и поршни инкапулированы в автомобиль и водителю не надо знать, как они работают. Согласен. Но ему не надо знать, как они работают именно потому, что на заводе чертёж автомобиля уже с поршнями и цилиндрами многкратно (а значит, повторно) исспользован при изготовлении каждого автомобиля. Если же каждый водитель будет для себся конструировать с нуля уникальный автомобиль, то ему придётся знать, как этот автомобиль вустроен и как работают цилиндры и поршни. Таким образом, сокрытие деталей реализации (причём, не только данных, но и кода) неотделимо от повторного использования. Ты перевёл слово Incapsulation с английского - приму на веру. Но даже при таком значении слова возможность повторного использования кода - неотемлемое свойство любой инкапсуляции. Тогда ошибки нет, с учётом того, что я не утверждал, что инкапсуляция предназначена для повторного исспользования кода, или что инкапсуляция - это любое повторное исспользование кода (например, include предназначен для повторного исспользования кода), а только сказал, что инкапсуляции позволяет повторно исспользовать код. Кстати, позволь указать на то, что слово Incapsulation многознано. Одно значение - сокрытие (спрятать, чтоб никто не знал), другое - изоляция (закрыть доступ). Но если изоляция, то и упаковка и герметизация все остальные близкие значения. А для чего упаковывать? Чтобы сделать невидимым? Как вариант принимается. А может быть, для того, чтобы это был комплект? Чтобы можно было обратиться целиком к классу при описании переменной (объект - это тоже переменная, а класс объекта - тип этой переменной) и, один раз повторно введя имя класса, повторно исспользовать всё, что в нём декларировано или реализовано? Такой вариант исспользования упаковки тоже нельзя исключать. Кроме того, при инкапсуляции скрываются не только данные. Скрыть данные без сокрытия кода можно только в том случае, если сделать невидимым весь объект. Но тогда зачем он вообще нужен. Истинный же смысл инкапсуляции тогда - сокрытие в первую очередь кода.

Код: Выделить всё

 class A
 {
  public:
   int Get ();
 };
что такое int Get ();?

Код: Выделить всё

 class A
 {
  protected:
  int data;
  public:
   int Get ()
   {
    return Data;
   }
 };
?

Код: Выделить всё

 class A
 {
  protected:
  float data;
  public:
   int Get ()
   {
    return (int) Data;
   }
 };
?

Код: Выделить всё

 class A
 {
   protected:
    bool f();
    public:
   int Get ()
   {
    int i;
    for (i=0; f(); ++i);   
    return i;
   }  
 };
?
Пользователю это не известно. Если же он будет знать, что int Get (); - это

Код: Выделить всё

 class A
 {
  protected:
  int data;
  public:
   int Get ()
   {
    return Data;
   }
 };
, то он будет занть, что существует данное член int Data; и как именно получают его значение. То есть сокрытие в данном случае места не имеет. Нет даже защиты доступа, так как пользователь может его получить через asm. Сокрытие же кода функции int Get(); обеспечивает сокрытие и данных. Именно сокрытие этого кода и есть инкапсуляция, а вовсе не то, что ты прячешь декларацию данных. Так вот, в любом классе, объекты которого разрешено создавать, обязательно есть как минимум две функции со скрытым кодом: конструктор и деструктор (или конструктор и финализатор). Даже если они не созданы разработчиком класса, их по дефолту создаст компилятор. Но тогда, вообще любой объект любого класса инкапсулирует эти две функции. Как именно создаётся и как уничтожается объект? Ни один пользователь этого не знает. Если же ты выложишь на виду исходник с реализацией классса, то получишь только коплект в прозрачной уапаковке. Это тоже Incupsulation (в обыденном значении английского слова), но без сокрытия (в любом значении русского слова).
Вопрос: "Почему вы все сионисты? Нельзя ли писать на чём то другом?".
Ответ: "Писать можно на чём угодно. Но зачем же так себя ограничивать? Пиши на С!".

Аватара пользователя
Airhand
Сообщения: 234
Зарегистрирован: 06 окт 2005, 15:21
Откуда: Dnepropetrovsk

Re: Что такое инкапсуляция

Сообщение Airhand » 12 окт 2009, 12:26

atavin-ta
Ты не разобрался, а уже кричишь. Изучи сначало ООП, а потом будешь делать замечания. Повторное использование кода - это один из постулатов ООП. Если бы инкапсуляция это включала, зачем бы повторное использование кода тогда упоминали бы среди постулатов ООП ?
Оптимизация по скорости:
#define while if
Оптимизация по размеру:
#define struct union

BBB
Сообщения: 1272
Зарегистрирован: 27 дек 2005, 13:37

Re: Что такое инкапсуляция

Сообщение BBB » 12 окт 2009, 17:06

Airhand писал(а):atavin-taПовторное использование кода - это один из постулатов ООП.
Разве в обычном (не ООП) программировании нет повторного использования кода?

Когда я читал про ООП, там говорилось о трех вещах: инкапсуляции, наследовании и полиморфизме.

Аватара пользователя
Airhand
Сообщения: 234
Зарегистрирован: 06 окт 2005, 15:21
Откуда: Dnepropetrovsk

Re: Что такое инкапсуляция

Сообщение Airhand » 12 окт 2009, 17:42

BBB писал(а):Разве в обычном (не ООП) программировании нет повторного использования кода?

Когда я читал про ООП, там говорилось о трех вещах: инкапсуляции, наследовании и полиморфизме.
Как это относится к инкапсуляции ? Или абы ляпнуть. Как то, что является постулатом ООП относится к инкапсуляции ?
Оптимизация по скорости:
#define while if
Оптимизация по размеру:
#define struct union

Ответить