Sto lavorando su un'applicazione web che memorizza identificatori, come nomi utente e indirizzi email in forma "normalizzata" e moduli "non normalizzati", per una serie di motivi. Ad esempio, un nome utente "John_Smith" verrebbe normalizzato in "johnsmith".
Tuttavia, alcune delle interfacce utente devono funzionare con la rappresentazione normalizzata, le altre non hanno bisogno di farlo. Continuando con lo stesso esempio, una visita alla pagina /user/John_Smith
, /user/johnsmith
o /user/jOhnsMith
dovrebbe restituire le stesse informazioni, quindi sarebbe necessaria la normalizzazione. D'altra parte, un endpoint API (ad esempio /api/update/?user=John_Smith&value=20
) non avrebbe bisogno di farlo.
Quindi, nel codebase ci sono alcune funzioni che normalizzano i nomi utente e altri che non:
class UserManager {
getUserInfo(username) {
normalized_username = normalize(username)
// do stuff with the normalized value
return info
}
updateValue(username, amount) {
// do stuff, without normalization
return info
}
// ...
}
Questo sembra molto incoerente, c'è un modo migliore?
L'unico modo migliore che potrei pensare è quello di richiedere che i chiamanti normalizzino gli argomenti della funzione prima di passarli e che tutte le funzioni funzionino esclusivamente su tali input normalizzati. (Tuttavia ucciderebbe il rigore dell'API, tuttavia, non è un requisito importante.)
(Sono consapevole del vero problema, è il fatto che le classi di entità non esistono nella base di codice. Se fossero state lì, sarebbe semplicemente una questione di Users.find('username', input_user)
o Users.find('normalized_username', normalize(input_user))
. Tuttavia, scrivere un mapper database-to-class non è realmente possibile in questo momento).