【发布时间】:2014-04-22 03:15:28
【问题描述】:
我正在尝试从“hello world”等价物的功能程序飞跃到更真实的应用程序。
由于我来自 Java 世界并接触过它的所有设计模式,我的建模过程仍然非常面向 Java(例如,我认为是 *Managers、*Factory、*ClientFactory、*Handler 等)
一次性改变我的思维过程会很困难,所以我希望获得一些关于如何用函数式语言建模以下场景(以 OO 方式描述)的指示。
像 Clojure/Haskell(或者像 Scala 这样的混合语言)这样的函数式语言的示例会很有帮助。
无状态请求处理程序
例如是一个 Servlet。它本质上是一个带有 doGet、doPost 等方法的请求处理程序。如何用函数式语言为这样的类建模?
协调器类
这样的类自己不做任何事情,只是编排整个过程或工作流。它们提供多个入口点 API。
例如OrderOrchestrator 编排了一个多步骤的工作流程,从支付工具验证、购物车管理、支付、发货启动等开始。
他们可能会维护自己的一些内部状态,供付款、发货等不同步骤使用。
ClientFactory 模式
假设您为 LogService 编写了一个客户端,您的客户端使用它来记录有关其服务的流量数据。客户端将数据记录在您管理的存储桶和帐户下的 S3 中,并且您提供其他服务,例如对这些数据进行报告和分析。 您不希望您的客户担心提供 AWS 帐户信息等配置信息,因此您提供了一个 ClientFactory,它根据是用于测试还是生产目的来实例化适当的客户端对象,而无需客户提供任何配置。例如。 LogServiceClientFactory.getProdInstance() 或 LogServiceClientFactory.getTestInstance()。
这样的客户端是如何用函数式语言建模的?
Builder Pattern 和其他 Fluent API 设计
客户端库通常提供构建器来创建具有复杂配置的对象。有时 API 也很流畅,可以轻松创建。 Fluent API 的一个示例是 Mockito API:Mockito.when(A.get()).thenReturn(a) IIRC,这是通过返回渐进式限制性构建器在内部实现的,以允许开发人员编写此代码。
这是否与函数式编程世界中的 this 相似?
数据存储实例
假设您的代码库使用来自多个位置的 ActiveUserRegistry 中存储的数据。您只希望此注册表的 1 个实例存在并让整个代码库访问此注册表。因此,您提供了一个 ActiveUserRegistry.getInstance() 来保证所有代码库都访问该实例(假设该实例是线程安全的等)
如何在功能设置中进行管理?我们是否必须确保在整个代码库中传递相同的实例?
【问题讨论】:
-
这可以帮助描述函数世界中的一些设计模式:norvig.com/design-patterns
标签: scala design-patterns clojure functional-programming