Что такое декоратор

Ответ

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

Пример с кешированием:

function cacheDecorator(func) {
  const cache = new Map();
  return function(...args) {
    const key = args.join(',');
    if (cache.has(key)) {
      return cache.get(key);
    }
    const result = func.apply(this, args);
    cache.set(key, result);
    return result;
  };
}

function slowCalculation(x) { /* тяжёлые вычисления */ }
const cachedCalc = cacheDecorator(slowCalculation);

В TypeScript/ES есть специальный синтаксис @decorator для классов и методов. Декораторы помогают соблюдать принцип DRY, изолируя повторяющуюся логику.

Ответ 18+ 🔞

А, ну вот, декораторы, блядь! Это ж та самая штука, когда ты берёшь функцию и натягиваешь на неё какую-нибудь дополнительную хуйню, не ковыряясь в её родных кишках. Красота, ёпта!

Представь: есть у тебя функция, которая, допустим, считает что-то тяжёлое, пиздец как медленно. И ты её вызываешь сто раз с одними и теми же аргументами, а она каждый раз пашет как лошадь, хотя результат-то уже известен! Ну это же пиздец, да? Вот тут на сцену выходит декоратор, типа такого cacheDecorator.

Смотри, как он работает, этот хитрожопый ублюдок:

function cacheDecorator(func) {
  const cache = new Map();
  return function(...args) {
    const key = args.join(',');
    if (cache.has(key)) {
      return cache.get(key);
    }
    const result = func.apply(this, args);
    cache.set(key, result);
    return result;
  };
}

function slowCalculation(x) { /* тяжёлые вычисления */ }
const cachedCalc = cacheDecorator(slowCalculation);

Что здесь происходит? Мы создаём замыкание, блядь! Внутри cacheDecorator рождается Map — это наша тайная коробочка-кеш. А потом мы возвращаем новую функцию-обёртку. Эта обёртка, когда её вызывают, первым делом лезет в коробочку: "А не считали ли мы уже это, сука?" Если нашли — сразу отдаём, без всяких танцев с бубном. Если нет — тогда уже заставляем оригинальную func поработать, результат прячем в коробочку и потом его возвращаем. В следующий раз — бац, и уже готово! Овердохуище экономия.

А в TypeScript или современном ES есть вообще, блядь, специальный синтаксис, красивый такой — @decorator. Вешаешь его над классом или методом, и всё, пизда, магия работает. Это ж как принцип DRY в действии: вместо того чтобы писать одну и ту же логику (логирование, проверку прав, кеширование) в каждой функции, ты выносишь её в отдельный декоратор и прикручиваешь куда надо. Чисто, аккуратно, и в рот меня чих-пых — не надо везде копипастить один и тот же код! Умно, сука.