實用"函數式"編程範式
通常說函數式編程,可能就會提到 map / reduce, 或者函數編程語言,例如 lisp, Haskell 等。
我以前讀過一篇文章,具體鏈接找不到了,作者的觀點是函數式編程具體體現在通過函數編程可以直觀得看到邏輯調用鏈條之間的關係。
例如下面這段代碼:
p = a(
b,
c,
d,
e(
f,
g
)
)
p(arg1, arg2, ..., argn)
這個代碼片段,表明了整個程序是如何組織在一起,p程序通過將一組函數a,b,c,d,e,f,g 有層次的組合在一起,構成了程序p,最後一次性調用程序p。這樣我們就可以在局部直觀地看到邏輯模塊的組織關係。
如果非常嚴格的寫下去,就會是函數式編程語言的那種代碼風格,例如 scheme。對於寫命令式編程、OOP編程語言來說這不切實際,但是可以在局部做到這點。例如在C裏面把a、b、c、d、e、f、g函數都實現了後,實際的代碼組織放在一起:
void run(){
e(f(), g());
d();
c();
b();
a();
}
這樣實際上看到的是命令式代碼,但是至少做到了在run裏面局部把邏輯模塊的層次依賴組織好。
如果在面嚮對象語言裏,則可能是這樣的:
struct T{
void run(){
this.e(this.f(), this.g();
this.d();
this.c();
this.b();
}
}
此外對於C++,可以通過函數對象的方式來把類看成一個函數來用:
struct E{
operator()(){
}
}
struct F{
operator()(){
}
}
...
p = A(B(),C(),D(),E(F(), G());
p(...);
在Python裏面也可以這樣做:
class E:
def __init(self):
...
def __call__(self):
...
...
p = A(B(),C(),D(),E(F(), G());
p(...);
簡單來說,實用函數式編程記住兩點:
- 可以通過語言的仿函數能力,將對象轉成函數
- 組合函數對象,清晰表達出邏輯模塊的組裝
- 一次性執行組合程序
--end--