2014-11-14 5 views
3
function setStyle(x) { 
    with (x.style) { 
     padding = '10px' 
     marginBottom = '10px' 
     width = '100%' 
    } 
    return setStyle 
} 

setStyle(account)(password)(login) 

Я часто использую вышеуказанный шаблон, но когда мне нужно говорить об этом, я понятия не имею, как его зовут? Как обратиться к такому подходу в разговоре?Что это за шаблон f (a) (b) (c)?

UPDATE:

Кто-то закрыл этот вопрос как дубликат, но я не могу понять, почему в том, что в двух экземплярах. Другой вопрос касается некоторых рамок, плакат пытается понять код. Я не пытаюсь понять код, я спрашиваю об английском термине для известного шаблона. Хотя обсуждаемая концепция одинаков, вопрос другой. Это похоже на то, что «Кто был самым молодым в« Пятеро Jasckson's »и« Чей альбом - Триллер », оба являются тем же вопросом, только потому, что это происходит примерно с одним и тем же человеком. Но это разные вопросы, не то же самое.

+2

Я бы сказал «свободный интерфейс» и «цепочка вызовов», но обычно это методы, которые возвращают «это», поэтому вы можете продолжать использовать другие методы на одном и том же объекте. В вашем случае вы возвращаете функцию так, чтобы ее можно было повторно вызвать с помощью разных аргументов. Такая же идея, но немного другая (я ее никогда не видел). – Thilo

+2

'с'? Назовем этот стиль _ "bad" _. И просто любопытно: почему вы предпочитаете использовать это для передачи нескольких переменных или массива параметров? – Cerbrus

+1

Вы спрашиваете о «каррировании»? – elclanrs

ответ

4

Этот шаблон является не «функциональная цепочка», поскольку функции с цепочкой (= скомпонованные, конвейерные) работают, передавая результат одной функции в качестве аргумента в следующую. Например, если у вас есть что-то вроде:

str = removeBadChars(str) 
str = makeLowerCase(str) 
str = convertToURL(str) 

вы можете переписать это более сжато, как

str = chain(removeBadChars, makeLowerCase, convertToURL)(str) 

(упражнение: написать chain()).

У вашего шаблона нет названия, возможно, потому что оно довольно бесполезно. Г-н Крокфорд coined термин retursion, , но он, кажется, не используется широко.

Обратите внимание, что этот шаблон по сути является антифункциональным, потому что в функциональном программировании мы предпочитаем работать с чистыми функциями, в то время как «рекурсивная» функция может делать только что-либо полезное в качестве побочного эффекта.

UPD: это рассуждение относится и к функциям, которые просто слепо возвращающих себя, как в вашем примере, однако, синтаксис f()()() может также использоваться с функциями, которые возвращают что-то другое при каждом вызове. В этом случае функция «root» принимает скрытый параметр («аккумулятор»), используемый для переноса состояния вокруг. Хороший пример такого подхода будет chain(), как и выше, но написано в аппликативном стиле: chain(func1)(func2)(func3):

function chain(f, fun) { 
 

 
    fun = fun || function(x) { return x }; 
 

 
    if(typeof f != "function") 
 
     return fun(f); 
 

 
    return function(x) { 
 
     return chain(x, function(y) { return f(fun(y)) }) 
 
    } 
 
} 
 

 
// Example: 
 

 
makeLowerCase = function(str) { return str.toLowerCase() }; 
 
removeBadChars = function(str) { return str.replace(/\W/g, "") }; 
 
makeURL  = function(str) { return "http://" + str }; 
 

 
funcs = chain(makeLowerCase)(removeBadChars)(makeURL); 
 
x = funcs('!!! HELLO ???'); 
 
alert(x);

В этом случае, этот синтаксис используются для реализации «частичного применения», потому что мы возвращаем замыкание, которое снова вызывает функцию root, с предопределенным вторым аргументом.

Смежные вопросы