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

@anothertechrock
Download Telegram
Вопрос с собеседования

Для чего нужен 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
🚩 Шаблон проектирования Декоратор

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

Структурный паттерн Декоратор (англ. Decorator) позволяет расширять функциональность без использования наследования.

Дело в том, что механизм наследования имеет несколько проблем:

1️⃣ Он статичный, т.е. не дает возможности менять поведение уже существующего объекта.
2️⃣ Он не позволяет наследовать поведение нескольких классов одновременно.

Декоратор позволяет обойти эти проблемы. Суть этого шаблона отлично передает его второе название — "обертка". Вы помещаете один объект в другой — обертку. Обертка запускает базовое поведение объекта, а затем что-то добавляет к нему.

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

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

Структурный паттерн Фасад (англ. Facade) помогает скрыть способ реализации сложной системы и предоставляет клиенту простой интерфейс взаимодействия с ней.

Другими словами, данный паттерн проектирования используется в качестве “обертки”, скрывающей детали реализации.

Фасад полезен, если вы используете какую-то сложную библиотеку со множеством подвижных частей, но вам нужна только часть её возможностей.

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