Материал Декоратор. Что-то декорирует. А зачем-почему?
0%

Декоратор. Что-то декорирует. А зачем-почему?

Декоратор. Что-то декорирует. А зачем-почему? По своей сути обычный структурный шаблон проектирования, целью которого является просто обогащение объекта чем-либо.

Typescript, к примеру, вы можете достигнуть это следующим образом, буду как всегда показывать на животных:

function vaccinated(target: any) { target.prototype.reflect = function () { console.log(“Reflected.”); }; }

@vaccinated class Animal { public age: number = 42; }

const instance = new Animal(); instance.reflect();

Когда и где это нужно? - Это самый простой способ собрать подобие #chain_of_responsibility или хоть какого-то #pipe похожего оператора на классах

  • В коде ваших тестов, базовую логику можно утащить туда, передавая дублирующийся код в качестве аргументов вашим декораторам

В чём плюсы?

  • Легче писать #unit_testing под ваши классы, так как код становится ближе к модульности #modularity из парадигмы #fp

В чём минусы?

  • Имея кривые руки, вы легко наплодите косяков вокруг any-типов, так как основная идея вообще избавиться от #типизация за счёт #generics

Что такое Decorator в Typescript в целом?

// Input - просто ваш type для target type Decorator = (target: Input, context: { kind: string; // class, method, getter, setter, field, or accessor name: string | symbol; // имя декорируемого object access: { // объект отвечающий за get-ер и set-ер декорируемого object get?(): unknown; set?(value: unknown): void; }; private?: boolean; // если декорируемый object является private членом класса static?: boolean; // если декорируемый object является static членом класса addInitializer?(initializer: () => void): void; // способ добавить кастомную логику до вызова конструктора }) => Output | void; // Output - что вы ожидаете получить

// При работе с классами type ClassDecorator = (value: Function, context: { kind: “class” name: string | undefined addInitializer(initializer: () => void): void }) => Function | void

Другие простые примеры для расширения методов или полей вы можете найти используя Google, а вот более интересные примеры вы найдете в закрепленных комментариях, а именно:

  • Пример #middleware за счёт #decorator в #nodejs
  • Расширение #constructor без использования #prototype
  • Расширение #class целиком за счёт использования #наследование #inheritance (мой любимый пример)

А если хочешь чаще читать наши публикации и быть в курсе вообще всего, то для доступа к нашим публикациям переходи в канал @digitable_blog

А еще если вам понадобилась карьерная консультация, подготовка к интервью или настройка чего-либо, то можно ознакомиться с услугами в нашем магазине https://digitable.ru

Ставьте Ваши реакции и задавайте вопросы в комментариях, они помогают стать нам лучше!

Have a fun!

Оригинал в Telegram

Нашли неточность? Выделите фрагмент текста — рядом появится жучок.

Нужен разбор именно вашей ситуации?

Статья описывает общий случай. Если у вас частный — можно разобрать его отдельно, платно. А если не хватает целого материала, предложите тему: её оплачивают вскладчину, и она выходит открытой для всех.

Доска запросов