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

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

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

class IsThisEncapsulation {
    public int age;

    public int getAge() {
        return this.age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

Теперь, если объявление атрибута данных age private приведет к сокрытию информации?


person user1720616    schedule 17.12.2012    source источник
comment
является ли класс IsThisEncapsulation примером инкапсуляции? = ›вы на самом деле ничего не инкапсулировали, поскольку вы предоставляете геттеры и сеттеры, которые могут напрямую читать и записывать состояние вашего класса ...   -  person assylias    schedule 17.12.2012
comment
@assylias Создание age общедоступным - вот что нарушает инкапсуляцию, а не предоставляет геттер и сеттер ...   -  person hyde    schedule 17.12.2012
comment
@hyde Я не заметил этой детали! Верно!   -  person assylias    schedule 17.12.2012
comment
@hyde Я читал, что инкапсуляция означает объединение данных и методов вместе, если это так, что созданный мной класс (IsThisEncapsulation) действительно достигает инкапсуляции. Я прав? Или я неправильно читал об инкапсуляции.   -  person user1720616    schedule 17.12.2012
comment
@ user1720616 Чтобы инкапсуляция имела смысл, вам нужны некоторые инварианты (условия, которые должны оставаться верными). Для возраста вы можете определить инвариант: возраст не может быть отрицательным. Итак, если можно установить отрицательный возраст (вместо получения исключения или чего-то еще), как это очевидно, если возраст является общедоступным полем, тогда возраст не инкапсулируется должным образом. Другой может быть, если у вас много полей, которые зависят друг от друга, поэтому вы не можете просто изменить одно поле, вам нужен код, который вносит правильные изменения во все поля, которые в нем нуждаются.   -  person hyde    schedule 17.12.2012


Ответы (10)


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

---> Инкапсуляция - это концепция ООП, в которой состояние объекта (поля класса) и его поведение (методы) обертываются вместе. Java обеспечивает инкапсуляцию с использованием class.

Скрытие информации:

-> механизм ограничения доступа к некоторым компонентам объекта. Ваш пример выше относится к случаю сокрытия информации, если вы делаете age закрытым.


Первоначально скрытие информации / данных считалось частью инкапсуляции, и определения инкапсуляции были такими:

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

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

Ссылка: wikipage

person Nandkumar Tekale    schedule 17.12.2012

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

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

Термин инкапсуляция был введен Zilles (1973) для описания использования процедур. для управления доступом к базовым данным, чтобы упростить систему и защитить данные от опасной модификации.

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

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

И наоборот, Роджерс (2001) предполагает, что инкапсуляция - это просто языковой механизм, который позволяет объединять данные с методами, которые работают с этими данными. Он утверждает, что инкапсуляция по сути не имеет ничего общего с сокрытием информации. Однако это определение противоречит почти всему использованию этого термина в академической литературе за 28 лет до публикации его статьи. Есть еще несколько примеров такого использования, например Арчер и Стинсон ( 1995), но их немного, и они не особо примечательны.

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

В качестве примера сокрытия / инкапсуляции информации рассмотрим этот класс:

public class BankAccount {
    public int dollars;
}

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

public class BankAccount {
    private int dollars;

    public void deposit(int dollars) {
        this.dollars += Math.max(0, dollars);
    }
}

Теперь у нас есть контроль над тем, как изменяется состояние, и мы также можем изменить реализацию, не нарушая клиентский код:

public class BankAccount {
    private int cents;

    public void deposit(int dollars) {
        deposit(dollars, 0);
    }

    public void deposit(int dollars, int cents) {
        this.cents += Math.max(0, 100 * dollars) + Math.max(0, cents);
    }
}

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

person Joseph Thomson    schedule 14.09.2016
comment
Этот ответ подкреплен гораздо лучше, чем принятый ответ. +1 - person Piovezan; 13.10.2019

Из абстракция-против-информации-сокрытие-против-инкапсуляции

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

Скрытие информации:

Его интерфейс или определение были выбраны так, чтобы как можно меньше раскрывать его внутреннюю работу. - [Парнас, 1972б]

Абстракция может […] использоваться как метод определения того, какая информация должна быть скрыта.

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

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

Это […] относится к построению капсулы, в случае концептуального барьера, вокруг некоторой совокупности вещей. - [Wirfs-Brock et al, 1990]

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

Если инкапсуляция - это «то же самое, что и сокрытие информации», то можно было бы привести аргумент, что «все, что было инкапсулировано, также было скрыто». Это не совсем так.

person Sumit Singh    schedule 17.12.2012
comment
Было бы так мило с вашей стороны, если бы вы привели мне примеры этих определений :) - person user1720616; 17.12.2012
comment
Я бы 5, если бы я только процитировал Парнаса. - person dietbuddha; 06.04.2016

Между ними есть тонкая разница, мне нравится описание из книги Стива Фримена и Ната Прайса "Growing Object-Oriented Software Guided by Tests":

Что говорит:

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

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

Скрытие информации

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

person Eds    schedule 17.12.2012

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

person Harit Vishwakarma    schedule 17.12.2012
comment
Большое вам спасибо. Итак, если изменения доступа не способствуют инкапсуляции, класс, который я здесь определил, достигает инкапсуляции, не так ли? - person user1720616; 17.12.2012
comment
@Harit Я бы сказал, что инкапсуляция также означает, что инварианты инкапсулированного объекта должны оставаться верными. Для этого требуется доступ к объекту только через общедоступный API. Предотвращает ли язык доступ к ним в обход API или нет (принудительно скрывает информацию или нет) - это другой вопрос, но инкапусляция - это не просто объединение вещей в кучу, она также включает инварианты. - person hyde; 17.12.2012

class NoEncapsulationNoInformationHiding { 
    public List widths = new ArrayList();
}

class EncapsulationNoInformationHiding {
    private ArrayList widths = new ArrayList();

