Sobes.tech
Middle

Какво е декоратор в контекста на програмирането?

sobes.tech AI

Отговор от AI

Декораторът е шаблон за дизайн, който позволява динамично добавяне на ново поведение към съществуващи обекти, като ги обвива в специални "обекти-обвивки" без да променя тяхната структура.

Ключови принципи:

  • Динамично добавяне на поведение: Функционалността се добавя по време на изпълнение, а не статично.
  • Прозрачност за клиента: Клиентският код взаимодейства с декоратора, сякаш това е оригиналният обект.
  • Гъвкавост: Позволява комбиниране на различни декоратори за постигане на желаното поведение.

Пример в Python:

def my_decorator(func):
    def wrapper():
        print("Преди извикването на функцията")
        func()
        print("След извикването на функцията")
    return wrapper

@my_decorator
def say_hello():
    print("Здравей!")

# Извикване на функция с приложен декоратор
say_hello()

В този пример, @my_decorator е синтактичен захар, който е еквивалентен на say_hello = my_decorator(say_hello).

JavaScript пример:

function logCall(target, key, descriptor) {
    const originalMethod = descriptor.value;
    descriptor.value = function(...args) {
        console.log(`Обаждане на метода ${key} с аргументи: ${args}`);
        const result = originalMethod.apply(this, args);
        console.log(`Методът ${key} върна: ${result}`);
        return result;
    };
    return descriptor;
}

class Example {
    @logCall
    add(a, b) {
        return a + b;
    }
}

const instance = new Example();
instance.add(2, 3);

Тук, @logCall се използва за добавяне на логиране към метода add на класа Example.

Приложение в QA Automation:

  • Логиране: Добавяне на логиране към тестови стъпки или взаимодействия с елементи.
  • Обработка на изключения: Обвиване на извиквания на функции за обработка на специфични изключения.
  • Управление на състоянието: Промяна на състоянието на обекта преди или след извикването на неговите методи (например, превключване на контексти).
  • Аутентикация/авторизация: Проверка на правата за достъп преди изпълнение на определено действие.