Инкапсуляция против сокрытия данных - Java

Интервьюер: Что такое инкапсуляция и как ее достичь в Java?

Я: Инкапсуляция - это механизм скрытия информации от клиента. Информация может быть данными или реализацией или алгоритмом. Мы достигаем этого, используя модификаторы доступа.

Интервьюер: Это сокрытие данных. Как нам достичь инкапсуляции в Java?

Я: uummmm

Конкретный вопрос: кроме "Модификаторов доступа", как реализовать инкапсуляцию в Java?

20 ответов

Решение

В более общем смысле инкапсуляция относится просто к объединению данных (например, объекта) с операциями над этими данными. Таким образом, у вас есть класс, инкапсулирующий поля данных, а также методы для манипулирования этими данными.

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

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

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

В общем, " Инкапсуляция" означает объединение похожих предметов, просто так.

Например, взять Student класс, в котором у нас будут переменные экземпляра учащихся и поведения / методы, действующие на эти переменные экземпляра @ one place.

Почему это важно? Мы не хотим, чтобы наш код разбросан по нашей базе кода.

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

Скрытие данных

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

Сравнение / Обсуждение

Теперь возникает вопрос, в каком отношении мы защищаем наши переменные?

Опять же, мы должны понимать, что Encapsulation - это просто контейнер, который нам нужен для размещения наших похожих элементов.

Это просто действовать как черный ящик с внешним миром. Внешний мир (я имею в виду клиентов / потребителей: используя наши Student класс) не знаю внутренних деталей / деталей реализации Student класс и на самом деле они не должны заботиться о внутренних деталях / деталях реализации класса. Им просто нужны некоторые методы /API, чтобы они могли использовать их в своем клиентском приложении.

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

Теперь вернемся к вопросу В Java: мы делаем наши переменные частными, это означает, что они защищены классом. Если мы хотим, чтобы переменные нашего экземпляра были доступны во всем пакете, тогда они защищены пакетом. В рамках нашего проекта они являются публичными. Поэтому я хочу сказать, что для сокрытия данных вам нужен своего рода контейнер, куда вы будете помещать свои данные и скрывать их относительно контейнера.

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

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

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

Как ты это делаешь? Допустим, ты создал класс под названием "Автомобиль". Теперь машина имеет цветную цену и модель. Это атрибуты, и у них есть метод run. Итак, здесь вы инкапсулировали все эти атрибуты и методы автомобиля под названием "Автомобиль". Когда вы создаете экземпляр автомобиля, как это так

Car myCar = new Car();

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

"Скрытие данных": скрытие данных контролируется в Java с помощью модификаторов доступа. Для доступа к членам данных вы используете ACCESSORS, а для изменения данных вы используете "Mutators". Java сама по себе не предоставляет средства доступа и мутаторы, вы создаете их самостоятельно (методы получения и установки). В то время как C# предоставляет СВОЙСТВА для этого.

Я ненавижу это делать, но из Википедии:

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

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

Ваше объяснение больше соответствовало первому понятию, интервьюер искал что-то во втором.

Инкапсуляция данных относится к механизму хранения всех связанных свойств и метода в одном объекте.

Пример: Автомобиль. Он объединяет рулевые колеса, шины, двигатель и все, что с этим связано, в единую единую структуру Car,

В языках программирования инкапсуляция достигается с помощью классов. Класс содержит все свойства и связанные методы в one single entity это предназначено для выполнения конкретной задачи.


Под сокрытием данных подразумевается сокрытие неважных подробностей от пользователя и отображение ему только соответствующих данных.

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

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

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

Тем не менее, я подумал об этом, и вот что я думаю, может быть моей попыткой ответить на вопрос.

С модификаторами доступа

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

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

Например, метод Arrays.asList() возвращает List реализации, но нам все равно, какая реализация, если она удовлетворяет List публичный интерфейс, верно? Реализация может быть изменена в будущем, не затрагивая нас, пользователей метода, но фактическая реализация скрыта от нас.

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

Без модификаторов доступа

