Sto costruendo un sito Web usando erlang, mnesia e webmachine. La maggior parte della documentazione che ho letto elogia le virtù di avere funzioni referenzialmente trasparenti.Quanto lontano dovrei prendere la trasparenza referenziale?
Il problema è che l'accesso al database è uno stato esterno. Ciò significa che qualsiasi metodo che colpisce il database non è più trasparente referenziale.
Diciamo che ho un oggetto utente in un database e alcune funzioni che si occupano di autenticazione.
funzioni referenzialmente opachi potrebbe essere simile:
handle_web_request(http_info) ->
is_authorized_user(http_info.userid),
...
%referentially opaque
is_authorized_user(userid) ->
User = get_user_from_db(userid),
User.is_authorized.
%referentially opaque
lots_of_other_functions(that_are_similar) ->
db_access(),
foo.
referenzialmente trasparenza impone che ridurre al minimo la quantità di codice referenzialmente opaca, in modo che il chiamante deve ottenere l'oggetto dal database e passare che come argomento ad un funzione:
Il codice sopra riportato non è ovviamente un codice di produzione - è costituito esclusivamente a scopo illustrativo.
Non voglio essere risucchiato dal dogma. I vantaggi del codice referentially trasparente (come test di unità provabili) giustificano l'interfaccia meno amichevole? Fino a che punto dovrei andare nella ricerca della trasparenza referenziale?
Si può semplicemente eliminare l'intero database, avendo solo un loop (MyWholeState) -> loop (ricezione X -> X end, MyWholeState) e loop (RecvHttp, MyWholeState) -> ..., loop (MyWholeNewState) funzione, rendendo tutto referenziale trasparente. – Zed