Абстракция VS Скрытие информации VS Инкапсуляция

167

Можете ли вы сказать мне, в чем разница между абстракцией и сокрытием информации при разработке программного обеспечения?

Я смущен. Абстракция скрывает детали реализации, а информация скрывает абстрагирует все детали чего-либо.

Обновление: я нашел хороший ответ для этих трех понятий. Смотрите отдельный ответ ниже для нескольких цитат, взятых оттуда .

popopome
источник
«Инкапсуляция - это метод упаковки информации таким образом, чтобы скрыть то, что должно быть скрыто, и сделать видимым то, что должно быть видимым». ; помня, что инкапсуляция достигается за счет сокрытия информации.
wulfgarpro
citation kink broken
Rishi Dua

Ответы:

152

Перейти к источнику! Грэди Буч говорит (в «Объектно-ориентированном анализе и проектировании», стр. 49, второе издание):

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

Другими словами: абстракция = объект извне; инкапсуляция (достигается за счет сокрытия информации) = объект внутри,

Пример: в .NET Framework System.Text.StringBuilderкласс предоставляет абстракцию над строковым буфером. Эта абстракция буфера позволяет работать с буфером без учета его реализации. Таким образом, вы можете добавлять строки в буфер без учета того, какStringBuilder internally keeps track of things such the pointer to the buffer and managing memory when the buffer gets full (which it does with encapsulation via information hiding).

Р.П.

rp.
источник
5
would you say that, in the same way abstraction and encapsulation are complementary, encapsulation and information hiding are also complementary? Sure, encapsulation is achieved through information hiding, but... isn't encapsulation the mechanism through which information hiding is realised?
wulfgarpro
Another real world example for Booch's definition is available here
lifebalance
Could you please tell me if it would correct to say that Abstraction is best understood through the Client code's perspective while Encapsulation is best understood through from the Service Code ( i.e. the Encapsulated Class itself ) perspective?
user1338998
Real World Example for above definition is explained here: stackoverflow.com/a/635755/3181500
user3181500
84

The OP updated his question with several citations that he had found, namely in an article by Edward V. Berard titled, "Abstraction, Encapsulation, and Information Hiding". I am re-posting a slightly expanded and reformatted version of the OP's update, since it should be an answer in its own right.

(All citations are taken from the article mentioned above.)

Abstraction:

«Одной из причин путаницы в отношении абстракции является ее использование как процесса и объекта. Абстракция, как процесс, обозначает извлечение существенных деталей об элементе или группе элементов, игнорируя при этом несущественные детали. Абстракция как сущность, обозначает модель, представление или какое-либо другое сфокусированное представление для фактического элемента. "

Сокрытие информации:

«Его интерфейс или определение были выбраны, чтобы показать как можно меньше о его внутренней работе». - [Парнас, 1972b]

«Абстракция может быть […] использована в качестве метода для определения того, какая информация должна быть скрыта».

«Путаница может возникнуть, когда люди не могут различить сокрытие информации и методику (например, абстракцию), которая используется, чтобы помочь определить, какая информация должна быть скрыта».

Инкапсуляция:

«Это […] относится к созданию капсулы, в случае концептуального барьера, вокруг некоторой коллекции вещей». - [Wirfs-Brock et al, 1990]

«Как процесс, инкапсуляция означает действие по включению одного или нескольких элементов в […] контейнер. Инкапсуляция, как объект, относится к пакету или вложению, которое содержит (содержит, включает в себя) один или несколько элементов».

«Если инкапсуляция - это« то же самое, что скрытие информации », то можно утверждать, что« все, что было инкапсулировано, также было скрыто ». Это явно не правда ".

Вывод:

«Абстракция, сокрытие информации и инкапсуляция - это очень разные, но тесно связанные понятия. Можно утверждать, что абстракция - это метод, который помогает нам определить, какая конкретная информация должна быть видимой, а какая информация должна быть скрыта. Инкапсуляция является техникой. для упаковки информации таким образом, чтобы скрыть то, что должно быть скрыто, и сделать видимым то, что должно быть видимым ".

