Я создаю веб-сайт, используя erlang, mnesia и веб-машину. Большая часть прочитанной мной документации восхваляет достоинства ссылочно-прозрачных функций.
Проблема в том, что весь доступ к базе данных является внешним состоянием. Это означает, что любой метод, обращающийся к базе данных, больше не является прозрачным с точки зрения ссылок.
Допустим, у меня есть пользовательский объект в базе данных и некоторые функции, связанные с аутентификацией.
Ссылочно непрозрачные функции могут выглядеть так:
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.
Ссылочная прозрачность требует, чтобы я минимизировал количество ссылочно непрозрачного кода, поэтому вызывающая сторона должна получить объект из базы данных и передать его в качестве аргумента функции:
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.
Приведенный выше код, очевидно, не является производственным кодом — он составлен исключительно для иллюстративных целей.
Я не хочу втягиваться в догму. Оправдывают ли преимущества ссылочно-прозрачного кода (например, доказуемое модульное тестирование) менее дружественный интерфейс? Насколько далеко я должен зайти в погоне за ссылочной прозрачностью?