Bel*_*lun 19 functional-programming principles clojure
Clojure有什么原则吗?
一个.像Java这样的OO语言的SOLID面向对象设计原则?
湾 或者其他更具启发性的,比如"告诉不要问","赞成组合与继承","与接口交谈"?
是否有任何设计模式(灵活的代码)?
功能编程基础的对应部分是什么,比如面向对象的封装?
知道这些资源吗?
Isa*_*aac 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代码的预期结果.
†至少,还没有.
难以回答的问题.
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有关于Design Pattern和LISP/Dylan的有趣幻灯片:http: //norvig.com/design-patterns/
希望有所帮助.
1a)我不知道有类似的事情,但是每本关于 FP 的书都会做类似的事情。
1b)
“偏好组合 vs 继承” --> 已经被处理了,因为你是从 FP 开始的
“与抽象交谈”--> 更一般
“能偷懒的时候就偷懒”
“避免状态”
“使用纯函数!!!”
项目清单
....
2.) 您可以使用一些相同的设计模式,它们只是更容易实现。其中一些意义不大,但通常是这样。FP 的人不会小题大做。(这是关于 GoF 模式的,我只知道它们)
例如,看看观察者模式。在 Clojure 中,您可以使用 add-watcher 函数来废弃观察者模式。
3.)您可以在名称空间中使用封装(查看 defn-),或者您可以将您的函数隐藏在其他函数中。《Clojure 的乐趣》中有一些例子。您可以将其推至任意远的位置。