演化架构和紧急设计: 利用可重用代码,第 1 部分:代码与设计之间的关系
2010-05-13 00:00:00 来源:WEB开发网清单 4 显示一个类似的重写版本,这一次用的是 Ruby(通过 JRuby):
清单 4. 翻译成 Ruby 的 addOrderFrom() 方法
def wrap_in_transaction
setup_data_infrastructure
begin
yield
complete_transaction
rescue
rollback_transaction
throw
ensure
cleanup
end
end
def add_order_from
wrap_in_transaction do
add order, user_key_based_on(user_name)
add_line_items_from cart, order.order_key
end
end
与 Java 版本相比,上述代码更类似于 Groovy 代码。Groovy 代码与 Ruby 代码的主要不同点在 Command 模式特征中。在 Ruby 中,任何方法都可以使用代码块,代码块通过方法主体中的 yield 调用执行。因此,在 Ruby 中,甚至不需要指定专门类型的基础结构元素 — 该语言中已具有处理这种常见用法的功能。
抽象的风格
不同的语言以不同的方式处理抽象。阅读本文的人都熟悉一些普遍的抽象风格 — 例如结构化、模块化和面向对象 — 它们出现在很多不同的语言中。当长时间使用一种特定的语言时,它就成了金锤:每个问题看上去就像一个钉子,可以用该语言的抽象来驱动。对于纯面向对象语言(例如 Java 语言)来说,这一点尤为明显,因为主要的抽象就是分层和易变状态。
Java 世界现在对一些函数式语言,例如 Scala 和 Clojure 表现出很大的兴趣。当使用函数式语言编写代码时,您会以不同的方式思考问题的解决方案。例如,在大多数函数式语言中,默认方式是创建不可变变量,而不是可变变量,这与 Java 截然相反。在 Java 代码中,默认情况下数据结构是可变的,必须添加更多的代码,才能使它们具有不变的行为。这意味着以函数式语言编写多线程应用程序要容易得多,因为不可变数据结构与线程交互起来非常自然,因而代码可以很简洁。
更多精彩
赞助商链接