SmooshGate - kontrowersje wokół flatten i flatMap

W dzisiejszym poście przybliżę pewną ciekawostkę z JavaScriptowego świata. Opowiem o aferze, okrzykniętej humorystycznie w internecie jako #SmooshGate. Przybliżę jak powstają nowe standardy języka JavaScript i jakie towarzyszą temu problemy. Zaczynajmy!

# Flatten i FlatMap

Wielkie afery, skandale i sytuacje kontrowersyjne na świecie nazywane były z przyrostkiem "gate". Smoosh to nieoficjalna propozycja nazwy dla nowej funkcji w języku JavaScript. Stąd nazwa - SmooshGate. Ale zacznijmy od początku:

TC39 18 stycznia zaproponowało dodanie do języka JavaScript funkcji flatMap oraz flatten. Samą propozycję można zobaczyć tutaj: https://tc39.github.io/proposal-flatMap/

Czym jest TC39? To grupa będąca częścią instytucji standaryzującej język ECMAscript, znany nam jako JavaScript.

Obydwie funkcje rozszerzają typ tablicowy i mają podobną funkcjonalność. W skrócie:

flatten służy do "rozwijania" tablic zagnieżdżonych aż do podanej głębokości, czyli usuwania tablic zawierających się w innej tablicy i dodawaniu jej elementów do głównej tablicy. Spróbujmy może wytłumaczyć to jednak na przykładzie :)

flatMap działa jak zwykły map, który opisałem już wcześniej w "podstawy programowania funkcyjnego 3 map i filter", z tą różnicą, że "rozwija" zagnieżdżone tablice z głębokością 1.

# SmooshGate

A więc w czym problem, skoro funkcje znane z wielu bibliotek będą wprowadzane do oficjalnego standardu JavaScript? Kłopoty zaczęły się od zgłoszenia na portalu GitHub: https://github.com/tc39/proposal-flatMap/pull/56,
kiedy to zorientowano się, że ponad ośmioletnia biblioteka MooTools wykorzystuje nazwę flatten dodaną do array.prototype. Dodanie takiej funkcji w nowym standardzie JS spowodowałoby, że starsze strony internetowe mogłyby przestać działać. Polityka ECMA zakłada, że nie wolno dokonywać w języku zmian psujących kompatybilność wsteczną. Stąd zaproponowane przez użytkowników nazwy - smoosh oraz smooshMap.

# To smoosh or not to smoosh?

Szybko pojawiła się opozycja z ogromną ilością argumentów. Jeden z developerów postanowił nawet stworzyć bibliotekę, która "zarezerwuje" funkcję smoosh w prototypie typu tablicowego. Co więcej - zachęcając wszystkich do dodania jej do swojego projektu. Twórcy Webpacka i one drive wyrazili zainteresowanie dodania tej biblioteki, co można znaleźć na twitterze.

Więcej informacji: https://github.com/staltz/prevent-smoosh.

Flatten to bardzo popularna nazwa, służąca do "rozwijania" zagnieżdżonych tablic. Możemy znaleźć je w różnych bibliotekach, takich jak:

Przy czym flatMap możemy znaleźć tylko w bibliotece lodash.

Kolejnym istotnym miejscem zastosowania flatMap są monady znane z programowania funkcyjnego. Przeciwnicy nowej nazwy wysuwają argumenty, że używanie smoosh zamiast flatMap utrudni zrozumienie, skomplikowanych już bardzo monad, w których to funkcja ta jest wykorzystywana. Czasem pojawia się w ich implementacji nazwa chain(), czasem bind(), jednak to flatMap() jest najpopularniejsza. Prawdopodobnie nigdzie nie spotkamy się z nazwą smoosh.

# Jak stworzyć funkcję prototypową?

Z przyczyn, które opisałem powyżej wiemy, że dodawanie funkcji do prototypu typu tablicowego to bardzo zła praktyka, ale mimo wszystko - warto wiedzieć jak taka implementacja wygląda. Nie będziemy bawić się w implementację "rozwijania" tablic, mądrzejsi ludzie zrobili to już wcześniej.

Do prototypu typu tablicowego dodaliśmy przekornie nazwaną funkcję smoosh, która po użyciu zwraca nową, całkowicie zamienioną tablicę.

# Co dalej?

Nie chcę zabierać jakiegoś szczególnego stanowiska w tym temacie, jednak uważam, że jako i kompatybilność wsteczna jest priorytetem, tak jednak sama nazwa niekoniecznie musi być zmieniona na smoosh. Istnieją inne propozycje i alternatywy, które wyglądają znacznie lepiej i są bardziej intuicyjne.

Z wypowiedzi Ricka Waldrona z ECMA/TC39 wynika, że nazwy smoosh i smooshMap były użyte humorystycznie i nigdy nikt nie myślał o nich poważnie, a sama sprawa będzie w najbliższym czasie rozwiązywana przez TC39.

Published: April 09 2018

blog comments powered by Disqus