ar
Feedback
Pattern Guru. Шаблоны проектирования. Архитектура ПО

Pattern Guru. Шаблоны проектирования. Архитектура ПО

الذهاب إلى القناة على Telegram

Патерны программирования. Архитектура ПО. Микросервисы @anothertechrock

إظهار المزيد
3 144
المشتركون
لا توجد بيانات24 ساعات
-67 أيام
-2330 أيام
أرشيف المشاركات
Шаблон проектирования Adapter Адаптер используется, если требуется изменить интерфейс без ущерба для разработки. Этот шаблон
Шаблон проектирования Adapter Адаптер используется, если требуется изменить интерфейс без ущерба для разработки. Этот шаблон позволяет повторно использовать уже имеющийся код, приводя его несовместимый интерфейс к виду, пригодному для использования. Предположим, что у программиста есть собака, а система ожидает кошку. Эту собаку нужно адаптировать. Смотреть реализацию

❓Хотите создавать масштабируемую и отказоустойчивую микросервисную архитектуру? 19 ноября в 20:00 мск приглашаем на открытый
❓Хотите создавать масштабируемую и отказоустойчивую микросервисную архитектуру? 19 ноября в 20:00 мск приглашаем на открытый вебинар, где вы узнаете, как применять ключевые стратегии Circuit Breaker, Retry и Load Balancing для повышения стабильности систем. В современном мире сбоев и перегрузок не избежать. Но с правильными паттернами они не будут вас пугать. Мы разберем на практике, как защитить приложения от краха и обеспечить их стабильную работу даже при высокой нагрузке. 👨‍💻🛠👨🏻‍💻 Вебинар будет полезен разработчикам, архитекторам и DevOps-инженерам, которые хотят повысить производительность своих микросервисов, внедрив современные решения для автоматического масштабирования и балансировки. 🔴 Регистрируйтесь прямо сейчас и получите скидку на курс «Software Architect» Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576

В библиотеке aiogram dialog есть диалог менеджер, он реализует базовую функциональность управления диалогами: старт разным способом, доступ к контексту и т.п. Также есть менеджер - это временный объект. Он создаётся на время обработки конкретного события. Соответственно, его надо постоянно пересоздавать. В какой-то момент я решил что неплохо дать возможность что-то в менеджере переопределить, соответственно нужно и фабрику менять. Для решения этой проблемы абстрактная фабрика подошла лучше всего.

#паттерны Введение Сегодня мы рассмотрим паттерн проектирования "Абстрактная фабрика". Классификация Тип: Порождающий Определение: Абстрактная фабрика - это порождающий паттерн проектирования, который предоставляет интерфейс для создания семейств взаимосвязанных или взаимозависимых объектов, не специфицируя их конкретных классов. Грубо говоря, абстрактная фабрика - это "фабрика фабрик", данный паттерн позволяет решить проблему создания целых семейств связанных объектов, без указания конкретных классов продуктов. С помощью абстрактной фабрики вы можете предоставить библиотеку объектов не расскрывая их реализацию. Из чего состоит и как работает данный паттерн 1. Абстрактного класса/Интерфейса абстрактной фабрики. Содержит абстрактные методы которые возвращают абстрактные продукты, связанные одной конпцецией.
class AbstractFactory(ABC):
    @abstractmethod
    def create_product_a(self):
        ...

    @abstractmethod
    def create_product_b(self):
        ...
2. Конретные фабрики. Конкретные фабрики реализут операции которые создают конкретные продукты.
class ConcreteFactory1(AbstractFactory):
    def create_product_a(self):
        return ConcreteProductA1()

    def create_product_b(self):
        return ConcreteProductB1()

class ConcreteFactory2(AbstractFactory):
    def create_product_a(self):
        return ConcreteProductA2()

    def create_product_b(self):
        return ConcreteProductB2()
3. Абстрактные классы продуктов. Реализуют интерфейс для всех конретных продуктов своего семейства.
class AbstractProductA(ABC):
    @abstractmethod
    def very_important_super_function_a(self) -> str:
        ...

class AbstractProductB(ABC):
    @abstractmethod
    def very_important_super_function_b(self) -> str:
        ...
4. Конкретные продукты. Реализуют абстрактные продукты. Продукты одного семейства не могут взаимодействовать, с продуктами другого семейства.
class ConcreteProductA1(AbstractProductA):
    def very_important_super_function_a(self) -> str:
        return "Product A1"


