最大的“翻译问题”可能会从Java / OOP方法学转向Clojure /功能编程范式。
特别是,“ Clojure方法”不是在对象内部具有可变状态,而是要清楚地区分出可变状态并开发纯净(无副作用)功能。您可能已经知道所有这些了:-)
无论如何,这种理念往往会导致一种“自下而上”的开发风格,在这种风格中,您将最初的精力集中在构建用于解决问题的正确工具集上,然后最终将它们组合在一起。这可能看起来像这样
确定关键数据结构并将其转换为不可变的Clojure映射或记录定义。不要害怕嵌套很多不可变的地图-由于Clojure的持久数据结构,它们非常有效。值得观看此视频以了解更多信息。
开发纯的,面向业务逻辑的功能的小型库,这些库可在这些不可变的结构上运行(例如,“向购物车中添加商品”)。您不需要一次完成所有这些操作,因为稍后可以轻松添加更多内容,但是这样做有助于尽早进行一些测试以方便测试并证明您的数据结构可以正常工作……..您实际上可以在REPL上开始以交互方式编写有用的东西
单独开发数据访问例程,这些例程可以根据需要将这些结构持久化到数据库或网络或旧版Java代码。保持这种独立性的原因是,您不希望将持久性逻辑与“业务逻辑”功能捆绑在一起。您可能希望为此查看ClojureQL,尽管包装您喜欢的任何Java持久性代码也很容易。
编写涵盖以上所有内容的单元测试(例如,使用clojure.test)。这在像Clojure这样的动态语言中尤为重要,因为a)您没有太多来自静态类型检查的安全网,并且b)确保在构建过多基础结构之前,您的低级结构能够正常工作他们的顶端
确定如何使用Clojure的引用类型(变量,引用,代理和原子)来管理每个部件可变的应用程序级状态。它们都以类似的方式工作,但是具有不同的事务/并发语义,具体取决于您要执行的操作。引用可能会成为您的默认选择-它们允许您通过将任何代码包装在(dosync ...)块中来实现“正常” STM事务行为。
选择合适的整体Web框架-Clojure已经有很多了,但是我强烈建议Ring-观看这段出色的视频“ 将它们捆绑在一起的一环 ”,再加上Fleet或Enlive或Hiccup,具体取决于您的模板设计理念。然后使用它来编写您的表示层(具有“将购物车翻译成适当的HTML片段之类的功能”)
最后,使用上述工具编写您的应用程序。如果您正确地完成了上述步骤,那么实际上就很容易了,因为您将能够以很少的样板就可以通过适当组合各种组件来构建整个应用程序。
由于它大致代表了代码中的依存关系顺序,因此,这大致就是我要解决该问题的顺序,因此适合“自下而上”的开发工作。尽管当然采用了良好的敏捷/迭代风格,您可能会发现自己早早地开发了可证明的最终产品,然后很频繁地跳回早期步骤以扩展功能或根据需要进行重构。
ps如果您遵循上述方法,那么我会着迷于与50,000行Java的功能相匹配需要多少行Clojure。
更新:自从最初写这篇文章以来,出现了一些额外的工具/库,它们属于“必须签出”类别: