所有的erlang书似乎都说export_all是不好的做法,但是不要说明理由。最终,大多数模块花费大部分时间用于编译(export_all),因为不断更新模块列表以删除辅助函数是一件麻烦事。这是不好的做法,因为我应该关心我向其他开发者公开的功能吗?或者这是不好的做法,因为模块所具有的功能数量会带来某种性能成本,这可能与热代码加载有关。如果在填充具有很多功能的模块时性能受到影响,它有多糟糕?为什么-compile(export_all)不好的做法?
回答
以下几个原因:
净度:它更容易看到哪些功能旨在模块外部使用。
当您在Erlang shell中完成选项卡时,只会列出导出的功能列表,而不会包含其他功能。重构模块时,您会知道无需外部用户就可以安全地重命名哪些函数,具体取决于它们。
代码异味:你会得到未使用函数的警告。
因此,你会避免死代码。
优化:编译器可能能够进行更积极的优化,因为知道并非所有函数都必须导出。
尽管我不确定使用-compile(export_all).
是否有任何实际的性能影响,但我怀疑它们是否足够重要。
但是,显式声明导出列表有好处。通过这样做,每个人都可以通过查看.erl
文件的第一页来找出模块的界面。此外,与我们倾向于写下的许多其他内容一样,显式声明模块接口有助于保持其清晰度。
随着中说,当我开始一个新的Erlang模块上工作,我总是键入-module(...). -compile(export_all).
界面变得成熟后,我够添加一个显式-export([...])
同时保持的export_all
编译选项。
没有使用'-compile(export_all).'的性能影响。编译器处理所有调用都是一样的,导出过程与显式导出相同。 – rvirding
定义了哪些函数是外部的,因此哪些函数是内部函数的列表对于将来处理您的代码的人非常有用。我最近重构了一些旧代码,并且在大多数模块中使用export_all一直是一个烦恼的持续源。
- 1. 为什么把magic_quotes_gpc视为一种不好的做法?
- 2. 不好的做法?它是什么“称为”
- 3. Javascript为什么FOR IN是一种不好的做法?
- 4. 什么是更好的做法以下
- 5. 这是为什么认为是不好的做法?还是它? (ASP.Net)
- 6. 为什么重载operator <作为成员函数是不好的做法?
- 7. 锁定可变对象 - 为什么它被认为是不好的做法?
- 8. 为什么关闭Angular的良好做法? (或一般)?
- 9. 什么是最好的做法,称为wordpress媒体上传(wp.media)
- 10. 在React中refs有什么不好的做法?
- 11. GitHub在这里做了什么好的做法?
- 12. 为什么Visual Studio中的循环引用是一个不好的做法?
- 13. 为什么Web服务器上的* .cs文件是不好的做法?
- 14. 为什么在条件不好的情况下做事
- 15. 认为是好的做法?
- 16. 为了获得更好的性能,做什么更好?
- 17. 为什么在JavaScript中使用“const”构造是一种不好的做法?
- 18. 为什么在HTML中使用onClick()是一种不好的做法?
- 19. 为什么从WCF服务操作中返回DataTables是不好的做法?
- 20. 为什么从javascript连接SQL数据库是一种不好的做法?
- 21. dispatch_async为什么不好?完成相同任务的更好方法是什么?
- 22. 良好的做法或不好的做法
- 23. 试图理解为什么Laravel的许多静态方法不被认为是不好的做法
- 24. 这是不好的做法?
- 25. 为什么require_once不好用?
- 26. 为什么#define不好?
- 27. 为什么globals不好?
- 28. JQuery $ post() - 方法好像什么都不做
- 29. 什么是最好的做法或方法(使用.NET)
- 30. WPF能做什么和不做什么?
因为反向工程更容易,并且不必要地生成比需要更大的可执行文件。没有人需要你的函数名称在可执行权? – fazo