PDA

Просмотр полной версии : Что такое инкапсуляция



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

nazavrik
08.10.2009, 14:48
http://www.programmersforum.ru/showthread.php?t=65466

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

Airhand
09.10.2009, 11:34
Инкапсуляция - это сокрытие данных. Так, что atavin-ta не прав, когда говорит, что это повторное использование кода. ООП позволяет повторно использовать код, но это к инкапсуляции не имеет никакого отношения.

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

Airhand
09.10.2009, 14:35
Не сам процесс повторного исспользования и не всякий способ повторного иисспользования, а только прибамбас, необходимый для реализации многократного исспользования кода класса для всех объектов этого класса. Он же обеспечивает и сокрытие. Ведь если весь код и декларации всех полей надо каждый раз повторять, то каким образом ты скроешь данные или алгоритмы их обработки? И даже при инкапсуляции сокрытие достигается только в том случае, если ты спрячешь исходник с реализацией класса, а навиду оставишь только декларацию. Кроме того, этот же прибамбас помогает и защитить поля обекта от неправильного изменения. Ты просто обратил внимание на одно свойство, а я - на другое. Но если говорить о чётком определении термина (которого я не дал, да и не пытался), то может быть там и говорится о сокрытии - спорить не буду.
Incapsulation с английского переводится как сокрытие, изоляция. Вот тебе статья: http://www.intuit.ru/department/pl/python/4/python_4.html.
Повторное использование кода - это повторное использование кода. Один из принципов ООП, как и инкапсуляция.

atavin-ta
12.10.2009, 06: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
12.10.2009, 13:26
atavin-ta
Ты не разобрался, а уже кричишь. Изучи сначало ООП, а потом будешь делать замечания. Повторное использование кода - это один из постулатов ООП. Если бы инкапсуляция это включала, зачем бы повторное использование кода тогда упоминали бы среди постулатов ООП ?

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

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

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

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

Romeo
13.10.2009, 01:13
atavin-ta, прочитай теорию. Инкапсуляцию - это сокрытие данных. Никакого переиспользования кода это понятие не включает. Спор бессмысленен. Сколько бы ты буков не написал в подтверждение своей идеи, значение термина ты всё равно не изменишь, так как он был изобретён до тебя. Как вариант, можешь придумать свой термин и внести в него иной смысл. Например "сипулировать" (как в дневниках Иона Тихого) и дай определение, что сипулировать, это инкапсулировать или переиспользовать.


Airhand, в общем-то ты занял правильную позицию. Вот только в среди трёх китов ООП: наследования, инкапсуляции и полиморфизма, к сожалению, нет переиспользования кода. Переиспользование кода можно реализовать и без ООП, так что это относительно параллельные понятия.

atavin-ta
13.10.2009, 10:00
Инкапсуляцию - это сокрытие данных.
Согласен с определением.
Никакого переиспользования кода это понятие не включает.
Не "не включает", а не упомянуто за не надобностью. Но если не исспользовать для каждого объекта один и тот же код, то как вообще можно инкапсулировать (скрыть данные)? Следовательно сокрытие и возможность повторного исспользования кода - неотъемлемое свойсов (свойство, а не определение) инкапсуляции. А если говорить об английском слове Incapsulation, то там вообще не сказано, что именно упаковывается.

Вот только в среди трёх китов ООП: наследования, инкапсуляции и полиморфизма, к сожалению нет переиспользования кода.
А зачем? При инкапсуляции код уже упакован вместе с данными, а при полиморфизме ещё и выбирается в зависимости от фактического типа, кроме того

