Классика баз данных - статьи

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


Принцип инкапсуляции выразительно устанавливается законом Деметры . «Для любого класса C и для любого метода M, связанного с C, все объекты, которым M посылает сообщение, должны быть экземплярами классов, ассоциированными со следующими классами:

  • Классами аргументов M (включая C).
  • Классами переменных экземпляра C.»

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

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

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

У инкапсуляции имеются две основные мотивировки:

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

При отсутствии инкапсуляции в пределе метод мог бы обходить все ассоциации модели классов.



Содержание раздела