Știi ce traductoarele, savepearlharbor

Există o serie de scoruri, care conține rezultatele jocurilor am fotbal ca un obiect cu domenii:

  • Potrivire cu un ID - Sala de jocuri;
  • meu - numărul de puncte în casa mea;
  • altele - numărul de puncte de adversarul meu.

Ai nevoie pentru a găsi numerele primele două jocuri câștigate de mine.

Date inițiale pentru problema (răspuns la o astfel de date - [1, 3]):

Decizia №1. ciclu obligatoriu

Să începem de departe, înapoi în acele zile când am scris ciclurile obligatorii uzuale și a suferit de stat mutabile (Sunt de acord că, în acest exemplu, nu cauzează probleme):

Este totul destul de simplu, frumos și rapid, dar imperativ și mutabil. Este important de remarcat faptul că iterație suplimentare nu se realizează, ciclul se termina imediat după matrice pentru a se obține numărul dorit de elemente.

Soluția №2. Array # # hartă și filtru Array

Aceasta este immutabelnoe solutie, mai expresiv, „modernă“.

Asta ar fi rezolvat cele mai multe dintre factorii de js în aceste zile, cred. Dar această soluție are o problemă majoră: În cazul în care soluția anterioară, am făcut doar un singur termen, iar el nu este până la sfârșitul anului, dar acum avem mai puțin de două treceri complete. Dacă avem scoruri cu milioane de articole, predicatul în filtru s-ar fi numit un milion de ori în funcția de hartă pentru a aplica un număr mai mic, dar încă mare de ori, iar în cele din urmă încă mai iau doar primele două elemente. Desigur, optimizarea prematură - rău, dar acest lucru este în orice poarta.

Decizia №3. convoluție

Prin convoluție se poate defini [aproape] orice operațiune pe matrice. În această decizie, avem doar o singură trecere:

Acest lucru este oarecum similar cu soluția cu ciclurile, dar aici vom trece starea intermediară în mod clar și immutabelno. Dar problema a rămas - în loc de două treceri acum avem una, dar este încă plină, adică, cu milioane de elemente pe care le vom trece peste un milion, chiar dacă numărul dorit de rezultate le-am obținut deja, deoarece standardul nu reduce posibil pentru a ieși din bucla prin pauză. Să ne scrie să reduceți, de la care puteți obține dacă rentabilitate redusă valoare (o idee împrumutată de la Clojure).

Uh, acum, atunci noi toți repede (o singură trecere și exact atâta timp cât nu primesc cantitatea potrivită de elemente), dar este frumos? Eu cred că codul de mai sus - teribil: există prea mult cod care nu se aplică problemei.

Decizia №4. Descompunerea redyusera, Traductoare

Redyuser de mai sus pot fi împărțite în 4 funcții mici, care va declanșa lanțul, în cazul în care o funcție este următoarea.

  1. Filtrele filterWins privind statutul jocului, adică, trece mai departe de-a lungul lanțului de câștigat doar jocul.
  2. mapGameID primește de la joc numărul ei.
  3. firstTwo verifică numărul de rezultate. În cazul în care mai puțin de două, aceasta determină următoarea funcție obține rezultate noi, iar apoi completează ciclul, dacă tastat suma dreapta.
  4. appendToResult adăugat sala de jocuri, în matrice cu rezultatele și o returnează.

Ca și cum simplificat, defalcate în funcții, dar sa dovedit înfricoșător. Scrisul nu este de fiecare dată foarte mult ca să. Dar vom repara asta mai târziu, atunci când ne unificăm codul pentru reutilitate.

Modelul ar putea suna familiar, pentru că este atât de a alerga middleware. Aceasta este middleware. Și acest lucru este traductoarele, deoarece traductoarele este middleware. Traductorul - o funcție care acceptă o redyuser și returnează noua (logica suplimentare înainte sau după redyusera de apel).

În această soluție, avem trei traductorului: filterWins. mapGameID și firstTwo. și noi le aplicăm în mod consecvent la redyuseru appendToResult. crearea de mai multe și mai complexe redyuser.

Acum, să unifice traductoare noastre:

În același timp, redenumiți redyuser:

Și doar pentru a adăuga la funcțiile de compoziție helper pentru a elimina parantezele:

Adăugați ajutor care se va aplica trancdyuser redyuseru și cauza pentru a reduce Get redyuserom:

În cele din urmă vom rezolva problema cu ajutorul tuturor acestor caracteristici:

Ia un frumos, rapid, funcțional, immutabelnoe gata pentru reutilizare soluție.

Traductoare - un model foarte simplu, care este un caz special de middleware model, care este cunoscut mult mai larg (de aici titlul articolului), în baza căreia - crearea de redyuserov complexe cu ajutorul compoziției. Un redyusery obținut, la rândul lor, sunt foarte versatile si pot fi folosite cu procesarea colecțiilor, fluxuri, Redux.

Scrieți tot codul pentru a lucra cu traductoare manual de fiecare dată când nu este necesară, deoarece traductoarele au fost mult timp puse în aplicare în mai multe biblioteci de prelucrare a datelor (de exemplu, ramda.js Clojure sau biblioteca standard)