19
  1. Clojure 有什么原则吗?

    一个。像 Java 等面向对象语言的SOLID 面向对象设计原则一样吗?

    湾。还是其他更具启发性的方法,例如“告诉不要问”、“偏好组合与继承”、“与接口对话”?

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

  3. 面向对象的封装等函数式编程基础的对应部分是什么?

知道这些资源吗?

4

6 回答 6

28

对于你的第一个问题:没有。†</sup>

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

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

  1. 首先,让一些工作。然后,您可以在必要时检查、测试和优化。time宏使用核心语言是有原因的。在敏捷之前正确,要可爱。

  2. 抽象的。如果你在重复自己,你可能做的不对。编写,咖喱和组合功能。

  3. 从你的逻辑中分离副作用。例如,如果你想格式化和保存一个字符串,在一个函数中格式化它,然后使用另一个函数来保存它,但是你需要。

3a。不要对此太疯狂。有时,拥有几个匿名函数比一堆defn乱七八糟的代码要好。

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

  2. 不要弄乱你的命名空间。我们在 Clojure-land 很干净。限定你use的 s 或使用:only你需要的东西。让你的代码可读。

  3. 了解核心库。不只是clojure.core, clojure.java.io,clojure.string以及clojure.set介于两者之间的所有内容。如果你认为 Clojure 应该有一个函数来做 X,它可能有。您可以使用apropos(来自,是的,另一个核心库:)clojure.repl

  4. 记录您的代码。文档字符串是一个美丽的东西。如果您有冗长的倾向,那么文档环就是放松的地方。但是,也要知道好的代码通常会“记录自己”。如果代码是不言自明的,则无需迂腐。

  5. 这是一种函数式语言。如果可以,请使用函数。协议、宏和记录都很棒:但是当您可以摆脱它时,请使用函数。您可以组合、组合、映射、减少、迭代(列表继续,继续,继续……)函数。这是非常好的。

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

其他一些提示:阅读其他人的代码。如果您开始阅读代码,并且擅长阅读代码,那么您将更擅长编写自己的代码,并且您也可能会学习新事物:几乎所有事情都有不止一种方法。

最后,通读Clojure 库编码标准,了解生产 Clojure 代码中的预期内容。

† 至少,现在还没有。

于 2010-08-31T21:35:19.247 回答
8

Hard question.

Clojure is very flexible. So they are best practices, but they aren't nearly as important as for java.

I write here a few examples of advices from the most general to the most particular families.

There are advices for programming in general: write a lot of tests, write something correct and nice, profile and optimize when needed

There are advices for functional programming: write small functions, write pure functions, compose the small functions, factor your code through functions, try to use combinators when possible...

There are advices for LISP: use macro to factor out repetitive patterns, build your program bottom-up. (See Paul Graham's 'on LISP' for a better explanation than mine)

There are also some advices specifically for Clojure: follow the careful analysis of state and identity ( http://clojure.org/state , for a very good explanation), try to use seqs and their functions when possible, write doc strings for functions

A good source for more advices are the Clojure Library Coding Standard http://www.assembla.com/wiki/show/clojure/Clojure_Library_Coding_Standards

But all these advices are just advices, and Clojure can be used by someone that do not want to follow these advices, because, as a Lisp, it is very flexible.

As far as design pattern are concerned, functional programmer rarely think in these terms, as most of them has been designed for OO languages and do not apply in a functional language.

Peter Norvig has interesting slides on Design Pattern and LISP/Dylan: http://norvig.com/design-patterns/

Hope that helps.

于 2010-08-31T18:22:30.547 回答
3

Don't Repeat Yourself ( DRY) 原则非常适用于 clojure。该语言非常灵活,并且真正促进了以可以真正将锅炉位置代码量减少到非常接近于零的方式组合抽象。

删除重复代码的方法的一些示例是:

  • 仅在生成没有 map 变体的原始数据时才使用lazy-cons。如果您发现自己在写作(lazy-seq (cons (do-something data) (call-myself (rest data))),请检查是否mapiterate会做您想做的事情。
  • 使用小函数并自由组合它们。如果一个函数需要格式化一些数据,将其包装在 XML 中,然后通过网络发送。将这些写在三个小函数中,然后使用(def send-formated-xml (comp send xml format))这种方式,您可以稍后将格式函数映射到一些数据等。
  • 当语言绝对不能表达你重复的模式时,使用宏。使用宏比重复你自己更好*。并且永远记住宏俱乐部的第一条规则是不要使用宏。
于 2010-09-08T00:26:02.337 回答
3

1a)我不知道这样的事情,但每本关于 FP 的书都会做这样的事情。

1b)

  • “Favor Composition vs Inheritance” --> 已经处理好了,因为您从 FP 开始

  • “与抽象对话”-> 更一般

  • “尽可能偷懒”

  • “避免状态”

  • “使用纯函数!!!”

  • 项目清单

……

2.)您可以使用一些相同的设计模式,它们更容易实现。其中一些意义不大,但通常。FP 的人对此并没有什么大不了的。(这是关于我只知道的 GoF 模式)

以观察者模式为例。在 Clojure 中,您可以使用 add-watcher 函数来使观察者模式过时。

3.)您可以在名称空间中使用封装查看 defn- 或者您可以将您的函数隐藏在其他函数中。Clojure 的喜悦中有一些例子。你可以把它推到你想要的地方。

于 2010-08-31T15:08:11.640 回答
2

该视频介绍了 SOLID 原则,以及如何在 Clojure 中应用它们。

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

于 2014-07-14T08:24:52.420 回答
0

在博客中有一篇文章提到“在 clojure 中思考” 它提供了一些指向 Clojure 的乐趣和其他一些书籍的指针(甚至是一些视频的链接)

现在,我得到了《The Joy Of Clojure》一书,读了一点,它承诺会教我“Clojure 之道”。希望结果能告诉我我在寻找什么,一些原则......

这本书正在进步,但你可以在这里从 manning 购买“抢先体验版”,并获得 40% 的代码“s140”。在这里查看信息

于 2010-09-04T12:02:53.130 回答