JS: Полиморфизм
Теория: Null Object Pattern
На сайтах, у которых есть аутентификация, внутри присутствует понятие «текущий пользователь». Это тот пользователь, который аутентифицировался через форму (или вошел через социальную сеть). Текущий пользователь активно используется для вывода различных блоков информации, например, чтобы отобразить блог этого пользователя. Подобный код обычно выглядит так:
Обратите внимание на проверку аутентификации пользователя. Если ее не сделать, то код упадет с ошибкой, потому что вызывается метод hasArticles() у null (так как пользователь отсутствует, если он не залогинился). Когда этих проверок одна или две, то ничего страшного, но если их много, то код быстро захламляется. Кроме того, такую проверку очень легко забыть вставить.
Можно ли решить эту задачу каким-то другим способом? Оказывается можно. Достаточно использовать полиморфизм подтипов. Для этого создается класс, описывающий пользователя, не прошедшего аутентификацию, например, Guest. Затем в него добавляются все необходимые методы, для которых мы хотим получить полиморфное поведение.
Большинство этих методов возвращает false либо пустые списки, так как у этого пользователя ничего нет. Зачем тогда он нужен? Все очень просто: теперь клиентский код всегда рассчитывает на существование пользователя и ему больше не нужно проверять аутентификацию:
Условные конструкции уйдут по всем шаблонам, но остается вопрос. А где и как происходит сам процесс создания нашего пользователя? И вот здесь останется тот единственный if, благодаря которому произойдет создание правильного объекта. Это происходит на этапе обработки входящего запроса, и конкретное место зависит от используемого фреймворка. Код в этом месте выглядит примерно так:
У такого способа использования полиморфизма есть особое название: шаблон проектирования null object. Он часто используется внутри фреймворков и иногда встречается в прикладном коде. На Хекслете таких мест как минимум 3. Например, в классе Guest у нас десятки методов. Вот его содержимое (не полностью):





