Знаеш ли какво преобразувателите, savepearlharbor

Има набор от резултати, съдържащ резултатите от игрите, които имам футбол като обект с полета:

  • gameID - Зала за игри;
  • ми - броя на точките, в къщата ми;
  • други - броя на точките от съперника си.

Трябва да се намери броя на първите две игри, спечелени от мен.

Първоначалните данни за проблема (отговор на такива данни - [1, 3]):

Решението №1. задължително цикъл

Да започнем от далеч, в онези дни, когато писахме обичайните задължителни цикли и страдал непостоянен състояние (Съгласен съм, че в този пример, за да не причинява никакви проблеми):

Всичко това е съвсем проста, приятно и бързо, но задължително и непостоянен. Важно е да се отбележи, че допълнително итерация не се извършва, цикълът завършва веднага след масива да се получи желаният брой елементи.

Решение №2. Array # карта и Array # филтър

Това е immutabelnoe на решение, по-изразителен, "модерно".

Това е, което щеше да реши повечето от JS вземащите в тези дни, предполагам. Но това решение има един основен проблем: Ако предишното решение, което направихме само една писта, а той не е до края, но сега имаме най-много два пълни цикъла. Ако имаме резултатите с помощта на милиони произведения, сказуемото във филтъра ще се нарича един милион пъти в функцията картата да се прилагат по-малък, но все пак голям брой пъти, а в края на краищата ние все още се вземат само първите два елемента. Разбира се, преждевременно оптимизация - зло, но това е по някакъв порта.

Решението №3. навиване

Чрез навиване може да определи [почти] всяка операция на масиви. В това решение, ние имаме само едно преминаване:

Това е нещо подобно на разтвора с циклите, но тук ние сме преминаване на междинното състояние ясно и immutabelno. Но проблемът остава - вместо два паса сега ние имаме един, но тя все още е пълен, това е, с милиони произведения, ние ще отидат над един милион, дори ако желаната броя на резултатите, които вече сме получили, защото стандартът не се намали възможно, за да излезете бримката през почивката. Нека след това да ни напишете своя намали, от които можете да получите, ако завръщането намалена стойност (една идея заимствана от clojure).

Ами, сега, а след това всички ние бързо (един пас и точно толкова дълго, колкото ние не се точното количество елементи), но тя е красива нали? Аз вярвам, че кода по-горе - ужасен: има твърде много код, който не се отнася до проблема.

Решението №4. redyusera на разлагане, преобразуватели

Redyuser горе, може да бъде разделена на четири малки функция, която ще задейства верига, където една функция е следното.

  1. filterWins филтри за състоянието на играта, т.е., преминава по-нататък по веригата само спечели играта.
  2. mapGameID получава от игра номера й.
  3. firstTwo проверява броя на резултатите. Ако по-малко от две, тя създава следната функция придобива нови резултати, а след това завършва цикъла, набран точното количество.
  4. appendToResult добавена игрална зала в масива с резултатите и го връща.

Както опростена, разделено на функции, но се оказа, страшно. Писането не е всеки път, много подобно на. Но ние ще поправим това по-късно, когато се обедини код за повторна употреба.

Моделът може да ви звучи познато, защото тя е толкова план мидълуер. Това е мидълуер. И това е на датчиците, защото датчиците е мидълуер. На датчиците - функция, която приема един redyuser и връща нов (допълнително логика преди или след redyusera за повикване).

В това решение, ние имаме три от датчиците: filterWins. mapGameID и firstTwo. и ние ги прилага последователно към redyuseru appendToResult. създаване на повече и по-сложни redyuser.

Сега нека да обединим преобразуватели:

В същото време преименувате redyuser:

И само да добавите към функциите на състав помощни за премахване на излишни скобите:

Добави помощник, който ще се прилага за trancdyuser redyuseru и причини за намаляване Get redyuserom:

Най-накрая се реши проблема с помощта на всички тези функции:

Вземи хубав, бърз, функционален, immutabelnoe готова за повторна употреба решение.

Преобразуватели - много прост модел, който е специален случай на мидълуер модел, който е известен като много по-широко (оттук заглавието на статията), въз основа на които - създаването на комплекс redyuserov използване на състава. А redyusery получени, от своя страна, са много гъвкави и могат да бъдат използвани с обработката на колекции, потоци, Redux.

Напишете целия код за работа с преобразуватели ръчно всеки път, когато не е необходимо, тъй като датчиците, отдавна са изпълнени в много библиотеки за обработка на данни (напр ramda.js clojure или стандартна библиотека)