Инкапсуляция и сокрытие информации - это очень тесно связанные концепции, хотя их точные определения различаются в зависимости от того, с кем вы разговариваете.
Концепция сокрытия информации была впервые описана Парнас (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
age
общедоступным - вот что нарушает инкапсуляцию, а не предоставляет геттер и сеттер ... - person hyde   schedule 17.12.2012