class ConcreteProductA2(AbstractProductA):
    def very_important_super_function_a(self) -> str:
        return "Product A2"

class ConcreteProductB1(AbstractProductB):
    def very_important_super_function_b(self) -> str:
        return "Product B1"


class ConcreteProductB2(AbstractProductB):
    def very_important_super_function_b(self) -> str:
        return "Product B2"
5. Клиент. Клиентский код работает исключительно с абстрактной фабрикой и абстрактными продуктами.
def client(factory: AbstractFactory) -> str:
    return factory.create_product_a().very_important_super_function_a()

for factory in (ConcreteFactory1, ConcreteFactory2, ...):
    client(factory)
Плюсы данного паттерна 1. Реализует принцип открытости/закрытости. 2. Упращает поддержку кода. 3. Выделяет код производства продуктов в одно место, упрощая поддержку кода. Минусы данного паттерна 1. Снижает читаемость программы из-за введения множества дополнительных классов. Пример и задача Дед Мороз и Пасхальный кролик не успевают сделать игрушки к празднику, которые они будут дарить детям. Все существует 3 вида игрушек: 1. Лошадка 2. Зайчик 3. Шарик Всё было бы просто однако Деду Морозу нужны игрушки в новогоднем стиле, а пасхальному кролику в пасхальном. Создайте абстрактную фабрику игрушек и спасите эти праздники! Пример из реального кода Пример из реального кода предоставил @Tishka17. Он разработал замечательный фреймворк aiogram_dialog для разработки интерактивных диалогов и меню в телеграмм ботах, как обычное приложение с графическим интерфейсом. Вот здесь он использует данный паттерн: https://github.com/Tishka17/aiogram_dialog/blob/develop/aiogram_dialog/manager/manager_middleware.py#L23 Вот его объяснение, какую задачу он решает в данном случае:

❓Какой самый больной вопрос для IT-команд? Тестирование микросервисов! Откройте все секреты! Как повысить отказоустойчивость
Какой самый больной вопрос для IT-команд? Тестирование микросервисов! Откройте все секреты! Как повысить отказоустойчивость и управлять взаимодействиями между сервисами? 👨‍💻🛠👨🏻‍💻 На открытом уроке мы разберем всё: от юнит-тестов до тестов производительности. Присоединяйтесь к бесплатному вебинару 7 ноября в 20:00 мск и получите практические инструменты для работы с микросервисами. А еще скидку на обучение на курсе «Software Architect»! 🔴 Регистрируйтесь прямо сейчас и получите доступ к лучшим практикам тестирования в распределённых системах Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576

🔍 Что такое MVC? MVC (Model-View-Controller) — это популярный архитектурный паттерн, который разделяет приложение на три ком
🔍 Что такое MVC? MVC (Model-View-Controller) — это популярный архитектурный паттерн, который разделяет приложение на три компонента: Model — отвечает за бизнес-логику и управление данными. Это сердце приложения, где происходит взаимодействие с базой данных, выполнение бизнес-правил и другие операции. View — представляет собой интерфейс пользователя. Он отвечает за отображение данных и взаимодействие с пользователем, но не содержит бизнес-логики. Controller — посредник между Model и View. Он получает запросы от пользователя, передает их Model и возвращает результаты во View. 💡 MVC позволяет четко разделить обязанности между компонентами, облегчая поддержку и масштабирование кода.

