Яка різниця між "приховуванням даних" та "капсуляцією"?


29

Я читаю "Паралельність Java на практиці", і там сказано: "На щастя, ті самі об'єктно-орієнтовані методи, які допомагають писати добре організовані, ремонтовані класи - такі, як інкапсуляція та приховування даних, - також можуть допомогти вам створити безпечний потік" заняття ».

Проблема №1 - я ніколи не чув про приховування даних і не знаю, що це.

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

Чи можете ви пояснити, що таке приховування даних та чим вони відрізняються від інкапсуляції?


2
Прочитайте код Повне 2-е видання . Він відповість на багато ваших запитань.
Шиплу Мокаддім

Щодо приховування інформації, дивіться: javaworld.com/jw-05-2001/jw-0518-encapsulation.html
Дейв Джарвіс

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

Відповіді:


19

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

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

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


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

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

2
Ви можете мати одне, не маючи іншого - подивіться на Python, де взагалі немає даних, які ховаються (немає такого поняття, як приватний чи захищений атрибут).
Latty

@ Точка Lattyware дуже правдива і важлива. Можна також зробити інкапсуляцію (за вашим визначенням, на яку я заперечую через те, що я тут описую), не приховуючи нічого, а саме сліпо викриваючи тривіальний геттер і сетер для кожного члена. Це нічого не приховує і нічого не заважає, але виконує загальне визначення інкапсуляції до листа.

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

6

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

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


5

Створення класу включає концепцію інкапсуляції. Коли ви створюєте клас, ви кладете дані та поведінку всередині класу, і клас стає однією одиницею, яку ми називаємо об'єктом. Тож приховування даних є частиною інкапсуляції.


4

З Вікіпедії :

У мові програмування інкапсуляція використовується для позначення одного з двох споріднених, але відмінних понять, а іноді і до їх комбінації:

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

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

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


Дякуємо за Ваш відповідь. Подальші запитання: 1) чи має мова програмування Java можливості, на які посилається друге поняття, пов'язане з інкапсуляцією? 2) Я не розумію, чому важлива перекриття даних. Наприклад, у java ви можете отримати доступ до будь-якого поля (публічного чи приватного) через рефлексію.
dhblah

@Software Engeneering Learner: класи як конструкти вихідного коду представляють друге поняття. Щодо приховування інформації, справа полягає в тому, що обмеження обсягу даних часто базується на конкретних та окремих мовних механізмах.
Майкл Боргвардт

2

Їх часто використовують безперервно для обговорення, і часто я думаю, що вони працюють разом для досягнення тієї самої мети, і хоча наступне може бути не зовсім точним, воно може дати певне змістовне розмежування, якщо потрібно зробити розрізнення:

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

Я бачу, що концепція приховування даних за своїм призначенням схожа на інкапсуляцію; однак механізм є структурним і працює на іншому рівні. На практиці, замість забезпечення механізму захисту та побічних ефектів через процедуру, держава захищається та впливає на неї через структурні механізми мови та часу виконання. Ці типи охоронців будуть клавішами видимості, визначеннями типів, успадкуванням тощо. Побічні ефекти, які ви можете використовувати від об'єктів, що захищаються структурою, знову-таки залежать від мови та часу виконання: можливо, активація об'єкта, кількість посилань чи щось у цьому напрямку.


0

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

Зауважте, що Python дозволяє згорнути дані в класах, але не дозволяє приватні змінні. Тож можна сказати, що Python забезпечує інкапсуляцію без приховування даних.

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


0

У ОО, інкапсуляція - це місце, де інформація зберігається в межах Об'єкта. Наприклад, клієнт Personмає nameі клієнти Особи (тобто ви) знаєте, що особа має ім'я, або через публічні поля, або через методи доступу. І, сподіваємось, вам не потрібно також містити імена в якомусь глобальному масиві імен тощо. Отже, це великий крок, щоб уникнути некерованого коду спагетті. Але клієнтові все-таки потрібно щось знати про те, як Person поводиться з іменами: наприклад, пробіл чи розділені комами?

Приховування даних - це те, де Personє поле імен, але, принаймні теоретично, ніхто не знає . Поле приватне, без публічних методів доступу. Клієнти можуть передавати ім’я із запису бази даних, XML, HTTP POST, будь-що, але внутрішня робота з тим, як Person обробляє ім'я, є "чорною скринькою". Майбутні реалізації Person можуть змінюватись, наприклад, переходити на наявність a firstNameі a lastName.

В ідеальному світі приховування даних перевершує інкапсуляцію, але не всі світи ідеальні. :-)

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