stakx
источник
отличное объяснение практически. было бы здорово привести конкретные примеры в Java. мне кажется, что setter / getter в java скрывает реализацию, следовательно, достигая Information Hiding(или скрывая реализацию), тогда как универсальный classдостигает инкапсуляции, а абстракция достигается через privateдоступ
abarik
57

Abstraction скрывает детали реализации, предоставляя слой поверх основной функциональности.

Information Hidingскрывает данные, на которые влияет эта реализация. Использование privateи publicподпадает под это. Например, скрытие переменных классов.

Encapsulationпросто помещает все подобные данные и функции в группу, например, Classв программирование; Packetв сети.

Благодаря использованию классов, мы реализуем все три понятия - Abstraction, Information HidingиEncapsulation

Shashwat
источник
33

Пожалуйста, не усложняйте простые понятия.

Инкапсуляция : Объединение данных и методов в единый блок - это Инкапсуляция (например, Класс)

Абстракция : это представляет собой представление только самых важных вещей, не включая второстепенных деталей. (например, интерфейс)

ПРИМЕРЫ И ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ GOTO:

http://thecodekey.com/C_VB_Codes/Encapsulation.aspx

http://thecodekey.com/C_VB_Codes/Abstraction.aspx

Утвержденные определения здесь

PS: я также помню определение из книги под названием C ++ Сумиты Арора, которую мы читали в 11-м классе;)

Rashy
источник
6

Значение абстракции, данное Оксфордским словарем английского языка (OED), наиболее близким к значению, которое здесь подразумевается, - «Акт разделения в мышлении». Лучшим определением может быть «Представление основных характеристик чего-либо без учета фона или несущественных деталей».

Сокрытие информации - это принцип, согласно которому пользователи программного компонента (такого как класс) должны знать только основные детали того, как инициализировать и получать доступ к компоненту, и не должны знать детали реализации.

Редактировать : мне кажется, что абстракция - это процесс принятия решения о том, какие части реализации следует скрыть .

Так что не абстракция против информации скрывается. Это информация, скрывающая абстракцию VIA.

jamting
источник
4

абстракция

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

Инкапсуляция

Инкапсуляция объясняет связывание элементов данных и методов в единый блок. Сокрытие информации является основной целью инкапсуляции. Инкапсуляция достигается с помощью спецификаторов доступа, таких как private, public, protected. Переменные-члены класса являются закрытыми, поэтому они не могут быть доступны напрямую для внешнего мира. Инкапсуляция фокусируется на внутреннем виде. Другими словами, инкапсуляция - это метод, используемый для защиты информации в объекте от другого объекта.

Harleen
источник
3

Абстракция скрывает детали реализации, как вы выразились.

Вы абстрагируете что-то до достаточно высокой точки, чтобы вам было нужно сделать что-то очень простое, чтобы выполнить действие.

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

Эти 2 понятия очень тесно связаны в объектно-ориентированном программировании.

Дэн Герберт
источник
3

Абстракция - это процесс определения основных характеристик объекта без включения не относящихся к делу и утомительных деталей.

Инкапсуляция - это процесс объединения данных и функций, манипулирующих этими данными в единое целое.

Абстракция и инкапсуляция являются взаимосвязанными, но взаимодополняющими понятиями.

  1. Абстракция - это процесс. Инкапсуляция - это механизм реализации Абстракции.

  2. Абстракция фокусируется на наблюдаемом поведении объекта. Инкапсуляция фокусируется на реализации, которая порождает такое поведение.

Сокрытие информации - это процесс сокрытия деталей реализации объекта. Это результат инкапсуляции.

Аатиш Агарвал
источник
2