#паттерны Введение Сегодня мы рассмотрим паттерн проектирования "Адаптер". Классификация Тип: Структурный Определение: Адаптер — это структурный паттерн проектирования, который позволяет объектам с несовместимыми интерфейсами работать вместе. Адаптер выступает прослойкой между объектами превращая вызовы одного в понятные для другого. Очень удобно понять адаптер на примере из жизни. Представим человеку который говорит только на французском нужно рассказать историю человеку который понимает только немецкий. Сами понять они друг друга не смогут, поэтому им понадобится переводчик, который переведёт французкий на немецкий. В данном случае переводчик выступит адаптером. Из чего состоит и как работает паттерн адаптер 1. Клиент. Описывает бизнес логику программы. Работает с адаптером и другими объектами. adapter = Adapter() result = adapter.do() + "5" 2. Интерфейс с которым может работать клиентский код. class Test1: def do(self) -> str: return "3" 3. Класс, который имеет нужную клиенту логику, однако клиент не может с ним общаться, так как интерфейс данного класса ему не понятен. class Test2: def specific_do(self) -> float: return 3.4 4. Адаптер - класс который помогает клиенту использовать функционал незнакомого ему сервиса в правильном формате. Реализует клиентский интерфейс. Содержит ссылку на незнакомый сервис. Адаптер при получении вызовов от клиента через клиентский интерфейс и переводит их в вызовы незнакомого сервиса в правильном формате. class Adapter(Test1, Test2): def do(self) -> str: return f"Translated: {round(self.specific_do())}" Уточнение: Приложение должно использовать объект адаптера только через клиентский интерфейс. Это позволит легко создавать и изменять адаптеры в будущем. Плюсы данного паттерна 1. Скрывает все "низкоуровневые" преобразования интерфейсов от клиента. Реализует принцип абстракция. Минусы данного паттерна Таковых я не обнаружил Пример и задача В качестве примера возьмём класс с методом do который возвращает небольшой текст. Также есть класс с методом secret_do который возвращает другую строку, зашифрованную шифром Цезаря со сдвигом 5, которая ещё и полностью развёрнута. В виде клиента выступает функция которая постит текст в ваш блог.(Можете просто создать функцию которая выводит переданный в неё текст). Естественно она должна принимать только расшифрованный текст. Реализуйте адаптер для второго класса, который спасёт ваш блог от зашифрованных постов. Пример из реального кода https://github.com/aiogram/aiogram/blob/b190bbba1915ed3b7f311a780f34723ebd6b5acd/aiogram/contrib/fsm_storage/redis.py#L280 Вот его объяснение какую задачу решает адаптер в данном случае: Здесь адаптер дает возможность контроллеру хранилища (RedisStorage) работать с первой версией редиса, т.е. адаптирует aioredis-v1, там еще есть адаптер для aioredis-v2, но он в отличие от первой версии адаптирует только создание клиента редиса Дополнительные материалы https://habr.com/ru/post/85095/

Как эффективно разделять приложения на микросервисы? Расскажет Евгений Непомнящий — разработчик в IT Sense. Встречаемся на бе
Как эффективно разделять приложения на микросервисы? Расскажет Евгений Непомнящий — разработчик в IT Sense. Встречаемся на бесплатном практическом уроке от OTUS, где вы вместе с опытным экспертом: - рассмотрите принципы функциональной декомпозиции; - научитесь выделять отдельные компоненты приложения; - погрузитесь в методику EventStorming; - изучите подход API First Design; - узнаете, как разрабатывать API. 🗓 Встречаемся 28 октября в 20:00 мск в рамках курса «Software Architect». Доступна рассрочка на обучение! 🔴 Ссылка для регистрации Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru

🕯 Паттерн Proxy (Прокси) Proxy — это структурный паттерн, который предоставляет объект-заместитель для управления доступом к
🕯 Паттерн Proxy (Прокси) Proxy — это структурный паттерн, который предоставляет объект-заместитель для управления доступом к другому объекту, обеспечивая контроль над его использованием. Использование: 🔹 Когда необходимо контролировать доступ к ресурсоемким объектам или операциям. 🔹 Для добавления дополнительной функциональности без изменения исходного объекта. Преимущества: 1️⃣ Позволяет контролировать доступ к реальному объекту, например, для ленивой инициализации или кэширования. Это может улучшить производительность, так как ресурсоемкие объекты создаются только тогда, когда они действительно нужны. 2️⃣ Позволяет контролировать доступ к объектам, добавляя проверки перед вызовом методов. Это полезно для управления доступом в сетевых приложениях или для защиты данных. 3️⃣ Позволяет оптимизировать работу с удаленными объектами, минимизируя количество вызовов или обрабатывая их асинхронно. Это снижает нагрузку на систему и повышает скорость работы приложения. 4️⃣ Может использоваться для логирования или отслеживания вызовов методов реального объекта, не внося изменений в сам объект. Это упрощает мониторинг и отладку системы.

