Clojure有什么原则吗?
一个。就像Java这样的OO语言的S.O.L.I.D. Object-Oriented Design Principles一样?
湾或其他更具启发性的内容,如“告诉不要问”,“赞成组合与继承”,“与界面交谈”?
是否有任何设计模式(灵活代码)?
功能编程基础的对应部分是什么,比如面向对象的封装?
知道这些资源吗?
答案 0 :(得分:26)
关于你的第一个问题:不。 †
Clojure旨在帮助您正确,快速,愉快地完成工作。之后的一切都是肉汁。
还有很多肉汁。我不认为知道 Clojure方式,即使有一个,但这里有一些指导我已被告知并在Clojure写作时发现:
首先,让事情有效。 然后您可以根据需要进行检查,测试和优化。 time
宏是核心语言的原因。 敏捷前的正确性,很可爱。
摘要。 如果你在重复自己,那么你可能做得不对。撰写,咖喱和组合功能。
从您的逻辑中分离出副作用。例如如果要格式化并保存字符串,请将其格式化为一个函数,然后使用另一个函数进行保存,但是您需要。
3A。不要为此过于疯狂。有时,最好有一些匿名函数,而不是一堆单行defn
乱丢你的代码。
测试。 Rich给了你一个REPL是有原因的;使用那个REPL的地狱。
不要混淆您的命名空间。在Clojure-land我们很干净。限定use
或使用:only
您需要的内容。使您的代码可读。
了解核心库。不只是clojure.core
,还有clojure.java.io
,clojure.string
,clojure.set
以及介于两者之间的所有内容。如果您认为Clojure应该具有执行X的功能,那么它可能会这样做。您可以使用apropos
(来自,是的,另一个核心库:clojure.repl
)。
记录您的代码。 Docstrings是一件美丽的事情。如果你有一种冗长的倾向,那么doctsring就是放松的地方。但是,也要知道好的代码经常“记录自己”。如果代码不言自明,就没有必要迂腐。
这是一种功能语言。 如果可以,请使用功能。协议,宏和记录都很棒:但是当你可以逃脱它时,使用一个函数。您可以编写,组合,映射,缩小,迭代(列表继续,开启,开启......)功能。那太好了。
最重要的是,如果有意义则违反上述规则。但要准备好重新思考和重构。如果您保持代码模块化,那么重构代码应该是重组和重组的问题。
其他一些提示:阅读其他人的代码。如果你开始阅读代码,并且善于阅读代码,你就会更好地编写自己的代码,而且你也可能会学习新的东西:只有一种方法可以做到。
最后,阅读Clojure Library Coding Standards以了解生产Clojure代码的预期结果。
†至少,还没有。
答案 1 :(得分:8)
难题。
Clojure非常灵活。 所以它们是最佳实践,但它们并不像java那么重要。
我在这里写了几个从最普通的家庭到最特别的家庭的建议的例子。
一般来说,有一些编程建议: 写了很多测试,写出正确和好的东西,配置文件并在需要时进行优化
有功能编程的建议: 编写小函数,编写纯函数,编写小函数,通过函数计算代码,尽可能使用组合器......
LISP有建议: 使用宏来分解重复模式,自下而上构建程序。 (请参阅保罗格雷厄姆的'关于LISP'以获得比我更好的解释)
还有一些专门针对Clojure的建议: 按照对状态和身份的仔细分析(http://clojure.org/state,以获得非常好的解释),尽可能使用seqs及其函数,为函数编写doc字符串
更多建议的良好来源是Clojure Library Coding Standard http://www.assembla.com/wiki/show/clojure/Clojure_Library_Coding_Standards
但是所有这些建议都只是建议,Clojure可以被不想遵循这些建议的人使用,因为作为Lisp,它非常灵活。
就设计模式而言,函数式程序员很少用这些术语来思考,因为它们中的大部分都是针对OO语言而设计的,并不适用于函数式语言。
Peter Norvig在设计模式和LISP / Dylan上有一些有趣的幻灯片: http://norvig.com/design-patterns/希望有所帮助。
答案 2 :(得分:3)
1a)我不知道类似的东西,但每本关于FP的书都会做那样的事情。
1b)的
“赞成合并与继承” - >因为你开始使用FP
“与抽象对话” - >更一般的
“你可以懒惰”
“避免状态”
“使用PURE FUNCTIONS !!!”
列出项目
...
2.)您可以使用一些相同的设计模式,它们更容易实现。它们中的一些通常不太有意义。 FP人员并没有做出太大的贡献。 (这是关于GoF模式我只知道它们)
例如,观察观察者模式。在Clojure中你可以使用add-watcher函数使观察者模式过时。
3.)您可以在名称空间中使用封装查看defn-或者您可以在其他功能中隐藏您的功能。在Clojure的喜悦中有一些例子。您可以根据需要推送它。
答案 3 :(得分:3)
不要重复自己(DRY)校长适用于clojure。该语言非常灵活,真正促进了组成抽象,其方式可以真正减少锅炉位置代码的数量非常接近于零。
删除重复代码的方法的一些示例是:
(lazy-seq (cons (do-something data) (call-myself (rest data)))
,请检查map
或iterate
是否符合您的要求。(def send-formated-xml (comp send xml format))
这样你可以将格式函数映射到某些数据等等。答案 4 :(得分:2)
This video介绍了SOLID原则,以及如何在Clojure中应用它们。
它显示了这些原则在功能世界中如何与OOP一样,因为我们仍然需要解决相同的潜在问题。总的来说,它让我觉得功能编程更适合SOLID设计。
答案 5 :(得分:0)