Абстракция против сокрытия информации против инкапсуляции
можете ли вы сказать мне, в чем разница между абстрагирование и сокрытие информации в разработке программного обеспечения?
Я в замешательстве. Абстракция скрывает детали реализации и сокрытие информации абстрагирует целые детали чего-то.
обновление: Я нашел хороший ответ для этих трех понятий. См. отдельный ответ ниже для нескольких цитат, взятых из здесь.
19 ответов:
перейти к источнику! Грейди Буч говорит (в объектно-ориентированном анализе и дизайне, стр. 49, второе издание):
абстрагирование и инкапсуляция являются взаимодополняющими понятиями: абстракция фокусируется на наблюдаемом поведении объекта... инкапсуляция основное внимание уделяется реализации, которая приводит к такому поведению... инкапсуляция чаще всего достигается путем сокрытия информации, которая процесс скрытия всех секретов объекта, которые не внести свой вклад в его основные характеристики.
пример: В .NET Framework,
System.Text.StringBuilder
класс предоставляет абстракцию над строковым буфером. Эта абстракция буфера позволяет работать с буфером без учета его реализации. Таким образом, вы можете добавлять строки в буфер без учета того, какStringBuilder
внутренне отслеживает такие вещи, как указатель на буфер и управление памятью, когда буфер заполняется (что он делает с инкапсуляцией через скрытие информации).rp
ОП обновил свой вопрос несколькими цитатами, которые он нашел, а именно в статья Эдварда В. Берарда под названием "абстракция, инкапсуляция и сокрытие информации". Я повторно публикую немного расширенную и переформатированную версию обновления OP, так как она должна быть ответом сама по себе.
(все цитаты взяты из упомянутой выше статье.)
абстракция:
"одно очко путаница в отношении абстракции заключается в ее использовании как процесса, так и сущности. Абстракция, как процесс, обозначает извлечение существенных деталей об элементе или группе элементов, игнорируя несущественные детали. Абстракция как сущность обозначает модель, представление или другое сфокусированное представление для фактического элемента."
Скрывая Информацию:
"его интерфейс или определение было выбрано, чтобы выявить как можно меньше о его внутренней работе." - [Парнас, 1972b]
"абстракция может быть [ ... ] использована в качестве метода для определения того, какая информация должна быть скрыта."
"путаница может возникнуть, когда люди не в состоянии различить между сокрытием информации, и метод (например, абстракция), который используется, чтобы помочь определить, какая информация должна быть скрытый."
заключение:
- [Wirfs-Brock et al, 1990]
"как процесс, инкапсуляция означает акт включения одного или нескольких элементов в контейнер [ ... ]. Инкапсуляция, как сущность, относится к пакету или вложению, которое содержит (содержит, заключает) один или несколько предметы."
"если инкапсуляция была" то же самое, что и сокрытие информации", то можно было бы сделать аргумент, что " все, что было инкапсулировано, также было скрыто.'Это не очевидно, не правда."
вывод:
Abstraction
скрывает детали реализации, предоставляя слой поверх базовой функциональности.
Information Hiding
скрывает данные, на которые влияет эта реализация. Использованиеprivate
иpublic
попадает под это. Например, скрытие переменных классов.
Encapsulation
просто группирует все подобные данные и функции в группу, напримерClass
в программировании;Packet
в сети.благодаря использованию классов, мы реализуйте все три концепции -
Abstraction
,Information Hiding
иEncapsulation
пожалуйста, не усложняйте простые понятия.
инкапсуляция : упаковка данных и методов в один блок является инкапсуляцией (например, класс)
абстрагирование: это акт представления только основных вещей, не включая детали фона. (например, интерфейс)
ДЛЯ ПРИМЕРОВ И БОЛЬШЕ ИНФОРМАЦИИ ГОТО :
http://thecodekey.com/C_VB_Codes/Encapsulation.aspx
http://thecodekey.com/C_VB_Codes/Abstraction.aspx
утверждены определениями здесь
P.S.: Я также помню определение из книги с++ Sumita Arora, которую мы читали в 11-м классе;)
значение абстракции, данное Оксфордским английским словарем (OED), наиболее близким к значению, предназначенному здесь, является "акт разделения в мысли". Лучшим определением может быть " представление существенных признаков чего-то без включения фона или несущественных деталей.-
сокрытие информации-это принцип, по которому пользователи программного компонента (например, класса) должны знать только основные сведения о том, как инициализировать и получить доступ к компоненту, и не нуждаются чтобы узнать подробности реализации.
Edit: мне кажется, что абстракция-это процесс решения о том, какие части реализации, которые должны быть скрытый.
Так что это не абстракция против сокрытия информации. Это сокрытие информации с помощью абстракции.
абстракция скрывает детали реализации, как вы выразились.
вы абстрагируете что-то до достаточно высокой точки, что вам нужно будет только сделать что-то очень простое, чтобы выполнить действие.
сокрытие информации скрывает детали реализации. Программирование-это сложно. Вы можете иметь много вещей, чтобы иметь дело с и ручкой. Там могут быть переменные, которые вы хотите/нужно держать очень близко трасса. Скрытие информации гарантирует, что никто случайно не сломает что-то с помощью переменная или метод, который вы выставили публично.
эти 2 понятия очень тесно связаны между собой в объектно-ориентированном программировании.
абстрагирование
абстракция-это акт представления деталей essentail без включения деталей фона. Абстрактный класс имеет только сигнатуры методов, а реализующий класс может иметь свою собственную реализацию, таким образом, сложные детали будут скрыты от пользователя. Абстракция фокусируется на внешнем виде. Другими словами, абстракция-это отделение интерфейсов от реальной реализации.
инкапсуляция
инкапсуляция объясняет связывание элементов данных и методов в один блок. Сокрытие информации является основной целью инкапсуляции. Инкапсуляция достигается с помощью спецификаторов доступа, таких как private, public, protected. Переменные-члены класса становятся закрытыми, так что они не могут быть доступны непосредственно внешнему миру. Инкапсуляция фокусируется на внутреннем виде. Другими словами, инкапсуляция-это метод, используемый для защиты информация в объекте от другого объекта.
инкапсуляция: связывание элементов данных и функций-членов вместе называется инкапсуляцией. инкапсуляция осуществляется через класс. абстракция: скрытие сведений о реализации использование формы или из представления называется абстракцией. бывший: int x; мы не знаем, как int будет внутренне работать. но мы знаем, что int будет работать. это абстракция.
абстрагирование - это процесс выявления существенных характеристик объекта не включая несущественные и утомительные детали.
инкапсуляция - это процесс включения данных и функций, манипулирующих этими данными в единое целое.
абстракция и инкапсуляция являются взаимосвязанными, но взаимодополняющими понятиями.
абстракция-это процесс. Инкапсуляция это механизм, с помощью которого осуществляется абстракция.
абстракция фокусируется на наблюдаемом поведении объекта. Инкапсуляция фокусируется на реализации, которая приводит к такому поведению.
Сокрытие Информации - это процесс сокрытия деталей реализации объекта. Это результат инкапсуляции.
абстракция : абстракция-это понятие / метод, используемый для определения того, что должно быть внешним видом объекта. Сделать доступным только необходимый интерфейс.
Скрывая Информацию : она дополняет абстракцию, так как за счет сокрытия информации достигается абстракция. Скрывая все остальное, кроме внешнего вида.
заключение : связывание данных и связанных с ними функций в единое целое. Это облегчает Абстракция и сокрытие информации. Возможность применения таких функций, как доступ к элементу, для достижения абстракции и скрытия информации
см. сообщение Джоэла о законе дырявых абстракций
в основном, абстрагирование дает вам свободу мышления понятий более высокого уровня. Аналогия без программирования заключается в том, что большинство из нас не знает, откуда берется наша пища или как она производится, но тот факт, что нам (обычно) не нужно беспокоиться об этом, освобождает нас от других вещей, таких как программирование.
Что касается сокрытия информации, то я согласен джемтинг.
абстрагирование позволяет рассматривать сложный процесс, как простой процесс. Например, стандартная абстракция "файл" рассматривает файлы как непрерывный массив байтов. Пользователю / разработчику даже не нужно думать о проблемах кластеров и фрагментации. (Абстракция обычно появляется в виде классов или подпрограмм.)
сокрытие информации - это защита ваших абстракций от вредоносных/некомпетентных пользователей. Путем ограничения контроля некоторого состояния (выделения жесткого диска, для пример) для исходного разработчика огромное количество обработки ошибок становится избыточным. Если никто, кроме драйвера файловой системы, не может писать на жесткий диск, то драйвер файловой системы точно знает, что было записано на жесткий диск и где. (Обычным проявлением этого понятия является
private
иprotected
ключевые слова в ОО языках.)
чтобы абстрагировать что-то, нам нужно скрыть детали или скрыть детали чего-то, что нам нужно абстрагировать. Но, оба они могут быть достигнуты путем инкапсуляции.
Итак, сокрытие информации-это цель, абстракция-это процесс, а инкапсуляция-это техника.
абстрагирование просто означает метод, в котором только существенные детали программного обеспечения становятся видимыми для пользователя, чтобы помочь пользователю использовать или работать с программным обеспечением, таким образом, детали реализации этого программного обеспечения не отображаются(становятся невидимыми). инкапсуляция это метод, который имеет пакет, который содержит один или несколько элементов и, следовательно, некоторая информация (особенно детали программы) стала видимой, а некоторые не видны пользователю, поэтому достигается инкапсуляция через сокрытие информации. В заключение. абстрагирование для наблюдаемого поведения (внешне) и инкапсуляции для невидимости (внутренне), но эти двое действительно дополняют друг друга.
просто добавляя больше деталей вокруг InformationHiding, нашел эта ссылка действительно хороший источник с примерами
InformationHiding это идея, что проектное решение должно быть скрыто от остальной части системы, чтобы предотвратить непреднамеренное соединение. InformationHiding-это принцип проектирования. InformationHiding должен сообщить, как вы инкапсуляция вещи, но, конечно, он не имеет к.
инкапсуляция - это функция языка программирования.
Я тоже был очень смущен двумя понятиями абстракции и инкапсуляции. Но когда я увидел статьи абстракции ВКЛ myjavatrainer.com мне стало ясно, что абстракция и инкапсуляция-это яблоки и апельсины, вы не можете их сравнивать, потому что они необходимы.
инкапсуляция-это то, как создается объект, а абстракция-это то, как объект рассматривается во внешнем мире.
прочитав все вышеперечисленные ответы один за другим, я не могу остановить себя от публикации этого
абстракция включает в себя средство для определения объектов, представляющих абстрактные "акторы", которые могут выполнять работу, сообщать и изменять свое состояние, а также "общаться" с другими объектами в системе.
инкапсуляция вполне понятна сверху, однако ->
термин инкапсуляция относится к сокрытию сведений о состоянии, но расширяется концепция типа данных из более ранних языков программирования, чтобы связать поведение наиболее сильно с данными, и стандартизация способа взаимодействия различных типов данных, является началом абстракции.
ссылка wiki
заключение: связывание данных и методов, которые действуют на него. это позволяет скрывать данные от всех других методов в других классах. пример:
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 }
теперь для абстракции определить метод, который может быть доступен только и пользователь не знает что такое тело метода и как он работает Давайте рассмотрим вышеизложенное например, мы можем определить область метода, которая вычисляет площадь прямоугольника.
public int area() { return length*breadth; }
теперь, когда пользователь использует вышеуказанный метод, он просто получит область не так, как она вычисляется. Мы можем рассмотреть пример метода println () мы просто знаем, что он используется для печати, и мы не знаем, как он печатает данные. Я написал блог подробно вы можете увидеть ссылку ниже для получения дополнительной информации абстракция против заключения