2011-10-22 11 views
14

Todos los libros de erlang parecen decir que export_all es una mala práctica pero no da una razón. Al final, la mayoría de los módulos pasan la mayor parte de su tiempo compilando (export_all) porque actualizar constantemente la lista de módulos para eliminar las funciones auxiliares es una molestia. ¿Es una mala práctica porque se supone que me preocupan las funciones que expongo a otros desarrolladores? ¿O es una mala práctica porque hay algún tipo de costo de rendimiento en la cantidad de funciones que tiene un módulo, debido quizás a cosas como la carga de código caliente? Si hay un golpe de rendimiento para rellenar un módulo con muchas funciones, ¿qué tan malo es?¿Por qué es -compile (export_all) una mala práctica?

+2

porque es más fácil realizar ingeniería inversa y producir innecesariamente un archivo ejecutable más grande que el necesario. nadie necesita los nombres de tu función en ejecutable ¿no? – fazo

Respuesta

22

Por varias razones:

  • Claridad: es más fácil de ver qué funciones están destinados a ser utilizados fuera del módulo.

    Cuando completa la pestaña en el shell Erlang obtiene una lista de solo las funciones exportadas y ninguna otra. Cuando refactoriza el módulo, usted sabe qué funciones puede cambiar de nombre de manera segura sin usuarios externos que dependan de ellas.

  • Olor de código: recibe advertencias por funciones no utilizadas.

    Por lo tanto, evitará el código muerto.

  • Optimización: el compilador puede realizar optimizaciones más agresivas sabiendo que no todas las funciones tienen que exportarse.

+0

¿Tiene una fuente para respaldar el reclamo de optimización? – jocull

+0

Desafortunadamente no, pero me imagino que sería capaz de alinear funciones utilizadas solo en un lugar, por ejemplo, si sabe que nunca serán llamadas desde fuera del módulo. –

+3

Además, hace que el dializador sea más difícil de usar. @jocull En el libro de Joe Armstrong, Programming Erlang, 2nd ed., pág. 164, afirma que el "compilador puede producir código mucho mejor" cuando exporta menos funciones. – JDong

10

Si bien no estoy seguro de si hay implicaciones de rendimiento práctico de usar -compile(export_all)., dudo que sean lo suficientemente importantes como para importarle.

Sin embargo, existe la ventaja de declarar explícitamente la lista de exportaciones. Al hacer esto, todos pueden descubrir la interfaz del módulo mirando la primera página del archivo .erl. Además, como ocurre con muchas otras cosas que tendemos a escribir, la declaración explícita de la interfaz del módulo ayuda a mantener su claridad.

Dicho esto, cuando comienzo a trabajar en un nuevo módulo de Erlang Siempre escribo -module(...). -compile(export_all). Después de la interfaz se vuelve lo suficientemente madura agrego una explícita -export([...]) mientras se mantiene la opción de compilación export_all.

+3

No hay implicaciones de rendimiento al usar '-compile (export_all) .'. El compilador maneja todas las llamadas de la misma manera y la exportación se realiza de la misma manera que con la exportación explícita. – rvirding

3

Tener una lista definida de qué funciones son externas, y por lo tanto cuáles son internas, es extremadamente útil para cualquier persona que trabaje en su código en el futuro. Recientemente he estado refabricando un código viejo, y el uso de export_all en la mayoría de los módulos ha sido una fuente constante de molestias.

Cuestiones relacionadas