Dlaczego moment.js śmierdzi?
To będzie krótki post, ale cudaczność tej biblioteki naprawdę zasługuje na oddzielny wpis. Najprostszą odpowiedzią na tytułowe pytanie jest oczywiście to, że moment.js
został napisany w JavaScript, a język ten nie słynie z przemyślanych rozwiązań…
W czym rzecz?
Od kilku dni zajmuję się tematem działania datepickera dla różnych ustawień regionalnych. Jak łatwo się domyślić, potrzebowałem w tym celu walidacji daty zgodnie z ustalonym formatem. Ponieważ zabawkowy język do animacji płatków śniegu jakim jest JS, natywnie nie umożliwia zrobienia niczego sensownego z datami, musiałem użyć zewnętrznej biblioteki. Pomyślałem, że zastosuję moment.js
, który jest zachwalany jako najlepsze narzędzie do obsługi dat dla JS.
Szybki test:
Nie wiem doprawdy, jak można coś takiego osiągnać. Wygląda jak jakieś 10 lat wąchania przeterminowanego sudafedu. Jestem w stanie zrozumieć olewanie konkretnego separatora, trochę mniej olewanie zera wiodącego dla liczby dni/miesięcy, ale kompletne olewanie kolejności? I czemu się nie wywali, gdy dostanie totalna głupotę w formacie?
No nic, cudaczny moment.js
poszedł do kosza, okazało się, że są jednak lepsze rozwiązania w półświatku JS.
PS To jednak działa!
Jak zauważył jeden (jedyny?) z czytelników w komentarzach, da się zmusić moment.js
do poprawnej walidacji w ten sposób:
I to jest właśnie doskonały przykład code smell
. Musimy podać trzeci parametr, koniecznie o wartości true
, żeby drugi parametr zaczął działać. Absurd! Taki kod jest mylący i nieintuicyjny. Nie da się po prostu użyć, trzeba się wczytywać w dokumentację. A nawet po jej przeczytaniu właściwie nie wiadomo, o co chodzi, ani dlaczego proste i intuicyjne wywołanie nie zachowuje się zgodnie z oczekiwaniami.