Pattern Guru. Шаблоны проектирования. Архитектура ПО – Telegram
Pattern Guru. Шаблоны проектирования. Архитектура ПО
5.88K subscribers
214 photos
3 videos
122 links
Патерны программирования.
Архитектура ПО.
Микросервисы

@anothertechrock
Download Telegram
Какой паттерн использует разделение для эффективной поддержки большого числа мелких объектов?
Anonymous Quiz
50%
Flyweight (приспособленец)
30%
Memento (хранитель)
14%
Interpreter (интерпретатор)
6%
Посмотреть результаты
Что почитать программисту: «Паттерны объектно-ориентированного проектирования»

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

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

#книги #ооп #паттерны
👍2
💣 Большая сила - большая ответственность.
А ты справишься с тестом по HighLoad?


🏆 Пройди тест из 29 вопросов, проверь свой уровень знаний и получи скидку на онлайн-курс «Highload Architect» от OTUS!

Если успешно пройдешь тест, сможешь забронировать место в группе по выгодной цене!

🎫 Курс можно приобрести в рассрочку

👉 Пройти тест и забрать скидку:
https://vk.cc/cMWovj

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
👾2
TOGAF — один фреймворк, чтобы управлять архитектурой.

Звучит почти как легенда. Но в мире корпоративных архитекторов — это реальный инструмент: системный, признанный, масштабируемый.
Если вы работаете на уровне enterprise-решений — без TOGAF 10 сегодня сложно говорить на одном языке с бизнесом и ИТ.

📍 Приходите на бесплатный вебинар от OTUS:
«TOGAF: зачем он нужен и как поможет вашей карьере?»

Поговорим:
— чем отличается TOGAF 10 и как его применяют на практике
— какие компетенции важны архитектору нового уровня
— как сертификация открывает новые карьерные треки

🎓 Вебинар ведёт сертифицированный эксперт.

💡Понравится вебинар - приходите учиться на онлайн-курс «Архитектура корпорации. Togaf 10». Курс — с доступом к материалам Open Group.

Пока действует скидка по промокоду TOGAF_7
👉 Регистрируйтесь — напомним перед началом: регистрация: https://vk.cc/cN8VNU

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
1
Фабричный методэто порождающий паттерн проектирования, который определяет общий интерфейс для создания объектов в суперклассе, позволяя подклассам изменять тип создаваемых объектов.

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())
3👌1
💣 Как настроить отказоустойчивое хранилище данных? Дарим гайд за прохождение теста по HighLoad!

🏆 Пройди тест из 29 вопросов, проверь свой уровень знаний и получи файл “Как настроить отказоустойчивое хранилище данных“! Тест проводится в рамках курса Highload Architect

👉 Пройти тест и забрать файл: https://vk.cc/cN8YR3

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

🎫 Курс можно приобрести в рассрочку

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
🔥1
Вопрос с собеседования

Для чего нужен Decorator паттерн в Javanoscript?
Приведите пример.

Ответ:

Javanoscript предоставляет удивительно гибкие возможности по работе с функциями: их можно передавать, в них можно записывать данные как в объекты, у них есть свои встроенные методы.

Шаблон декоратора динамически расширяет (украшает) поведение объекта. Возможность добавления нового поведения во время выполнения достигается с помощью объекта Decorator, который «оборачивается» вокруг исходного объекта. Несколько декораторов могут добавлять или переопределять функциональность исходного объекта.

Примером декоратора является управление безопасностью, где бизнес-объектам предоставляется дополнительный доступ к привилегированной информации в зависимости от привилегий аутентифицированного пользователя. Например, менеджер по персоналу приступает к работе с объектом сотрудника, к которому добавлена (то есть украшена) запись о зарплате сотрудника, чтобы можно было просматривать информацию о зарплате.

Декораторы обеспечивают гибкость статически типизированных языков, позволяя вносить изменения во время выполнения, а не наследование, которое происходит во время компиляции. Однако JavaScript - это динамический язык, и возможность расширения объекта во время выполнения встроена в сам язык.

Пример использования декоратора в JavaScript:

function User(name) {
this.name = name,
this.print = () => console.log(this.name)
}

const jane = new User ('Jane Doe')
jane.print() // 'Jane Doe'

function DecorateWithCity(user, city) {
user.city = city
user.print = function() {
console.log (${this.name} from ${this.city})
}
}

DecorateWithCity(jane, 'NewYork')
jane.print(); //'Jane Doe from New York'


#interview
👍1
💻 Асинхронная обработка данных в высоконагруженных системах 🚀

🔥 29 июля в 20:00 мск — открытый вебинар в OTUS.

На вебинаре рассмотрим:

