有没有Clojure原则?

时间:2010-08-31 12:09:00

标签: functional-programming clojure principles

  1. Clojure有什么原则吗?

    一个。就像Java这样的OO语言的S.O.L.I.D. Object-Oriented Design Principles一样?

    湾或其他更具启发性的内容,如“告诉不要问”,“赞成组合与继承”,“与界面交谈”?

  2. 是否有任何设计模式(灵活代码)?

  3. 功能编程基础的对应部分是什么,比如面向对象的封装?

  4. 知道这些资源吗?

6 个答案:

答案 0 :(得分:26)

关于你的第一个问题:不。

Clojure旨在帮助您正确,快速,愉快地完成工作。之后的一切都是肉汁。

还有很多肉汁。我不认为知道 Clojure方式,即使有一个,但这里有一些指导我已被告知并在Clojure写作时发现:

  1. 首先,让事情有效。 然后您可以根据需要进行检查,测试和优化。 time宏是核心语言的原因。 敏捷前的正确性,很可爱。

  2. 摘要。 如果你在重复自己,那么你可能做得不对。撰写,咖喱和组合功能。

  3. 从您的逻辑中分离出副作用。例如如果要格式化并保存字符串,请将其格式化为一个函数,然后使用另一个函数进行保存,但是您需要。

  4. 3A。不要为此过于疯狂。有时,最好有一些匿名函数,而不是一堆单行defn乱丢你的代码。

    1. 测试。 Rich给了你一个REPL是有原因的;使用那个REPL的地狱。

    2. 不要混淆您的命名空间。在Clojure-land我们很干净。限定use或使用:only您需要的内容。使您的代码可读。

    3. 了解核心库。不只是clojure.core,还有clojure.java.ioclojure.stringclojure.set以及介于两者之间的所有内容。如果您认为Clojure应该具有执行X的功能,那么它可能会这样做。您可以使用apropos(来自,是的,另一个核心库:clojure.repl)。

    4. 记录您的代码。 Docstrings是一件美丽的事情。如果你有一种冗长的倾向,那么doctsring就是放松的地方。但是,也要知道好的代码经常“记录自己”。如果代码不言自明,就没有必要迂腐。

    5. 这是一种功能语言。 如果可以,请使用功能。协议,宏和记录都很棒:但是当你可以逃脱它时,使用一个函数。您可以编写,组合,映射,缩小,迭代(列表继续,开启,开启......)功能。那太好了。

    6. 最重要的是,如果有意义则违反上述规则。但要准备好重新思考和重构。如果您保持代码模块化,那么重构代码应该是重组和重组的问题。

    7. 其他一些提示:阅读其他人的代码。如果你开始阅读代码,并且善于阅读代码,你就会更好地编写自己的代码,而且你也可能会学习新的东西:只有一种方法可以做到。

      最后,阅读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-cons,其中没有地图变体可以执行。如果您发现自己写了(lazy-seq (cons (do-something data) (call-myself (rest data))),请检查mapiterate是否符合您的要求。
  • 使用小功能并自由组合。如果函数需要格式化某些数据,请将其包装在XML中,然后通过网络发送。在三个小函数中写下这些函数,然后使用(def send-formated-xml (comp send xml format))这样你可以将格式函数映射到某些数据等等。
  • 当语言绝对不能表达你重复的模式时,使用一个宏。它更好*使用宏而不是重复你的自我。并且永远记住宏俱乐部的第一条规则是不要使用宏。

答案 4 :(得分:2)

This video介绍了SOLID原则,以及如何在Clojure中应用它们。

它显示了这些原则在功能世界中如何与OOP一样,因为我们仍然需要解决相同的潜在问题。总的来说,它让我觉得功能编程更适合SOLID设计。

答案 5 :(得分:0)

在博客中有一篇文章提到“在clojure中思考”here,它提供了一些关于“欢乐的Clojure”以及其他一些书籍(甚至是某些视频的链接)的指示

现在,我收到了“欢乐的Clojure”一书,读了一下,并承诺教我“Clojure的方法”。希望结果告诉我我在寻找什么,一些原则......

这本书正在进行中,但你可以从manning here购买“早期版本”并获得40%的代码“s140”。请参阅信息here