Attualmente sono incaricato di rilevare un sacco di codice scritto con nomi di campi posizionati nella costante Java nella parte superiore del file e quindi le query SQL create utilizzando la concatenazione di stringhe con i nomi dei campi. Nella parte superiore del file è presente il seguente blocco:
private static final String TABLE_VALID_USER = "valid_user_table";
private static final String TABLE_USER_MANAGEMENT = "V1_USER_MANAGEMENT_TABLE";
private static final String TABLE_ROLE_DEFINITION = "V1_ROLE_DEFINITION_TABLE";
private static final String TABLE_ROLE_MANAGEMENT = "V1_ROLE_MANAGEMENT_TABLE";
private static final String TABLE_USER_STATUS_DEF = "V1_USER_STATUS_DEFNITION";
private static final String COLUMN_NAME_OPEN_ID = "hashed_open_id";
private static final String COLUMN_NAME_INTERNAL_USER_ID = "internal_user_id";
private static final String COLUMN_NAME_USER_ID = "hashed_open_id";
private static final String COLUMN_NAME_USER_NAME = "name";
private static final String COLUMN_NAME_ROLE_ID = "role_id";
private static final String COLUMN_NAME_ROLE_NAME = "role_name";
private static final String COLUMN_NAME_USER_STATUS_CODE = "status_code";
private static final String COLUMN_NAME_USER_STATUS_NAME = "status_name";
private static final String DEFAULT_USER_STATUS = "Pending";
private static final String AS_NAME_COUNT = "cnt";
Più avanti nel codice, ci sono query SQL costruite in questo modo usando queste costanti nella costruzione delle stringhe.
Quello che devi ricordare è che questi sono molto distanti nel codice, quindi per scoprire che cos'è un nome di campo, devi scorrere su e giù per tutto il tempo. Per essere in grado di leggere la query, richiede un sacco di esercizio mentale. Mi rendo conto che per il programmatore originale questo non è un grosso problema, perché la colonna potrebbe essere hashed_open_id
ma quel programmatore ha ritenuto che il nome costante COLUMN_NAME_USER_ID
fosse un sostituto perfettamente accettabile per quello. La buona notizia è che questo è spiegato come id utente.
La cattiva notizia è che la colonna effettiva nel database è chiamata hashed_open_id che non è ovvia. Quando leggi il codice, impari questo nuovo simbolo arbitrario COLUMN_NAME_USER_ID
e devi ricordare che in realtà significa hashed_open_id
e devi farlo per ogni colonna della tabella! Sembrerebbe raddoppiare la quantità di cose che devi imparare per leggere il codice.
Per comprendere la query, è necessario avere conoscenza del database. Quando si utilizza il database, è necessario tenere a mente i nomi delle colonne reali. I simboli delle costanti Java non sono utili quando si ha a che fare con il browser dati SQL.
String sql =
"SELECT "
+ "COUNT(" + COLUMN_NAME_OPEN_ID +") as " + AS_NAME_COUNT + ", "
+ "FROM "
+ TABLE_VALID_USER + " "
+ "WHERE "
+ COLUMN_NAME_OPEN_ID + "= ? "
+ ";";
Non sarebbe meglio usare solo i nomi delle tabelle reali e i nomi delle colonne reali direttamente? Se lo facevi, la query sarebbe nel codice come:
String sql =
"SELECT COUNT(hashed_open_id) as cnt, "
+ "FROM valid_user_table "
+ "WHERE hashed_open_id= ? ;";
Quest'ultima query è chiaramente più facile da leggere e comprendere, soprattutto se si conosce la struttura della tabella effettiva. Puoi facilmente vedere esattamente come viene manipolato il nome della tabella e quali colonne sono coinvolte. Torna all'originale e prova a cercare i valori nelle costanti per arrivare alla stessa comprensione. E DEVI conoscere la struttura della tabella perché è manipolata da altre classi e altri programmi. Qualcuno crede davvero che usare le costanti come un ulteriore livello di reindirizzamento dei simboli in questo modo sia un vantaggio?
In teoria, se decidi di cambiare il nome di una colonna, vai in un punto e si propaga attraverso l'intero codice. Ehi, è bello, ma quanto spesso lo fai? E cambia solo questa classe ... ci sono altre classi e programmi, alcuni scritti in lingue diverse, che manipolano il tavolo. Un cambiamento della costante non cambierà mai tutto.
La leggibilità è importante. Non è la capacità di leggere, esaminare e comprendere rapidamente il codice da parte dei programmatori che manterranno il codice più importante della rara comodità di cambiare una colonna? Considera il codice che vive per 10 anni. Quanti nuovi programmatori dovranno leggere questo codice? Quante volte cambia il nome di una colonna?
E, immagina che hai bisogno di cambiare il nome di una colonna da hashed_open_id
a standard_user_id
è davvero così difficile fare una ricerca e sostituirla? Probabilmente dovevi fare la stessa cosa in alcuni script SQL usati per creare la tabella. La costante non è un simbolo universale per il nome della colonna. Il nome della colonna è un simbolo universale per il nome della colonna. Perché non usarlo direttamente ovunque? Il punto di un nome di colonna deve essere un simbolo per i dati nella colonna.
Qualcuno può pensare a qualche ragione che un ulteriore livello di riferimento per rendere le costanti Java per ogni colonna valga i problemi che provoca?