我已经学习了几个星期的clojure,最近我开始阅读一些开源代码:clojure和clojurescript编译器以及一些像om,boot,figwheel这样的库.
我注意到一些clojure文件很长,其中一些超过一千个LOC.鉴于clojure的代码是非常简洁和低级的仪式,该代码意味着比其他语言中的大文件更多的代码.
来自OO背景,你通常每个文件有一个类,你试着保持你的课程简短(SRP)我发现有点奇怪.
我知道clojure代码主要由纯函数组成,它们比一些可变类更容易推理,你需要记住当前状态,我发现我可以阅读和理解大多数函数一时间 但是大多数这些功能都经过精心设计,因此它们不会相互依赖:即使你可以使用(filter odd?)它并不意味着filter并且odd?是相关的.但是对于"每天"代码(LOB应用程序,Web应用程序等)很难将这些功能保持为自包含(至少这是我对OO编程的体验).
我还看到了一些clojurescript应用程序(om,试剂等)的演示,它们在同一个文件中声明了所有组件.我不知道是不是因为它只是一个演示而且在现实应用程序中你有一个product.clj和一个category.clj或那只是clojure方式:每个命名空间/模块/有界上下文有一个文件.
我想,如果我打开一个文件夹,我看到product.clj,category.clj,order.clj,等我可以一目了然什么是关于该文件夹,不仅仅是有一个更好的想法components.clj或core.clj.
所以,我的问题是:
1:我查看了我现在正在进行的相当大的非库clojure项目,并运行了这个:
ls **/*.clj | xargs wc -l | awk '{print $1}' | head -n -1 > counts
Run Code Online (Sandbox Code Playgroud)
并打开一个repl并运行
user> (float (/ (reduce + counts) (count counts)))
208.76471
Run Code Online (Sandbox Code Playgroud)
我看到在17k LOC的项目中,我们的平均clojure文件中有200行.我找到一个1k LOC.
2:是的,一旦我有空的时间,我就会开始打破那个长的.一些非常长的,例如clojure.core是非常长的因为clojure的一次通过设计和自我引导的需要.他们需要建立能够拥有许多名称空间的能力,然后才能这样做.对于其他花哨的图书馆,很可能他们有一些其他设计理由的大文件,虽然通常是我的expierence中的"拉请求欢迎"的情况.
3:我在一个拥有一些大文件的大型团队中工作,我们处理与git的合并冲突,但是因为这些变化往往在一个函数中出现,对我来说,比其他语言更少.我发现这根本不是问题.