Інкапсуляція проти абстракції?


137

Ось короткі визначення інкапсуляції та абстракції.

Абстракція:

Процес абстрагування на Java використовується для приховування певних деталей і лише відображення істотних особливостей об'єкта. Іншими словами, він стосується зовнішнього вигляду об'єкта (інтерфейсу). Єдиний хороший приклад, який я бачу для цього на різних сайтах, - це інтерфейс.

Інкапсуляція:

В основному це стосується приховування стану об'єкта за допомогою модифікаторів, таких як приватні, громадські, захищені тощо.

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

Отже, зверху пояснення виглядає як інкапсуляція є частиною абстракції, або можна сказати, що це підмножина абстракції. Але чому тоді придуманий термін інкапсуляції, коли ми можемо мати справу лише з абстракцією? Я впевнений, що має бути якась основна відмінність, яка їх відрізняє, але більшість матеріалів у мережі говорить майже те саме для обох.

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

Оновлення: - Через 5 років я придумав власну відповідь, яка є суть, заснована на відповідях у цій публікації та нижче.

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

інкапсуляція, як визначено вище, є інструментом абстракції, однак я схильний думати про це з точки зору того, що клас інкапсулює (функціональність / дані незалежно від доступу), де як абстракція - це більше сенс позбавити вас від проблем конкретних реалізацій, тобто незалежно від того, як це робиться, і що саме робиться, це можна зробити з wikipediaAn '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, оскільки вони надають лише інформацію / приховування даних, які ми це робимо, оскільки це хороша практика захисту даних екземпляра.
користувач3227986

Відповіді:


98

Інкапсуляція - це стратегія, яка використовується як частина абстракції. Під інкапсуляцією розуміється стан об’єктів - об’єкти інкапсулюють їх стан і приховують його зовні; зовнішні користувачі класу взаємодіють з ним за допомогою його методів, але не можуть отримати доступ до стану класів безпосередньо. Тож клас абстрагує деталі реалізації, пов'язані з його станом.

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

Абстракція часто неможлива без приховування базового стану шляхом інкапсуляції - якщо клас виставляє свій внутрішній стан, він не може змінити свою внутрішню роботу і, таким чином, не може бути абстрагований.


8
Інкапсуляція означає, що група споріднених властивостей, методів та інших членів трактується як окрема одиниця або об'єкт. msdn.microsoft.com/en-us/library/dd460654.aspx
raberana

1
Інкапсуляція призводить до абстракції.
Мартін

124

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

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

Інкапсуляція - це техніка . Це може бути, а може і не бути в допомозі в абстрагуванні, але це, безумовно, стосується приховування інформації та / або організації. Він вимагає, щоб дані та функції були згруповані певним чином - звичайно, хороша практика ООП вимагає їх об'єднання за допомогою абстракції. Однак є й інші види використання, які просто сприяють ремонту і т.д.


13
Ваше визначення Абстракції - це найкраще, що я бачив колись, і я відчуваю, що вперше коли-небудь, воно насправді клацнуло в голові і мало сенс. Я знаю, що минуло 3+ років, як ти опублікував це, але дякую.
Кейсі Крукстон

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

Інкапсуляція використовується для досягнення "Вільної сполуки та високої згуртованості".
Сортер

28

інкапсуляція - це частина абстракції, або ми можемо сказати, її підмножина абстракції

Вони різні поняття.

  • Абстракція - це процес уточнення всіх непотрібних / неважливих атрибутів об'єкта і зберігати лише ті характеристики, які найкраще підходять для вашого домену.

    Наприклад, для людини: ви вирішили зберегти ім’я та прізвище та SSN. Вік, зріст, вага тощо ігноруються як нерелевантні.

    Абстракція - це там, де починається ваш дизайн.

  • Інкапсуляція - це наступний крок, коли він розпізнає операції, придатні для атрибутів, які ви прийняли зберігати під час процесу абстрагування. Саме ці дані пов'язані з операцією, яка діє на них.
    Тобто дані та методи поєднуються разом.

Чи можна сказати, що Абстракція є різновидом дизайнерської концепції, а інкапсуляція в основному стосується впровадження дизайну, про який ми домовилися під час абстрагування?
M Sach

1
При капсулюванні ви визначаєте операції, які можуть / повинні бути застосовані до ваших даних. Це також може бути частиною дизайну. Отримайте SSN, але не модифікуйте його
Cratylus

25

Інкапсуляція приховує непотрібні дані в капсулі або одиниці

Абстракція показує істотну особливість об'єкта

Інкапсуляція використовується для приховування свого члена від зовнішнього класу та інтерфейсу. Використання модифікаторів доступу, наданих у c # .like публічному, приватному, захищеному тощо. Наприклад:

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();

    }

