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