Пейджер

🌍 Привет мир! 👋

🌍 Привет мир! 👋

В связи с высокой нагрузкой 👨‍💻 не было времени сформировать полноценный пост, хотя и зачатков для этого у меня полным полно.

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

Но сейчас всё острее стоит вопрос не просто в том, чтобы писать код быстро (за счёт AI), а в том, чтобы делать это грамотно.

Не было и дня, чтобы я не использовал AI: генерит много, генерит классно, но есть одно НО, нет структуры и приходится постоянно говорить:

“Слушай, всё, что ты написал — это огнище 🔥. Но давай мы сделаем это по принципу или по паттерну…”

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

Вот недавно я касался паттерна Strategy 🎮 — вот о нём, собственно, и поговорим.

🚀 Мотивация

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

⚙️ Что такое Strategy?

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

Представим что у нас есть игрушечный робот 🎆. Этот робот может передвигаться, и можно менять способ его передвижения:

🟢Ходит пешком
🟢Едет на колёсиках
🟢Летит с пропеллером

Что мы имеем? У робота есть способ двигаться — стратегия и можно менять стратегию передвижения в любой момент, не меняя саму игрушку.

Подумайте, как бы вы реализовывали такой алгоритм поведения? Уверен что многие сразу подумали об этом:
В зависимости от команды которая поступила с пульта, намучу if..else..else, О! или даже не так, сделаю через switch case, потому что и так много if else в коде =)

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

Но давайте уже писать как бородатые дядьки (Мурычу привет)

🚩 Простой примерчик

Представим, что мы пилим приложение, рассчитывающее стоимость 💵 доставки заказа.
У нас может быть несколько вариантов доставки:

🟢Курьерская доставка 🚴‍♂️,
🟢Почта 📦,
🟢Ракета с байконура 🚀.

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

1️⃣ Создание стратегий:

// Стратегии доставки
class CourierDelivery {
  calculate(price) {
    return price + 5;
  }
}

class PostalDelivery {
  calculate(price) {
    return price + 3;
  }
}

class FalconDelivery {
  calculate(price) {
    return price + 100;
  }
}


2️⃣ Далее пишется контекст, который будет выбирать и использовать стратегию:


class DeliveryContext {
  setStrategy(strategy) {
    this.strategy = strategy;
  }

  calculate(price) {
    // Использует выбранную стратегию для расчёта
    return this.strategy.calculate(price);
  }
}


3️⃣ И остается самый сок это получение стратегии на основании типа:

const delivery = new DeliveryContext();

// Dictionary стратегий
const strategies = {
  express: new FalconDelivery(),
  postal: new PostalDelivery(),
  courier: new CourierDelivery(),
};

// Выбор стратегии по типу заказа
const selectedStrategy = strategies[orderType] || strategies.courier;

delivery.setStrategy(selectedStrategy);

// Расчёт финальной стоимости заказа с учётом выбранной стратегии
const finalPrice = delivery.calculate(orderPrice);


Я думаю и без слов видна элегантность подхода, но самое классное, завтра, когда придет клиент и скажет 🧐:

“А чо, я еще и по морю хочу, давай пароходы добавим”.

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

💬 Делитесь своим мнением в комментариях👇! Если вам понравилась статья, не забудьте поставить лайк и хорошего вам дня! 👍

#PATTERNS
Медиа 1
Хотите больше таких постов?
Подпишитесь на канал и читайте продолжение в Telegram.
Подписаться на @ivanchikovitclub Открыть пост в Telegram