Java来clojure重写

我刚刚被公司要求在Clojure中重写一个大型的(50000单行代码)Java应用程序(一个使用JSP和servlet的web应用程序)。 有没有其他人有什么我应该小心的提示?

请记住,我很了解Java和Clojure。

更新

我做了重写,并投入生产。 这很奇怪,重写的速度很快,大约在6周内完成。 因为许多function并不需要,所以它更像是3000行的Clojure。 我听说他们对这个系统很满意,而且他们正在做他们想做的事情。 唯一的缺点是维护这个系统的人必须从零开始学习Clojure,并且被拖入它的脚步和尖叫声中。 我有一天接到他的电话,说他现在爱Lisp ..虽然..有趣:)

另外,我应该提到Vaadin。 使用Vaadin可能会占用尽可能多的代码,Clojure所做的一样。Vaadin仍然是我使用过的顶级Web框架,尽pipe现在我正在愤怒的学习ClojureScript! (请注意,Vaadin和ClojureScript都使用Google的GUI框架)

最大的“翻译问题”可能将从Java / OOP方法学转向Clojure /函数式编程范例。

特别的是,“Clojure方式”不是在对象中具有可变状态,而是清晰地分离出可变状态,开发纯粹的(无副作用)function。 你可能已经知道所有这些了:-)

无论如何,这种理念往往会导致某种“自下而上”的开发风格,在这种风格中,您将最初的努力集中在构build正确的工具集以解决您的问题,然后最终将它们结合在一起。 这可能看起来像这样

  1. 识别关键数据结构并将其转换为不可变的Clojure映射或logging定义。 不要害怕嵌套大量不可变的映射 – 由于Clojure的持久化数据结构,它们非常高效。 值得看这个video了解更多。

  2. 开发在这些不可变结构上运行的纯粹的面向业务逻辑的小型函数库(例如“将商品添加到购物车”)。 您不需要一次完成所有这些操作,因为以后可以很容易地添加更多内容,但是可以帮助您尽早完成一些testing,并certificate您的数据结构正在运行。点你可以开始在REPL交互式地编写有用的东西

  3. 单独开发数据访问例程,可以根据需要将这些结构保存到数据库或networking或遗留Java代码中。 保持这种独立的原因是你不希望持久性逻辑与你的“业务逻辑”function捆绑在一起。 你可能想看看这个ClojureQL ,但是也可以很容易地包装任何你喜欢的Java持久代码。

  4. 编写unit testing(例如clojure.test ),覆盖以上所有内容。 这对于像Clojure这样的dynamic语言来说尤为重要,因为a)您没有从静态types检查中获得尽可能多的安全网; b)有助于确保您的较低级别的构造在构build过多之前运行良好他们顶部

  5. 决定如何使用Clojure的参考types(variables,参考,代理和primefaces)来pipe理每个部分可变的应用程序级状态。 它们都以类似的方式工作,但根据您正在尝试执行的操作,具有不同的事务/并发语义。 Refs可能会成为您的默认select – 它们允许您通过在(dosync …)块中包装任何代码来实现“正常的”STM事务行为。

  6. select正确的整体网页框架 – Clojure已经有不less,但我强烈build议Ring – 根据你的模板哲学,看看这个优秀的video“ 一个环绑定它们 ”加上舰队或Enlive或打嗝 。 然后用这个来写你的表示层(用“把这个购物车翻译成合适的HTML片段”的function)

  7. 最后,使用上面的工具编写你的应用程序。 如果你已经正确地完成了上述步骤,那么这将是一件轻而易举的事情,因为你将能够通过适当地组合各种组件来构build整个应用程序,只需很less的样板。

这大致是我会攻击这个问题的顺序,因为它广泛地代表了代码中依赖关系的顺序,因此适合于“自下而上”的开发工作。 尽pipe当然是以良好的敏捷/迭代风格,但是您可能会发现自己很早就推出了可演示的最终产品,然后经常跳回到前面的步骤来扩展function或根据需要进行重构。

ps如果你按照上面的方法,我会很着迷的听到Clojure需要多less行来匹配50000行Java的function

更新 :由于这篇文章最初写了一些额外的工具/库出现在“必须检查”类别:

  • Noir – 构build在Ring之上的Web框架。
  • 科马 – 一个非常好的访问SQL数据库的DSL。

你目前的项目包括哪些Java方面的内容? 日志logging,数据库事务,声明性事务/ EJB,Web层(你提到的JSP,servlets)等等。我注意到Clojure生态系统有各种微观框架和库,目标是完成一项任务,做得很好。 我build议根据您的需要评估图书馆(以及是否可以在大型项目中扩展)并作出明智的决定。 (免责声明:我是http://code.google.com/p/bitumenframework/的作者)另外需要注意的是构build过程 – 如果你需要一个复杂的设置(开发,testing,分期,产品),你可能有将项目拆分为模块,并使构build过程轻松脚本化。

我发现最困难的部分是思考数据库。 做一些testing,find你想要在那里使用的正确的工具。