Wpis z mikrobloga

Tym razem wpis z #programowanie i trochę #zalesie

Jak ja nie lubię #javascript :D w weryfikatorze ciągłości operacji (czy nie ma ujemnych akcji) miałem ciekawego bug-a. (blokował czasami import, nie miał wpływu na wyliczenia).

Dla przykładowego sortowania tablicy obiektów sposób działania był inny na Chrome niż na Firefox.
Okrojony pseudokod poniżej:
--------------
let tablica = [ { id: null, nazwa: 'A' }, { id: null, nazwa: 'B' } ];
console.table(tablica);
tablica.sort(foo);
console.table(tablica);
function foo(itemA, itemB) {
if(itemB.id === null) {
return -1;
}
if(itemA.id === null) {
return 1;
}
return 1;
}
-------------
Ten sam kod zwróci dwa różne wyniki, ponieważ kolejność przekazywania elementów do 'itemA' i 'itemB' różni się pomiędzy przeglądarkami.
Można wkleić ten kod bezpośrednio w konsoli deweloperskiej i zobaczyć jak na FF po posortowaniu na pierwszym miejscu jest obiekt z nazwą 'A' natomiast w Chrome obiekt z nazwą 'B'.

Poprawka była super prosta by sortowanie było deterministyczne na wszystkich przeglądarkach ale niesmak pozostał.
Na dodatek nauczka by testy uruchamiać na wszystkich przeglądarkach przy każdym release.

#kalkulatorgieldowy #gielda
  • 5
@kalkulatorgieldowy: Sortowanie wymaga funkcji, która znajduje uporządkowanie między dwoma elementami, Twoja funkcja tego nie robi, więc nie powinna być używana do sortowania. Równie dobrze mógłbyś wstawić tam random i się dziwić, że nie sortuje. Różnice w algorytmach sortowania między implementacjami tego samego języka to norma, więc nic dziwnego, że dla nieprawidłowego komparatora dają różne nieprawidłowe wyniki – bo nie ma prawidłowego wyniku.
@vytah: to jest tylko wycinek funkcji i w granicznym przypadku dochodziło do tego warunku, który tak jak zaznaczyłeś równie dobrze mógł być random :)
Nie narzekam na implementacje interpretatora bo był to mój oczywisty błąd - powtarzalność (każdy rebuild odpala wszystkie testy a rebuild jest przy dowolnej zmianie w dowolnym pliku) rezultatu na FF dała mi fałszywe poczucie bezpieczeństwa.
False positive is a bitch :D