【问题标题】:let bloat or idiomatic clojure?让膨胀或惯用的clojure?
【发布时间】:2013-10-29 19:56:26
【问题描述】:

作为 clojure 的新手,我很难为不同的代码结构找到一种惯用的风格。

在某些情况下,我的 let 绑定包含函数的大部分代码。这种膨胀,是对clojure哲学的一些误解还是惯用的,就可以了吗?

这是一个示例测试用例来演示。它测试到某个存储库的添加/获取往返。 long let 看起来很奇怪吗?

(deftest garden-repo-add-get
  (testing "Test garden repo add/get"
    (let [repo (garden/get-garden-repo)
          initial-garden-count (count (.list-gardens repo))
          new-garden (garden/create-garden "Keukenhof")
          new-garden-id (.add-garden repo new-garden)
          fetched-garden (.get-garden repo new-garden-id)]
      (is (= (+ initial-garden-count 1) (count (.list-gardens repo))))
      (is (= (.name new-garden) (.name fetched-garden))))))

【问题讨论】:

  • 我建议您尽可能多地进行 4clojure 练习,并对照前 10 名其他用户(以及网站创建者)的实现检查您的答案。我发现自己使用 let 作为解决方案分解策略,但是其他答案显示了您可能会发现自己更喜欢的其他成语。它总是提供信息。

标签: clojure idioms


【解决方案1】:

就我个人而言,这就是我在 Clojure 中编码的方式。 Clojure 足够简洁、优雅和简洁。
我认为通过压缩到以下内容不会是“惯用的”。

  (is (= (+ (count (.list-gardens repo)) 1) (count (.list-gardens (garden/get-garden-repo)))))

您的代码 sn-p 更易于理解、测试和调试(在 Eclipse、IntelliJ 中......)。

Clojure 是关于简单的,我想保持这种方式。

不过,您的问题的答案是高度固执己见的。

【讨论】:

  • 您的代码错过了返回项目的相等性测试并且没有测试 add-garden 合约(它返回一个可用于查找项目的 id),它根本不等效.除了初始花园计数之外,我看不出如何以无点形式重写。
【解决方案2】:

通过查看您的函数代码,该函数正在使用的“事物”似乎是具有 getter/setter 和方法的典型 OO 对象(请参阅有很多 .{something} 调用),这使您可以使用这些 let绑定,因为对象 API 的设计方式。如果您必须使用对象,这很好。

在 Clojure 中,您基本上围绕数据结构(如 map/vector/list/set 和函数)设计 API,这(在大多数情况下)为您提供了一种可能不需要太多 let 绑定使用的 API。

【讨论】:

    【解决方案3】:

    我在您的 let 代码中看到的主要问题是,通常情况下,您使用了大量只有名称才能存在于 let form 中的中间变量。

    避免过度膨胀的最佳方法是使用箭头宏-> 或->>

    例如,您可以避免使用 repo 中间变量

    initial-garden-count (-> (garden/get-garden-repo)
                             (.list-gardens)
                             count)
    

    不过,在您的特定情况下,您在测试验证中使用了 all 中间变量,因此无论如何您都需要在 let 语句中使用它们。也许new-garden-id 是唯一可以避免的中间人:

    fetched-garden (->> (.add-garden repo new-garden)
                        (.get-garden repo))
    

    或者使用 Chiron 建议的方法:

    fechted-gaden (.get-garden repo (.add-garden repo new-garden))
    

    【讨论】:

      猜你喜欢
      • 2014-07-04
      • 1970-01-01
      • 2017-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-23
      相关资源
      最近更新 更多