Ich erstelle eine Website mit Erlang, Mnesia und Webmachine. Die meisten Dokumente, die ich gelesen habe, loben die Vorzüge von referentiell transparenten Funktionen.Wie weit soll ich referentielle Transparenz nehmen?
Das Problem ist, alle Datenbankzugriff ist externer Zustand. Dies bedeutet, dass jede Methode, die die Datenbank trifft, nicht mehr referenziell transparent ist.
Sagen wir, ich habe ein Benutzerobjekt in einer Datenbank und einige Funktionen, die sich mit der Authentifizierung befassen.
referenziell undurchsichtige Funktionen könnten wie folgt aussehen:
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.
referenziell Transparenz erfordert, dass ich die Menge an referenziell undurchsichtigen Code zu minimieren, so dass der Anrufer muss das Objekt aus der Datenbank erhalten und dass ein als Argument übergibt in Funktion:
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.
Der obige Code ist offensichtlich nicht Produktionscode - es ist nur zur Veranschaulichung gemacht.
Ich möchte nicht in Dogma gesaugt werden. Nutzen die Vorteile von referenziell transparentem Code (wie der Test von beweisbaren Einheiten) die weniger benutzerfreundliche Schnittstelle? Wie weit sollte ich in Bezug auf die Transparenz der Referenz gehen?
Sie können nur die gesamte Datenbank loswerden, nur eine Schleife (MyWholeState) -> Schleife (erhalten X -> X Ende, MyWholeState) und Schleife (RecvHttp, MyWholeState) -> ..., Schleife (MyWholeNewState) Funktion, alles referenziell transparent machen. – Zed