Рубрики
Без рубрики

Шаблоны дизайна в веб-разработке – # 1 Команда

Первый эпизод о поведенческих узорах и команде. Теги с JavaScript, Python, архитектурой, шаблонами дизайна.

Шаблоны дизайна в веб-разработке (3 серии деталей)

Проверьте обновленную версию здесь

Как избаловано во введении, первая статья будет о Командный шаблон Отказ Этот шаблон является одним из классических узоров, которые вы можете найти в Банда из четырех И это относится к набору шаблонов, называемых Поведенческие узоры Отказ

Поведенческие шаблоны

Как указано имя, поведенческие модели обеспокоены поведением объектов.

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

Это последнее предложение было достаточно сложно, чтобы заслужить реальный образ жизни.

Скажем, вы находитесь в ресторане, и вы хотите съесть сочный T-костный стейк (я думаю, теперь это очевидно У меня есть что-то для еды). Один из способов достижения этого, чтобы выдержать, иду на кухню, и спрашивая шеф-повар, чтобы подготовить стейк для вас. В этот момент вы понимаете, что кухня полна людей с той же яркой идеей, которые в конечном итоге создают хаос и путаницу в кухонном персонале. Только одно можно хуже: твоя бывшая подруга/парень, да, тот, с вещью для ядов, это шеф-повар.

На самом деле, клиент заинтересован только в том, чтобы получить еду. Прямое общение с шеф-поваром не служит этой цели, и это на самом деле только приносит проблемы. В то же время эта прямая связь не масштабируется, когда у вас есть несколько запросов, и он даже не будет, когда у вас есть несколько слушателей для этих запросов. Это прекрасный пример таких проблем, которые муфта может принести разработку программного обеспечения.

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

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

Этот простой трюк волшебным образом решил наши вопросы. Мы не вынуждены знать, кто готовит нашу еду. Мы даже не знаем, действительно ли кто-то готовит нашу еду или если они покупают, например. Это означает огромное усиление гибкости (и, возможно, немного потери доверия в ресторанах, которые работают таким образом). Кроме того, это улучшило весь процесс на кухне, так как они могут приоритетировать, приготовьте одновременно, бросать в корзину, журнал или делать все, что они хотят с заказами.

Все (Panda включена) жили счастливо после 1!

О, кстати, это был командной шаблон.

ПОКАЖИТЕ МНЕ КОД

О чем это?

Давайте начнем с цитаты из одного и только GIF.

Намерение Кинпсулировать запрос в качестве объекта, тем самым позволяя вам параметризировать клиентов с различными запросами, очередями или запросами журнала, а также поддерживать ненаправленные операции.

В веществе командование все о капсулировании рутины в объекте. В приведенном выше примере мы инкапсулировали запрос на пищу в объекте, который был листкой бумаги, используемой для размещения заказа. Инкапсулирующий объект – это то, что мы называем Команда Отсюда название шаблона 2 Отказ

Последствия

Применение команды имеет в основном два эффекта: уменьшение муфты между invoxer и исполнителем команды сделать рутину первый класс объекта.

Ex сценарий в примере выше должно быть достаточно, чтобы убедить вас, что муфта может быть опасной даже вне компьютерной науки.

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

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

Это только часть усиления, которую мы имеем в преобразовании процедур в объектах. Лучшая часть … ждать этого … Это объекты! Это означает, что вы можете манипулировать процедурами в качестве объектов, так как вы можете хранить их, чтобы иметь историю транзакций, вы можете задержать выполнение, вы можете игнорировать их, если S ** T выходит из трубы, вы можете расширить те, которые добавляют инспекции отладки Вы называете это!

Потрясающий! Буду ли я когда-нибудь понадобиться в моей жизни?

Нет.

Есть некоторые ситуации, в которых Команда не только крайне удобно, но почти нужно.

Обратные вызовы

Каждый раз, когда исполнитель команды и эмитента не только они не знают друг друга, но они не может заранее знаешь друг друга.

Допустим, вы разрабатываете модный комплект пользовательского интерфейса. Вы, конечно, развиваете что-то, что нужно повторно использовать, так что если вы построете Кнопка Компонент, вы хотите, чтобы он мог выполнить любой Действие, вы не хотите, чтобы никто не хочешь.

“Эй братан! У нас есть обратные вызовы для этого! » Да, я знаю, но не все в мире так повезло работать с JavaScript ежедневно (извините, предвзятый комментарий). Когда вы хотите (или надо) быть строго объективным ориентированным, это способ реализации обратных вызовов.

Транзакции и журналы

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

Это очень удобно в системах, в которых вы нужно История транзакции, например, банка, например. Кроме того, вы получите еще один приятный побочный эффект: вы можете восстановить состояние

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

Если вам нужна дополнительная «рабочая сила», вам просто нужно добавить еще несколько потребителей для этой очереди, что делает ваше приложение в целом более масштабируемым.

