Что такое "декораторы" и как они используются?
Мне любопытно, что именно декораторы в AngularJS. Существует не так много информации в Интернете для декораторов, за исключением рекламы в документации AngularJS и краткого (хотя и интересного) упоминания в видео youtube.
Как ребята Angular, ребята, это декоратор:
Украшение сервиса, позволяет декоратору перехватывать услугу создание экземпляра. Возвращенным экземпляром может быть исходный экземпляр, или новый экземпляр, который делегирует исходный экземпляр.
Я действительно не знаю, что это значит, и я не уверен, почему вы отделите эту логику от самой службы. Например, если бы я хотел вернуть что-то другое в разных условиях, я просто передал бы разные аргументы соответствующим функциям или использовал бы другую функцию, разделяющую это частное состояние.
Я все еще вроде AngularJS noob, поэтому я уверен, что это просто невежество и/или вредные привычки, которые я выбрал.
Ответы
Ответ 1
Хорошим вариантом использования $provide.decorator
является то, когда вам нужно выполнить незначительную "настройку" на какой-либо сторонней/восходящей службе, от которой зависит ваш модуль, оставив службу неповрежденной (поскольку вы не являетесь владельцем/сопровождающим услуги). Здесь - демонстрация на plunkr.
Ответ 2
Декораторы позволяют нам выделять сквозные проблемы и предоставлять услуги для сохранения SRP, не беспокоясь о "инфраструктурном" коде.
Практическое использование декораторов:
- Кэширование: если у нас есть служба, которая делает потенциально дорогостоящие HTTP-вызовы, мы можем обернуть службу в декодер кеширования, который проверяет локальное хранилище перед выполнением внешнего вызова.
- Отладка/трассировка: есть переключатель в зависимости от вашей конфигурации разработки/производства, которая украшает ваши сервисы с помощью отладочных или трассировочных оберток.
- Дросселирование: обматывание часто вызываемых вызовов в обертки debouncing. Позволяет нам легко взаимодействовать с услугами с ограничением скорости, например.
Во всех этих случаях мы ограничиваем код в сервисе своей основной ответственностью.
Ответ 3
decorator
может перехватить экземпляр службы, созданный с помощью factory, service, value, provider
, и дает возможность изменять некоторые instance(service)
, которые иначе не настраиваются/с параметрами.
Он также может предоставлять макеты для целей тестирования, например $http
.
Ответ 4
В простом слове мы можем сказать, что это как метод расширения. Для примера. У нас есть класс, и у него есть два метода, и во время выполнения мы хотим добавить в него больше методов, тогда мы используем Decorator.
Мы не можем использовать $reserve.decorator с константами, потому что мы не можем изменить константы, которые они используют только для чтения.