2013-05-06 119 views
7

我對.hrl文件應該用於什麼感到困惑。我的理解是,.hrl文件可以包含任何有效的Erlang代碼,使用-include指令將本質上將.hrl文件中的代碼插入到包含它的任何模塊中。Erlang頭文件(.hrl)文件應該和不應該包含哪些內容?

什麼樣的代碼適合放在這些.hrl文件中,然後呢? Erlang的編程規則在記錄方面聲明如下:

如果記錄要在多個模塊中使用,則其定義應放置在模塊包含的頭文件(後綴爲.hrl)中。

因此,我已經在我的代碼中形成了這樣做的習慣。然而,我喜歡在頭文件中放置諸如記錄的實例化和比較函數以及類型定義之類的東西(因爲這是我在C中要做的事情)。這是不好的形式?應該從.erl文件中導出類型,即使它們用於多個模塊?似乎沒有關於可用Erlang頭文件的最佳實踐的文檔。

回答

9

使用C語言,include聲明將包含文件的內容逐字地添加到erl文件中。因此,在hrl文件中放入任何實際的代碼都會導致代碼被複制到你包含它的任何地方。這會在每個Erlang模塊中導致不必要的功能重複。

我會將任何實際的Erlang代碼放入它自己的erl模塊中,以及hrl文件中的任何記錄定義,類型規範或常用宏。記錄定義和類型規範不會編譯到二進制文件中,因此它們可以安全地包含在多個文件中。

4

我使用hrl文件來存儲我的單元測試中使用的各種燈具。我不喜歡在實際生產代碼中使用它們。在不同位置導入相同的功能使得很難推斷代碼。將代碼放在單獨的模塊中並將其明確導出更爲可取。類型也可以使用-export_type指令顯式導出。

我甚至不喜歡與它共享記錄(儘管這是共享記錄的唯一方法)。爲此,我更喜歡有一個模塊只管理適當的獲取和設置函數來管理這個方法。共享記錄是一個等待發生的災難,使代碼升級變得更加棘手。

總之,不要將它們用於任何重要的事情。

5

通常你把東西放在你想在模塊之間共享的.hrl,通常是記錄定義和宏。對於一個模塊來說純粹是本地的東西,你不會把它放在.hrl文件中。因此,純粹的本地記錄定義(例如服務器中的本地狀態)不會在.hrl中出現,而只會在定義服務器的模塊中出現。與宏定義相同。您應該始終避免不必要地暴露內部信息。

由於包含文件直接插入到包含文件中,因此其中包含的任何代碼都將在包含它的每個模塊中複製。你通常不想這樣做。

相關問題