功能-OO混合语言的设计模式?

时间:2010-06-21 12:24:15

标签: design-patterns scala functional-programming oop

Scala等语言是否已经收集了最佳实践?

我找到了关于函数式语言的设计模式的工作, Design patterns for functional strategic programming 。 OO语言有GoF个设计模式。但功能性OO混合动力车是否有任何模式?我所看到的只是this列表。知道什么?

5 个答案:

答案 0 :(得分:19)

Bill Venners的两种模式;我认为两者都在ScalaTest中大量使用:

Stackable Trait(类似于装饰器模式的结构,除了它涉及用于类组合而不是对象组合的装饰)。

Selfless Trait(允许图书馆设计师提供客户可以通过mixin或者导入访问的服务)。

Type safe builder

Independently Extensible Solutions to the Expression Problem - 就像“可扩展的组件抽象”一样,它不是模式目录,但它也处理类似的问题(例如访问者模式)

Deprecating the Observer Pattern - 观察者的替代方案。

我们还可以将Haskell类型的Scala仿真视为一种设计模式。第一个描述(我至少可以找到)是在 Poor Man's Type Classes。此主题还提供了一些博客条目。

如果我也提到各种monad,我想我并不完全错。你可以找到很多处理它们的资源。

答案 1 :(得分:12)

虽然不是直接设计模式目录本身,但文章“Scalable Component Abstractions”(Martin Odersky; Matthias Zenger)检查了可重用组件的三个构建块:

  • 抽象类型成员,
  • 显式自我类型,
  • 模块化mixin组合物。

它重新审视了几种设计模式(发布/订阅,主题/观察者,上下文/组件),以说明和理解哪些语言结构对于实现可伸缩和动态组件系统至关重要。

答案 2 :(得分:5)

一个经常被观察到的模式,它急需一个名字,是用curried参数列表和by-name参数创建控件抽象。

def command(expr: T)(block: => Unit) {...}

产生

command (expr) {
  block
}

答案 3 :(得分:4)

尽管任何对象功能语言很快就会获得一个actor库,但是大量基于actor的模式可能有资格获得这个问题。几乎Bob Martin的Enterprise Integration Patterns中的任何模式都可以根据actor进行重新设计,其中Load Balancer,Message Filter,基于内容的路由器和Content Enricher等模式在围绕粗粒度演员构建的系统中尤为常见。 / p>

答案 4 :(得分:3)

密切相关,您可能希望探索purely functional(或混合功能)语言中定义的数据结构。首先,将函数视为一等值的能力使某些(不是所有)上下文中不需要某些模式(如visitortemplate methoddecorator)。其次,数据结构(以及对它们进行操作的算法)要么是设计模式的管道,要么是设计模式试图解决的某些问题,请参阅维基百科文章 Purely functional

更好的是,我会推荐你​​Okasaki's thesis on purely functional data structures