第一步是擺脫所有的幫助變量。儘管布爾中間變量容易理解他們的描述性名稱,但至少result
是完全不必要的。
function compareCodes(validateFn, moreProcessingFn, doStuffOnCodeAFn, doStuffOnCodeBFn, doSomething1Fn, doSomething2Fn, codeA, codeB, param1, param2) {
return validateFn(codeA, codeB)
? (moreProcessingFn(doStuffOnCodeAFn(codeA), doStuffOnCodeBFn(codeB), codeA, codeB)
? doSomething1Fn
: doSomething2Fn
)(param1, param2)
: null;
}
接下來,您可以申請一些鑽營(你可以做到這一點每個參數,但我認爲這是比較有用的,這將有可能被同時使用的塊):
function compareCodes(validateFn, moreProcessingFn, doStuffOnCodeAFn, doStuffOnCodeBFn, doSomething1Fn, doSomething2Fn) {
return function(codeA, codeB) {
return validateFn(codeA, codeB)
? moreProcessingFn(doStuffOnCodeAFn(codeA), doStuffOnCodeBFn(codeB), codeA, codeB)
? doSomething1Fn
: doSomething2Fn
: function(param1, param2) { return null; };
};
}
但僅此而已。儘管可以爲條件編寫自己的組合器,並且可以將多個參數並行輸入到多個函數中,但在此過程中不會獲得任何結果。當然,沒有標準的組合器可以幫助你。
如果你總是提供兩件東西(A和B,1和2),但作爲不同的參數,它可能會是一個不同的東西。如果你改爲修改所有的函數來取代元組(在這裏表示爲長度爲2的數組,因爲JavaScript缺少對類型),我們可以做一些事情。首先,我們將從
function compareCodes(validateFn, moreProcessingFn, [doStuffOnCodeAFn, doStuffOnCodeBFn], [doSomething1Fn, doSomething2Fn], [codeA, codeB], [param1, param2]) {
return validateFn([codeA, codeB])
? (moreProcessingFn([doStuffOnCodeAFn(codeA), doStuffOnCodeBFn(codeB)], [codeA, codeB])
? doSomething1Fn
: doSomething2Fn
)([param1, param2])
: null;
}
到(我使用ES6語法,顯着箭頭的功能和結構破壞)
const bimap = ([f, g]) => ([x, y]) => [f(x), g(y)];
const fst = ([x, _]) => x;
const snd = ([_, y]) => y;
function compareCodes(validate, moreProcessing, doStuff, doSomething, code, param) {
return validate(code)
? (moreProcessing(bimap(doStuff)(code), code)
? fst
: snd
)(doSomething)(param)
: null;
}
現在是我們的確可以用組合程序處理:
const compose = f => g => x => f(g(x));
const bind = f => g => x => f(g(x), x);
const cond = pred => then => other => x => pred(x) ? then(x) : other(x);
const k = x => _ => x;
function compareCodes(validate, moreProcessing, doStuff, doSomething)
return cond(validate,
cond(bind(moreProcessing)(compose(bimap)(doStuff)),
fst(doSomething),
snd(doSomething)
),
k(k(null))
);
}
我們可以進一步完成compareCodes
的完全無點定義,但說實話,這不值得。
我投票結束題目,因爲這屬於codereview.stackexchange.com – Paul
@Paul Code Review不會檢查涉及'doSomething'佔位符的問題。此外,即使它是代碼審查的專題問題,「屬於某個其他網站_」[也不構成有效的關閉原因](http://meta.stackexchange.com/q/260769/148099)。 –
爲什麼要將嵌套條件放在函數中呢?具有三個以上參數的高階函數可以定期重構。 – ftor