我的公司刚刚要求我在Clojure中重写一个较大的(50,000行单行代码)Java应用程序(使用JSP和servlet的Web应用程序)。有没有其他人得到关于我应该注意什么的提示?
请记住,我非常了解Java和Clojure。
我做了重写,然后投入生产。这是非常奇怪的,因为重写最终进展得如此之快,以至于它在大约6周内完成。因为不需要很多功能,它最终更像是3000行的Clojure。
我听说他们对系统感到满意,并且正在按照自己的意愿行事。唯一的缺点是,维护系统的人必须从零开始学习Clojure,并且他被踢进去并且尖叫着。前几天我确实接到了他的电话说他现在喜欢Lisp ..好笑:)。
另外,我应该好好提一下Vaadin。使用Vaadin可能占用了Clojure所节省的时间和代码的短缺.Vaadin仍然是我曾经使用的顶级Web框架,尽管现在我正在愤怒地学习ClojureScript! (请注意,Vaadin和ClojureScript都使用了Google的GUI框架。)
答案 0 :(得分:81)
最大的“转化问题”可能会从Java / OOP方法转变为Clojure /函数式编程范式。
特别是,“Clojure方式”不是在对象中具有可变状态,而是明确地分离出可变状态并开发纯(无副作用)函数。你可能已经知道了这一切: - )
无论如何,这种理念倾向于导致某种“自下而上”的开发风格,在这种风格中,您将最初的努力集中在构建正确的工具集来解决您的问题,然后最终将它们连接在一起。这可能看起来像这样
识别关键数据结构并将其转换为不可变的Clojure映射或记录定义。不要害怕嵌套大量不可变映射 - 由于Clojure的持久数据结构,它们非常有效。值得关注this video了解更多信息。
开发基于业务逻辑的纯函数的小型库,这些函数在这些不可变结构上运行(例如“将项目添加到购物车”)。您不需要一次性完成所有这些操作,因为以后可以轻松添加更多内容,但它有助于尽早做一些事情来促进测试并证明您的数据结构正常工作.....你可以在REPL
单独开发数据访问例程,可以根据需要将这些结构持久存储到数据库或网络或遗留Java代码中。保持这种分离的原因是你不希望持久性逻辑与你的“业务逻辑”功能捆绑在一起。您可能希望查看ClojureQL,但也可以很容易地包装您喜欢的任何Java持久性代码。
编写涵盖以上所有内容的单元测试(例如clojure.test)。这在像Clojure这样的动态语言中尤其重要,因为a)你没有静态类型检查那么多的安全网; b)它有助于确保你的低级构造在你构建太多之前运行良好顶部
决定如何使用Clojure的引用类型(vars,refs,agent和atoms)来管理每个部分可变的应用程序级状态。它们都以类似的方式工作,但具有不同的事务/并发语义,具体取决于您要执行的操作。 Refs可能是您的默认选择 - 它们允许您通过在(dosync ...)块中包装任何代码来实现“正常”STM事务行为。
选择合适的整体网络框架 - Clojure已经有很多,但我强烈推荐使用Ring - 请参阅此优秀视频“One Ring To Bind Them”以及Fleet或{{3} }或Enlive取决于你的模板哲学。然后使用它来编写表示层(使用“将此购物车翻译成适当的HTML片段”等功能)
最后,使用上述工具编写应用程序。如果你已经正确地完成了上述步骤,那么实际上这将是一件容易的事情,因为你可以通过适当组合各种组件来构建整个应用程序,只需要很少的样板。
这大致是我会解决问题的顺序,因为它广泛地代表了代码中依赖关系的顺序,因此适合于“自下而上”的开发工作。虽然当然处于良好的敏捷/迭代风格,但您可能会发现自己很早就推进了可证明的最终产品,然后经常跳回到早期的步骤,以根据需要扩展功能或重构。
P.S。如果你按照上面的方法,我会很高兴听到需要多少行Clojure才能匹配50,000行Java的功能
更新:由于这篇文章最初是在“必须签出”类别中出现的,因此出现了一些额外的工具/库:
答案 1 :(得分:5)
您当前项目包含哪些Java方面?记录,数据库事务,声明式事务/ EJB,Web层(你提到过JSP,servlets)等我注意到Clojure生态系统有各种微框架和库,目标是完成一项任务,并且做得很好。我建议根据您的需要评估库(以及它是否可以在大型项目中扩展)并做出明智的决定。 (免责声明:我是http://code.google.com/p/bitumenframework/的作者)另外需要注意的是构建过程 - 如果您需要复杂的设置(开发,测试,升级,生产),您可能需要将项目拆分为模块并拥有构建过程脚本轻松。
答案 2 :(得分:4)
我发现最困难的部分是考虑数据库。做一些测试,找到你想在那里使用的合适工具。