【问题标题】:Design patterns for building loosely-coupled systems in dynamic/scripting languages用动态/脚本语言构建松散耦合系统的设计模式
【发布时间】:2012-09-01 21:19:48
【问题描述】:

我在使用 Java/C# 构建企业应用程序方面拥有丰富的经验,并且已经习惯了面向对象的静态类型语言所带来的所有陷阱。具体来说,我已经非常擅长使用行业标准工具来处理系统复杂性:

  • 接口/抽象类型
  • 对象组合
  • 依赖倒置

我被要求使用动态的函数式语言 (Lua) 设计一个相当复杂的后端消息处理系统。函数式语言如今风靡一时(NodeJs、JavaScript 等),所以我很高兴借此机会加入上述潮流。

谁能推荐一个示例应用程序或架构,我可以使用它来学习如何使用诸如一流函数、闭包、currying 来构建一个复杂、松散耦合的系统?

非常感谢!

【问题讨论】:

  • Lua 不是函数式语言。它具有函数式编程的元素,但仅仅将函数作为一等对象并不意味着它是一种函数式编程语言。
  • @NicolBolas,在这种情况下,你会说 Scheme 也不是函数式语言吗?
  • @finnw:我不太了解Scheme。但我确实知道函数式编程是什么,而且我知道 Lua 不是。仅仅因为一种语言有闭包并不能使它起作用。 Functional programming 包括不可变的状态等等,Lua 很不擅长。在 Lua 中编写纯函数非常困难,函数式编程不应该让编写纯函数变得困难。
  • @NicolBolas,我看到之前已经在 SO 上讨论过这个问题,例如stackoverflow.com/q/2291742stackoverflow.com/q/214913。我猜 Scheme 是“祖父”,因为它在出现时被认为是一种函数式语言,但它不符合今天使用的更严格的定义(由与 Haskell、Clojure 等一起长大的人使用)
  • @finnw Scheme 允许编写纯函数、避免可变状态等。然而,它并不需要它,而且它并没有真正使用任何花哨的东西隔离 IO。

标签: node.js architecture functional-programming lua closures


【解决方案1】:

我已经对“设计模式”进行了大量研究,这些“设计模式”可以应用于具有一流功能支持的动态语言,这是我的发现。

柯里化 == 依赖注入。 Currying 允许您获取一个函数并将其重新打包为一个新函数,其中一个或多个参数值已经分配。这非常类似于 IoC 容器实例化一个“引导”类及其所有依赖项并准备好供客户端使用。

一等函数 == 命令模式。由于第一类函数可以传递类似的值,因此您基本上可以免费获得命令模式,而且没有开销。

参考资料:

First Class Functions == Command pattern

Functional Dependency Injection via Currying

【讨论】:

    【解决方案2】:

    我会建议查看下面的库/框架,它们设计得非常好, 请记住,javascript 和 lua 非常相似,只需将对象替换为 表添加协程和“不错”的语法,你就有了 Lua。

    Lua

    • Luvit Lua 中的 node.js。

    node.js

    【讨论】:

      猜你喜欢
      • 2010-09-22
      • 2011-01-01
      • 2011-01-20
      • 1970-01-01
      • 2013-05-06
      • 1970-01-01
      • 2010-11-28
      • 2011-03-15
      • 1970-01-01
      相关资源
      最近更新 更多