Как сокрытие информации помогает в модульности? - PullRequest
3 голосов
/ 29 октября 2009

Как сокрытие информации помогает разъединить модули, составляющие систему?

Ответы [ 2 ]

10 голосов
/ 29 октября 2009

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

Показательный пример. Допустим, вы реализовали структуру данных, которая содержит строки в массиве. Если вы выставите массив, пользователи вашей структуры данных могут просто использовать str[7], чтобы получить строку в позиции 7.

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

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

Однако, если вы полностью скрыли реализацию и просто предоставили функцию:

String getStringAt (int n);

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

Клиенты не не ломаются, потому что ваш интерфейс прикладного программирования (API) не изменился.

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

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

1 голос
/ 29 октября 2009

Data Hiding, не столько разъединяет модули, что помогает ограничить связь между ними.
Это потому, что ни один из скрытых элементов не может быть использован любым другим модулем, кроме того, в котором они определены, что ограничивает возможные привязки / зависимости / call-it-what-you-may, которые "соединяют" модули вместе.

Другими словами, он ограничивает межмодульные обмены теми, которые специально определены в API , и этот факт очень помогает при изменении реализации данного модуля, поскольку до тех пор, пока API остается прежним, модуль взаимодействия будет работать. (Нет необходимости просматривать код, чтобы найти, если каким-то образом модуль A использовал переменную x из модуля B (если B скрывает x, он единственный, кто его использует!)

...