Los atributos del módulo son metadatos que describen el módulo en sí. ¿Dónde podemos encontrar estos metadatos cuando no tenemos acceso a la fuente? Bueno, al compilar un módulo, recogerá la mayoría de los atributos del módulo y los almacenará (junto con otra información) en una función module_info/0. Puedes ver los metadatos del módulo useless de la siguiente manera:
9> useless:module_info().
[{exports,[{add,2},
{hello,0},
{greet_and_add_two,1},
{module_info,0},
{module_info,1}]},
{imports,[]},
{attributes,[{vsn,[174839656007867314473085021121413256129]}]},
{compile,[{options,[]},
{version,"4.6.2"},
{time,{2009,9,9,22,15,50}},
{source,"/home/ferd/learn-you-some-erlang/useless.erl"}]}]
10> useless:module_info(attributes).
[{vsn,[174839656007867314473085021121413256129]}]
El fragmento anterior también muestra una función adicional, module_info/1, que le permitirá obtener una información específica. Puede ver funciones exportadas, funciones importadas, atributos (aquí es donde irían sus metadatos personalizados) y opciones e información.
vsn es un valor único generado automáticamente que es diferente en cada versión del código, excluyendo los comentarios. Se utiliza en la carga en caliente de código (actualización de una aplicación mientras se ejecuta, sin detenerla) y en algunas herramientas relacionadas con el manejo de versiones. También podemos especificar un valor vsn: simplemente agregando -vsn(VersionNumber) al módulo.
Otro punto que sería bueno abordar con respecto al diseño general del módulo: ¡evite las dependencias circulares! Un módulo A no debe llamar a un módulo B que también llama al módulo A. Estas dependencias suelen terminar dificultando el mantenimiento del código. De hecho, depender de demasiados módulos, incluso si no están en una dependencia circular, puede dificultar el mantenimiento. Lo último que desea es despertarse en medio de la noche y encontrar a un ingeniero de software o informático maníaco tratando de arrancarle los ojos debido al terrible código que ha escrito.
Por motivos similares (mantenimiento y miedo a la vista), suele considerarse una buena práctica reagrupar funciones que tienen funcionamiento similar.