Инкапсуляция против абстракции?


139

Вот краткие определения инкапсуляции и абстракции.

Абстракция:

Процесс абстракции в Java используется для того, чтобы скрыть определенные детали и показать только основные особенности объекта. Другими словами, он имеет дело с внешним видом объекта (интерфейса). Единственный хороший пример, который я вижу на разных сайтах, - это интерфейс.

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

В основном это скрытие состояния объекта с помощью таких модификаторов, как private, public, protected и т. Д. Мы открываем состояние через общедоступные методы только в случае необходимости.

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

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

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

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

  1. разница между абстракцией и инкапсуляцией?
  2. инкапсуляция против абстракции пример реального мира

инкапсуляция, как определено выше, является инструментом абстракции, однако я склонен думать об этом в терминах того, что инкапсулирует класс (функциональность / данные независимо от доступа), где абстракция - это скорее чувство избавления вас от проблем конкретных реализаций, т.е. независимо от того, как это сделано, и что именно сделано, можно сделать из википедииAn 'abstraction' (noun) is a concept that acts as a super-categorical noun for all subordinate concepts, and connects any related concepts as a group, field, or category.
TI

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

Ответы:


98

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

Абстракция - это более общий термин, она также может быть достигнута (среди прочего) путем создания подклассов. Например, интерфейс Listв стандартной библиотеке представляет собой абстракцию для последовательности элементов, индексированных по их положению, конкретными примерами Listявляются an ArrayListили a LinkedList. Код, который взаимодействует с Listрефератами, подробно описывает, какой тип списка он использует.

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


8
Инкапсуляция означает, что группа связанных свойств, методов и других членов рассматривается как единый блок или объект. msdn.microsoft.com/en-us/library/dd460654.aspx
raberana

1
Инкапсуляция ведет к абстракции.
Мартин

127

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

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

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


14
Ваше определение абстракции - лучшее, что я когда-либо видел, и я чувствую, что впервые в жизни оно пришло мне в голову и обрело смысл. Я знаю, что с тех пор, как вы это опубликовали, прошло уже более трех лет, но спасибо.
Кейси Крукстон

1
Вау .... Абстракция ... выраженная в терминах искусства ... красный цвет может означать гнев, это все, что нам нужно знать! Спасибо за такой взгляд на концепцию :-)
SlowLearner

Инкапсуляция используется для достижения «слабого сцепления и высокой когезии».
Sorter

28

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

Это разные понятия.

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

    Например, для человека: вы решили оставить имя, фамилию и SSN. Возраст, рост, вес и т. Д. Игнорируются как несущественные.

    Абстракция - это то, с чего начинается ваш дизайн.

  • Инкапсуляция - это следующий шаг, на котором она распознает операции, подходящие для атрибутов, которые вы приняли для сохранения в процессе абстракции. Это связь данных с действующей на них операцией.
    Т.е. данные и методы связаны вместе.

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

1
В инкапсуляции вы определяете операции, которые могут / должны быть применены к вашим данным. Это также может быть частью дизайна. Например, получить SSN, но не изменять его,
Cratylus

25

Инкапсуляция скрывает ненужные данные в капсуле или блоке

Абстракция показывает существенную особенность объекта

Инкапсуляция используется для того, чтобы скрыть его член от внешнего класса и интерфейса. Использование модификаторов доступа, представленных в C #, например, public, private, protected и т. Д., Пример:

Class Learn
{
  private int a;         // by making it private we are hiding it from other
  private void show()   //class to access it
  {
   console.writeline(a);
  }
}

Здесь у нас есть данные обертывания в единицу или капсулу, то есть класс.

Абстракция прямо противоположна инкапсуляции.

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

 abstract class MobilePhone
    {
        public void Calling();       //put necessary or essential data
        public void SendSMS();       //calling n sms are main in mobile
    }

    public class BlackBerry : MobilePhone   // inherited main feature
    {
        public void FMRadio();            //added new
        public void MP3();
        public void Camera();
        public void Recording();

    }

согласен. эти парни вроде как противоположности. хороший oop имеет тенденцию абстрагироваться от того, что не меняется, и [инкапсулировать вещи, которые действительно меняются] [1]. [1]: principles-wiki.net/...
Ray Tayek

15

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

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

API вашей операционной системы - это абстракция базовой машины. Ваш компилятор предоставляет уровень абстракции, который ограждает вас от деталей языка ассемблера. Стек TCP / IP, встроенный в вашу операционную систему, абстрагирует детали передачи битов по сети. Если вы дошли до необработанного кремния, то люди, разработавшие ваш ЦП, сделали это, используя принципиальные схемы, написанные в терминах «диодов» и «транзисторов», которые представляют собой абстракции того, как электроны проходят через кристаллы полупроводника.

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

Для сравнения, «инкапсуляция» - это очень специфический и ограниченный термин. Некоторые другие ответы на этот вопрос уже дали ему хорошие определения.


15

Отвечая на свой вопрос через 5 лет, так как я чувствую, что все еще нужно больше деталей

Абстракция:

Техническое определение: - Абстракция - это концепция, позволяющая скрыть ненужные детали (сложные или простые) и показать только основные характеристики объекта. Здесь нет реализации, это просто концепция

Что это означает на практике: - Когда я говорю, что моей компании нужен какой-то носитель / устройство, чтобы сотрудники могли подключаться к клиенту. Это чистейшая форма абстракции (например, интерфейс в java), поскольку этим устройством / носителем может быть телефон, интернет, скайп, лично или по электронной почте и т. Д. Я не буду вдаваться в подробности устройства / носителя.

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

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

