问题

我公司刚刚要求我在Clojure中重写一个较大的(50,000行单行代码)Java应用程序(使用JSP和servlet的Web应用程序)。有没有其他人得到关于我应该注意什么的提示?

请记住,我非常了解Java和Clojure。

##更新

我做了重写,然后投入生产。这是非常奇怪的,因为重写最终进展得如此之快,以至于它在大约6周内完成。因为不需要很多功能,它最终更像是3000行的Clojure。

我听说他们对系统感到满意,并且完全按照自己的意愿行事。唯一的缺点是,维护系统的人必须从零开始学习Clojure,并且他被踢进去并且尖叫着。前几天我确实接到了他的电话,说他现在喜欢Lisp ..好笑:)

另外,我应该好好提一下Vaadin。使用Vaadin可能占用了Clojure所节省的时间和代码的短缺.Vaadin仍然是我曾经使用的顶级Web框架,尽管现在我正在愤怒地学习ClojureScript! (请注意,Vaadin和ClojureScript都使用了Google的GUI框架。)


#1 热门回答(81 赞)

最大的"转换问题"可能是从Java / OOP方法到Clojure /函数式编程范例。

特别是,"Clojure方式"不是在对象中具有可变状态,而是清楚地分离出可变状态并开发纯(无副作用)函数。你可能已经知道了这一切:-)

无论如何,这种理念倾向于导致一种"自下而上"的开发风格,你最初的努力集中在构建正确的工具集来解决你的问题,然后最终将它们插在一起。这可能看起来像这样

  • 识别关键数据结构并将其转换为不可变的Clojure映射或记录定义。不要害怕嵌套大量不可变映射 - 由于Clojure的持久数据结构,它们非常有效。值得观看此视频以了解更多信息。
  • 开发在这些不可变结构上运行的纯粹的,面向业务逻辑的功能的小型库(例如"将项目添加到购物车")。你不需要一次性完成所有这些操作,因为以后可以轻松添加更多内容,但是有助于尽早做一些以便于测试并证明你的数据结构正常工作.....你可以在REPL上以交互方式开始编写有用的东西
  • 单独开发数据访问例程,可以根据需要将这些结构持久存储到数据库或网络或遗留Java代码中。保持这种分离的原因是你不希望持久性逻辑与你的"业务逻辑"功能捆绑在一起。你可能希望查看ClojureQL,尽管包装任何你喜欢的Java持久性代码也非常容易。
  • 编写涵盖所有上述内容的单元测试(例如使用clojure.test)。这在像Clojure这样的动态语言中尤其重要,因为a)你没有静态类型检查那么多的安全网,b)它有助于确保你的低级构造在你构建太多之前运行良好最重要的
  • 决定如何使用Clojure的引用类型(变量,引用,代理和原子)来管理每个部分可变的应用程序级状态。它们都以类似的方式工作,但具有不同的事务/并发语义,具体取决于你要执行的操作。 Refs可能是你的默认选择 - 它们允许你通过在(dosync ...)块中包装任何代码来实现"正常"STM事务行为。
  • 选择正确的整体网络框架 - Clojure已经有相当多的但我强烈推荐Ring - 看看这个优秀的视频"One Ring To Bind Them"加上Fleet或Enlive或Hiccup取决于你的模板哲学。然后使用它来编写表示层(使用"将此购物车翻译成适当的HTML片段"等功能)
  • 最后,使用上述工具编写应用程序。如果你已经正确地完成了上述步骤,那么实际上这将是一件容易的事,因为你将能够通过适当的组合构建整个应用程序,只需很少的样板。

这大致是我会解决问题的顺序,因为它广泛地代表了代码中依赖关系的顺序,因此适合于"自下而上"的开发工作。虽然当然处于良好的敏捷/迭代风格,但你可能会发现自己很早就推进了可证明的最终产品,然后经常跳回到早期的步骤以根据需要扩展功能或重构。

附:如果你按照上面的方法,我会很高兴听到需要多少行Clojure才能匹配50,000行Java的功能

更新:由于这篇文章最初是在"必须签出"类别中出现的,因此出现了一些额外的工具/库:

  • Noir - 构建在Ring之上的Web框架。
  • Korma - 用于访问SQL数据库的非常好的DSL。

#2 热门回答(5 赞)

你当前项目包含哪些Java方面?记录,数据库事务,声明式事务/ EJB,Web层(你提到过JSP,servlets)等我注意到Clojure生态系统有各种微框架和库,目标是完成一项任务,并且做得很好。我建议根据你的需要评估库(以及它是否可以在大型项目中扩展)并做出明智的决定。 (免责声明:我是http://code.google.com/p/bitumenframework/的作者)另外需要注意的是构建过程 - 如果你需要复杂的设置(开发,测试,登台,产品),你可能需要将项目拆分为模块并使构建过程易于编写。


#3 热门回答(4 赞)

我发现最困难的部分是考虑数据库。做一些测试,找到你想在那里使用的合适工具。


原文链接