所有的erlang书籍似乎都说export_all是不好的做法,但没有给出理由。最后,大多数模块将大部分时间花在compile(export_all)上,因为不断更新模块列表以删除辅助函数是一件麻烦事。这是不好的做法,因为我应该关心我向其他开发者公开的功能?或者这是不好的做法,因为模块所具有的功能数量会有某种性能成本,因为可能会出现热代码加载等问题。如果填充具有大量功能的模块会影响性能,那么它有多糟糕?
答案 0 :(得分:22)
有几个原因:
清晰度:更容易看出哪些功能是在模块外部使用的。
当您在Erlang shell中完成选项卡时,您将获得仅列出导出函数的列表,而不会列出其他函数。当您重构模块时,您知道哪些功能可以安全地重命名而无需外部用户,具体取决于它们。
代码气味:您会收到有关未使用功能的警告。
因此,您将避免死代码。
优化:编译器可能能够进行更积极的优化,因为并非所有功能都必须导出。
答案 1 :(得分:10)
虽然我不确定使用-compile(export_all).
是否有任何实际的性能影响,但我怀疑它们是否足够重要。
但是,明确声明出口清单会带来好处。通过这样做,每个人都可以通过查看.erl
文件的第一页来找出模块的界面。此外,与我们倾向于记下的许多其他事情一样,模块接口的显式声明有助于保持其清晰度。
话虽如此,当我开始处理新的Erlang模块时,我总是键入-module(...). -compile(export_all).
在界面变得足够成熟之后,我添加了一个明确的-export([...])
,同时保持 { {1}}编译选项。
答案 2 :(得分:3)
有一个已定义的列表,其中列出了哪些函数是外部函数,因此哪些函数是内部函数,对于将来处理代码的任何人都非常有用。我最近一直在重构一些旧代码,并且在大多数模块中使用export_all一直是烦恼的源头。