97

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

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

更新

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

我听说他们对这个系统很满意,而且它完全按照他们的意愿行事。唯一的缺点是维护系统的人必须从头开始学习 Clojure,他被拖入其中又踢又叫。前几天我确实接到了他的电话,说他现在喜欢 Lisp.. 有趣 :)

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

4

3 回答 3

82

最大的“翻译问题”可能是从 Java / OOP 方法论到 Clojure / 函数式编程范式。

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

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

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

  2. 开发在这些不可变结构上运行的纯面向业务逻辑的函数的小型库(例如“将商品添加到购物车”)。您不需要一次完成所有这些操作,因为以后很容易添加更多内容,但它有助于尽早进行一些操作以促进测试并证明您的数据结构正在工作......无论哪种方式点你实际上可以开始在 REPL 上以交互方式编写有用的东西

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

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

  5. 决定如何使用 Clojure 的引用类型(vars、refs、agents 和 atom)来管理每个部分的可变应用程序级状态。它们都以类似的方式工作,但根据您要执行的操作具有不同的事务/并发语义。Refs 可能会成为您的默认选择——它们允许您通过将任何代码包装在 (dosync ...) 块中来实现“正常”STM 事务行为。

  6. 选择正确的整体 Web 框架 - Clojure 已经有很多,但我强烈推荐 Ring - 观看这个出色的视频“ One Ring To Bind Them ”加上FleetEnliveHiccup,具体取决于您的模板理念。然后使用它来编写您的表示层(具有“将此购物车转换为适当的 HTML 片段”之类的功能)

  7. 最后,使用上述工具编写您的应用程序。如果您正确地完成了上述步骤,那么这实际上会很容易,因为您将能够通过适当组合各种组件而使用很少的样板来构建整个应用程序。

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

ps 如果您确实遵循上述方法,我会很想知道需要多少行 Clojure 才能匹配 50,000 行 Java 的功能

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

  • Noir - 建立在 Ring 之上的 Web 框架。
  • Korma - 一个非常好的访问 SQL 数据库的 DSL。
于 2011-03-08T15:21:54.360 回答
5

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

于 2011-03-08T15:37:02.640 回答
4

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

于 2011-03-08T14:10:19.700 回答