Локатор служб
Локатор служб (англ. service locator) — это шаблон проектирования, используемый в разработке программного обеспечения для инкапсуляции процессов, связанных с получением какого-либо сервиса с сильным уровнем абстракции. Этот шаблон использует центральный реестр, известный как «локатор сервисов», который по запросу возвращает информацию (как правило это объекты), необходимую для выполнения определенной задачи[1]. Стоит заметить, что в некотором случае локатор служб фактически является анти-шаблоном[2][3].
Преимущества
[править | править код]- «Локатор служб» может действовать как простой компоновщик времени выполнения. Это позволяет управлять кодом программы во время выполнения без повторной компиляции приложения, а в некоторых случаях без необходимости его перезапуска.
- Приложения могут оптимизировать себя во время выполнения путем выборочного добавления и удаления элементов из локатора служб. Например, приложение может обнаружить, что у него есть лучшая библиотека для чтения доступных изображений JPG, чем стандартная, и соответствующим образом изменить реестр.
- Компоненты приложения или библиотеки, используемые в приложении, могут быть полностью разделены. Единственная связь между ними записывается в реестр.
Недостатки
[править | править код]- Отношения между компонентами приложения, помещенные в реестр, скрывают зависимости частей программы (делают их неочевидными) и увеличивают сложность системы. Это затрудняет поиск ошибок в приложении и может сделать систему в целом менее надежной.
- Реестр должен быть уникальным, что может стать узким местом для одновременного запуска нескольких копий приложения.
- Реестр может быть серьезной уязвимостью безопасности, поскольку он позволяет посторонним (в том числе злоумышленникам) вводить код в приложение.
- Реестр скрывает зависимости класса, вызывая ошибки во время выполнения[англ.], а не ошибки времени компиляции, когда при отсутствии необходимых зависимостей компилятор информирует об ошибке.
- Реестр делает код более сложным для поддержания (против использования инъекции зависимостей), потому что становится неясным, когда вы вносите ошибочную запись в реестр или пропускаете необходимую запись.
- Реестр делает код более сложным для тестирования, поскольку все тесты должны взаимодействовать с одним и тем же глобальным классом локатора служб для установки поддельных зависимостей тестируемого класса. Однако это легко преодолеть, введя классы приложений с помощью одного интерфейса локатора служб.
См. также
[править | править код]Примечания
[править | править код]- ↑ Inversion of Control Containers and the Dependency Injection pattern . Дата обращения: 21 октября 2017. Архивировано 30 мая 2020 года.
- ↑ Seemann, Mark Service Locator is an Anti-Pattern (англ.). blog.ploeh.dk. Дата обращения: 1 июня 2017. Архивировано 31 мая 2017 года.
- ↑ Hall, G.M.L. Adaptive Code via C#: Agile coding with design patterns and SOLID principles. — Pearson Education, 2014. — ISBN 9780133979732.
Ссылки
[править | править код]- DI Паттерны. Service Locator (с примерами на C#)
- Локатор Служб (Service Locator) (с примерами на PHP)¶
- The Service Locator Pattern
- Core J2EE Patterns — Service Locator (с примерами на Java)
- In Defense of Service Locator
- Game Programming Patterns: Service Locator (с примерами на C++)
- Dependencies In Disguise (с примерами на PHP)