Как использовать декораторы с заводскими функциями

kak ispolzovat dekoratory s zavodskimi funkcziyami

Откройте для себя функциональный JavaScript был назван одним из лучшие новые книги по функциональному программированию от BookAuthority!

Декораторы методов – инструмент для повторного использования общей логики. Они дополняют объектно-ориентированное программирование. Декораторы инкапсулируют ответственность, разделенную разными объектами.

Рассмотрим следующий код:

function TodoStore(currentUser){
  let todos = [];
  
  function add(todo){
    let start = Date.now();
    if(currentUser.isAuthenticated()){
      todos.push(todo);
    } else {
      throw "Not authorized to perform this operation";
    }
            
    let duration = Date.now() - start;
    console.log("add() duration : " + duration);
  }
    
  return Object.freeze({
    add
  });  
}

Намерение add() метод заключается в добавлении новых дел к внутреннему состоянию. Кроме того, метод требует проверки авторизации пользователя и регистрации продолжительности выполнения. Эти две вещи второстепенны и могут повторяться в других методах.

Представьте, что мы можем инкапсулировать эти второстепенные обязанности в функции. Тогда мы можем написать код следующим образом:

function TodoStore(){
  let todos = [];
  
  function add(todo){
    todos.push(todo);
  }
    
  return Object.freeze({
     add:compose(logDuration,authorize)(add) 
  }); 
}

Теперь add() метод просто добавляет todo в список. Остальные обязанности реализуются путём декорирования метода.

logDuration() и authorize() являются декораторами.

А декоратор функций является функцией высшего порядка, которая принимает одну функцию в качестве аргумента и возвращает другую функцию, а возвращенная функция является вариантом функции аргумента.

Реджинальд Брейтуэйт в Javascript Allongé

Продолжительность журнала

Распространенным сценарием является регистрация длительности вызова метода. Следующий декоратор регистрирует длительность синхронного вызова.

function logDuration(fn){
  return function decorator(...args){
    let start = Date.now();
    let result = fn.apply(this, args);
    let duration = Date.now() - start;
    console.log(fn.name + "() duration : " + duration);
    return result;
  }
}

Обратите внимание на то, как была вызвана исходная функция путем передачи текущего значения this и все аргументы: fn.apply(this, args) .

Откройте для себя функциональный JavaScript был назван одним из лучшие новые книги по функциональному программированию от BookAuthority!

Чтобы узнать больше о применении методов функционального программирования в React, посмотрите Функциональный React.

Учитесь функциональный Reactна основе проекта, с Функциональная архитектура с React и Redux.

Подписывайтесь на Twitter

Добавить комментарий

Ваш адрес email не будет опубликован.