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.
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.