В кругах корпоративных архитекторов всё чаще говорят о «потоках создания ценности» или Value Streams. Это мощный инструмент д
В кругах корпоративных архитекторов всё чаще говорят о «потоках создания ценности» или Value Streams. Это мощный инструмент для анализа и проектирования целевого состояния организации. На открытом онлайн-уроке «Value Streams: инструмент анализа потоков создания ценности в организации» вы узнаете: - что такое Value Streams - для чего нужен Value Streams - о примерах Value Streams - о связи Value Streams и Capability Map 👨‍💻🛠👨🏻‍💻 Будет интересно: руководителям всех уровней, корпоративным и бизнес-архитекторам, бизнес-аналитикам, системным аналитикам, руководителям проектов и владельцам продуктов. После вебинара вы можете приобрести курс «Enterprise Architect». 🗓 6 ноября, 20:00 🆓 Бесплатно. Урок в рамках старта курса «Enterprise Architect» 🔴 Записаться на событие Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576

Фабричный метод — это порождающий паттерн проектирования, который определяет общий интерфейс для создания объектов в суперкла
Фабричный методэто порождающий паттерн проектирования, который определяет общий интерфейс для создания объектов в суперклассе, позволяя подклассам изменять тип создаваемых объектов.
from __future__ import annotations
from abc import ABC, abstractmethod


class Creator(ABC):
    """
    Класс Создатель объявляет фабричный метод, который должен возвращать объект
    класса Продукт. Подклассы Создателя обычно предоставляют реализацию этого
    метода.
    """

    @abstractmethod
    def factory_method(self):
        """
        Обратите внимание, что Создатель может также обеспечить реализацию
        фабричного метода по умолчанию.
        """
        pass

    def some_operation(self) -> str:
        """
        Также заметьте, что, несмотря на название, основная обязанность
        Создателя не заключается в создании продуктов. Обычно он содержит
        некоторую базовую бизнес-логику, которая основана на объектах Продуктов,
        возвращаемых фабричным методом. Подклассы могут косвенно изменять эту
        бизнес-логику, переопределяя фабричный метод и возвращая из него другой
        тип продукта.
        """

        # Вызываем фабричный метод, чтобы получить объект-продукт.
        product = self.factory_method()

        # Далее, работаем с этим продуктом.
        result = f"Creator: The same creator's code has just worked with {product.operation()}"

        return result


"""
Конкретные Создатели переопределяют фабричный метод для того, чтобы изменить тип
результирующего продукта.
"""


class ConcreteCreator1(Creator):
    """
    Обратите внимание, что сигнатура метода по-прежнему использует тип
    абстрактного продукта, хотя фактически из метода возвращается конкретный
    продукт. Таким образом, Создатель может оставаться независимым от конкретных
    классов продуктов.
    """

    def factory_method(self) -> Product:
        return ConcreteProduct1()


class ConcreteCreator2(Creator):
    def factory_method(self) -> Product:
        return ConcreteProduct2()


class Product(ABC):
    """
    Интерфейс Продукта объявляет операции, которые должны выполнять все
    конкретные продукты.
    """

    @abstractmethod
    def operation(self) -> str:
        pass


"""
Конкретные Продукты предоставляют различные реализации интерфейса Продукта.
"""


class ConcreteProduct1(Product):
    def operation(self) -> str:
        return "{Result of the ConcreteProduct1}"


class ConcreteProduct2(Product):
    def operation(self) -> str:
        return "{Result of the ConcreteProduct2}"


def client_code(creator: Creator) -> None:
    """
    Клиентский код работает с экземпляром конкретного создателя, хотя и через
    его базовый интерфейс. Пока клиент продолжает работать с создателем через
    базовый интерфейс, вы можете передать ему любой подкласс создателя.
    """

    print(f"Client: I'm not aware of the creator's class, but it still works.\n"
          f"{creator.some_operation()}", end="")


if __name__ == "__main__":
    print("App: Launched with the ConcreteCreator1.")
    client_code(ConcreteCreator1())
    print("\n")

    print("App: Launched with the ConcreteCreator2.")
    client_code(ConcreteCreator2())

Гарантирует, что у класса есть только один экземпляр, и предоставляет к нему глобальную точку доступа.
Anonymous voting

Какие брокеры использовать, чтобы обеспечить асинхронную связь между микросервисами? Узнайте на открытом практическом уроке «
Какие брокеры использовать, чтобы обеспечить асинхронную связь между микросервисами? Узнайте на открытом практическом уроке «Брокеры сообщений: RabbitMQ и Kafka» от OTUS, где мы узнаем: ✅ что такое брокеры сообщений и как они помогают в архитектуре микросервисов ✅ основные различия между RabbitMQ и Kafka, включая их архитектурные подходы ✅ как развернуть и настроить RabbitMQ и Kafka для ваших приложений ✅ практическое использование обоих брокеров на реальных примерах в live demo 🗓 Встречаемся 24 октября в 20:00 мск в преддверии старта курса «Microservice Architecture». Все участники вебинара получат специальную цену на обучение и консультацию от менеджеров OTUS! ➡️ Ссылка для регистрации Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru

