为什么-compile(export_all)是不好的做法?

Jaz*_*Man 15 erlang

所有的erlang书籍似乎都说export_all是不好的做法,但没有给出理由.最后,大多数模块将大部分时间花在compile(export_all)上,因为不断更新模块列表以删除辅助函数是一件麻烦事.这是不好的做法,因为我应该关心我向其他开发者公开的功能?或者这是不好的做法,因为模块所具有的功能数量会有某种性能成本,因为可能会出现热代码加载等问题.如果填充具有大量功能的模块会影响性能,那么它有多糟糕?

Ada*_*erg 23

有几个原因:

  • 清晰度:更容易看出哪些功能是在模块外部使用的.

    当您在Erlang shell中完成选项卡时,您将获得仅列出导出函数的列表,而不会列出其他函数.当您重构模块时,您知道哪些功能可以在没有外部用户的情况下安全地重命名,具体取决于它们.

  • 代码气味:您会收到有关未使用功能的警告.

    因此,您将避免死代码.

  • 优化:编译器可能能够进行更积极的优化,因为并非所有函数都必须导出.

  • 此外,它使透析器更难使用.@jocull在Joe Armstrong的书中,编程Erlang,第2版,第1页.164,他说当你导出较少的函数时,"编译器可以生成更好的代码". (3认同)

ala*_*rik 10

虽然我不确定使用是否有任何实际的性能影响-compile(export_all).,但我怀疑它们是否足够重要.

但是,明确声明出口清单会带来好处.通过这样做,每个人都可以通过查看.erl文件的第一页来找出模块的界面.此外,与我们倾向于记下的许多其他内容一样,模块接口的显式声明有助于保持其清晰度.

随着中说,当我开始一个新的Erlang模块上工作,我总是输入-module(...). -compile(export_all).界面变得足够成熟,我想补充一个明确后-export([...]) ,同时保持export_all编译选项.

  • 使用`-compile(export_all).`没有性能影响.编译器处理所有相同的调用,并且导出的执行方式与显式导出相同. (3认同)