Почему -compile (export_all) плохая практика? - PullRequest
14 голосов
/ 23 октября 2011

Все книги на эрланге, кажется, говорят, что export_all - плохая практика, но не дают причины. В конце концов, большинство модулей тратят большую часть своего времени на компиляцию (export_all), потому что постоянное обновление списка модулей для удаления вспомогательных функций - это хлопотно. Это плохая практика, потому что я должен заботиться о функциях, которые я представляю другим разработчикам? Или это плохая практика, потому что в числе функций, которые есть у модуля, есть какие-то затраты производительности из-за таких вещей, как горячая загрузка кода. Если производительность наполняется модулем с большим количеством функций, насколько это плохо?

Ответы [ 3 ]

22 голосов
/ 23 октября 2011

По нескольким причинам:

  • Ясность: легче увидеть, какие функции предназначены для использования вне модуля.

    Когда вы завершите вкладку в оболочке Erlang, вы получите список только экспортируемых функций и никаких других. Когда вы реорганизуете модуль, вы знаете, какие функции вы можете безопасно переименовать без внешних пользователей, в зависимости от них.

  • Запах кода: вы получаете предупреждения о неиспользуемых функциях.

    Поэтому вы избежите мертвого кода.

  • Оптимизация: компилятор может выполнять более агрессивные оптимизации, зная, что не все функции необходимо экспортировать.

10 голосов
/ 23 октября 2011

Хотя я точно не знаю, есть ли какие-либо практические последствия для производительности при использовании -compile(export_all)., я сомневаюсь, что они достаточно значительны, чтобы о них заботиться.

Однако есть преимущество объявления списка экспорта.в явном виде.Делая это, каждый может выяснить интерфейс модуля, посмотрев на первую страницу файла .erl.Также, как и во многих других вещах, которые мы склонны записывать, явное объявление интерфейса модуля помогает сохранить его ясность.

С учетом сказанного, когда я начинаю работать над новым модулем Erlang, я всегда набираю -module(...). -compile(export_all). После того, как интерфейс станет достаточно зрелым, я добавлю явное -export([...]) , сохраняя параметр компиляции export_all.

3 голосов
/ 23 октября 2011

Наличие определенного списка функций, которые являются внешними и, следовательно, которые являются внутренними, чрезвычайно полезен для всех, кто будет работать над вашим кодом в будущем.Недавно я проводил рефакторинг некоторого старого кода, и использование export_all в большинстве модулей было постоянным источником раздражения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...