Инкапсуляция: связывание элементов данных и функций-членов называется инкапсуляцией. Инкапсуляция осуществляется через класс. абстракция: скрытие деталей реализации реализации от вида или из вида называется абстракцией. пример: int x; мы не знаем, как int будет работать внутри. но мы знаем, что int будет работать. это абстракция.

Шива Прасад
источник
2

Абстракция: абстракция - это концепция / техника, используемая для определения того, каким должен быть внешний вид объекта. Сделать доступным только необходимый интерфейс.

Сокрытие информации: это дополнение к Абстракции, так как с помощью сокрытия информации достигается Абстракция. Скрытие всего остального, кроме внешнего вида.

Encapsulation : Is binding of data and related functions into a unit. It facilitates Abstraction and information hiding. Allowing features like member access to be applied on the unit to achieve Abstraction and Information hiding

Vikram
источник
2

See Joel's post on the Law of Leaky Abstractions

JoelOnsoftware

Basically, abstracting gives you the freedom of thinking of higher level concepts. A non-programming analogy is that most of us do not know where our food comes from, or how it is produced, but the fact that we (usually) don't have to worry about it frees us up to do other things, like programming.

As for information hiding, I agree with jamting.

Jason Z
источник
2

In very short

Encapsulation:– Information hiding

Abstraction :– Implementation hiding

Abstraction lets you focus on what the object does while Encapsulation means how an object works

Rahul Sharma
источник
1

Abstraction allows you to treat a complex process as a simple process. For example, the standard "file" abstraction treats files as a contiguous array of bytes. The user/developer does not even have to think about issues of clusters and fragmentation. (Abstraction normally appears as classes or subroutines.)

Information hiding is about protecting your abstractions from malicious/incompetent users. By restricting control of some state (hard drive allocations, for example) to the original developer, huge amounts of error handling becomes redundant. If nobody else besides the file system driver can write to the hard drive, then the file system driver knows exactly what has been written to the hard drive and where. (The usual manifestation of this concept is private and protected keywords in OO languages.)

Zooba
источник
1

Чтобы абстрагировать что-то, нам нужно скрыть детали или скрыть детали того, что нам нужно абстрагировать. Но оба они могут быть достигнуты путем инкапсуляции.

Таким образом, скрытие информации - это цель, абстракция - это процесс, а инкапсуляция - это техника.

Села
источник
Можете ли вы предоставить пример Java для того же?
Чинмай
1

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

MOBITI MAHENGE
источник
1

Просто добавив более подробную информацию о InformationHiding , найдено Эта ссылка действительно хороший источник с примерами

Под «скрытием информации» понимается, что проектное решение должно быть скрыто от остальной части системы, чтобы предотвратить непреднамеренную связь. InformationHiding - это принцип дизайна. InformationHiding должен сообщать, как вы инкапсулируете вещи, но, конечно, это не обязательно .

Инкапсуляция - это особенность языка программирования.

Abhijeet
источник
1

И Абстракция, и Инкапсуляция являются двумя из четырех основных концепций ООП, которые позволяют вам моделировать реальные вещи в объекты, чтобы вы могли реализовать их в своей программе и коде. Многие новички путаются между абстракцией и инкапсуляцией, потому что они оба очень похожи. Если вы спросите кого-то, что такое абстракция, он скажет, что это концепция ООП, которая фокусируется на соответствующей информации, скрывая ненужные детали, а когда вы спрашиваете об инкапсуляции, многие скажут, что это другая концепция ООП, которая скрывает данные от внешнего мира. Определения не ошибочны, поскольку и абстракция, и инкапсуляция действительно что-то скрывают, но ключевое отличие заключается в намерении.

Абстракция скрывает сложность, предоставляя вам более абстрактную картину, своего рода вид на 10 000 футов, в то время как Encapsulation скрывает внутреннюю работу, чтобы вы могли изменить ее позже. Другими словами, Abstraction скрывает детали на уровне разработки, а Encapsulation скрывает детали на уровне реализации.

Харит Перера
источник
0

Прочитав все приведенные выше ответы один за другим, я не могу удержаться от публикации

