Näin julkaisemme rahaan koskevia ominaisuuksia muuttamatta vahingossa kenenkään hintaa
Hinnoitteluvirhe on sellainen jota ei voi ottaa takaisin kun korttia on jo veloitettu. Tässä se kuri jolla lisäämme alennuksia, työntekijäkohtaisia hintoja ja tarjouksia varausvirtaan ilman että yksikään hinta liikkuu ennen kuin tarkoitamme niin.
Useimmat bugit maksavat sinulle anteeksipyynnön. Hinnoitteluvirhe maksaa hyvityksen, maksunpalautusriidan ja asiakkaan joka ei enää luota näytöllä olevaan lukuun. Panokset ovat epäsymmetriset, joten kaiken rahaan koskevan ympärillä oleva prosessi on tarkoituksella hitaampi kuin muu työmme. Tältä se näyttää, esimerkkinä yksi tuore ominaisuus: koko kategorian tarjous, jossa hoitola voi laittaa kaikki kasvohoidot tarjoukseen kerralla.
Oletuksena pois, tuotannossa, tekemättä mitään
Ominaisuuden ensimmäinen rivi on lippu. Se lukee ympäristömuuttujan ja on oletuksena pois päältä. Se tarkoittaa että voimme yhdistää ja julkaista koodin kauan ennen kuin se tekee mitään, ja jokainen hinta pysyy tavu tavulta samana kuin edellisenä päivänä. Ei ole mitään suurta julkaisuhetkeä josta hermoilla, koska julkaisu on erillinen ja tylsä askel jonka otamme kun olemme luottavaisia.
export const FEATURE_LIVE = process.env.FEATURE_LIVE === "true"; // Read at the one place it matters. When the flag is off, the branch// is skipped entirely: no extra query, no price change, nothing.if (FEATURE_LIVE) { const pct = await activeCategorySalePercent(orgId, "service", service.category); if (pct > 0) fullPriceCents = applyCategorySaleCents(fullPriceCents, pct);}Yksi funktio, yksi tehtävä
Alennuksen laskutoimitus asuu yhdessä puhtaassa funktiossa. Se ottaa sisään sentit ja prosentin ja palauttaa sentit. Sillä ei ole tietokantaa, ei pyyntöä eikä kelloa, mikä tarkoittaa että sen jokainen reunatapaus on helppo testata erillään: nollatarjous, tavallinen tarjous, katkaisu yläpäässä ja negatiivinen jota ei pitäisi koskaan tapahtua. Kun laskenta on yksi pieni funktio jonka pitää päässään, sitä lakkaa arvailemasta.
export function applyCategorySaleCents( baseCents: number, salePercent: number | null | undefined,): number { const base = cents(baseCents); const pct = Math.max(0, Math.min(100, Math.round(salePercent ?? 0))); if (pct === 0) return base; return cents((base * (100 - pct)) / 100);}Laske uudelleen palvelimella, aina
Selain näyttää hinnan jotta asiakas tietää mitä maksaa, mutta se luku on aina vain näyttöä varten. Kun varaus saapuu, palvelin lataa oikean palvelun, ratkaisee työntekijäkohtaisen hinnan, soveltaa mahdollisen voimassa olevan kategoriatarjouksen ja laskee sitten alennuksen, kaikki itse hakemastaan datasta. Jos joku muokkasi pyyntöä matkalla, se ei muuta mitään, koska hinta jolla korttia veloitetaan ei koskaan ollut se hinta jonka selain lähetti. Tämä on rahakoodin tärkein yksittäinen tapa: luottamusraja on palvelin, ja palvelin tekee laskun.
Yritä rikkoa se ennen kuin asiakas tekee sen
Läpimenevät testit kertovat että ne tapaukset joita ajattelit toimivat. Ne eivät kerro siitä tapauksesta jonka ohitit. Siksi ennen kuin hinnoittelulippu menee päälle, ajamme vihamielisen kierroksen, jonka ainoa tehtävä on löytää tapa saada rahat väärin. Erilliset tarkistukset ottavat kukin eri kulman: yksi metsästää mitä tahansa polkua joka veloittaa asiakkaalta liikaa, yksi metsästää polkua joka vie yritykseltä rahaa, yksi tarkistaa että ominaisuus on aidosti eloton kun lippu on pois päältä, ja yksi käy pyöristysten ja rajakohtien ryömimisen kimppuun. Tarjous kupongin päällä ennakkomaksun päällä on tasan se paikka johon murto-osasentti piiloutuu, joten sinne katsomme tarkimmin.
Mikään tästä ei ole nokkelaa. Se on lippu, pieni funktio, palvelin joka tekee omat laskunsa ja tapa yrittää rikkoa oma työnsä ennen julkaisua. Yhdessä ne ovat ero sen välillä että lisää rahaan koskevan ominaisuuden ja sen että menettää sen takia yöunensa.