Erlang头文件(.hrl)应该和不应该是什么?

时间:2013-05-06 16:33:31

标签: types coding-style erlang standards header-files

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

什么样的代码适合放入这些.hrl文件呢? Erlang的编程规则在记录方面说明如下:

  

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

结果,我养成了在我的代码中执行此操作的习惯。但是,我喜欢在我的标题中添加诸如记录的实例化和比较函数以及类型定义之类的东西(因为这是我在C中会做的事情)。这是不好的形式?是否应该从.erl文件导出类型,即使它们在多个模块中使用?似乎没有关于可用的Erlang标头的最佳实践的文档。

3 个答案:

答案 0 :(得分:10)

LIke C,include语句将包含文件的内容直接添加到erl文件中。因此,将任何实际代码放入hrl文件将导致该代码被复制到您包含它的任何位置。这将导致每个Erlang模块中不必要的功能重复。

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

答案 1 :(得分:5)

通常,您将事物放在要在模块之间共享的.hrl中,通常记录定义和宏。对于您不会放在.hrl文件中的模块而言纯粹是本地的东西。因此,纯粹的本地记录定义(例如服务器中的本地状态)不会进入.hrl,而只会出现在定义服务器的模块中。与宏定义相同。您应该始终避免不必要地暴露内部信息。

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

答案 2 :(得分:4)

我使用hrl文件来存储各种灯具,以便在我的单元测试中使用。我不喜欢在实际的生产代码中使用它们。在不同位置导入相同的功能使得很难推断代码。更优选的是将该代码放在单独的模块中并显式导出。也可以使用-export_type指令显式导出类型。

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

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