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

Значение абстракции, данное в Оксфордском словаре английского языка (OED), наиболее близко к предполагаемому здесь значению - «Акт разделения в мысли». Лучшим определением могло бы быть «Представление основных характеристик чего-либо без включения фона или несущественных деталей».
Скрытие информации - это принцип, согласно которому пользователи программного компонента (например, класса) должны знать только основные детали того, как инициализировать и получить доступ к компоненту, и им не нужно знать детали реализации.
Редактировать: Мне кажется, что абстракция - это процесс решения, какие части реализации должны быть скрытый.
Так что это не абстракция ПРОТИВ сокрытия информации. Это информация, скрывающая абстракцию VIA.
Абстракция, как вы выразились, скрывает детали реализации.
Вы абстрагируете что-то до такой степени, что вам нужно будет сделать что-то очень простое, чтобы выполнить действие.
Скрытие информации - это скрытие деталей реализации. Программировать сложно. У вас может быть много вещей, с которыми нужно справиться. Могут быть переменные, которые вы хотите / должны очень внимательно отслеживать. Скрытие информации гарантирует, что никто случайно не сломает что-либо, используя переменную или метод, который вы раскрыли публично.
Эти две концепции очень тесно связаны между собой в объектно-ориентированном программировании.
См. Сообщение Джоэла о законе дырявых абстракций.
По сути, абстрагирование дает вам свободу мыслить о концепциях более высокого уровня. Непрограммирующая аналогия заключается в том, что большинство из нас не знает, откуда берется наша еда и как она производится, но тот факт, что нам (обычно) не нужно беспокоиться об этом, позволяет нам заниматься другими делами, например программирование.
Что касается сокрытия информации, то я согласен с глушением.
Абстракция позволяет рассматривать сложный процесс как простой. Например, стандартная абстракция «файл» рассматривает файлы как непрерывный массив байтов. Пользователю / разработчику даже не нужно думать о проблемах кластеров и фрагментации. (Абстракция обычно выглядит как классы или подпрограммы.)
Скрытие информации - это защита ваших абстракций от злонамеренных / некомпетентных пользователей. Ограничивая управление некоторым состоянием (например, выделением жесткого диска) исходному разработчику, огромные объемы обработки ошибок становятся излишними. Если никто другой, кроме драйвера файловой системы, не может писать на жесткий диск, то драйвер файловой системы точно знает, что и где было записано на жесткий диск. (Обычное проявление этой концепции - ключевые слова private и protected в объектно-ориентированных языках.)
Идите к первоисточнику! Грэди Буч говорит (в «Объектно-ориентированный анализ и дизайн», стр. 49, второе издание):
Abstraction and encapsulation are complementary concepts: abstraction focuses on the observable behavior of an object... encapsulation focuses upon the implementation that gives rise to this behavior... encapsulation is most often achieved through information hiding, which is the process of hiding all of the secrets of object that do not contribute to its essential characteristics.
Другими словами: абстракция = объект извне; инкапсуляция (достигается за счет сокрытия информации) = объект внутри,
Пример:
В .NET Framework класс System.Text.StringBuilder предоставляет абстракцию над строковым буфером. Эта абстракция буфера позволяет вам работать с буфером независимо от его реализации. Таким образом, вы можете добавлять строки в буфер независимо от того, как StringBuilder внутренне отслеживает такие вещи, как указатель на буфер и управление памятью, когда буфер заполняется (что он делает с инкапсуляцией через скрытие информации).
rp
Вы бы сказали, что так же, как абстракция и инкапсуляция дополняют друг друга, инкапсуляция и сокрытие информации также дополняют друг друга? Конечно, инкапсуляция достигается за счет сокрытия информации, но ... разве инкапсуляция не является механизмом, с помощью которого осуществляется сокрытие информации?
Другой реальный пример определения Буча доступен здесь
Не могли бы вы сказать мне, правильно ли было бы сказать, что абстракция лучше всего понимается с точки зрения клиентского кода, в то время как инкапсуляция лучше всего понимается с точки зрения служебного кода (т.е. самого инкапсулированного класса)?
Пример реального мира для приведенного выше определения объясняется здесь: stackoverflow.com/a/635755/3181500
Чтобы абстрагироваться, нам нужно скрыть детали или скрыть детали чего-то, что нам нужно абстрагировать. Но оба они могут быть достигнуты путем инкапсуляции.
Итак, сокрытие информации - это цель, абстракция - это процесс, а инкапсуляция - это техника.
Можете ли вы предоставить пример Java для того же?
Инкапсуляция: связывание элементов данных и функций-членов вместе называется инкапсуляцией. инкапсуляция осуществляется через класс. абстракция: скрытие деталей реализации из формы использования или из представления называется абстракцией. бывший: int x; мы не знаем, как int будет работать внутри. но мы знаем, что int будет работать. это абстракция.
ОП обновил свой вопрос несколькими цитатами, которые он нашел, а именно в статья Эдварда В. Берарда "Абстракция, инкапсуляция и сокрытие информации". Я повторно отправляю слегка расширенную и переформатированную версию обновления OP, поскольку она должна быть самостоятельным ответом.
(Все цитаты взяты из упомянутой статьи.)
Абстракция:
"One point of confusion regarding abstraction is its use as both process and an entity. Abstraction, as a process, denotes the extracting of the essential details about an item, or a group of items, while ignoring the inessential details. Abstraction, as an entity, denotes a model, a view, or some other focused representation for an actual item."
Скрытие информации:
"Its interface or definition was chosen to reveal as little as possible about its inner workings." — [Parnas, 1972b]
"Abstraction can be […] used as a technique for identifying which information should be hidden."
"Confusion can occur when people fail to distinguish between the hiding of information, and a technique (e.g., abstraction) that is used to help identify which information is to be hidden."
Инкапсуляция:
"It […] refers to building a capsule, in the case a conceptual barrier, around some collection of things." — [Wirfs-Brock et al, 1990]
"As a process, encapsulation means the act of enclosing one or more items within a […] container. Encapsulation, as an entity, refers to a package or an enclosure that holds (contains, encloses) one or more items."
"If encapsulation was 'the same thing as information hiding,' then one might make the argument that 'everything that was encapsulated was also hidden.' This is obviously not true."
Вывод:
"Abstraction, information hiding, and encapsulation are very different, but highly-related, concepts. One could argue that abstraction is a technique that help us identify which specific information should be visible, and which information should be hidden. Encapsulation is then the technique for packaging the information in such a way as to hide what should be hidden, and make visible what is intended to be visible."
отличное объяснение практически. было бы здорово привести конкретные примеры на java. мне кажется, что установщик / получатель в java скрывает реализацию, следовательно, достигается Information Hiding (или скрытие реализации), тогда как общий class обеспечивает инкапсуляцию, а абстракция достигается через доступ private
Пожалуйста, не усложняйте простые концепции.
Инкапсуляция: объединение данных и методов в единый блок - это инкапсуляция (например, класс)
Абстракция: Это акт представления только основных вещей без включения фоновых деталей. (например, интерфейс)
ДЛЯ ПРИМЕРОВ И ДОПОЛНИТЕЛЬНОЙ ИНФОРМАЦИИ НАЙТИ:
http://thecodekey.com/C_VB_Codes/Encapsulation.aspx
http://thecodekey.com/C_VB_Codes/Abstraction.aspx
Утвержденные определения здесь
P.S .: Я также помню определение из книги Сумиты Ароры C++, которую мы читали в 11 классе;)
Abstraction скрывает детали реализации, обеспечивая уровень над базовой функциональностью.
Information Hiding скрывает данные, на которые влияет эта реализация. Под это подпадает использование private и public. Например, скрытие переменных классов.
Encapsulation просто помещает все похожие данные и функции в группу, например Class при программировании; Packet в сети.
Используя классы, мы реализуем все три концепции - Abstraction, Information Hiding и Encapsulation.
Абстракция просто означает метод, при котором только важные детали программного обеспечения становятся видимыми для пользователя, чтобы помочь пользователю использовать или работать с программным обеспечением, таким образом, детали реализации этого программного обеспечения не отображаются (делаются невидимыми). Инкапсуляция - это метод, при котором есть пакет, содержащий один или несколько элементов, и, следовательно, некоторая информация (в частности, детали программы) стала видимой, а другая - невидимой для пользователя, поэтому инкапсуляция достигается за счет сокрытия информации. В итоге. Абстракция предназначен для наблюдаемого поведения (внешне), а инкапсуляция - для невидимости (внутренне), но эти два действительно дополняют друг друга.
Абстракция - это процесс определения основных характеристик объекта. без включения нерелевантных и утомительных деталей.
Инкапсуляция - это процесс включения данных и функций, управляющих этими данными, в единый блок.
Абстракция и инкапсуляция связаны, но дополняют друг друга.
Абстракция - это процесс. Инкапсуляция - это механизм реализации абстракции.
Абстракция фокусируется на наблюдаемом поведении объекта. Инкапсуляция фокусируется на реализации, которая вызывает такое поведение.
Скрытие информации - это процесс скрытия деталей реализации объекта. Это результат инкапсуляции.
Абстракция: Абстракция - это концепция / метод, используемый для определения того, каким должен быть внешний вид объекта. Делаем доступным только необходимый интерфейс.
Скрытие информации: Это дополнение к абстракции, так как абстракция достигается за счет сокрытия информации. Скрытие всего остального, кроме внешнего вида.
Инкапсуляция: Связывание данных и связанных функций в единицу. Это облегчает абстракцию и сокрытие информации. Разрешение применения к модулю таких функций, как доступ к членам, для достижения абстракции и сокрытия информации
Прочитав все вышеперечисленные ответы один за другим, я не могу удержаться от публикации этого
abstraction involves the facility to define objects that represent abstract "actors" that can perform work, report on and change their state, and "communicate" with other objects in the system.
Однако инкапсуляция довольно ясна сверху ->
The term encapsulation refers to the hiding of state details, but extending the concept of data type from earlier programming languages to associate behavior most strongly with the data, and standardizing the way that different data types interact, is the beginning of abstraction.
ссылка вики
Просто добавив более подробную информацию о ИнформацияСкрытие, нашел Эта ссылка действительно хороший источник с примерами
InformationHiding is the idea that a design decision should be hidden from the rest of the system to prevent unintended coupling. InformationHiding is a design principle. InformationHiding should inform the way you encapsulate things, but of course it doesn't have to.
Encapsulation is a programming language feature.
Абстракция
Абстракция - это акт представления существенных деталей без включения фоновых деталей. У абстрактного класса есть только сигнатуры методов, а реализующий класс может иметь свою собственную реализацию, таким образом сложные детали будут скрыты от пользователя. Абстракция фокусируется на взгляде со стороны. Другими словами, абстракция - это отделение интерфейсов от фактической реализации.
Инкапсуляция
Инкапсуляция объясняет связывание элементов данных и методов в единый блок. Скрытие информации - основная цель инкапсуляции. Инкапсуляция достигается с помощью спецификаторов доступа, таких как частный, общедоступный, защищенный. Переменные-члены класса сделаны закрытыми, поэтому они не могут быть доступны напрямую внешнему миру. Инкапсуляция фокусируется на внутреннем виде. Другими словами, инкапсуляция - это метод, используемый для защиты информации в объекте от другого объекта.
Я тоже был очень смущен двумя концепциями абстракции и инкапсуляции. Но когда я увидел абстракция статья на myjavatrainer.com, мне стало ясно, что абстракция и инкапсуляция - это яблоки и апельсины, вы не можете сравнивать их, потому что оба требуются.
Инкапсуляция - это то, как создается объект, а абстракция - это то, как объект рассматривается во внешнем мире.
Данные привязки Инкапсуляция: и методы, которые на них действуют. это позволяет скрыть данные от всех других методов в других классах.
Пример: класс MyList, который может добавлять элемент, удалять элемент и удалять все элементы.
методы add, remove и removeAll воздействуют на список (частный массив), к которому нельзя получить доступ напрямую извне.
Абстракция: скрывает нерелевантное поведение и данные. То, как элементы фактически хранятся, добавляются или удаляются, скрыто (абстрактно). Мои данные могут храниться в простом массиве, ArrayList, LinkedList и т. д. Кроме того, снаружи скрыто то, как реализованы методы.
Инкапсуляция - обеспечение доступа к внутренним данным контролируемым образом или предотвращение прямого доступа к членам.
Абстракция. Скрытие деталей реализации определенных методов называется абстракцией.
Разберемся на примере: -
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
}
теперь для абстракции определите метод, к которому можно получить доступ, и пользователь не знает какова суть метода и как он работает Давайте рассмотрим приведенный выше пример, мы можем определить метод area, который вычисляет площадь прямоугольника.
public int area()
{
return length*breadth;
}
Теперь, когда пользователь использует вышеуказанный метод, он просто получает площадь не так, как она рассчитана. Мы можем рассмотреть пример метода println (), мы просто знаем, что он используется для печати, и мы не знаем, как он печатает данные. Я написал подробный блог, вы можете увидеть ссылку ниже для получения дополнительной информации абстракция против инкапсуляции
Стоит отметить, что эти термины имеют стандартизованные определения IEEE, поиск в которых можно найти в https://pascal.computer.org/.
абстракция
скрытие информации
инкапсуляция
Очень коротко
Инкапсуляция: - Скрытие информации
Абстракция: - Скрытие реализации
Abstraction позволяет сосредоточиться на what the object does, в то время как инкапсуляция означает how an object works
И абстракция, и инкапсуляция - это две из четырех основных концепций ООП, которые позволяют моделировать объекты реального мира в объекты, чтобы вы могли реализовать их в своей программе и коде. Многие новички путаются между абстракцией и инкапсуляцией, потому что они оба очень похожи. Если вы спросите кого-нибудь, что такое абстракция, он ответит, что это концепция ООП, которая фокусируется на соответствующей информации, скрывая ненужные детали, а когда вы спросите об инкапсуляции, многие скажут, что это еще одна концепция ООП, которая скрывает данные от внешнего мира. Определения не ошибочны, поскольку и абстракция, и инкапсуляция что-то скрывают, но ключевое различие заключается в намерении.
Абстракция скрывает сложность, давая вам более абстрактную картину, своего рода вид на 10 000 футов, в то время как инкапсуляция скрывает внутреннюю работу, чтобы вы могли изменить ее позже. Другими словами, абстракция скрывает детали на уровне дизайна, а инкапсуляция скрывает детали на уровне реализации.