Почему -compile (export_all) плохая практика?
Все книги erlang, похоже, говорят, что export_all - это плохая практика, но не дают причины. В конце концов большинство модулей тратят большую часть своего времени на compile (export_all), потому что постоянное обновление списка модулей для удаления вспомогательных функций - это хлопот. Это плохая практика, потому что я должен заботиться о функциях, которые я раскрываю другим разработчикам? Или это плохая практика, потому что есть какая-то стоимость исполнения в количестве функций, которые есть у модуля, из-за того, что может быть, например, загрузка горячего кода. Если есть удар производительности для наложения модуля с множеством функций, насколько это плохо?
Ответы
Ответ 1
По нескольким причинам:
-
Ясность: легче видеть, какие функции предназначены для использования вне модуля.
Когда вы завершаете вкладку в оболочке Erlang, вы получаете список только экспортируемых функций и других. Когда вы реорганизуете модуль, вы знаете, какие функции вы можете безопасно переименовать без внешних пользователей в зависимости от них.
-
Запах кода: вы получаете предупреждения о неиспользуемых функциях.
Поэтому вы избегаете мертвого кода.
-
Оптимизация: компилятор может сделать более агрессивную оптимизацию, зная, что не все функции должны быть экспортированы.
Ответ 2
Хотя я не знаю точно, есть ли какие-либо практические последствия использования -compile(export_all).
, я сомневаюсь, что они достаточно значительны для ухода.
Тем не менее, есть преимущество в том, что явным образом объявляю список экспорта. Делая это, каждый может определить интерфейс модуля, посмотрев первую страницу файла .erl
. Кроме того, как и во многих других вещах, которые мы склонны записывать, явное объявление интерфейса модуля помогает сохранить свою ясность.
С учетом сказанного, когда я начинаю работу над новым модулем Erlang, я всегда печатаю -module(...). -compile(export_all).
. После того, как интерфейс становится достаточно зрелым, я добавляю явный -export([...])
, сохраняя параметр компиляции export_all
.
Ответ 3
Наличие определенного списка функций, которые являются внешними, и, следовательно, какие из них являются внутренними, чрезвычайно полезно для всех, кто будет работать над вашим кодом в будущем. Я недавно рефакторинг старого кода, и использование export_all в большинстве модулей было постоянным источником раздражения.