我正在使用 erlang、mnesia 和 webmachine 构建一个网站。我读过的大多数文档都赞扬了具有引用透明功能的优点。
问题是,所有数据库访问都是外部状态。这意味着访问数据库的任何方法都不再是引用透明的。
假设我在数据库中有一个用户对象和一些处理身份验证的函数。
引用不透明函数可能如下所示:
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.
上面的代码显然不是生产代码 - 它纯粹是为了说明目的而组成的。
我不想陷入教条。引用透明代码(如可证明的单元测试)的好处是否证明了不太友好的界面?在追求参照透明方面我应该走多远?