Tema
/
Interneto svetainių kliento dalies kūrimas JS

Tylus melas — kai pamiršti vieną perpiešimą

Dabar — skausmas. Pridedam naują funkciją: „Remove" mygtuką kolekcijoje. Kodo stulpelyje removeFromCollection atrodo teisingai:

function removeFromCollection(date) {
  favorites = favorites.filter(f => f.date !== date);
  renderCollection();   // eilutė dingsta — atrodo padaryta!
  renderHome();         // skaitiklis sumažėja
  // ...bet PAMIRŠOM renderGallery().
}

Rašydamas galvoji apie tai, ką matai — kolekciją, kurioje spaudi „Remove", ir skaitiklį. Perpieši juos — atrodo baigta. Bet ta pati nuotrauka yra ir galerijoje, ir ten jos ♡ liko užpildytas. Programa dabar sako „išsaugota", nors nebeišsaugota.

Atkurk pats:

1. Įdėk nuotrauką į kolekciją (♡ galerijoje užsipildo).
2. Nueik į kolekciją, paspausk „Remove".
3. Grįžk į galeriją → ta pati nuotrauka VIS DAR su pilnu ♡.

Jokios klaidos konsolėje. Jokio įspėjimo. Testai praeina (juk kolekcija atsinaujino). Klaida iškeliauja į produkciją, ir ją randa vartotojas. Tai — tylus melas: DOM rodo viena, duomenys sako kita.

Ir esmė ne ta, kad „buvai neatidus". Esmė struktūrinė: kiekvienas veiksmas privalo žinoti pilną vaizdų, priklausančių nuo jo liečiamų duomenų, aibę — ir nieko nėra, kas tai užtikrintų. Kuo daugiau veiksmų ir vaizdų, tuo daugiau tokių porų „veiksmas × vaizdas", ir vieną nutylėti — tik laiko klausimas.

Vaistas — 9 pamokoje. Vietoj to, kad kiekvienas veiksmas kviestų kiekvieną vaizdą, būsena vieną kartą paskelbia „aš pasikeičiau", ir kiekvienas vaizdas atsinaujina pats. Tai — subscribe/notify (pub/sub). Veiksmas nustos rūpintis vaizdais; jam terūpės duomenys.

Spąstai — pamirštas perpiešimas

Rankinis būsenos valdymas nelūžta iškart — jis lūžta tyliai ir vėliau. „Nepamiršk perpiešti visų priklausomų vaizdų" nėra kodo taisyklė; tai — disciplina. O disciplina masto neatlaiko. Būtent todėl atsirado būsenos valdymo bibliotekos ir karkasai — ne dėl mados, o dėl šito konkretaus skausmo.