я згоден. ці хлопці є своєрідними протилежностями. good oop прагне абстрагувати речі, які не змінюються, і [інкапсулювати тіні, які змінюються] [1]. [1]: принципи-
wiki.net/…

15

Абстракція - це дуже загальний термін, а абстракція в програмному забезпеченні не обмежується об'єктно-орієнтованими мовами. Визначення словника: "акт розгляду чогось як загальної якості чи характеристики, крім конкретних реальностей, конкретних об'єктів чи фактичних випадків".

Мова складання може розглядатися як абстракція машинного коду - збірка виражає суттєві деталі та структуру машинного коду, але звільняє вас від думки про використовувані коди, компонування коду в пам'яті, змушує переходити до стрибків правильна адреса тощо.

API вашої операційної системи - це абстракція базової машини. Ваш компілятор надає шар абстракції, який захищає вас від деталей мови складання. Стек TCP / IP, вбудований у вашу операційну систему, дозволяє вилучити деталі передачі бітів по мережі. Якщо ви спускаєтесь до сирого кремнію, люди, які сконструювали ваш процесор, робили це, використовуючи схеми, написані «діодами» та «транзисторами», які є абстракціями проходження електронів через напівпровідникові кристали.

У програмному забезпеченні все - абстракція. Ми будуємо програми, що імітують або моделюють якийсь аспект реальності, але за необхідності наші моделі завжди абстрагують деякі деталі «реальної речі». Ми будуємо шар на шарі на шарі абстракцій, тому що це єдиний спосіб, коли ми щось робимо. .

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


14

Відповідаючи на моє власне запитання через 5 років, як я вважаю, все ще потрібно більше деталей

Абстракція:

Технічне визначення: - Абстракція - це поняття, щоб приховати непотрібні деталі (складні чи прості) та показати лише суттєві особливості об’єкта. Тут немає реалізації, це просто концепція

Що це означає практично: - Коли я кажу, що моя компанія потребує певного середовища / пристрою, щоб працівники могли підключитися до клієнта. Це найчистіша форма абстракції (наприклад, інтерфейс у Java), оскільки цей пристрій / носій може бути телефоном чи Інтернетом чи скайпом, особисто або електронною поштою тощо.

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

Зараз, коли я кажу, моїй компанії потрібен телефон, щоб працівники могли підключитися до клієнта за допомогою голосового дзвінка. Тоді також я говорю абстрактно, але на трохи нижчому рівні, оскільки телефоном може бути будь-яка компанія, як iphone, samsung або nokia тощо

Інкапсуляція: - По суті, це стосується приховування стану (інформації) об'єкта за допомогою модифікаторів, таких як приватні, громадські, захищені тощо.

Що це означає практично: - Зараз, коли я кажу, що моя компанія потребує iphone, щоб працівники могли підключитися до клієнта за допомогою голосового дзвінка. Зараз я говорю про якийсь конкретний об'єкт (наприклад, iphone). Навіть незважаючи на те, що я не збираюся входити в нітроподібну щілину iphone, але у iphone є якась інформація про стан / конкретні відомості / реалізація, пов'язана з нею, де пристрою / носія немає. Коли я кажу конкретний об’єкт, насправді це означає будь-який об’єкт, який має деяку (не повну, як абстрактний клас Java) реалізацію / інформацію, пов'язану з ним.

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

Це суть ґрунтується на відповідях у цій публікації та нижче

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

5

Інкапсуляція - процес приховування компонентів класу для запобігання прямого доступу ззовні. Це досягається використанням "приватного" модифікатора для запобігання прямого доступу до деяких членів класу (поле даних або метод) з інших класів або об'єктів, тим часом забезпечуючи доступ до цих приватних членів публічними членами (Інтерфейс). Це робить членів класу захищеними як органи людини, заховані / інкапсульовані під шкіру чи якийсь щит.

Абстракція - При написанні програми OOP слід дотримуватися принципу, який говорить: "Ви повинні включати до класу лише ті компоненти, які цікаві завдання програми". Наприклад: студент об'єкта має багато символів як людина: ім'я, вік, вага, колір волосся, колір очей тощо. Але, коли ви створюєте клас в ООП для роботи зі студентами, слід включати лише тих персонажів, які дійсно значення для бази даних студентів: ім'я, вік, спеціальність, рівень, оцінки ... тощо. У C ++ ви можете створити абстрактний клас, використовуючи модифікатор "віртуальний" будь-якими методами в класі, і це зробить його непридатним для прямого використання, але ви можете вивести з нього інші класи та створити реалізацію для своїх членів із додаванням необхідних членів на основі завдання.


4

