Вопрос с собеседования
Для чего нужен Decorator паттерн в Javanoscript? Приведите пример.
Ответ:
Javanoscript предоставляет удивительно гибкие возможности по работе с функциями: их можно передавать, в них можно записывать данные как в объекты, у них есть свои встроенные методы.
Шаблон декоратора динамически расширяет (украшает) поведение объекта. Возможность добавления нового поведения во время выполнения достигается с помощью объекта Decorator, который «оборачивается» вокруг исходного объекта. Несколько декораторов могут добавлять или переопределять функциональность исходного объекта.
Примером декоратора является управление безопасностью, где бизнес-объектам предоставляется дополнительный доступ к привилегированной информации в зависимости от привилегий аутентифицированного пользователя. Например, менеджер по персоналу приступает к работе с объектом сотрудника, к которому добавлена (то есть украшена) запись о зарплате сотрудника, чтобы можно было просматривать информацию о зарплате.
Декораторы обеспечивают гибкость статически типизированных языков, позволяя вносить изменения во время выполнения, а не наследование, которое происходит во время компиляции. Однако JavaScript - это динамический язык, и возможность расширения объекта во время выполнения встроена в сам язык.
Пример использования декоратора в JavaScript:
Для чего нужен 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
🔥 29 июля в 20:00 мск — открытый вебинар в OTUS.
На вебинаре рассмотрим:
- Почему асинхронная архитектура — ключ к масштабируемости и высокой производительности?
- Как эффективно использовать очереди сообщений, веб-сокеты и другие инструменты асинхронного взаимодействия?
- Пример реального архитектурного решения: от веб-сервера до брокера сообщений и БД.
- Как найти узкие места в архитектуре и устранить их для стабильной работы высоконагруженных сервисов.
🎓 После вебинара вы:
- Поймёте принципы асинхронной архитектуры и её влияние на производительность.
- Освоите методы асинхронной обработки данных для масштабируемых систем.
- Получите реальные примеры архитектурных решений для внедрения в свои проекты.
- Узнаете, как избегать узких мест и создавать отказоустойчивые системы.
🔧 Присоединяйтесь, чтобы улучшить архитектурные навыки и начать строить системы, готовые к высокой нагрузке!
👉 Регистрация https://vk.cc/cNJATL
Бесплатное занятие приурочено к старту курса Highload Architect, обучение на котором позволит освоить решения, которые выдерживают большое количество запросов в секунду и правильно оптимизировать работоспособность серверов
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
#паттерны
Введение
Сегодня мы рассмотрим паттерн проектирования "Адаптер".
Классификация
Тип: Структурный
Определение: Адаптер — это структурный паттерн проектирования, который позволяет объектам с несовместимыми интерфейсами работать вместе.
Адаптер выступает прослойкой между объектами превращая вызовы одного в понятные для другого.
Очень удобно понять адаптер на примере из жизни. Представим человеку который говорит только на французском нужно рассказать историю человеку который понимает только немецкий. Сами понять они друг друга не смогут, поэтому им понадобится переводчик, который переведёт французкий на немецкий. В данном случае переводчик выступит адаптером.
Из чего состоит и как работает паттерн адаптер
1. Клиент. Описывает бизнес логику программы. Работает с адаптером и другими объектами.
2. Интерфейс с которым может работать клиентский код.
3. Класс, который имеет нужную клиенту логику, однако клиент не может с ним общаться, так как интерфейс данного класса ему не понятен.
4. Адаптер - класс который помогает клиенту использовать функционал незнакомого ему сервиса в правильном формате. Реализует клиентский интерфейс. Содержит ссылку на незнакомый сервис. Адаптер при получении вызовов от клиента через клиентский интерфейс и переводит их в вызовы незнакомого сервиса в правильном формате.
Уточнение: Приложение должно использовать объект адаптера только через клиентский интерфейс. Это позволит легко создавать и изменять адаптеры в будущем.
Плюсы данного паттерна
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/
Введение
Сегодня мы рассмотрим паттерн проектирования "Адаптер".
Классификация
Тип: Структурный
Определение: Адаптер — это структурный паттерн проектирования, который позволяет объектам с несовместимыми интерфейсами работать вместе.
Адаптер выступает прослойкой между объектами превращая вызовы одного в понятные для другого.
Очень удобно понять адаптер на примере из жизни. Представим человеку который говорит только на французском нужно рассказать историю человеку который понимает только немецкий. Сами понять они друг друга не смогут, поэтому им понадобится переводчик, который переведёт французкий на немецкий. В данном случае переводчик выступит адаптером.
Из чего состоит и как работает паттерн адаптер
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/
GitHub
aiogram/aiogram/contrib/fsm_storage/redis.py at b190bbba1915ed3b7f311a780f34723ebd6b5acd · aiogram/aiogram
aiogram is a modern and fully asynchronous framework for Telegram Bot API written in Python using asyncio - aiogram/aiogram
❤2👍1
Proxy — это структурный паттерн, который предоставляет объект-заместитель для управления доступом к другому объекту, обеспечивая контроль над его использованием.
Использование:
🔹 Когда необходимо контролировать доступ к ресурсоемким объектам или операциям.
🔹 Для добавления дополнительной функциональности без изменения исходного объекта.
Преимущества:
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. Там разберут и архитектуру, и примеры запросов.
Хороший вариант, если вы думаете: «А не сделать ли нам своё хранилище знаний под ИИ».
А в жизни? Там куча всего:
📌 Вычисление эмбеддингов
📌 Обновление данных
📌 Индексация
📌 Фильтрация
📌 Отказоустойчивость
📌 Масштабирование
Яндекс 14 августа покажет, как они это решают внутри YDB. Там разберут и архитектуру, и примеры запросов.
Хороший вариант, если вы думаете: «А не сделать ли нам своё хранилище знаний под ИИ».
👎1
Какие из перечисленных паттернов относятся к структурным?
Anonymous Quiz
27%
Строитель, Абстрактная фабрика
16%
Цепочка обязанностей, Хранитель
16%
Прототип, Хранитель
40%
Компоновщик, Декоратор
👍1
💻 Мониторинг в высоконагруженных проектах 🔧
🔥 12 августа в 20:00 мск — открытый вебинар в OTUS.
На вебинаре рассмотрим:
- Почему мониторинг — ключ к стабильности высоконагруженных систем?
- Методы и инструменты мониторинга, подходящие для проектов с высокой нагрузкой.
- Как настроить и оптимизировать мониторинг для выявления и предотвращения проблем.
- Как эффективно использовать метрики и логи для улучшения производительности.
- Реальные кейсы мониторинга в сложных системах.
🎓 После вебинара вы:
- Научитесь правильно настраивать мониторинг для высоконагруженных проектов.
- Узнаете, как использовать данные мониторинга для повышения производительности и стабильности систем.
- Получите практические рекомендации по оптимизации мониторинга.
🔧 Присоединяйтесь, чтобы научиться отслеживать и поддерживать стабильность систем, работающих под высокой нагрузкой!
🎁Все участники получат шаблон развертывания кластера RabbitMQ
👉 Регистрация https://vk.cc/cOjdAU
Бесплатное занятие приурочено к старту курса Highload Architect, обучение на котором позволит освоить решения, которые выдерживают большое количество запросов в секунду и правильно оптимизировать работоспособность серверов
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
🔥 12 августа в 20:00 мск — открытый вебинар в OTUS.
На вебинаре рассмотрим:
- Почему мониторинг — ключ к стабильности высоконагруженных систем?
- Методы и инструменты мониторинга, подходящие для проектов с высокой нагрузкой.
- Как настроить и оптимизировать мониторинг для выявления и предотвращения проблем.
- Как эффективно использовать метрики и логи для улучшения производительности.
- Реальные кейсы мониторинга в сложных системах.
🎓 После вебинара вы:
- Научитесь правильно настраивать мониторинг для высоконагруженных проектов.
- Узнаете, как использовать данные мониторинга для повышения производительности и стабильности систем.
- Получите практические рекомендации по оптимизации мониторинга.
🔧 Присоединяйтесь, чтобы научиться отслеживать и поддерживать стабильность систем, работающих под высокой нагрузкой!
🎁Все участники получат шаблон развертывания кластера RabbitMQ
👉 Регистрация https://vk.cc/cOjdAU
Бесплатное занятие приурочено к старту курса Highload Architect, обучение на котором позволит освоить решения, которые выдерживают большое количество запросов в секунду и правильно оптимизировать работоспособность серверов
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Лучшие методы:
1. Декоратор
2. Базовый класс
3. Метакласс
4. Декоратор возвращает класс с тем же именем
5. Модуль
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2👌1
Идея поведенческого паттерна
Итератор (англ. Iterator) состоит в том, чтобы вынести поведение обхода коллекции в отдельный объект. Таким образом, если вам понадобится изменить или добавить новый способ обхода, вы сможете это сделать, не затрагивая код самой коллекции.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👌2❤1
Структурный паттерн
Декоратор (англ. Decorator) позволяет расширять функциональность без использования наследования. Дело в том, что механизм наследования имеет несколько проблем:
Декоратор позволяет обойти эти проблемы. Суть этого шаблона отлично передает его второе название — "обертка". Вы помещаете один объект в другой — обертку. Обертка запускает базовое поведение объекта, а затем что-то добавляет к нему.Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2👌2
Структурный паттерн
Фасад (англ. Facade) помогает скрыть способ реализации сложной системы и предоставляет клиенту простой интерфейс взаимодействия с ней. Другими словами, данный паттерн проектирования используется в качестве “обертки”, скрывающей детали реализации.
Фасад полезен, если вы используете какую-то сложную библиотеку со множеством подвижных частей, но вам нужна только часть её возможностей.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1👌1