Nelle nostre applicazioni per lo più di grandi dimensioni, di solito abbiamo solo poche posizioni per le costanti:
- Una classe per GUI e contstant interni (titoli di pagine di schede, titoli di caselle di gruppo, fattori di calcolo, enumerazioni)
- Una classe per le tabelle e le colonne del database (questa parte è codice generato) più i nomi leggibili per loro (assegnati manualmente)
- Una classe per i messaggi dell'applicazione (registrazione, caselle di messaggi, ecc.)
Le costanti sono solitamente separate in diverse strutture in quelle classi. Nelle nostre applicazioni C ++, le costanti sono definite solo nel file .h e i valori sono assegnati nel file .cpp.
Uno dei vantaggi è che tutte le stringhe ecc si trovano in un posto centrale e tutti sanno dove trovarle quando qualcosa deve essere cambiato.
Questo è soprattutto un aspetto che i project manager amano quando le persone vanno e vengono e in questo modo tutti possono cambiare cose così banali senza dover scavare nella struttura dell'applicazione.
Inoltre, puoi modificare facilmente il titolo di simili caselle di gruppo / pagine di tabulazioni contemporaneamente. Un altro aspetto è che puoi semplicemente stampare quella classe e darla a un non programmatore che può controllare se le didascalie sono intuitive e se i messaggi all'utente sono troppo dettagliati o troppo confusi ecc.
Tuttavia, vedo alcuni svantaggi:
- Ogni singola classe è strettamente accoppiata alle classi di costanti
- Aggiunta / rimozione / ridenominazione / spostamento di una costante richiede la ricompilazione di almeno il 90% dell'applicazione (Nota: la modifica del valore non lo fa, almeno per C ++). In uno dei nostri progetti C ++ con 1500 classi, ciò significa circa 7 minuti di tempo di compilazione (utilizzando intestazioni precompilate, senza che siano circa 50 minuti) più 10 minuti circa di collegamento con determinate librerie statiche.
- La creazione di una versione ottimizzata per la velocità tramite Visual Studio Compiler richiede fino a 3 ore. Non so se l'enorme quantità di relazioni di classe è la fonte, ma potrebbe anche essere.
- Si arriva direttamente al codice delle stringhe hard-coding perché si vuole testare qualcosa molto velocemente e non si vuole aspettare 15 minuti solo per quel test (e probabilmente ogni successivo). Tutti sanno cosa succede al "Lo aggiusterò più tardi" - pensieri.
- Riusare una classe in un altro progetto non è sempre così facile (principalmente a causa di altri accoppiamenti stretti, ma la gestione delle costanti non rende più semplice.)
Dove memorizzereste costanti come quelle? Inoltre quali argomenti porteresti per convincere il tuo project manager che ci sono concetti migliori che rispettano anche i vantaggi sopra elencati?
Sentiti libero di dare una risposta specifica o indipendente al C ++.
PS: So che questa domanda è soggettiva, ma onestamente non conosco nessun posto migliore di questo sito per questo tipo di domanda.
Aggiornamento su questo progetto
Ho notizie sulla cosa in fase di compilazione:
Seguendo i post di Caleb e di gbjbaanb, ho diviso il mio file delle costanti in molti altri file quando avevo tempo. Alla fine ho anche diviso il mio progetto in diverse librerie che ora era possibile molto più facile. La compilazione di questo in modalità di rilascio ha mostrato che il file generato automaticamente che contiene le definizioni del database (tabella, nomi di colonne e altro - più di 8000 simboli) e crea determinati hash ha causato enormi tempi di compilazione in modalità di rilascio.
La disattivazione dell'ottimizzatore di MSVC per la libreria che contiene le costanti DB ora ci ha permesso di ridurre il tempo di compilazione totale del tuo progetto (diverse applicazioni) in modalità di rilascio da un massimo di 8 ore a meno di un'ora !
Non abbiamo ancora trovato il motivo per cui MSVC ha difficoltà a ottimizzare questi file, ma per ora questo cambiamento allevia molta pressione dato che non dobbiamo più fare affidamento solo su build notturne.
Questo fatto - e altri vantaggi, come un accoppiamento meno stretto, una migliore riutilizzabilità, ecc. - mostrava anche che passare del tempo a suddividere le "costanti" non era affatto una cattiva idea; -)