Ось як я це зрозумів:

В об’єктно-орієнтованому програмуванні у нас є щось, що називається класами . Для чого вони? Вони повинні зберігати деякий стан і зберігати деякі методи для зміни цього стану, тобто вони інкапсулюються стан та його методи.

Він (клас) не піклується про видимість власного або його вмісту. Якщо ми вирішимо приховати стан або деякі методи, це приховування інформації .

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

Усі вони різні, правда? Але ми їх змішуємо для написання хороших об'єктно-орієнтованих програм. Сподіваюся, це допомагає :)


3

Абстракція окреслює контекстне, спрощене уявлення про щось; він ігнорує контекстуально нерелевантні деталі та включає контекстуально важливі деталі.

Інкапсуляція обмежує зовнішній доступ до частин і зв'язків стану речі з процедурами, які використовують стан.


Візьмемо, наприклад, людей. У контексті хірургічної операції корисна абстракція ігнорує релігійні переконання людини та включає тіло людини. Крім того, люди інкапсулюють свої спогади мисленнєвими процесами, які використовують ці спогади. Абстракція не повинна мати капсулювання; наприклад, живопис людини ні приховує його частин, ні зв'язує процедури зі своїм станом. І інкапсуляція не повинна мати супутню абстракцію; наприклад, реальні люди (не абстрактні) інкапсулюють свої органи своїм метаболізмом.


1

ПРИМІТКА: Я цим ділюсь. Це не означає, що тут відповідь не хороша, а тому, що я легко зрозумів.

Відповідь:

Коли концептуалізується клас, які властивості ми можемо мати в ньому, враховуючи контекст. Якщо ми розробляємо клас Animal у контексті зоопарку, важливо, щоб у нас був атрибут як animalType для опису домашніх чи диких. Цей атрибут може не мати сенсу, коли ми проектуємо клас в іншому контексті.

Аналогічно, які поведінки ми будемо мати у класі? Тут також застосовується абстракція. Що потрібно мати тут і що буде передозування? Потім ми відрізаємо деяку інформацію від класу. Цей процес застосовує абстракцію.

Коли ми просимо різниці між інкапсуляцією та абстракцією, я б сказав, інкапсуляція використовує абстракцію як концепцію. Тож, це лише інкапсуляція. Ні, абстракція - це навіть поняття, яке застосовується як частина спадкування та поліморфізму.

Перейдіть сюди, щоб дізнатися більше про цю тему.


1

Давайте спробуємо зрозуміти по-іншому.

Що може статися, якщо абстракції немає, і що може статися, якщо інкапсуляції немає.

Якщо абстракції немає, то можна сказати, що об'єкт використовується менше. Ви не можете ідентифікувати об'єкт, а також не можете отримати доступ до будь-якої його функції. Візьмемо приклад телевізора, якщо у вас немає можливості включити, змінити канал, збільшити чи зменшити гучність тощо. Тоді в чому полягає телевізор і як ним користуватися?

Якщо інкапсуляція не існує або не реалізована належним чином, ви можете неправильно використати об'єкт. Там дані / компоненти можуть неправильно використовуватися. Візьміть той самий приклад телевізора. Якщо не зроблено інкапсуляції з гучністю телевізора, то регулятор гучності може бути неправильно використаний, зробивши його нижче або перевищивши межу (0-40 / 50).


1

Інкапсуляція захищає від згортання внутрішньої поведінки об'єкта / екземпляра від зовнішньої сутності. Отже, слід забезпечити контроль, який підтверджує, що дані, які надаються, не завдадуть шкоди внутрішній системі екземпляра / об'єкта, щоб пережити своє існування.

Хороший приклад, Divider - це клас, який має два екземпляри змінної дивіденду та дільник та метод getDividedValue.

Чи можете ви подумати, якщо дільник встановлений на 0, тоді внутрішня система / поведінка (getDivided) порушиться.

Отже, внутрішню поведінку об'єкта можна було б захистити, викинувши виняток за допомогою методу.


0

Простим реченням я кажу: Суть абстракції полягає у виведенні істотних властивостей, опускаючи несуттєві деталі. Але чому ми повинні опускати несуттєві деталі? Основний мотиватор - запобігання ризику змін. Ви можете вважати, що абстрагування те саме, що капсулювання. Але інкапсуляція означає акт укладання одного або декількох предметів всередині контейнера, не приховуючи деталей. Якщо ви зробите аргумент, що «все, що було інкапсульовано, також було приховано». Це, очевидно, неправда. Наприклад, навіть незважаючи на те, що інформація може бути інкапсульована в структурах записів і масивах, ця інформація, як правило, не приховується (якщо не прихована через якийсь інший механізм).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.