UI-Muster in funktionalen Sprachen

11

Ich würde gerne anfangen, mit ClojureScript zu spielen, aber ich bin über einige Punkte verwirrt. Mein Problem ist, was ein guter Weg ist, um mit Statusänderungen umzugehen, die durch Benutzerinteraktion entstehen, wenn Sie versuchen, funktional zu arbeiten.

Lassen Sie mich einige Beispiele nennen. Ich denke an Anwendungen, die im Browser ausgeführt werden, aber ich denke, das Problem ist allgemeiner. Natürlich wird sich etwas ändern - zumindest das DOM. Ich möchte jedoch herausfinden, wie der Rest des Codes für die Arbeit mit unveränderlichen Datenstrukturen organisiert werden kann.

1) Angenommen, ich möchte einige Ereignisse an ein DOM-Objekt anhängen. Dies ist auf meist funktionale Weise nicht schwer zu tun: Wenn Sie den Knoten erstellen, fügen Sie ihm eine Hash-Map mit den verschiedenen Ereignishandlern hinzu. Aber betrachten wir den Fall , wo Sie Ereignis Delegation verwenden. Wenn Sie dann einen neuen Knoten erstellen, können Sie einen Ereignishandler an einen übergeordneten Knoten anhängen, der wahrscheinlich bereits vorhanden ist. Sie müssten also den Hash ändern, der dem bereits vorhandenen Knoten zugeordnet ist.

2) Angenommen, ich entwerfe ein Autocomplete-Modul für ein Eingabefeld. Jedes Mal, wenn der Benutzer eine Taste drückt, kann ich einen Server anrufen, um die Vorschläge zu erhalten. Das ist einfach. Aber jetzt nehme ich an, ich möchte es ein bisschen optimieren. Wenn ich weiß, dass alle Ergebnisse übereinstimmen, macht fooes keinen Sinn, erneut nach allen übereinstimmenden Ergebnissen zu fragen foobar. Ich kann nur das erstere filtern. Also muss ich eine Art Cache erstellen. Dieser Cache wird jedes Mal aktualisiert, wenn der Benutzer ein neues Wort einfügt, das keine Obermenge der zuvor eingegebenen Wörter ist. Nochmals: Wie modelliere ich den Cache? Der vernünftigste Weg scheint eine Hash-Map zu sein, die Wörter den Ergebnissen zuordnet, aber sie sollte veränderbar sein.

Können Sie einige Muster vorschlagen, die es einfacher machen würden, Änderungen aufgrund der Benutzerinteraktion in ein funktionales Design einzubeziehen?

Andrea
quelle
4
Nachschlagen "Functional Reactive Programming".
dan_waterworth
Dies ist nicht ganz dasselbe, aber mit (nebenwirkungsfreien) XSLT-Vorlagen, die DOM-Ereignissen entsprechen, die von einem Benutzer initiiert wurden, treten in Saxon-CE ähnliche Probleme auf. Ich sehe es gerne so, dass der Benutzer die Statusänderung auslöst, nicht das XSLT, also ist das irgendwie in Ordnung. Der Schlüssel besteht darin, sicherzustellen, dass der Code, der die Benutzerinteraktion und nachfolgende Statusänderungen verwaltet, stark vom Rest getrennt ist.
pgfearo
@pgfearo Haben Sie Ratschläge, wie Sie den Code so organisieren können, dass die Benutzerinteraktion ausreichend vom Rest getrennt bleibt?
Andrea
Es gibt keine gute Möglichkeit, mit Statusänderungen umzugehen, wenn Sie funktional arbeiten, da die funktionale Programmierung zustandslos ist.
Old Pro
3
@ Old Pro: Dies ist nicht ganz richtig. Während Sie in der funktionalen Programmierung eine Berechnung mithilfe einer Funktionsanwendung anstelle eines Nebeneffekts definieren, müssen Sie das Ergebnis der Berechnung möglicherweise irgendwo speichern. Der Schwerpunkt von FP liegt auf der Beschränkung der Verwendung von Status auf ein Minimum, während bei der imperativen Programmierung die schrittweise Transformation des Status (durch Nebenwirkungen) das grundlegende Werkzeug für die Definition einer Berechnung ist.
Giorgio

Antworten:

3

Wie in den Kommentaren erwähnt, sollten Sie nach "Functional Reactive Programming" suchen und einige der Beiträge unter http://prog21.dadgum.com/archives.html lesen . Genauer gesagt sollten Sie wahrscheinlich " Verlieben Sie sich nicht in Ihre Technologie ", " Code schreiben, wie Sie gerade gelernt haben, wie man programmiert ", " Funktionale Programmierung funktioniert nicht (und was Sie dagegen tun) " und vielleicht a lesen wenige andere.

Eine vollständige Vermeidung von Veränderlichkeit und Nebenwirkungen ist praktisch unmöglich. Sogar Haskell-Programmierer werden hin und wieder nutzen unsafePerformIO, um aus dem rein funktionalen, nebenwirkungsfreien, statisch typisierten Paradigma auszubrechen, um bestimmte Dinge zu tun. Wenn Sie dieses Projekt als rein akademische Übung beginnen, gehen Sie einfach vor und vermeiden Sie Veränderlichkeit und Nebenwirkungen so weit wie möglich. Wenn Sie jedoch versuchen, ein brauchbares Produkt innerhalb einer bestimmten Frist zu erstellen, wird Sie kein Muster retten.

davidk01
quelle