gpt4 book ai didi

clojure - 构建 Clojure 源代码的惯用方法

转载 作者:行者123 更新时间:2023-12-03 04:03:58 25 4
gpt4 key购买 nike

我对人们如何构建 Clojure 源代码感兴趣。

由于习惯了 Java,我非常熟悉每个源代码文件一个类的范例,将所有数据和方法定义与适当的注释和注释等捆绑在一起。

然而,Clojure 提供了更多的灵 active ,我不确定应该如何构建我的项目(可能最终会成为一个中型应用程序,可能有 5,000 行代码,具有三个或四个不同的子系统)

特别是我正在努力解决:

  • 我应该使用什么准则来确定代码是否应该位于单个命名空间中还是应该分离到不同的命名空间中?
  • 每个协议(protocol)/数据类型都应该有自己的命名空间 + 源文件以及相关的函数集吗?
  • 什么时候应该使用 require 或使用其他命名空间?

最佳答案

我也有 Java 背景,同时也有相当多的 Ruby 和一点点 Go 背景。这是我目前正在做的事情,大约一个月后就开始使用 Clojure:

  • 我将命名空间视为一个语义单元,它是为了特定目的而组合在一起的代码,例如数据类型及其操作。

对于命名空间和文件,我有两种约定:

  • 对于适合一个文件的小型单元(我使用 ~1000 行作为文件分割的限制),每个文件都有一个命名空间,目录路径加文件名与命名空间相同。我认为这在 Java 中是一件好事,它使得从文件中查找 namespace 变得轻而易举,反之亦然。
  • 对于需要多个文件的较大单元,我使用 Go 约定:命名空间与目录路径匹配,并且目录中的所有文件共享相同的命名空间。在这些情况下,我通常会分配一个具有固定名称(“main”)的主文件,用于加载其他文件并与其他文件交互。

作为命名空间示例,我有一个解析器,可以读取格式并将其转换为 HTML。我有一个用于解析器(语义单元)的命名空间,目录中的多个文件按子功能划分:词法分析器、解析器、HTML 转换和一个包含用于使用解析器的主要公共(public) API 的主文件。

我不会自动为每种数据类型使用一个命名空间,这取决于数据类型的范围。如果是大的,也许可以。但对于像 Point 这样具有两个字段和几个函数的数据类型,我宁愿将其包含到像 Geometry 这样更通用的命名空间中。

要求与使用:

  • 几乎所有地方都要求使用适当短的别名。
  • 这还允许重用核心名称:我的专用树数据类型具有“get”操作以适应 map ;使用 require 没有冲突:“get”是 Clojure 核心 get,“tree/get”是我的数据类型。
  • 我仅将“use”用于我认为的“核心扩展”,例如当我制作自己的“map-if”(将 map 和过滤器合二为一)时。

关于clojure - 构建 Clojure 源代码的惯用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3062737/

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