我的心、我這一生都在追求一個東西:一個無以名狀的東西。
André Breton
某種程度上,Javascript ES6(JS)提供了一種多典範多風格的彈性(multi-paradigm, multi-style),簡直是「一個語言,各自表訴」。這種彈性創造了分歧,這種分歧創造了討論,討論創造爭議,爭議創造流量密碼。這或許就是JS的魅力之一。
你跑來問我「我到底該信/遵循哪個style?」或「哪個style才能讓我升職加薪?」,我的答案千篇一律:你自己決定。多麽令人討厭的回答啊!
後來,你跑去問我老闆,他絕對會告訴你Functional Programming (FP),因為很受歡迎啊!(請容我將style/programming混為一談)
好吧,趨之若鶩總比特立獨行來得更有安全感。但這理由也太爛了吧!
我不想逼你愛上FP,但他有些特別的點你可能覺得迷人,或是更討厭...。
到目前為止,JS最常見的style不外乎object-oriented或funtional,前者遵循命令式典範imperative paradigm,後者則恪守宣告式典範declarative paradigm。這兩類的差異如下:
如果你是母語是C++或Java,你大概把命令式典範刻在骨子裡了。命令式典範著重HOW,也就是你為了達成目標,精耕細作了每一步驟,一步一步都可能改變狀態。顯而易見,在命令式典範中,是狀態依賴的(stateful),不斷改變狀態的(not immutable)。
// 可能會被FP老闆討厭的寫法
// imperative paradigm
function addOneAll(lst) {
for (let i = 0; i < lst.length; i++) {
lst[i] += 1;
}
};
const lstOfOddNumbers = [1, 3, 5, 7, 9];
addOneAll(lstOfOddNumbers);
console.log(lstOfOddNumbers); //[2, 4, 6, 8, 10]
宣告式典範著重What,也就是目標本身是什麼。宣告式典範中過程不再重要,只要不要改變到狀態就好。
// 較不會被FP老闆討厭的寫法
// declarative paradigm
const lstOfOddNumbers = [1, 3, 5, 7, 9];
const addedOddNumbers = lstOfOddNumbers.map(n => n+1);
console.log(addedOddNumbers); //[2, 4, 6, 8, 10]
未完待續...