2014-11-02 24 views
0

我想了解什麼是OOP中良好的舊依賴注入的替代方案。 假設我有以下應用程序(僞代碼)如何在純函數式編程中交換函數(例如用於測試)

app()是應用程序啓動的地方。它允許用戶註冊和列出用戶帖子(不管)。這兩個函數組成了幾個其它功能(寄存器它一步一步,勢在必行,而列表的帖子確實構成他們(至少這是我的理解複合函數)。

app() 

    registerUser(u) 
    validate(u) 
    persist(u) 
     callSaveToDB(u) 
    notify(u) 
     sendsEmail 

    listPosts(u) 
    postsToView(loadUserPosts(findUser(u))) 

現在,我想測試這個東西(registerUserlistPosts),並希望有存根的功能,因此我不叫分貝等等 - 你知道,平常測試的東西 我知道這是可能傳遞函數的功能,例如

registerUser(validateFn, persistFn, notifyFn, u) 

並將其部分應用,因此它看起來像registerUser(u)關閉其他功能等等。但是這一切都需要在應用程序啓動級別完成,因爲它是在OOP(接線依賴和引導應用程序)。它看起來像手動這樣做會需要很長的時間和噸的樣板代碼。有什麼明顯的我在那裏失蹤?有沒有其他的方式呢?

編輯:

我看到IO有沒有一個很好的例子。那麼如果我的函數是由其他幾個函數組成的,其中一個函數真的很重(就計算而言),我想交換它呢?

簡單地說 - 我正在尋找FP的方式做DI的東西。

+0

好吧,但我想在這種情況下並不重要。如果我想從其他幾個building block中構建功能邏輯(他們可能不會做任何IO)呢? – veilsoen 2014-11-02 14:43:57

+0

另外,我需要最終在某個時候調用db,所以這必須在某處處理 – veilsoen 2014-11-02 15:54:11

+0

但是,它不以任何方式回答我的問題(或者我完全錯過了您的觀點) – veilsoen 2014-11-02 16:03:56

回答

1

回答這個問題的方法是放棄「依賴注入」這個短語並從根本上思考它。將接口寫爲每個組件的類型。實現具有這些類型的函數。根據需要更換它們。沒有什麼魔力,像類型類這樣的語言特性使得編譯器很容易確保你可以在接口中替換方法。

以前的特定哈斯克爾回答,展示瞭如何使用Haskell的類型的API:https://stackoverflow.com/a/14329487/83805

相關問題