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?
Respuesta
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.
¿Tiene una fuente para respaldar el reclamo de optimización? – jocull
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. –
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
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
.
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
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.
- 1. Javascript ¿por qué FOR IN es una mala práctica?
- 2. es @unlink una mala práctica?
- 3. ¿Qué es una mala práctica al usar los parámetros?
- 4. ¿Es una mala práctica escribir a $ _POST?
- 5. ¿La mala práctica de "arrojar excepciones" es?
- 6. ¿Es una mala práctica usar su AppDelegate como Singleton?
- 7. ¿Por qué es una mala práctica bloquear el objeto que vamos a cambiar?
- 8. ¿Por qué es una mala idea permitir esto en JavaScript ==,! =, ++, -
- 9. ¿Es una mala práctica tener estado en una clase estática?
- 10. ¿El uso de procedimientos almacenados es una mala práctica?
- 11. ¿Es una mala práctica buscar en Rails I18n?
- 12. ¿Es una mala práctica usar las características C en C++?
- 13. ¿Es una mala práctica devolver vistas parciales que contengan javascript?
- 14. ¿Es una mala práctica usar Reflection in Unit testing?
- 15. ¿En general es una mala práctica tener muchos parámetros "initWith"?
- 16. ¿Es una mala práctica utilizar matrices multidimensionales en C/C++?
- 17. ¿Es una mala práctica usar muchos viewmodels en asp.net mvc
- 18. ¿Es una mala práctica generar aleatoriamente datos de prueba?
- 19. ¿Es una mala práctica usar getattr de python extensivamente?
- 20. ¿Es una mala práctica poner usuarios externos en Active Directory?
- 21. ¿Es una mala práctica usar el módulo requireJS como singleton?
- 22. ¿Es una mala práctica tener un método de inicialización largo?
- 23. ¿Es una mala práctica usar variables temporales para evitar escribir?
- 24. ¿Es una mala práctica usar uno mismo en decoradores?
- 25. ¿Es esto una mala práctica sobrecargar un método?
- 26. ¿Es una mala práctica agregar propiedades a los nodos DOM?
- 27. ¿La palabra clave "con" Delphi es una mala práctica?
- 28. ¿Es una mala práctica escribir manipuladores de eventos en línea
- 29. Mezcla GET con POST: ¿es una mala práctica?
- 30. ¿Los argumentos NULL son una mala práctica?
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