Ist das ein Spot für funktionale Objektive in Javascript?

8

Herumspielen mit point-free style Javascript zum Spaß.

Sagen wir, ich kodiere das Videospiel Diablo, und ich modelliere Gegner mit komplexen verschachtelten Typen wie dieser, aber tiefer und komplizierter:

%Vor%

Ich habe also eine Liste aller meiner Feinde. Ich möchte allen Feinden in einem bestimmten Radius Schaden zufügen

%Vor%

das gibt natürlich keinen check - meine Kombinatoren nehmen Primitive, also muss ich "down level" mappen und filtern. Ich möchte die Filter / Map-Business-Logik-Pipeline nicht verdecken. Ich weiß Linsen können mir helfen aber lassen Sie uns sagen, ich bin in einem Browser, als Das ist natürlich trivial mit veränderlichen Strukturen. Wie mache ich das?

    
Dustin Getz 04.09.2013, 03:29
quelle

2 Antworten

6

Lesen mein Artikel über Linsen . Es beantwortet Ihre Frage genau so, wie Sie es formuliert haben. Ernsthaft, ich mache nicht einmal Witze. Hier ist ein Codeausschnitt von meinem Beitrag:

%Vor%     
Gabriel Gonzalez 04.09.2013 03:38
quelle
6

Ist Ihre Frage, wie man Objektive in Javascript verwendet? Wenn ja, kann ich vielleicht helfen. Haben Sie die Ramda.js-Bibliothek ausgecheckt? Es ist eine großartige Möglichkeit, funktionale JS zu schreiben. Fangen wir mit einem Blick auf das gegnerische Modell an:

%Vor%

Linse: Um ein Objektiv zu konstruieren, benötigen Sie eine Getter-Methode und eine Setter-Methode für Ihr spezifisches Objekt - in Ihrem Fall den "Feind". Hier ist, wie Sie diese mit der Hand konstruieren können.

Methode 1: Erstellen Sie Ihre eigenen Getter und Setter

%Vor%

Methode 2: Ramdas zweckmäßiges Convenience-Objektiv für Objekte

%Vor%

Sobald Sie das Objektiv erstellt haben, ist es Zeit, es zu verwenden. Ramda bietet 3 Funktionen für die Verwendung von Objektiven: view(..) , set(..) und over(..) .

%Vor%

Da du die Funktion fireDamage(..) auf den Gesundheitszustand eines Gegners anwendest, solltest du over(..) verwenden. Da deine Positionskoordinaten im gegnerischen Modell verschachtelt sind, wirst du auch ein Objektiv verwenden wollen, um auf diese zuzugreifen. Lassen Sie uns eine erstellen und isInRange(..) umgestalten, während wir dabei sind.

Als Referenz ist hier der Ursprung fn:

%Vor%

Hier ist ein funktionaler Ansatz:

%Vor%

So würde das aussehen, wenn es sich um eine Sammlung von feindlichen Modellen handelt:

%Vor%

Ich hoffe, dies zeigt, wie nützlich Linsen sein können. Während es viele Hilfsfunktionen gibt, denke ich, dass das Endstück des Codes super semantisch ist!

Zum Schluss überflute ich meinen Anwendungsbereich mit diesen Funktionen von Ramda, um dieses Beispiel lesbarer zu machen. Ich benutze ES6 Dekonstruktion, um dies zu erreichen. Hier ist wie:

%Vor%

Probieren Sie es in jsBin aus! Sie bieten Ramda-Unterstützung.

    
wpcarro 02.03.2016 21:08
quelle