Avoid ugly If/else blocks

Обзор паттерна Strategy, сделай свой код не только модульным.

Mikalailupish
Clean Code

--

Новый синтаксис ES6 направлен на то, чтобы сделать наш код более сжатым и чистым. И,он отлично справляется со своей задачей: такие вещи, как деструктуризация, строковые литералы, операторы распространения и т. д. все большие инструменты для улучшения читаемости нашего кода.

Ugly if/else

Грязное if/else: Одним из элементов синтаксиса, который вряд ли когда-либо изменится, являются операторы if/else и switch. Не знаю, как вы, но я всегда считал их самой уродливой частью моего кода. Однако это ужасно необходимое зло, которого невозможно избежать.

В бизнес-приложениях мы почти всегда сталкиваемся с ситуацией, когда мы должны реализовать какой-то метод маршрутизации, который выполняет изменение определенного действия на основе условия. Эти методы обычно заканчиваются длинными и уродливыми инструкциями if / else или switch. (Варианты оплаты, маршрутизация электронной почты, несколько поставщиков аутентификации и т. д.)

В этом посте я хочу поделиться с вами шаблоном, который я открыл для себя недавно и который, я думаю, может помочь вам избежать некоторых из этих сценариев.

Strategy

Стратегия: Паттерн, о котором я говорю, называется “strategy”. Этот шаблон был популяризирован GoF (Gang of Four ) и является отличным инструментом для добавления изменяемых, взаимозаменяемых частей к определенным частям вашей логики приложения.

Так как же это работает? Стратегия реализует переменные части функциональности с согласованным интерфейсом для общего объекта, который мы называем “контекст”. Контекст использует различные стратегии для выполнения определенной задачи на основе вызова клиента.

Подумайте о наборе стратегий как о наборе инструментов, а о контексте как о мастере. Ремесленник использует различные инструменты в зависимости от задания. Но в этом случае все инструменты имеют один и тот же тип инструкций о том, как их использовать.

Вот схема, которая изображает эту идею:

Passport.JS

Паспорт.JS: Паспорт.JS является прекрасным примером использования шаблона strategy. Паспорт.JS-это библиотека для простой интеграции системы аутентификации в узле Node.JS. Он имеет несколько различных интерфейсов для настройки аутентификации на основе поставщика, который вы хотите использовать (Facebook, Google, Twitter и т.д. ). Все, что вам нужно сделать, это подключить интерфейс, который вам нужен в вашей логике аутентификации. Кроме того, все эти интерфейсы взаимозаменяемы, и вы можете легко поменять один на другой.

Receipt sender

Отправитель отчета: Я уверен, что к настоящему времени у вас есть по крайней мере базовое понимание модели strategy, так что достаточно теории! Давайте попробуем построить простую систему доставки отчета пользователям на основе клиента, который они используют для размещения заказа.

Define strategies

Определяем стратегии: Давайте начнем с конкретизации наших стратегий. Сначала давайте определим нашу стратегию электронной почты:

Мы используем модуль mailgun для отправки писем. Объект стратегии имеет один методsend, который принимает receiptHtmlи userEmailдля параметров.

Теперь давайте перейдем к нашей стратегии Slack:

Мы используем библиотеку npm slack для отправки отчета через нашего воображаемого бота slack. Здесь следует отметить одну важную вещь:

  • send сигнатура метода стратегии идентична ее почтовому эквиваленту

Receipt manager

Менеджер отчетов: Теперь, когда мы определили наши стратегии, давайте определим наш класс диспетчера поступлений, который будет генерировать html для поступления и использовать наши стратегии для отправки поступлений пользователю:

Я опустил реализацию _generateReceiptHtmlметода, так как он не относится к нашему примеру. Интересной частью является sendReceiptметод:

  • Мы генерируем html для получения отчета, используя _generateReceiptHtml
  • Мы отправляем отчет, используя стратегию, которая была передана нам в качестве аргумента

Поскольку обе наши стратегии имеют одинаковую сигнатуру метода, мы можем использовать их взаимозаменяемо, безReceiptManager.

Теперь давайте посмотрим, как sendReceiptбудет выглядеть, если мы не определим наши стратегии:

Обратите внимание, как switchоператор снизил читаемость нашего кода. Этот метод может выглядеть не слишком плохо прямо сейчас, но позже, если мы решим добавить больше каналов для доставки отчетов, этот метод быстро станет грязным.

Client

Клиент: Теперь, что касается финальной части, давайте посмотрим, как легко использовать наши стратегии вместе с нашим менеджером по получению:

Просто не так ли? Все, что нам нужно сделать, это создать экземпляр соответствующей стратегии в зависимости от канала, который мы хотим использовать, и передать его нашему менеджеру по приему.

И это все для этого поста! Disclamer: шаблон strategy может быть неприменим к каждому случаю и иногда может быть излишним . Потому что в конце концов, этот шаблон просто инструмент, и так же, как с любым инструментом, вам нужно убедиться, что он необходим для работы.

Тем не менее, стратегия может отлично обеспечить разделение проблем и сделать части вашего кода более модульными и взаимозаменяемыми.

Спасибо за чтение!

--

--