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 foo
es 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?