абстракция включает в себя средство для определения объектов, которые представляют абстрактных «действующих лиц», которые могут выполнять работу, сообщать о своем состоянии и изменять его, а также «общаться» с другими объектами в системе.

Инкапсуляция совершенно ясна сверху ->

Термин «инкапсуляция» относится к сокрытию деталей состояния, но расширение концепции типов данных с более ранних языков программирования для более сильной связи поведения с данными и стандартизация способа взаимодействия различных типов данных является началом абстракции.

справочная вики

user666
источник
0

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

Инкапсуляция - это то, как объект создается, а абстракция - это то, как объект рассматривается во внешнем мире.

Навин Исрани
источник
0

Инкапсуляция: связывание данных и методов, которые на них воздействуют. это позволяет скрывать данные от всех других методов в других классах. Пример: MyListкласс , который может добавить элемент, удалить элемент, и удалить все элементы методы add, removeи removeAllдействовать в списке (частный массив) , которые не могут быть доступны непосредственно с внешней стороны.

Абстракция: скрывает несоответствующее поведение и данные. То, как элементы хранятся, добавляются или удаляются, скрыто (абстрагировано). Мои данные могут храниться в простом массиве, ArrayList, LinkedList и так далее. Кроме того, как методы реализованы, скрыто извне.

Аммар Саматер
источник
0

Инкапсуляция - обеспечение контролируемого доступа к внутренним данным или предотвращение прямого доступа к членам.

Абстракция - скрытие деталей реализации определенных методов называется абстракцией.

Давайте разберемся с помощью примера:

class Rectangle
{
private int length;
private int breadth;// see the word private that means they cant be accesed from 
outside world.
 //now to make them accessed indirectly define getters and setters methods
void setLength(int length)
{  
// we are adding this condition to prevent users to make any irrelevent changes 
  that is why we have made length private so that they should be set according to 
   certain restrictions
if(length!=0)
{
 this.length=length
 }
void getLength()
{
 return length;
 }
 // same do for breadth
}

Теперь для абстракции определите метод, к которому можно получить доступ, и пользователь не знает, что является телом метода и как он работает. Давайте рассмотрим приведенный выше пример, мы можем определить область метода, которая вычисляет площадь прямоугольника.

 public int area()
 {
  return length*breadth;
 }

Теперь, когда пользователь использует вышеуказанный метод, он просто получает площадь, а не способ, которым она рассчитывается. Мы можем рассмотреть пример метода println (), мы просто знаем, что он используется для печати, и мы не знаем, как он печатает данные. Я написал блог подробно, вы можете увидеть ссылку ниже для получения дополнительной информации абстракции против инкапсуляции

Рохан Шарма
источник
0

Стоит отметить, что эти термины имеют стандартизированные определения IEEE, которые можно найти по адресу https://pascal.computer.org/ .

абстракция

  1. вид объекта, который фокусируется на информации, относящейся к конкретной цели, и игнорирует остальную часть информации
  2. процесс формулирования представления
  3. процесс подавления несущественных деталей для создания упрощенной модели, или результат этого процесса

сокрытие информации

  1. методика разработки программного обеспечения, при которой интерфейсы каждого модуля раскрывают как можно меньше информации о внутренней работе модуля, а другим модулям запрещено использовать информацию о модуле, которая не указана в спецификации интерфейса модуля.
  2. Содержит решение о разработке или реализации в одном модуле, чтобы решение было скрыто от других модулей.

инкапсуляция

  1. методика разработки программного обеспечения, которая заключается в выделении системной функции или набора данных и операций с этими данными в модуле и предоставлении точных спецификаций для модуля
  2. Концепция, согласно которой доступ к именам, значениям и ценностям обязанностей класса полностью отделен от доступа к их реализации.
  3. Идея, что модуль имеет внешнюю сторону, отличную от его внутренней, что он имеет внешний интерфейс и внутреннюю реализацию
jaco0646
источник