Однако как такой язык, как Python, достигает инкапсуляции, когда у него нет модификаторов доступа? Все публично в Python? Означает ли это, что инкапсуляция невозможна?

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

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

Роль абстракции

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

Подумайте, например, об уровне абстракции в концепции автомобиля. Автомобиль сложен в своей внутренней реализации. У них есть несколько подсистем, таких как система трансмиссии, система останова, топливная система и т. Д.

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

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

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

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

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

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

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

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

Сокрытие данных означает, что мы обеспечиваем безопасность данных в классе.

Абстракция означает скрытие кода путем определения функций-членов.

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

    class student {
private int age;  // Data Hiding 
public setAge(){} // Abstraction 
public getAge(){} // Abstraction 
}

Студенческий класс инкапсулирован.

инкапсуляция = сокрытие данных + абстракция

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

  1. Низкая связь (обеспечивается скрытием информации)
  2. Высокая сплоченность
  1. ENCAPSULATION - это объединение данных (полей) и поведения (методов) в классах.
  2. Теперь вы должны обеспечить контроль доступа к данным с помощью модификаторов доступа (private/protected/public или default), что означает скрытие данных. Он защищает данные от внешнего мира, к которому вы не хотите предоставлять доступ.
  3. Кроме того, чтобы скрыть сложность операций, вы должны использовать интерфейсы для достижения абстракции.

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

Абстракция говорит о том, что нужно для взаимодействия с объектом.

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

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

Я видел много обсуждений уже сделано, просто для упрощения из моего понимания:

Инкапсуляция Гарантирует, что на поведение объекта может влиять только его API. Это позволяет нам контролировать, насколько изменение одного объекта повлияет на другие части системы, обеспечивая отсутствие неожиданных зависимостей между несвязанными компонентами. Для достижения инкапсуляции можно использовать модификатор доступа.

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

Инкапсуляция: Инкапсуляция является одним из столпов OOPS, также является надмножеством для двух других терминов: скрытие данных и абстракция. (Данные скрываются, как термин. Данные могут храниться только в переменных. Чтобы скрыть данные от внешнего мира, мы используем концепцию скрытия данных. Public, Private, Protected - это три модификатора доступа, предоставленные нам для скрытия данных. По умолчанию ограничено пакетом. Защищено ограничено унаследованным классом.) ** Закрытые переменные доступны только внутри класса, что означает, что если есть внутренний класс, то и частные переменные могут быть вызваны напрямую. Только статические внутренние классы могут вызывать статические переменные.

Теперь подходит к абстракции (имеется в виду нематериальный). Абстракция также рассматривается как процесс, чтобы скрыть реализацию от пользователя и предоставить только конечный результат. Пример: у нас есть класс person, у которого есть свойство Weight. Это свойство довольно сложно, потому что мы не можем принять менее 0 вес для человека. Также мы не можем принять более 500 кг. Так что скрывать реализацию для них будет в методе setter. Эта вещь, скрывающая детали реализации, является абстракцией.

** А Полный Пакет, т.е. создание объекта частным и реализация логики в методах установки и получения, называется ENCAPSULATION.

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

На структурном языке, таком как c, данные объявляются в начале блока и используются напрямую, к ним есть открытый доступ (доступ к данным может получить любой Том, Дик и Гарри). Сокрытие данных - это концепция прямого и открытого ограничения доступа к данным для любого человека.
Инкапсуляция - один из способов скрыть данные. Вы достигаете сокрытия данных, соединяя данные и функции (инкапсуляция).

Как вы достигли в JAVA, посмотрите любой пример функции getter(), setter() в JAVA. Проверь это

Как работают геттеры и сеттеры?

Из Википедии

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

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

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

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

Инкапсуляция означает связывание элементов данных и метода (поведения) в одном модуле и предоставление столько информации, сколько требуется пользователю, вы можете легко сказать [encapsulation= скрытие данных + абстракция].

Класс полностью инкапсулированный элемент в Java

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

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

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

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

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

Инкапсуляция = Сокрытие данных + Абстракция

Другие вопросы по тегам