2014-11-02 52 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

相关问题