Documentazione: hanno usato per Edoc per generare tutte le diverse forme di documentazione per il codice. Gli attributi -spec
sono firme di funzioni che, a seconda dell'impegno che si mettono in esse, possono rendere il codice più comprensibile e mantenibile. Supponiamo che la tua struttura dati preferita questo mese sia dict()
. Considerare il seguente codice:
my_function(SomeArg, SomeOtherArg, Dict) ->
...
dict:find(SomeKey, Dict)
...
La variabile che viene utilizzata come dict è stata denominata come tale. Ma diciamo che si ha il seguente frammento:
my_other_function(NamesDict, PlacesDict) ->
...
R1 = my_function(A, B, NamesDict),
...
R2 = my_function(C, D, PlacesDict),
...
Cercando di tenere il passo con questo potrebbe presto portare a codice che si ripete questo suffisso Dict
. Inoltre, potresti non voler nemmeno ricordare nel contesto di my_other_function
che i due argomenti sono dict()
. Così, invece si potrebbe desiderare di fare questo:
-spec my_other_function(dict(), dict()) -> atom().
my_other_function(Names, Places) ->
...
R1 = my_function(A, B, Names),
...
R2 = my_function(C, D, Places),
...
Ora è chiaro che questi argomenti dovrebbero essere dict() per la funzione di lavorare e speriamo tutti saranno in grado di capire che, senza andare in profondità nel codice.Supponiamo che tu stia utilizzando questo Name
dict()
in altri luoghi e memorizzi alcune informazioni particolari esposte con API diverse. Allora è un candidato perfetto per una dichiarazione -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),
...
Se qualcun altro fa uso frequente di questa particolare struttura dati si consiglia di esportarlo anche:
-module(my_module).
-export_type([names/0]).
-type names() :: dict().
Altri moduli possono ora fare riferimento a questo particolare struttura dei dati:
-module(my_other_module).
-record(my_state, {names :: my_module:names(),
...}).
Infine, se si preferisce altro sviluppatore di non esaminare questa struttura dati in alcun modo nella loro moduli, è possibile de Chiaro come -opaque
. Ancora una volta, questo è un "suggerimento amichevole", così come tutto il resto della roba fino ad ora. O è...?
Grazie per la risposta dettagliata.Il '-opaque' equivale a' -type' senza la dichiarazione '-export_type'? – egor7
No, è ancora necessario esportare tutti i tipi '-opaque' che si dichiarano. – aronisstav