나는 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.
Referentially 투명성 내가 referentially 불투명 코드의 양을 최소화하는 것이 필요하므로 발신자는 데이터베이스에서 개체를 가져오고 인수로 그에 통과해야합니다 : 같은
Referentially 불투명 기능을 보일 수 있습니다 함수 :
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.
위의 코드는 분명히 생산 코드가 아니며 설명 목적으로 만 작성되었습니다.
저는 독단에 빠져들고 싶지 않습니다. 명확한 투명 코드 (증명 가능한 단위 테스트와 같은)의 이점은 덜 친숙한 인터페이스를 정당화합니까? 내가 얼마나 멀리 떨어진 곳에서 투명성을 추구해야 하는가?
루프 (MyWholeState) -> 루프 (X-> X 끝, MyWholeState 수신) 및 루프 (RecvHttp, MyWholeState) -> ..., 루프 (MyWholeNewState) 루프 만 있으면 전체 데이터베이스를 제거 할 수 있습니다. 모든 것을 참조하는 것을 투명하게 만듭니다. – Zed