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

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

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

предположим у меня есть класс, как это описано ниже.

public Class IsThisEncapsulation
{
    public int age;

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

    public int getAge()
    {
       return age;
    }
}

теперь класс IsThisEncapsulation является примером инкапсуляции?

теперь будет делать поле "возраст" в указанном выше классе private достичь информация скрывается?

Не могли бы вы дать мне четкие примеры, которые помогут мне четко различать эти понятия?

7 ответов


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

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

Скрывая Информацию:

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


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

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

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

ссылки: wikipage


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

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

Скрывая Информацию:

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

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

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

заключение:

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

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

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


между ними есть тонкая разница, мне нравится описание из книги" растущее объектно-ориентированное программное обеспечение, управляемое тестами", написанной Стивом Фрименом и Нэтом Прайсом:

Он говорит:

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

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

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

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


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

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

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

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

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

наоборот, Rogers (2001) предполагает, что инкапсуляция-это просто языковой механизм, позволяющий объединять данные с методами, которые работают с этими данными. Он утверждает, что инкапсуляция принципиально не имеет ничего общего с сокрытием информации. Однако это определение противоречит почти всему использованию термина в научной литературе за 28 лет до публикации его статьи. Там are несколько других примеров этого использования, например Арчер и Стинсон (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);
    }
}

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


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


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

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

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


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

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