La lunghezza del documento d’identità nazionale è la prima cosa che si rompe quando un team internazionalizza un modulo. Una colonna dimensionata per il numero che un paese rilascia troncherà in silenzio il numero che ne rilascia un altro, e il guasto di solito emerge mesi dopo sotto forma di un ticket di assistenza su un cliente che non riesce a registrarsi.
Questo articolo esamina i modi in cui i numeri di identificazione differiscono tra i paesi, perché lo stesso paese può cambiare formato nel tempo e come costruire un percorso di validazione che sopravviva a entrambi i problemi.
Perché non esiste una lunghezza universale
I numeri di identificazione sono stati progettati dalle amministrazioni nazionali, per scopi nazionali, molto prima che qualcuno immaginasse un campo di modulo che avrebbe dovuto contenerli tutti insieme. Ogni progetto riflette una teoria diversa di a cosa serva il numero, e quella teoria si manifesta nella sua forma.
Alcuni numeri sono pura cifra, dimensionati affinché la popolazione non possa mai esaurire lo spazio. Alcuni mescolano lettere e cifre per guadagnare spazio senza allungarsi. Alcuni riservano i caratteri iniziali a un codice di categoria, a un ufficio emittente o a una regione. Alcuni incorporano la data di nascita del titolare. Alcuni aggiungono uno o due caratteri di controllo calcolati aritmeticamente dal resto.
Poiché i progetti differiscono, le lunghezze differiscono. I numeri vanno da una manciata di caratteri nei sistemi più piccoli a ben più di una dozzina nei più grandi, e l’intervallo è abbastanza ampio che qualunque regola a larghezza fissa è sbagliata da qualche parte.
Le famiglie di numeri di identificazione
Raggruppare i numeri per progetto anziché per paese è il modello mentale più utile, perché le conseguenze sulla validazione seguono il progetto e non la mappa.
| Famiglia | Forma tipica | Cosa significa per la validazione |
|---|---|---|
| Puramente numerico | Solo cifre, spesso con uno zero iniziale | Deve essere memorizzato come testo; mai convertirlo in un intero |
| Alfanumerico | Lettere e cifre mescolate in posizioni definite | Controlli posizione per posizione, non un semplice conteggio di cifre |
| Portatore di data | Data di nascita intrecciata nei caratteri iniziali | La data deve essere una data di calendario reale, cosa che quasi tutte le regole dimenticano |
| Con cifra di controllo | Caratteri di controllo aritmetici alla fine | I caratteri finali sono verificabili, ma solo secondo la regola pubblicata |
| Forma libera | Nessuna struttura su cui si possa contare | Lunghezza e limiti di caratteri sono gli unici controlli onesti |
Dove un numero porta caratteri di controllo, l’aritmetica è di solito una somma ponderata con l’applicazione di un modulo — la stessa idea di fondo usata da molti schemi di numerazione, ed è per questo che una singola spiegazione concettuale può servire diversi paesi anche se le costanti differiscono. Ciò che un carattere di controllo superato dimostra è limitato e va detto chiaramente ovunque lo si documenti: il numero è coerente al proprio interno, non che sia stato emesso a qualcuno.
La lunghezza del campo deve essere fissa?
No, e questa è l’assunzione più dannosa in assoluto in questo ambito. Una lunghezza fissa o tronca i formati più lunghi oppure riempie quelli più corti, ed entrambe le cose corrompono il valore. Il riempimento è peggiore del troncamento sotto un aspetto: un numero riempito sembra plausibile, quindi passa tranquillamente nei sistemi a valle prima che qualcuno se ne accorga.
Memorizza i numeri di identificazione come testo a lunghezza variabile e imponi un limite superiore generoso. Il limite esiste per impedire che un incolla accidentale riempia una colonna con un tema, non per affermare che ogni paese usi quel numero di caratteri. Se l’applicazione ha bisogno di una regola specifica per paese, applicala condizionalmente, dopo che il paese è noto.
C’è una seconda ragione per mantenere la colonna generosa. Un paese può cambiare formato e, quando lo fa, i record esistenti devono continuare a funzionare mentre i nuovi seguono la nuova regola. Una colonna esattamente della vecchia lunghezza non ha spazio per la transizione.
Cosa succede quando un paese cambia formato?
I formati cambiano davvero, e non solo in piccoli modi. Un paese può allungare un numero quando la popolazione supera lo spazio disponibile, aggiungere un carattere di controllo per ridurre gli errori di inserimento, riorganizzare i blocchi interni oppure sostituire uno schema con uno completamente diverso e concedere ai titolari un periodo di transizione durante il quale entrambi sono validi.
Per chi scrive validazione, la lezione è che la regola ha una data di entrata in vigore. Un controllo che accetta solo la forma attuale rifiuterà ogni record emesso secondo quella precedente, e quei record restano validi finché il paese dice che lo sono. Un controllo che accetta solo la vecchia forma è peggio.
In pratica questo significa due cose: mantieni le regole di validazione datate anziché senza tempo, e fai in modo che il messaggio di rifiuto descriva cosa c’è di sbagliato nel valore invece di annunciare che il numero della persona non esiste. Un modulo che accusa un titolare legittimo di avere un numero falso è un modulo che genera carico di assistenza.
Dove aiutano davvero le cifre di controllo?
I caratteri di controllo vale la pena implementarli quando la regola è pubblicata, perché intercettano i due errori di inserimento più comuni: un carattere digitato male e due caratteri adiacenti digitati nell’ordine sbagliato. Entrambi cambiano l’aritmetica e sono quindi entrambi rilevabili.
Il beneficio si ferma lì. Un carattere di controllo non ti dice se il numero appartenga a qualcuno, non conferma che la persona che lo cita ne sia il titolare e non rende il numero una credenziale. Qualunque processo che tratti un carattere di controllo superato come verifica dell’identità si affida all’aritmetica per un compito che l’aritmetica non può svolgere.
Per i test, quella distinzione determina dove appartiene la logica del carattere di controllo. È una regola di qualità dei dati — utile al punto di inserimento per intercettare errori di battitura, e utile in una suite di test per confermare che un generatore produca valori coerenti al proprio interno. Non è una regola di autenticazione, e una fixture che la tratta come tale codificherà un’assunzione di sicurezza che non è vera. I valori prodotti dal generatore di identità e dati di test sono record sintetici dal formato corretto, e servono a esercitare regole come queste; non sono numeri reali e non possono essere usati per farsi passare per l’identità di qualcuno.
Come si gestisce un paese che non hai modellato?
Mantieni un fallback onesto. Quando il paese è sconosciuto, o noto ma non modellato, accetta un’ampia gamma di caratteri e lunghezze, registra il paese accanto al valore e contrassegna il record come non validato invece di trattarlo in silenzio come corretto.
Due dettagli di progettazione rendono il fallback utilizzabile. Primo, rendi visibili nei monitoraggi i record non validati, così che la lacuna di copertura sia una quantità nota anziché una sorpresa. Secondo, non lasciare mai che il percorso di fallback sia quello che gira in produzione per un paese che hai già modellato — la regola permissiva è una rete di sicurezza, e una rete di sicurezza che cattura tutto impedisce alla regola rigorosa di scattare mai.
Vale la pena costruire una volta un confronto completo. Prendi lo stesso record a forma di persona, rendilo secondo le regole di diversi paesi e verifica che il campo li contenga tutti senza riempimento. I campi che sopravvivono a quel confronto sono di solito quelli che erano stati dichiarati come testo fin dall’inizio.
Per gli sviluppatori: progettare il campo dell’identificatore
Quattro decisioni portano il peso maggiore quando il campo viene definito: il tipo di colonna, la lunghezza massima, il set di caratteri e dove risiede la validazione. Azzecca le prime tre e la quarta diventa semplice.
- Tipo: testo a lunghezza variabile, sempre, con normalizzazione limitata alla rimozione dei separatori.
- Lunghezza: un limite superiore generoso anziché una dimensione esatta, scelto in modo che il formato nazionale più lungo conosciuto entri con spazio in abbondanza.
- Set di caratteri: qualunque sia l’unione usata dai paesi modellati, che in pratica significa lettere e cifre con i diacritici normalizzati via.
- Validazione: un ramo per ogni paese modellato, selezionato sul valore del paese, più un fallback documentato che non sovrascrive mai una regola modellata.
Sistema anche il lato tra campi. Un identificatore è significativo solo insieme al paese che l’ha emesso e, in alcuni paesi, insieme a una data di nascita, quindi quei tre campi dovrebbero viaggiare come gruppo nei file di fixture. E mantieni esplicita la nota della fixture: questi sono identificatori sintetici generati per i test software, non numeri reali, e nulla di essi va presentato come prova dell’identità di qualcuno.
Passi successivi
Verifica la lunghezza della colonna dell’identificatore nel tuo schema e confrontala con il formato più lungo che dichiari di supportare; se sono lo stesso numero, la colonna è troppo piccola. Poi genera una varietà di record nel generatore di identità attraverso diversi paesi e conferma che ciascuno superi le tue regole, incluso uno proveniente da un paese che non hai modellato, per dimostrare che il fallback funziona. Se i tuoi numeri portano caratteri di controllo, la guida alle cifre di controllo su questo sito mostra come si costruisce l’aritmetica.