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?
quelle
Antworten:
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.quelle