Что такое декоратор (decorator) в программировании?

«Что такое декоратор (decorator) в программировании?» — вопрос из категории Основы программирования, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Декоратор — это структурный паттерн проектирования и языковая конструкция (в таких языках, как Python), которая позволяет динамически добавлять новое поведение объектам или функциям, оборачивая их, не изменяя их исходный код.

Основная идея: Расширение функциональности через композицию, а не наследование. Соответствует принципу открытости/закрытости (Open/Closed Principle).

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

  • Гибкость: Поведение можно добавлять и комбинировать во время выполнения.
  • Разделение ответственности: Каждый декоратор решает одну задачу (логирование, кеширование, проверка прав).
  • Чистый код: Избегание создания сложных иерархий классов.

Пример на Python (декоратор функции):

def log_execution(func):
    """Декоратор, логирующий вызов функции."""
    def wrapper(*args, **kwargs):
        print(f"Вызывается функция {func.__name__} с аргументами: {args}, {kwargs}")
        result = func(*args, **kwargs)
        print(f"Функция {func.__name__} вернула: {result}")
        return result
    return wrapper

@log_execution
def add(a, b):
    return a + b

print(add(5, 3))
# Вывод:
# Вызывается функция add с аргументами: (5, 3), {}
# Функция add вернула: 8
# 8

Распространённые сценарии использования:

  • Логирование вызовов функций.
  • Кеширование (мемоизация) результатов.
  • Контроль доступа и аутентификация.
  • Валидация входных данных или результатов.
  • Замер времени выполнения (бенчмаркинг).