Переиспользование кода можно реализовать и без ООП.
Согласен, можно includeом. И если ставить перед собой только цель повторного использования кода - тогда include и никаких гвоздёв. В книгах по c++у, по-моему, прямо написано, что классы придуманы для того, чтобы собрать в одно место данные и код и что данные индивидульны для каждого объекта, а код создаётся в одном экземпляре для всего класса, и используется всеми обектами. Разве это не повторность? А упаковка в одну запись только разнородных данных никогда инкапсуляцией не считалась, да и сокрытие данных места не имело. Именно объединение данных с кодом суть инкапсуляции. А определения надо ещё интерпретировать.
Например "сипулировать" (как в дневниках Иона Тихого) и дай определение, что сипулировать, это инкапсулировать или переиспользовать.
Зачем? термин "инкапсуляция" уже есть. Он означает "сокрытие". Но как он реализуется? В процедурном программировании были понятия локальных/глобальных данных и области их видимости. Однако локализация инкапсуляцией не называется. Сокрытие же данных в ООП реализуется путем объединением с кодом. А код объединяется с данными в любом классе. Следоватьено, если ты объявил класс, а от него объект, то основа для инкапсуляции (сокрытия данны) уже есть. Объяви класс с одним конструктором и десять его экземпляров. А потом сосчитай, сколько раз вызывается конструктор и сколько он имеет экземпляров кода. Сразу увидишь повторное исспользование. Я же не претендовал, на точное знание определения. Но где у меня явная ошибка? Я никогда не утверждал (и не считал), что инкапсуляция предназначена для повторного исспользования кода. Я лишь считаю что она, сама будучи основана на многократном обращении к коду, позволяет повторно его исспользовать. Не более того.

Romeo
13.10.2009, 22:09
Но если не исспользовать для каждого объекта один и тот же код, то как вообще можно инкапсулировать (скрыть данные)?
Не нашёл смысла в высказывании. Как связано инкапсуляция и переиспользование кода? Не вижу даже слабой связи.


Согласен, можно includeом. И если ставить перед собой только цель повторного использования кода - тогда include и никаких гвоздёв
Переиспользование кода - это не include. Переиспользование кода, это когда нам нужно в двух разным местах сделать одни и те же действия и вместо того, чтобы копировать код из одного места в другое, мы выносим общий код в отдельную функцию/метод и вызываем её/его два раза в нужных местах.

То, что ты называешь переиспозованием, а именно то, что данные и методы "упакованы" в одной сущности, на самом деле является определением класса. У тебя в голове какая-то каша. Почитай об ООП - в интернете куча статей. Тогда всё станет на свои места.

atavin-ta
14.10.2009, 10:39
Переиспользование кода - это не include. Переиспользование кода, это когда нам нужно в двух разным местах сделать одни и те же действия и вместо того, чтобы копировать код из одного места в другое, мы выносим общий код в отдельную функцию/метод. Согласен, если говорить именно о коде. А если о тексте, называя его кодом? Это явная терминологическая неточность, но разве при includeе нет повторного исспользования (хоть и текста). Вынести код в функцию - вообще не инструмент, но действительно путь повторного исспользования и именно кода.
Почитай об ООП
Уже читал. Герберт Шилдт Теоирия и практика С++.
То, что ты называешь переиспозованием, а именно то, что данные и методы "упакованы" в одной сущности
Не это, а то, что к одному экземпляру кода можно обращаться многократно в разных частях программы, применяя его для обработки разных объетов. Ты говоришь, что переиспользование кода - это создание функции. А разве член класса, содержащий код, не функция? Инкапсуляция невозмеожна без класса, а в клсассе всесь код собран в те самые функции, которые есть основа любого переиспользования. Соглашусь с тем, что не она это обеспечивает. Это делает класс. Понятия действительно смешались и это явня ошибка.

Romeo
14.10.2009, 21:59
А разве член класса, содержащий код, не функция?
Именно поэтому я написал "...в отдельную функцию/метод". Я не говорю, что переиспользование кода не реализуемо с помощью ООП, я говорю, что оно реализуемо и без него.

dr.Jekill
22.12.2013, 03:20
Вот это заруба )
На самом деле есть только порождение (расщепление/разделение) и обобщение (объединение/обособление) все остальное демагогия. Не ограничивайте сами себя.

З.Ы. Извините за некрофилию - не удержался )