Закон Деметера (сильная форма). Только следующие объекты должны выступать в роли
источника данных и приемника сообщений метода:
1. Аргументы выполняемого метода (включая объект self).
2. Экземпляры класса, содержащего выполняемый метод.
3. Глобальные переменные.
4. Временные переменные, создаваемые внутри метода.
Полезно рассмотреть, какие правила доступа вытекают из закона Деметера, и соотнести
его с концепциями зацепления и связности, описанными выше. Основной вид доступа,
который запрещается правилами Деметера, — это прямая обработка (манипулирование)
полей экземпляра другого класса. В противном случае один объект зависит от
внутреннего представления другого объекта (что является формой зацепления внутренних
данных). Соблюдение этого правила приводит к тому, что классы могут изучаться и быть
понятными независимо друг от друга (поскольку они взаимодействуют между собой
простым, четко определенным образом). Вирфс-Брок и Вилкерсон еще более ужесточают
закон Деметера, считая, что ссылки из метода даже на переменные экземпляра того же
класса должны выполняться через функции доступа [Wirfs-Brock 1989a]. Их аргументация
состоит в том, что непосредственный доступ к переменным серьезно ограничивает
возможность программиста дорабатывать существующие классы.
17.1.5. Видимость: на уровне классов и на уровне объектов
Тот факт, что класс может иметь несколько экземпляров, приводит к ряду новых
соображений, касающихся контроля над зацеплением. В объектно-ориентированных
языках программирования для описания видимости имен используются две модели. Они
могут быть описаны как видимость на уровне класса и видимость на уровне объекта.
Различие между ними сводится к ответу на вопрос: разрешено ли объекту заглядывать
внутрь родственного объекта?
Языки, которые управляют видимостью на уровне классов (например, C++),
рассматривают все экземпляры класса одним способом. Как мы скоро узнаем, C++
допускает контроль видимости идентификаторов, но даже в наиболее ограничительном
случае (поля данных описаны с ключевым словом private) экземпляр класса всегда имеет
возможность доступа к полям данных других экземпляров того же класса. То есть
объектам всегда разрешен доступ ко внутреннему состоянию родственных объектов.
С другой стороны, управление видимостью на уровне объектов рассматривает
индивидуальный объект как основную единицу контроля доступа. Языки
программирования с видимостью на уровне объектов (например, Smalltalk) запрещают
объектам доступ ко внутреннему состоянию другого объекта, даже если они оба являются
экземплярами одного и того же класса.
17.1.6. Активные значения
Активное значение [Stefik 1986] — это переменная, с которой мы хотим выполнять
некоторые действия всякий раз, когда изменяется ее значение. Система с активными
значениями иллюстрирует, почему зацепление через параметры предпочтительнее, чем
другие виды зацепления, особенно для объектно-ориентированных языков. Предположим,
что модель ядерного реактора включает в себя класс Reactor, который содержит
различную информацию о состоянии реактора. Среди наблюдаемых параметров значится
температура теплоотводящей среды (воды, циркулирующей вокруг блока). Далее
PDF created with pdfFactory Pro trial version www.pdffactory.com