什麼是函式架構?
函式架構是指一個架構中主要部分是純函式,且純函式不能呼叫不純的活動;但是不純的活動能夠呼叫純函式。
那麼什麼是純函式?就是引用透明,為了使函式具有引用透明性(也稱為 ofollow,noindex" target="_blank">純函式 ),它必須具有兩個屬性:
- 它必須始終對同一輸入返回相同的輸出。我們稱之為質量決定論。
- 它必須沒有副作用。
比如對於表示式,等號的左手邊和右手邊是真正相等的:
two = 1 + 1
在 Haskell中 ,這是由編譯器強制執行的,“=”真正意味著相等。在C#,Java和其他命令式語言中,“=”暗示賦值,而不是相等。
如果程式碼是引用透明的,那麼您可以使用左側的符號替換右側的表示式:
i = findBestNumber [42,1337,2112,90125]
FP中的所有其他內容都遵循此定義。例如,值必須是不可變的,因為如果它們不是,你可以改變它們,這將被視為副作用。
我更喜歡這個定義的原因是它支援偽證法。你可以斷言函式或值是純粹的; 所需要的只是一個反例來證明它不是。反例可以是一個對於同樣輸入值不總是產生相同返回值的例子,也可以是產生副作用的函式呼叫的例子。
所有軟體都會產生副作用:更改顯示器上的畫素是一個副作用。將位元組寫入磁碟是一個副作用。通過網路傳輸一點是副作用。
假設你有兩組操作:不純的活動和純函式。
純函式:雖然有純函式的規則,但這些規則仍然允許互動。一個純函式可以呼叫另一個純函式。這種互動不會改變任何這些功能的屬性。呼叫者和被呼叫者都保持無副作用和確定性。
不純活動:不純的活動也可以互動。沒有規則適用於他們。由於沒有規則適用於不純的活動,因此它們可以呼叫純函式。
不純的活動不受規則約束,因此他們可以做任何他們需要做的事情,包括繪製畫素,寫入檔案或呼叫純函式。純函式是確定性的,沒有副作用。這些屬性不會因為其輸出結果會顯示在螢幕上而改變。
函式架構的規則:
Caller表示呼叫者,Callee表示被呼叫者
讓我們將上述規則稱為函式互動法:純函式不能呼叫不純的活動。因此,函式架構是遵循該法則的程式碼庫,並且具有很大一部分純程式碼。
顯然,通過編寫不純的程式碼,您可以輕而易舉地遵守函式互動法。從某種意義上說,這是您在指令式程式設計語言中預設執行的操作。如果你熟悉Haskell,想象一下編寫一個完整的程式IO。這是可能的,但毫無意義。
程式碼庫的重要部分應該由純程式碼組成。多少為好?越多越好。主觀上,我會說程式碼庫的一半以上應該是純粹的。
如果有一個工具可以自動檢查程式碼是否遵循函式互動法則會很好。我所知道的唯一強制執行函式互動法的工具是一些程式語言,最著名的是Haskell(其他也存在)。Haskell通過其IO型別強制執行函式互動法。您不能IO在純函式(不返回的函式IO)中使用值。如果您嘗試,您的程式碼不會編譯。
我個人反覆使用Haskell來理解函式架構的侷限性,例如確定 依賴注入不起作用 , 因為它使一切都不純。