
Viens CSS mainīgais, piecas pārskatīšanas kārtas un Swift rīkkopa, kas meloja
GeekBye v2.0.7 padarīja visu pārklājumu regulējami caurspīdīgu — kas izklausās pēc vienas rindas CSS izmaiņas, bet nekādā ziņā tāda nebija. Īstais stāsts ir par to, ko pamanīja koda pārskatīšana: divas virsmas, kas atteicās izbālēt, ierakstīšanas josla, kas pie tās pašas necaurspīdības izskatījās nepareizi, un kompilēts binārais fails, kas mainīja 672 baitus turp un atpakaļ, jo mūsu pašu dokumentācija pārskatītājam pateica nepareizo Swift versiju.
"Padari pārklājumu caurspīdīgu" ir tāds uzdevums, kas izklausās pēc slīdņa un CSS opacity īpašības. GeekBye v2.0.7 piegādāja tieši tādu lietotājam redzamu iznākumu — vienu regulējamu "gaišo režīmu", kas ļauj skatīties cauri asistenta paneļiem uz jebko, kas atrodas aiz tiem. Bet interesantākā daļa šajā laidienā nav pati funkcija. Tās ir piecas pārskatīšanas kārtas, kas bija vajadzīgas, lai to izdarītu pareizi, un kara stāsts par kompilētu bināro failu, kas mainīja izmēru, jo mūsu pašu dokumentācija meloja pārskatītājam.
Pareizais veids, kā padarīt visu UI caurspīdīgu
Naivā šī risinājuma versija ir izkaisīt necaurspīdības vērtību pa katru paneļa komponentu un uzskatīt to par pabeigtu. Tā ir uzturēšanas lamatas: ducis cieti iekodētu vērtību, kas sāk atšķirties tajā pašā brīdī, kad kāds pieskaras vienai no tām.
Tā vietā v2.0.7 izmanto vienu koplietotu CSS utilītu un žetonu katrai virsmai. Ir viena overlay-surface klase, kas paneļa fonu aprēķina no divām pielāgotām īpašībām: bāzes necaurspīdības, ko katra virsma deklarē pati sev (vadības josla, tērzēšana, transkripta burbuļi, koda bloki un tā tālāk katrs izvēlas savu), un globāla alfa reizinātāja, kas mīt pārklājuma saknē un atspoguļo lietotāja slīdņa iestatījumu. Katra virsma nolasa to pašu reizinātāju; katra saglabā savu raksturu. Kas ir izšķiroši — mērogojas tikai paneļa fons — teksts, ikonas un backdrop-blur paliek pilnībā atveidoti, tāpēc "caurspīdīgs" nekad nenozīmē "neizlasāms".
Divus lēmumus šajā dizainā ir vērts izcelt, jo tie ir starpība starp funkciju, kas palīdz, un tādu, kas rada atbalsta pieteikumus:
- Noklusējums ir pilnīgi necaurspīdīgs. Necaurspīdības iestatījums piegādes brīdī ir 100% — bezdarbība. Nevienam pārklājums pēc atjaunināšanas pēkšņi nekļuva caurspīdīgs; caurspīdīgums ir klāt, kad pēc tā sniedzies, un neredzams līdz tam.
- Iestatījums tiek validēts aizsargājoši. Ir viens patiesības avots minimumam, maksimumam, noklusējumam un solim, kā arī normalizētājs, kas sargā tukšo/trūkstošo gadījumu. Tas ir svarīgi JavaScript slazda dēļ:
Number(null)ir0, tāpēc trūkstošs iestatījums, naivi piespiedu kārtā pārveidots, pārklājumu pieķertu pie tā viscaurspīdīgākā stāvokļa, nevis pie noklusējuma. Normalizētājs to noķer, pirms tas var notikt.
Pavelc slīdni, un viss pārklājums pārkrāsojas tiešraidē, ieraksta laikā, jo katra virsma ir pierakstīta uz to pašu iestatījumu. Nekādas pārstartēšanas, nekādas pārlādes.
Ko pamanīja pārskatīšana (un ko viena monitora tests nekad neredzētu)
Šeit "viens CSS mainīgais" pārstāja būt vienkāršs. Pārskatīšanā parādījās trīs kļūdas, un divas no tām ir viena un tā pati mācība atšķirīgās maskās.
Panelis, kas negribēja izbālēt. Tastatūras īsceļu pārklājums palika ietiepīgi necaurspīdīgs, kamēr viss pārējais kļuva caurspīdīgs. Cēlonis: tas atveidojas ārpus DOM apakškoka, kas nes necaurspīdības mainīgo, tāpēc tas nekad nepārmantoja vērtību, kas kaskādē plūst lejup no pārklājuma saknes. CSS pielāgotās īpašības mantojas caur DOM koku — un, ja mezgls patiesībā nav tā vietas pēctecis, kur iestatīji mainīgo, tas klusi neko nesaņem. Risinājums bija iestatīt mainīgo lokāli arī uz šī paneļa.
Uzvedināšanas krāsojums, kas pazuda. Fn/Assist pogas zaudēja savu ciāna uzvedināšanas mirdzumu. Caurspīdīguma utilīta iestatīja fonu ar !important (tam ir jāuzvar pār virsmu noklusējumiem), un tas notecināja hover: fona krāsojumu uz tā paša elementa. Specifiskuma sadursme. Risinājums bija padarīt uzvedināšanas krāsojumu tikpat uzsvērtu, lai tas varētu uzvedināšanas brīdī atgūt pārsvaru.
Abas no tām ir viena un tā pati pamata patiesība: CSS mainīgā kaskāde ir īsta pareizības robeža, nevis stila detaļa. Mantošana un specifiskums izlemj, vai tava vērtība vispār sasniedz elementu, un neviens no tiem neparādās ekrānuzņēmumā, kamēr tas nav nepareizs.
Tāda pati necaurspīdība, atšķirīgs izskats. Vissmalkākā: ierakstīšanas josla un dīkstāves josla tika iestatītas uz identisku bāzes necaurspīdību un tomēr izskatījās redzami atšķirīgas. Kāpēc? Ierakstīšanas tablete izmantoja smagāku backdrop-blur, un spēcīgs izpludinājums virs tumša fona vidēji tuvojas tumšākam rezultātam — tāpēc vienāda alfa deva nevienādu izskatu. Tai arī bija blāva apmale, kur dīkstāves joslai bija spilgta gradienta gredzena mala. Risinājums saskaņoja izpludinājuma līmeni un gredzenu. Mācība iesēdās: vienāda alfa nav vienāds izskats, tiklīdz iesaistās izpludinājums. Caurspīdīgums ir mijiedarbojošos efektu sistēma, nevis viens skaitlis.
Binārais fails, kas mainīja izmēru, jo dokumentācija meloja
Tagad kara stāsts, un tas ir mans mīļākais veids — tāds, kur rīki un dokumentācija nesaskan un rūpīgs pārskatītājs nokļūst krustugunī.
GeekBye piegādā dažus iepriekš kompilētus Swift binārifos failus (vietējos palīgus tādām lietām kā sanāksmju noteikšana). Tā kā kompilēts binārais fails ir iekomitēts repozitorijā, katram izstrādātājam tas jākompilē ar tieši to pašu Swift versiju — atšķirīgas rīkkopas no identiska pirmkoda ražo atšķirīgus baitus, un tas nozīmētu fantoma git konfliktu katru reizi, kad kāds pārbūvē. Tāpēc ir skripts, kas īsteno vienu konkrētu versiju: Swift 6.3.x, pārbaudīts būvēšanas laikā.
Šī laidiena pārskatīšanas laikā pārskatītājs norādīja, ka binārais fails būtu jāpārbūvē, lai tas atbilstu "repozitorija pieprasītajai rīkkopai". Izstrādātājs izdarīja tieši to — un binārā faila izmērs mainījās no 89,184 baitiem uz 88,512. Komitas ziņojums pat teica, ka tas "atjauno baitu stabilu izvadi", pārbūvējot ar Swift 6.2.1, "repozitorija pieprasīto rīkkopu".
Vien 6.2.1 bija nepareizā versija. Būvēšanas īstenošanas skripts pieprasīja 6.3.x. Problēma bija tā, ka prozas dokumentācija — README un ieguldītāju rokasgrāmata — dažās vietās joprojām norādīja 6.2.1. Tāpēc apzinīgs pārskatītājs un apzinīgs izstrādātājs, abi cenšoties darīt pareizo, sekoja dokumentācijai taisni iekomitējot tieši to artefaktu, kuru īstenošanas skripts pastāv, lai noraidītu. 6.2.1 binārais fails 6.3.x repozitorijā ir tieši tā novirze, kas salauztu katra cita izstrādātāja tīro pārbūvi.
Nākamā komita to izlaboja — un risinājums ir pati būtība. Tas ne tikai pārbūvēja bināro failu atpakaļ tā 6.3.x formā (izmērs atjaunots uz 89,184, tieši atpakaļ, kur sākās). Tas arī izlaboja novecojušās "6.2.1" atsauces dokumentācijā, lai lamatas nevarētu no jauna izlēkt. Binārais fails divās komitēs pārmeta 672 baitus turp un atpakaļ, un īstā kļūda nekad nebija binārais fails. Tā bija tāda, ka divi patiesības avoti — īstenošanas skripts un rakstītā dokumentācija — nesaskanēja, un cilvēks uzticējās nepareizajam.
Trīs lietas, ko iemācīja šis laidiens
- CSS mainīgā kaskāde ir pareizības robeža. Divas no trim pārskatīšanas kļūdām sanāca no mainīgā, kas nepārmantojās, un
!important, kas sagrāva uzvedināšanas stāvokli. Ja vērtībai jāsasniedz elements caur mantošanu vai jāuzvar caur specifiskumu, šis ceļš ir loģika — pārbaudi to kā loģiku, nevis kā stilu. - Vienādi parametri var radīt nevienādus rezultātus. Ierakstīšanas josla un dīkstāves josla dalīja necaurspīdību un tomēr izskatījās atšķirīgas, jo cits izpludinājums mainīja iznākumu. Kad apvieno vizuālu sistēmu uz viena skaitļa, pārbaudi, vai pārējie mainīgie ap katru virsmu klusi nemaina to, ko šis skaitlis nozīmē.
- Kad dokumentācija un īstenošana nesaskan, salabo nesaskaņu — nevis tikai simptomu. Kļūda nebija slikts binārais fails; tā bija dokumentācija, kas nosauca nepareizo rīkkopu, un īstenošanas skripts, kas teica pretējo. Binārā faila pārbūvēšana ārstē simptomu. Panākt, lai katrs patiesības avots saskan, ir īstais risinājums, jo nākamais pārskatītājs arī uzticēsies dokumentācijai.
GeekBye v2.0.7 piegādāja vienveidīgu caurspīdīgumu, visi robežgadījumi pārskatīti un rīkkopas dokumentācija sakārtota. Tas ir pēdējais no "klusā amata" laidieniem pirms uzticamības sprinta, kas sekoja. Par pamatu, kas atrodas zem tā, skati ko patiesībā prasa versija 2 (v2.0.0); par radniecīgo pulēšanas laidienu — mierīga programmatūra: mirgošanas labojums un atbildes režīma žetons (v2.0.3 + v2.0.5); un par to, kā pārklājums paliek paslēpts zvana laikā — kā palikt neredzamam ekrāna koplietošanas laikā.