- Почему асинхронная архитектура — ключ к масштабируемости и высокой производительности?
- Как эффективно использовать очереди сообщений, веб-сокеты и другие инструменты асинхронного взаимодействия?
- Пример реального архитектурного решения: от веб-сервера до брокера сообщений и БД.
- Как найти узкие места в архитектуре и устранить их для стабильной работы высоконагруженных сервисов.

🎓 После вебинара вы:

- Поймёте принципы асинхронной архитектуры и её влияние на производительность.
- Освоите методы асинхронной обработки данных для масштабируемых систем.
- Получите реальные примеры архитектурных решений для внедрения в свои проекты.
- Узнаете, как избегать узких мест и создавать отказоустойчивые системы.

🔧 Присоединяйтесь, чтобы улучшить архитектурные навыки и начать строить системы, готовые к высокой нагрузке!

👉 Регистрация https://vk.cc/cNJATL

Бесплатное занятие приурочено к старту курса Highload Architect, обучение на котором позволит освоить решения, которые выдерживают большое количество запросов в секунду и правильно оптимизировать работоспособность серверов

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
#паттерны

Введение

Сегодня мы рассмотрим паттерн проектирования "Адаптер".

Классификация

Тип:
Структурный

Определение: Адаптер — это структурный паттерн проектирования, который позволяет объектам с несовместимыми интерфейсами работать вместе.
Адаптер выступает прослойкой между объектами превращая вызовы одного в понятные для другого.

Очень удобно понять адаптер на примере из жизни. Представим человеку который говорит только на французском нужно рассказать историю человеку который понимает только немецкий. Сами понять они друг друга не смогут, поэтому им понадобится переводчик, который переведёт французкий на немецкий. В данном случае переводчик выступит адаптером.

Из чего состоит и как работает паттерн адаптер

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/
2👍1
🕯 Паттерн Proxy (Прокси)

Proxy — это структурный паттерн, который предоставляет объект-заместитель для управления доступом к другому объекту, обеспечивая контроль над его использованием.

Использование:

🔹 Когда необходимо контролировать доступ к ресурсоемким объектам или операциям.
🔹 Для добавления дополнительной функциональности без изменения исходного объекта.

Преимущества:

1️⃣ Позволяет контролировать доступ к реальному объекту, например, для ленивой инициализации или кэширования. Это может улучшить производительность, так как ресурсоемкие объекты создаются только тогда, когда они действительно нужны.

2️⃣ Позволяет контролировать доступ к объектам, добавляя проверки перед вызовом методов. Это полезно для управления доступом в сетевых приложениях или для защиты данных.

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

4️⃣ Может использоваться для логирования или отслеживания вызовов методов реального объекта, не внося изменений в сам объект. Это упрощает мониторинг и отладку системы.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3👌1
Определяет группу алгоритмов, инкапсулирует их и делает взаимозаменяемыми. Позволяет изменить алгоритм независимо от клиентов, их использующих.
Anonymous Quiz
54%
Strategy
22%
Template Method
8%
Factory Method
1%
Singleton
16%
Adapter
Что под капотом у RAG? На схеме всё просто: LLM + Retrieval + память = RAG.

А в жизни? Там куча всего:

📌 Вычисление эмбеддингов
📌 Обновление данных
📌 Индексация
📌 Фильтрация
📌 Отказоустойчивость
📌 Масштабирование

Яндекс 14 августа покажет, как они это решают внутри YDB. Там разберут и архитектуру, и примеры запросов.

Хороший вариант, если вы думаете: «А не сделать ли нам своё хранилище знаний под ИИ».
👎1
💻 Мониторинг в высоконагруженных проектах 🔧

🔥 12 августа в 20:00 мск — открытый вебинар в OTUS.

На вебинаре рассмотрим:

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

🎓 После вебинара вы:

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

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

🎁Все участники получат шаблон развертывания кластера RabbitMQ

👉 Регистрация https://vk.cc/cOjdAU

Бесплатное занятие приурочено к старту курса Highload Architect, обучение на котором позволит освоить решения, которые выдерживают большое количество запросов в секунду и правильно оптимизировать работоспособность серверов

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
🚩 Шаблон проектирования Singleton

🟣Подробное описание паттерна

Лучшие методы:
1. Декоратор
2. Базовый класс
3. Метакласс
4. Декоратор возвращает класс с тем же именем
5. Модуль

🗂 Код на Python
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2👌1
🚩 Шаблон проектирования Итератор

🟣 Подробное описание паттерна

Идея поведенческого паттерна Итератор (англ. Iterator) состоит в том, чтобы вынести поведение обхода коллекции в отдельный объект.

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

🗂 Код на Python
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👌21