    public ArrayList getWidths() {
        return this.widths;
    }
}

class EncapsulationInformationHiding {
    private List widths = new ArrayList();

    public List getWidths() {
        return this.widths;
    }
}
  • Инкапсуляция: объединение таких вещей, как данные, и процедур, которые работают с этими данными (создание объекта). Инкапсуляция подразумевает сокрытие данных объекта, поскольку любые процедуры могут работать с общедоступными данными.
  • Скрытие информации: абстрагирование таких вещей, как реализация объекта, то есть данные объекта, реализация его процедур, а также классы параметров и возвращаемые значения его процедур. Скрытие информации подразумевает инкапсуляцию, но не наоборот.

Примеры навеяны Уильяма Андервуда.

person Alireza Rahmani khalili    schedule 08.10.2018

Из статьи Эдварда Берара Абстракция, инкапсуляция и сокрытие информации :

ВЫВОДЫ

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

Нетрудно увидеть, как абстракция, сокрытие информации и инкапсуляция смешались друг с другом. Кроме того, можно утверждать, что, независимо от их словарных определений, эти термины приобрели новые значения в контексте разработки программного обеспечения, например, во многом так же, как и парадигма. (См., Например, [Kuhn, 1962].) Однако можно привести более веский аргумент в пользу сохранения различий между понятиями и, следовательно, терминами.

Другими словами:

  • абстракция - это метод выбора (какая информация должна быть видимой / скрытой);
  • инкапсуляция - это метод презентации (как информация должна быть видимой / скрытой).

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

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

Теперь, если объявление атрибута данных age private приведет к сокрытию информации?

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

person Maggyero    schedule 02.07.2021
comment
Указание инкапсуляции data подразумевает, что существует также альтернативная форма инкапсуляции, то есть не объектно-ориентированная инкапсуляция. У вас есть пример этого другого типа инкапсуляции? - person jaco0646; 02.07.2021

Чтобы ответить на ваш вопрос:

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

Инкапсуляция: инкапсуляция объединяет данные и методы и обеспечивает доступ к внутренним данным общедоступными методами. Итак, да, если в вашем классе вы сделаете переменную age, private, вы достигнете инкапсуляции

person stamhaney    schedule 17.12.2012
comment
Умм, я читал, что инкапсуляция означает объединение данных и методов вместе, а также кто-то здесь опубликовал, что модификаторы доступа не способствуют инкапсуляции. Если эти утверждения верны, тогда класс, который я определил, достигает инкапсуляции. Я ошибаюсь? Пожалуйста, поправьте меня Если да. И я имел в виду, что если я сделаю поле закрытым, оно будет скрывать информацию. - person user1720616; 17.12.2012
comment
Инкапсуляция обеспечивает безопасность данных, которые вы хотите защитить от несанкционированного доступа. Этого можно добиться с помощью спецификаторов доступа и общедоступных функций. Переменная age объявлена ​​в вашем классе как общедоступная, поэтому к ней можно получить доступ извне и ее можно изменить, чего мы не хотим. Поэтому нам нужно сделать его приватным. Скрытие информации может быть достигнуто с помощью абстракции, которая демонстрирует поведение, которое не показывает, как вы сохраняете / используете внутренние данные. Итак, в этом примере, если вы сделаете его закрытым, вы добьетесь сокрытия информации. - person stamhaney; 17.12.2012

Вот что происходит, когда вы не реализуете скрытие информации, инкапсуляцию или что-то еще, что это называется. Плохие вещи происходят, когда вы меняете что-то в углу, которое, по вашему мнению, является независимым. Во-вторых, когда вы хотите изменить стороннюю библиотеку, которая используется в вашей системе, вы обнаруживаете, что повсюду в системе есть ссылки, которые вы не можете переместить без рефакторинга всего этого. Например, вы хотите обновить свою версию библиотеки доступа к данным (я столкнулся с этой проблемой, когда хотел обновить версию ODP.net), вы оцениваете, что работа предполагает, что вы хотите изменить класс DataAccess, который должен иметь ссылку на БД. клиентская библиотека. Но вы обнаружите, что каждый бизнес-класс создал ссылку на клиентскую библиотеку БД. Теперь вам нужно обновить ссылки 60 сборок вместо одной :( Утечка информации

То же самое происходит, когда вы открываете клиентам внутреннюю логику. Например, у вас есть функция EnrollMember (строковый флаг), вы принимаете «A», «B» как допустимые флаги и выполняете некоторую логику внутри функции. Если позже вы захотите изменить эту функцию, вы не сможете сделать это, не проинформировав клиентов.

person Manjula Liyanage    schedule 12.02.2019

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

-> Сокрытие информации на самом деле является процессом или действием ограничения

person Nasserr    schedule 20.01.2018