gpt4 book ai didi

clojurescript - 为什么要为记录定义工厂函数?

转载 作者:行者123 更新时间:2023-12-02 01:37:26 26 4
gpt4 key购买 nike

在 swannodettes clojurescript 教程 ( https://github.com/swannodette/lt-cljs-tutorial/blob/master/lt-cljs-tutorial.cljs ) 中,声称:

定义工厂函数被认为是惯用的(并且被推荐) 它返回创建的 defrecord/deftype 实例。这是惯用的 工厂名称的破折号。

例子:

(defn person [first last]
(->Person first last))

为什么?

我唯一能想到的是,如果您使用一组参数并且它们与实现不匹配,无论是作为转换:

(defn person [full-name]
(->Person (first (split full-name)) ... ))

或者在用作库时防止更改实现。

是吗?

缺点是额外的、不必要的功能,需要与实现并行更新,而且名称可能稍微不明确。

我不喜欢样板代码,所以在没有解释的情况下给出这样的建议时,我总是很沮丧。

最佳答案

Java 允许多个具有不同签名的构造函数 IE

public class Foo implements Bar {
private final Boolean initialState;
public Foo () { this.initialState = false; }
public Foo (Boolean initialState) { this.initialState = initialState; }
public void sayState () {System.out.println(this.initialState)}
}

Clojure 构造函数不能以这种方式定制。您基本上会根据提供给 defrecord 的字段向量为您创建一个构造函数。

(defrecord Foo [initial-state] Bar (sayState [this] (println initial-state)))

因此,如果您想基于与 defrecord 的字段向量不匹配的签名构造一个对象,您将需要一个包装器 fn 来设置初始状态的默认值。

如果 defrecord 的字段向量发生变化,工厂方法将在未来证明您不必更改所有出现的 (->Foo state)代码。

关于clojurescript - 为什么要为记录定义工厂函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30457088/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com