Estoy construyendo un sitio web usando erlang, mnesia y webmachine. La mayoría de la documentación que he leído elogia las virtudes de tener funciones referencialmente transparentes.¿Cuán lejos debería tomar la transparencia referencial?
El problema es que todo el acceso a la base de datos es de estado externo. Esto significa que cualquier método que llegue a la base de datos ya no es referencialmente transparente.
Digamos que tengo un objeto de usuario en una base de datos y algunas funciones que se ocupan de la autenticación.
funciones referencialmente opacos podría ser como:
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.
referencialmente transparencia exige que puedo minimizar la cantidad de código referencialmente opaco, por lo que la persona que llama debe obtener el objeto de la base de datos y pasar esa como argumento a una función:
handle_web_request(http_info) ->
User = get_user(http_info.userid),
is_authorized_user(User),
...
%referentially opaque
get_user(userid) ->
get_user_from_db(userid).
%referentially transparent
is_authorized(userobj) ->
userobj.is_authorized.
%referentially transparent
lots_of_other_functions(that_are_similar) ->
foo.
El código anterior obviamente no es un código de producción, está hecho solo con fines ilustrativos.
No quiero quedar atrapado en el dogma. ¿Los beneficios del código referencialmente transparente (como las pruebas probables de la unidad) justifican la interfaz menos amigable? ¿Qué tan lejos debo ir en la búsqueda de la transparencia referencial?
Puede deshacerse de toda la base de datos, teniendo solo un bucle (MyWholeState) -> loop (recibir X -> X end, MyWholeState) y loop (RecvHttp, MyWholeState) -> ..., loop (MyWholeNewState) función, haciendo todo referencial transparente. – Zed