Отменить повторить

Создание выполнения действия объекта, позволяет создавать объект с двумя методами: Выполнить и отменить . Первый предназначен для того, чтобы сделать что-то, в то время как последний должен отменить то, что вы только что сделали.

Создайте то, что выше о транзакциях, и вы можете легко создавать и отменить/повторить историю.

Последнее усилие перед кодом …

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

Участники этой картины:

  • Приемник :

    • знает, как выполнить команду;
  • Команда :

    • объявляет интерфейс для выполнения операции;
  • Бетонная команда :

    • Определяет связывание между приемником и действием для выполнения;
    • вызывает методы на приемнике для выполнения запроса;
  • Клиент
    • создает бетонную команду и устанавливает приемник;
  • Invoker
    • выдает запрос на выполнение команды;

В примере пример ресторана мы бы имели:

  • Готовить как Получатель
  • Заказать как Бетонная команда
  • Ресторан как Клиент
  • Клиент как Invoker

Какой-то псевдокод выглядит немного более серьезным:

interface Command {
    function execute()
}

// Concrete Command
class Order implements Command {
    Cook cook;
    Meal meal;

    execute() {
        cook.prepare(meal);
    }
}

// Receiver
interface Cook {
    function prepare(Meal meal)
}

// Invoker
class Customer {
    Order order;
    Meal meal;

    mailOrder(Order order) {
        order.execute()
    }
}

// Client
class Restaurant {
    Cook cook;
    Customer customer;

    main() {
        order = new Order(cook, customer.meal)
        customer.mailOrder(order)
    }
}

Вы можете найти более подробную версию этих примеров здесь

Шикаан/Дизайн-образцы

Примеры использования конструктивных узоров в реальном жизненном коде

Примеры использования конструктивных узоров в реальном жизненном коде

Это эталонные ресурсы для этой серии статей

Frontend: ui kits

После первого примера выше, здесь вы простой пример того, как вы можете использовать командный шаблон на интерфейсе. Я решил не использовать какие-либо рамки, поскольку идея достаточно, чтобы быть достаточно, чтобы их применяться к ванили JavaScript.

В этом примере мы просто создадим и визуализируем Кнопка Компонент (Invoxer), который будет выполнять OpenAlertCommand (Бетонная команда). Окно (приемник) фактически отвечает за выполнение задания, во время приложения (клиент) все обогащается.

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

В репо Мы на самом деле доказываем, насколько более гибким это, добавление к настоящему примеру пара других вещей: мы повторно используем одну и ту же кнопку с одной и той же командой с двумя разными приемниками, мы используем одну и ту же кнопку для запуска двух разных команд одновременно.

Backend: CQRS в Python

Хорошая вступительная статья по этому вопросу – здесь Отказ

В следующем примере будет содержать Super Simple Приложение CQRS написано в Python. Предполагается, что это банковское приложение, в котором вы можете внести свой вклад и получить список всех месторождений. Все хранится в памяти и будет исчезнет, как только процесс заканчивается.

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

Ремень себя, потому что здесь у нас есть два одновременной реализации командной картины: один для написания (команду) и один для чтения (запросов). Оба разделяют один и тот же клиент, хотя.

1) Приложение (клиент) создает Депозит Команда и называет Handle_deposit Способ по обработчику команд (команда invoker) 2) Writestore (Command Receiver) сохраняет данные 3) Сразу после того, как обработчик команд загорается событие, чтобы уведомить readstore (получатель запроса), который обновляет 4) Приложение (клиент) затем создает Getlastdeposit Запрос и называет ручка Метод на QueryHandler (Query Invoker) 5) Readstore (приемник запроса) затем сохранит значение в запрос 6) Результат, хранящийся в запросе, возвращается пользователю

Код для этого конечно доступен в репо Отказ Python – это не мой основной язык, поэтому, если вы увидите что-то, не стесняйтесь отправлять запрос на тягу или открыть проблему там.

Окончательные слова

Ну, это было массивно. Надеюсь, вы должны прочитать как минимум половину того, что я написал: D Как всегда, если у вас есть какие-либо отзывы о том, как сделать эту серию лучше, пожалуйста, дайте мне знать.

До скорого!

1 . Этот вид шаблонов на самом деле модифицировал поведение (в общем английском смысле) клиентов и поваров. Надеюсь, это будет достаточно, чтобы навсегда исправить навсегда, что a поведенческий Узор.

2 . Вам языковые гики могут захотеть знать, что «заказы» в контексте ресторана по-итальянски это на самом деле называется «Comanda». Просто одно слово, чтобы помнить как шаблон, так и пример. Прекрасный.

Шаблоны дизайна в веб-разработке (3 серии деталей)

Оригинал: “https://dev.to/shikaan/design-patterns-in-web-development—1-command-2jf”