Types Erlang头(.hrl)文件中应该和不应该有什么?

Types Erlang头(.hrl)文件中应该和不应该有什么?,types,coding-style,erlang,standards,header-files,Types,Coding Style,Erlang,Standards,Header Files,我对.hrl文件应该用于什么有点困惑。我的理解是,.hrl文件可以包含任何有效的Erlang代码,并且使用-include指令基本上将.hrl文件中的代码插入到包含它的任何模块中 那么,什么样的代码适合放在这些.hrl文件中呢?Erlang的编程规则规定了有关记录的以下内容: 如果记录要在多个模块中使用,则其定义应放在模块中包含的头文件(后缀为.hrl)中 因此,我养成了在代码中这样做的习惯。然而,我也喜欢在我的头中放一些东西,比如记录的实例化和比较函数,以及类型定义(因为这是我在C中要做的事情

我对
.hrl
文件应该用于什么有点困惑。我的理解是,
.hrl
文件可以包含任何有效的Erlang代码,并且使用
-include
指令基本上将
.hrl
文件中的代码插入到包含它的任何模块中

那么,什么样的代码适合放在这些
.hrl
文件中呢?Erlang的编程规则规定了有关记录的以下内容:

如果记录要在多个模块中使用,则其定义应放在模块中包含的头文件(后缀为.hrl)中


因此,我养成了在代码中这样做的习惯。然而,我也喜欢在我的头中放一些东西,比如记录的实例化和比较函数,以及类型定义(因为这是我在C中要做的事情)。这是坏形式吗?是否应该从
.erl
文件中导出类型,即使它们在多个模块中使用?似乎没有关于Erlang头的最佳实践的文档可用。

与C一样,include语句将包含文件的内容添加到erl文件中。因此,将任何实际代码放在hrl文件中都会导致该代码被复制到包含它的任何地方。这将导致每个Erlang模块中不必要的功能重复


我会将任何实际的Erlang代码放在它自己的erl模块中,并将任何记录定义、类型规范或公共宏放在hrl文件中。记录定义和类型规范没有编译到二进制文件中,因此可以安全地包含在多个文件中。

我使用hrl文件存储各种装置,以便在单元测试中使用。我不喜欢在实际的生产代码中使用它们。在不同的位置导入相同的函数会使代码难以推理。更可取的做法是将代码放在单独的模块中并显式导出。还可以使用-export\u type指令显式导出类型

我甚至不喜欢与它共享记录(即使这是共享记录的唯一方式)。为此,我更喜欢让一个模块只管理带有适当get和set函数的方法。共享记录是一场即将发生的灾难,它使代码升级变得更加棘手


简而言之,不要将它们用于任何重要的事情。

通常,您会将内容放在一个
.hrl
中,您希望在模块之间共享它,通常是记录定义和宏。对于一个模块来说,这些内容是完全本地的,而不是放在
.hrl
文件中。因此,纯本地记录定义(例如服务器中的本地状态)不会出现在
.hrl
中,而只出现在定义服务器的模块中。宏定义也是如此。您应该始终避免不必要地公开内部信息

由于include文件直接插入到include文件中,因此其中包含的任何代码都将在包含它的每个模块中复制。你通常不想这样做