Java改写为Clojure

Zub*_*air 96 java clojure vaadin

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

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

更新

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

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

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

mik*_*era 81

最大的"转换问题"可能会从Java/OOP方法转变为Clojure /函数式编程范例.

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

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

  1. 识别关键数据结构并将其转换为不可变的Clojure映射或记录定义.不要害怕嵌套大量不可变映射 - 由于Clojure的持久数据结构,它们非常有效.值得观看此视频以了解更多信息.

  2. 开发纯粹的,面向业务逻辑的函数的小库,这些函数在这些不可变结构上运行(例如"将项目添加到购物车").您不需要一次性完成所有这些操作,因为以后可以轻松添加更多内容,但它有助于尽早做一些以便于测试并证明您的数据结构正常工作.....无论如何你可以在REPL上以交互方式开始编写有用的东西

  3. 单独开发数据访问例程,可以根据需要将这些结构持久存储到数据库或网络或遗留Java代码中.保持这种分离的原因是你不希望持久性逻辑与你的"业务逻辑"功能捆绑在一起.您可能希望查看ClojureQL,尽管包装任何您喜欢的Java持久性代码也非常容易.

  4. 编写涵盖以上所有内容的单元测试(例如使用clojure.test).这在像Clojure这样的动态语言中尤其重要,因为a)你没有静态类型检查那么多的安全网; b)它有助于确保你的低级构造在你构建太多之前运行良好最重要的

  5. 决定如何使用Clojure的引用类型(变量,引用,代理和原子)来管理每个部分可变的应用程序级状态.它们都以类似的方式工作,但具有不同的事务/并发语义,具体取决于您要执行的操作.Refs可能是您的默认选择 - 它们允许您通过在(dosync ...)块中包装任何代码来实现"正常"STM事务行为.

  6. 选择正确的整体网络框架 - Clojure已经有相当多的但我强烈推荐Ring - 看看这个优秀的视频" One Ring To Bind Them "加上FleetEnliveHiccup取决于你的模板哲学.然后使用它来编写表示层(使用"将此购物车翻译成适当的HTML片段"等功能)

  7. 最后,使用上述工具编写应用程序.如果你已经正确地完成了上述步骤,那么实际上这将是一件容易的事,因为你将能够通过适当的组合构建整个应用程序,只需很少的样板.

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

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

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

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

  • Nitpick re:"决定你想用哪个Clojure的STM引用类型来管理每个部分可变的应用程序级状态":只有一个STM引用类型.其他IRef不涉及STM.否则看起来像坚实的建议. (4认同)
  • 如果我能给这个更多+1就好了。我看了你引用的两个视频,它们都很棒。谢谢。 (2认同)

Sha*_*mar 5

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

  • 可以使用Ring + Compojure IMHO轻松替换Servlet,并且可以使用StringTemplate(或FreeMarker/Velocity模板)替换JSP .Clojure中的持久性将与Java不同.如果需要关系映射,可以查看Clj-Record和SQLRat(还不是很成熟).ClojureQL目前仅支持AFAICT的MySQL和PostgreSQL.ccsql中当前限制禁止列名中的下划线可能会令人感到意外.我认为在Clojure列表中讨论开发方面的时间和时间将是有用的.祝这个项目好运! (4认同)