Выберите верное утверждение.
Anonymous voting

Хотите узнать, как использовать Patroni для управления высокодоступными кластерами PostgreSQL? Ждем вас на открытом вебинаре
Хотите узнать, как использовать Patroni для управления высокодоступными кластерами PostgreSQL? Ждем вас на открытом вебинаре 24 октября в 20:00 мск, где мы разберем: - что такое Patroni и как он помогает обеспечить высокую доступность для PostgreSQL; - основные компоненты и архитектуру Patroni; - настройку и конфигурацию Patroni для работы с PostgreSQL; - примеры использования Patroni для управления кластером PostgreSQL; - практические советы по оптимизации и мониторингу работы кластера. 👨‍💻🛠👨🏻‍💻 Урок для DevOps-инженеров, системных администраторов, backend-разработчиков и тимлидов, стремящихся обеспечить высокую доступность PostgreSQL. Спикер Андрей Поляков — старший разработчик в Unlimint. Встречаемся в преддверии старта курса «Highload Architect». Все участники вебинара получат специальную цену на обучение! Регистрируйтесь прямо сейчас, чтобы не пропустить мероприятие Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru

Что такое зависимость (dependency)?
Anonymous voting

Используйте умные ссылки – создавайте и настраивайте сервисы для динамического управления редиректами Как именно, спросите вы
Используйте умные ссылки – создавайте и настраивайте сервисы для динамического управления редиректами Как именно, спросите вы? А очень просто: приходите на открытый урок OTUS «Проектирование сервиса умных ссылок» Вы узнаете: - как спроектировать сервис умных ссылок и создавать ссылки с динамическими правилами редиректа - как настраивать редирект в зависимости от геолокации, устройства пользователя и других параметров - как разрабатывать и оптимизировать масштабируемый и гибкий сервис умных ссылок Вебинар проведёт действующий директор компании по разработке ПО, в прошлом – профессиональный разработчик на C++ 👨‍💻🛠👨🏻‍💻 Будет интересно: бэкенд-разработчикам, фулстек-разработчикам, техническим архитекторам 📅 8 октября, 20:00 🆓 Бесплатно. Урок в рамках старта курса «Microservice Architecture» 🔴 Записаться на открытый урок Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576

К порождающим паттернам относится...
Anonymous voting

Highload, системный дизайн, производительность и масштабирование Приглашаем на курс для прокачки навыков архитектора и проект
Highload, системный дизайн, производительность и масштабирование Приглашаем на курс для прокачки навыков архитектора и проектировщика, которые важны для профессионального роста программиста. 🌐 С курсом «Системный дизайн высоконагруженных проектов» вы: ▪️изучите ключевые фундаментальные паттерны и получите навыки проектирования проектов с миллионной аудиторией (балансировка, масштабирование апп/кешей/субд, высокая доступность и кластерные решения, шардинг, CAP/PACELS, консистентность, саги, транзакционные очереди и многое другое) ▪️поупражняетесь в проектировании и получите обратную связь на реальных задачах: магазин/маркетплейс, такси/доставка, обьявления, соцсети, дейтинг, игры, википедия, мессенжер, CDN, хранилище файлов, онлайн-кинотеатр, счетчики, удаленный мониторинг, интеграционные вебхуки, рассылки и тд. ▪️ научитесь планировать нагрузку и связывать бизнес-показатели с нефункциональными требованиями к системе ▪️ попрактикуемся в проведении и прохождения секций системного дизайна на интервью Всё в формате «живых» онлайн-сессий (лекции, брейнштормы, презентации домашних проектов). 🥸 Кто мы: школа Devhands, основатель школы и автор курса Алексей Рыбак, ex-СТО Badoo, с 20-летним опытом высоконагруженных проектов и и управления глобальными технологическими организациями, член программного комитета Highload. 🗓 Старт 22-го октября, изучаем программу, записываемся здесь Реклама. ИП Рыбак А.А. ИНН 771407709607 erid:LjN8JuvAT

Применяется для создания объектов с определенным интерфейсом, реализации которого предоставляются потомками.
Anonymous voting