Documentación: se utilizan por edoc para generar todas las formas diferentes de documentación de su código. Los atributos -spec
son firmas de funciones que, dependiendo de cuánto esfuerzo pongas en ellas, pueden hacer que tu código sea más comprensible y mantenible. Supongamos que su estructura de datos favorita este mes es dict()
. Tenga en cuenta el siguiente código:
my_function(SomeArg, SomeOtherArg, Dict) ->
...
dict:find(SomeKey, Dict)
...
La variable que se está utilizando como dict ha sido nombrada como tal. Pero digamos que usted tiene el siguiente fragmento:
my_other_function(NamesDict, PlacesDict) ->
...
R1 = my_function(A, B, NamesDict),
...
R2 = my_function(C, D, PlacesDict),
...
Tratando de mantenerse al día con esto pronto podría dar lugar a código que repite este Dict
sufijo. Aún más, tal vez ni siquiera quiera recordar en el contexto de my_other_function
que los dos argumentos son dict()
. Así que en vez es posible que desee hacer esto:
-spec my_other_function(dict(), dict()) -> atom().
my_other_function(Names, Places) ->
...
R1 = my_function(A, B, Names),
...
R2 = my_function(C, D, Places),
...
Ahora está claro que estos argumentos deben ser dict() para la función de trabajar y es de esperar que todos serán capaces de darse cuenta de eso, sin profundizar en el código.Pero supongamos que está utilizando este Name
dict()
en otros lugares y almacena cierta información particular que está expuesta con diferentes API. Entonces es un candidato perfecto para una declaración -type
:
-type names() :: dict().
-spec my_other_function(names(), places()) -> atom().
my_other_function(Names, Places) ->
...
R1 = my_function(A, B, Names),
...
R2 = my_function(C, D, Places),
...
Si otra persona hace uso frecuente de esta estructura de datos particular, es posible que desee exportar también:
-module(my_module).
-export_type([names/0]).
-type names() :: dict().
Otros módulos pueden ahora hacer referencia a este en particular estructura de datos:
-module(my_other_module).
-record(my_state, {names :: my_module:names(),
...}).
por último, si usted prefiere otro desarrollador para no inspeccionar esta estructura de datos en forma alguna en sus módulos, se puede de Clare como -opaque
. De nuevo, esta es una "sugerencia amistosa", al igual que el resto de las cosas hasta ahora. O es eso...?
Gracias por una respuesta detallada.¿El '-opaque' significa lo mismo que' -type' sin la declaración '-export_type'? – egor7
No, aún necesita exportar cualquier tipo '-opaque' que declare. – aronisstav