В чем разница между «сокрытием данных» и «инкапсуляцией»?

29

Я читаю «Параллелизм Java на практике», и там говорится: «К счастью, те же объектно-ориентированные методы, которые помогают вам писать хорошо организованные, поддерживаемые классы, такие как инкапсуляция и скрытие данных, могут также помочь вам создать поточно-ориентированный классы «.

Проблема № 1 - я никогда не слышал о сокрытии данных и не знаю, что это такое.

Проблема № 2 - я всегда думал, что инкапсуляция использует private против public и фактически скрывает данные.

Не могли бы вы объяснить, что такое сокрытие данных и чем оно отличается от инкапсуляции?

dhblah
источник
2
Читайте код завершения 2-го издания . Это ответит на многие ваши вопросы.
Шиплу Мокаддим
Относительно сокрытия информации см .: javaworld.com/jw-05-2001/jw-0518-encapsulation.html
Дейв Джарвис,
Эта ссылка содержит полезную информацию об этой информации. Скрывая принцип проектирования, указывает, что проектное решение должно быть скрыто от остальной части системы, чтобы предотвратить непреднамеренное соединение. Он должен сообщать, как вы инкапсулируете вещи, но, конечно, это не обязательно. Инкапсуляция - это особенность языка программирования.
Абхиджит

Ответы:

19

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

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

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

m3th0dman
источник
1
Спасибо за ответ. Я до сих пор не понимаю, почему, если скрытие данных такое же, но чуть более широкое, чем инкапсуляция, в книге говорится, что они имеют одинаковую широту, а не одно, включая другое.
Дабл
Авторы, вероятно, отличаются от сокрытия данных и сокрытия информации в том смысле, что сокрытие данных скрывает только структуры данных - частные поля - в то время как скрытие информации может относиться к инкапсуляции деталей реализации (алгоритмы, используемые, например), связь осуществляется только через интерфейсы.
m3th0dman
2
Вы можете иметь один, не имея другого - посмотрите на Python, где вообще нет данных, скрывающих данные (нет такого понятия, как закрытый или защищенный атрибут).
Latty
Смысл @ Lattyware очень верный и важный. Можно также иметь инкапсуляцию (по вашему определению, на которую я возражаю из-за того, что я описываю здесь), не скрывая ничего, а именно, слепо выставляя тривиальный метод получения и установки для каждого члена. Это ничего не скрывает и ничего не мешает, но соответствует общему определению инкапсуляции в письме.
1
Инкапсуляция не хранит данные в приватном поле, это скрытие информации. В общем, инкапсуляция - это концепция объединения (инкапсуляции) информации / данных и методов в класс.
nbro
6

Инкапсуляция и сокрытие данных являются связанными терминами. Важно понимать, что они возникают по отношению к абстракции . Booch et. и др. в объектно-ориентированном анализе и проектировании с приложениями объясняет,

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

Тед
источник
5

Создание класса включает в себя понятие инкапсуляции. Когда вы создаете класс, вы помещаете в него данные и поведения, и класс становится одной единицей, которую мы называем объектом. Таким образом, сокрытие данных является частью инкапсуляции.

Алеко Гарибашвили
источник
4

Из Википедии :

В языке программирования инкапсуляция используется для обозначения одного из двух связанных, но различных понятий, а иногда и их комбинации:

  • Языковой механизм для ограничения доступа к некоторым компонентам объекта.
  • Языковая конструкция, которая облегчает связывание данных с методами (или другими функциями), работающими с этими данными.

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

Второе определение мотивировано тем, что во многих языках ООП сокрытие компонентов не является автоматическим или может быть переопределено; таким образом, скрытие информации определяется как отдельное понятие теми, кто предпочитает второе определение.

Майкл Боргвардт
источник
Спасибо за ваш ответ. Последующие вопросы: 1) есть ли в языке программирования Java средства, на которые ссылается второе понятие, касающееся инкапсуляции? 2) Я не понимаю, почему переопределение сокрытия данных имеет значение. Например, в Java вы можете получить доступ к любому полю (общедоступному или частному) через рефлексию.
Дабл,
@ Software Engeneering Learner: классы как конструкции исходного кода представляют собой второе понятие. Что касается сокрытия информации, дело в том, что ограничение объема данных часто основано на определенных и отдельных языковых механизмах.
Майкл Боргвардт
2

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

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

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

JustinC
источник
0

Они часто, может быть, обычно используются взаимозаменяемо. Но обратите внимание на приведенную выше цитату Буча: «Инкапсуляция чаще всего достигается путем сокрытия информации ...», то есть чаще всего, но не всегда в каждом случае.

Обратите внимание, что Python позволяет сворачивать данные в классах, но не позволяет использовать закрытые переменные. Таким образом, можно сказать, что Python обеспечивает инкапсуляцию без скрытия данных.

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

обкрадывать
источник
0

В ОО инкапсуляция - это место, где информация хранится внутри объекта. Например, a Personимеет a nameи клиенты Person (то есть вы) знают, что Person хранит имя, либо через открытые поля, либо с помощью методов доступа. И, надеюсь, вам не нужно также хранить имена в каком-то глобальном массиве имен и т. Д. Так что это большой шаг, чтобы избежать неуправляемого кода спагетти. Но клиент все еще должен знать кое-что о том, как Person обрабатывает имена: например, пробел или запятая?

Скрытие данных , где Personесть поле имени, но, по крайней мере в теории, никто не знает . Поле является приватным без общедоступных методов доступа. Клиенты могут передавать имя из записи базы данных, XML, HTTP POST, что угодно, но внутренняя работа того, как Person обрабатывает имя, является «черным ящиком». Будущие реализации Person могут свободно менять, например, переключаться на наличие a firstNameи a lastName.

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

user949300
источник