Инкапсуляция: - В основном речь идет о сокрытии состояния (информации) объекта с помощью таких модификаторов, как private, public, protected и т. Д. Мы раскрываем состояние через общедоступные методы только в случае необходимости.

Что это означает на практике: - Теперь, когда я говорю, что моей компании нужен iphone, чтобы сотрудники могли подключаться к клиенту через голосовой вызов. Теперь я говорю о каком-то конкретном объекте (например, iphone). Несмотря на то, что я не собираюсь вдаваться в подробности iphone, но iphone имеет некоторую информацию о состоянии / конкретную информацию / реализацию, связанную с ним, где устройство / носитель не имеют. Когда я говорю конкретный объект, на самом деле это означает любой объект, который имеет некоторую (не полную, как абстрактный класс java) реализацию / информацию, связанную с ним.

Таким образом, iphone фактически использовал здесь инкапсуляцию как стратегию, чтобы скрыть свое состояние / информацию и раскрыть только те, которые, по его мнению, должны быть раскрыты. Таким образом, и абстракция, и инкапсуляция скрывают некоторые ненужные детали, но абстракция на уровне концепции и инкапсуляция фактически на уровне реализации.

Это суть, основанная на ответах в этом посте и ниже

  1. разница между абстракцией и инкапсуляцией?
  2. инкапсуляция против абстракции пример реального мира

5

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

Абстракция. При написании программы ООП необходимо соблюдать принцип, гласящий, что «вы должны включать в класс только те компоненты, которые представляют интерес для задачи программы». Например: объект студент имеет много символов как человек: имя, возраст, вес, цвет волос, цвет глаз и т. Д. Но когда вы создаете класс в ООП для работы со студентами, вы должны включать только те символы, которые действительно имеет значение для базы данных студентов: имя, возраст, специальность, уровень, оценки ... и т. д. в C ++ вы можете создать абстрактный класс, используя модификатор virtual с любыми методами класса, что сделает его непригодным для использования напрямую, но вы можете получить от него другие классы и создать реализацию для его членов с добавлением необходимых членов в зависимости от задачи.


4

Вот как я это понял:

В объектно-ориентированном программировании у нас есть нечто, называемое классами . Для чего они? Они должны хранить некоторое состояние и хранить некоторые методы для изменения этого состояния, то есть они инкапсулируют состояние и его методы.

Он (класс) не заботится о видимости самого себя или своего содержимого. Если мы решим скрыть состояние или некоторые методы, это будет скрытие информации .

Теперь рассмотрим сценарий наследования . У нас есть базовый класс и пара производных (унаследованных) классов. Итак, что здесь делает базовый класс? Он абстрагируется от производных классов.

Все они разные, правда? Но мы смешиваем их, чтобы писать хорошие объектно-ориентированные программы. Надеюсь, это поможет :)


3

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

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


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


1

НОТА: я делюсь этим. Это не значит, что это плохой ответ, но потому, что я легко понял.

Ответ:

Когда класс концептуализируется, какие свойства мы можем иметь в нем с учетом контекста. Если мы разрабатываем класс Animal в контексте зоопарка, важно, чтобы у нас был атрибут animalType для описания домашних или диких животных. Этот атрибут может не иметь смысла, когда мы проектируем класс в другом контексте.

Точно так же, как мы будем вести себя в классе? Здесь также применяется абстракция. Что здесь необходимо иметь и при какой передозировке? Затем мы отключили часть информации из класса. В этом процессе применяется абстракция.

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

Перейдите сюда для получения дополнительных сведений по этой теме.


1

Попробуем понять по-другому.

Что может произойти, если абстракции нет, и что может случиться, если нет инкапсуляции.

Если абстракции нет, можно сказать, что объект используется меньше. Вы не можете идентифицировать объект и не можете получить доступ к его функциям. Возьмем, к примеру, телевизор. Если у вас нет возможности включить, переключить канал, увеличить или уменьшить громкость и т. Д., Тогда в чем польза телевизора и как вы его используете?

Если инкапсуляция отсутствует или не реализована должным образом, вы можете неправильно использовать объект. Там данные / компоненты могут быть использованы не по назначению. Возьмем тот же пример с телевизором. Если для громкости телевизора не выполняется инкапсуляция, то регулятор громкости может использоваться неправильно, заставляя его опускаться ниже или превышать его предел (0-40 / 50).


1

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

Хороший пример, Divider - это класс, который имеет две переменные экземпляра divisor и divisor, а также метод getDividedValue.

Не могли бы вы подумать, если делитель установлен на 0, внутренняя система / поведение (getDivided) сломается.

Итак, внутреннее поведение объекта можно защитить, выбрасывая исключение через метод.


0

Я могу сказать простым предложением: сущность абстракции состоит в том, чтобы выделить существенные свойства, опуская несущественные детали. Но почему мы должны опускать несущественные детали? Ключевой мотиватор - предотвращение риска перемен. Вы можете рассматривать абстракцию как инкапсуляцию. Но инкапсуляция означает действие по включению одного или нескольких элементов в контейнер, а не сокрытия деталей. Если вы утверждаете, что «все, что было инкапсулировано, также было скрыто». Это явно не так. Например, даже несмотря на то, что информация может быть инкапсулирована в структуры и массивы записей, эта информация обычно не скрывается (если не скрыта каким-либо другим механизмом).

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.