Глава 18. Базовые типовые решения 497
к потоку. В этом случае для выполнения последующего доступа к данным сеанса объекты
приложения могут проводить поиск в коллекции, индексированной по идентификаторам
сеанса, используя значение идентификатора, хранящееся в реестре, глобальном по от-
ношению к потоку.
Используя глобальный по отношению к потоку реестр со статическими методами, вы
можете столкнуться с проблемами производительности, возникающими при попытках
доступа к статическим методам реестра нескольких потоков. Избежать подобных про-
блем поможет прямое обращение к экземпляру потока.
Некоторым приложениям достаточно одного реестра, а некоторым может понадо-
биться сразу несколько. Как правило, реестры приложения группируются по слоям сис-
темы или же по контекстам выполнения. Я же предпочитаю группировать их по принци-
пу использования, а не реализации.
Назначение
Несмотря на инкапсуляцию своих методов, содержимое реестра является глобальным
по отношению к определенному контексту. Я никогда не любил работать с глобальными
данными. В моих приложениях практически всегда встречается та или иная разновид-
ность реестра, однако я совершенно искренне стараюсь избегать его применения и ис-
пользую обычные переходы по связям между объектами там, где только возможно.
Как правило, реестр следует применять только в случае крайней необходимости.
Существует несколько альтернатив использованию реестра. Одна из них состоит в
том, чтобы передавать глобальные данные в виде параметров. К сожалению, этот подход
приводит к тому, что параметры добавляются в вызовы методов, которым они совсем не
нужны. Нередки ситуации, когда методы, действительно нуждающиеся в переданных па-
раметрах, находятся в дереве вызовов на несколько слоев ниже тех, которым эти пара-
метры были переданы. Передача практически ненужных параметров кажется мне пустой
тратой времени, поэтому в подобных ситуациях я отдаю предпочтение реестру.
Еще одна альтернатива использованию реестра заключается в том, чтобы при созда-
нии экземпляров объектов добавлять к ним ссылки на необходимые глобальные данные.
Разумеется, при этом в конструкторе объекта появляется лишний параметр, однако он по
крайней мере не будет фигурировать в вызовах других методов. Как и предыдущий, этот
подход имеет больше недостатков, чем преимуществ, но, если у вас есть глобальные дан-
ные, которые применяются только некоторым подмножеством классов, он может ока-
заться довольно полезным.
Существенным недостатком реестра является необходимость его изменения при до-
бавлении новых объектов. Вследствие этого многие предпочитают хранить глобальные
данные в коллекциях. Тем не менее я рекомендую использовать явные классы с явными
методами, которые позволяют проследить, какие ключи применяются для поиска объек-
та. Чтобы понять принцип работы явного метода, достаточно взглянуть на исходный код
или сгенерированную документацию. Использование коллекции лишено таких пре-
имуществ. Чтобы понять, по какому ключу выполняется поиск, вам понадобится най-
ти места системы, в которых происходит считывание или запись в коллекцию, либо
обратиться к документации, которая, как известно, быстро становится неактуальной.
Явный класс позволяет сохранить типовую безопасность в статически типизированных
языках, а также инкапсулировать структуру реестра, чтобы при последующем росте сис-
темы ее можно было вынести в нужный класс или слой. Обычная коллекция не является