Prima un po 'di background. Sto codificando una ricerca su Age - > Vota. Ci sono 7 classi di età, quindi la tabella di ricerca è di 3 colonne (Da | A | Tasso) con 7 righe. I valori cambiano raramente: sono tariffe legiferate (prima e terza colonna) che sono rimasti gli stessi per 3 anni. Ho capito che il modo più semplice per memorizzare questa tabella senza hard-coding è nel database in una tabella di configurazione globale, come un valore di testo singolo contenente un CSV (quindi "65,69,0.05,70,74,0.06" è come i livelli 65-69 e 70-74 verrebbero memorizzati). Relativamente facile da analizzare quindi utilizzare.
Poi mi sono reso conto che per implementarlo avrei dovuto creare una nuova tabella, un repository per aggirarlo, test del livello dati per il repository, test unitari attorno al codice che disattenta il CSV nella tabella e test intorno al ricerca stessa L'unico vantaggio di tutto questo lavoro è evitare l'hard-coding della tabella di ricerca.
Quando parli con gli utenti (che attualmente usano direttamente la tabella di ricerca - guardando una copia cartacea) l'opinione è che "i tassi non cambiano mai". Ovviamente non è corretto: le tariffe sono state create solo tre anni fa e in passato le cose che "non cambiano mai" hanno avuto l'abitudine di cambiare - quindi per me programmare questo in modo difensivo non devo assolutamente memorizzare la tabella di ricerca in l'applicazione.
Tranne quando penso YAGNI . La funzione che sto implementando non specifica che le tariffe cambieranno. Se le tariffe cambiano, cambieranno ancora così raramente che la manutenzione non è nemmeno una considerazione, e la funzionalità non è in realtà abbastanza critica da mettere in pericolo qualcosa se ci fosse un ritardo tra la modifica della velocità e l'applicazione aggiornata. / p>
Ho praticamente deciso che nulla di valore andrebbe perso se indurizzo la ricerca e non sono troppo preoccupato per il mio approccio a questa particolare funzionalità. La mia domanda è, come professionista, ho giustamente giustificato tale decisione? I valori di codifica hard sono un cattivo design, ma il problema di rimuovere i valori dall'applicazione sembra violare il principio YAGNI.
EDIT Per chiarire la domanda, non sono preoccupato per l'effettiva implementazione. Sono preoccupato di poter fare una cosa brutta e cattiva, e giustificarlo dicendo YAGNI, o posso adottare un approccio più difensivo e ad alto sforzo, che anche nel migliore dei casi ha dei bassi benefici. Come programmatore professionista, la mia decisione di implementare un design che conosco è imperfetta si riduce a un'analisi costi / benefici?
EDIT Mentre tutte le risposte erano molto interessanti perché penso che questo dipenda dalle scelte progettuali di un individuo, penso che le risposte migliori siano state @ Corbin's e @ EZ Hart's che presenta cose che non avevo considerato nella domanda:
- la falsa dicotomia di "rimozione corretta dei valori codificati" spostandola nel database rispetto a "applicare in modo efficiente YAGNI" utilizzando l'hard-coding. C'era una terza possibilità di mettere la tabella di ricerca nella configurazione dell'app, che non comporta il sovraccarico del modo corretto e senza l'efficienza di YAGNI. Generalmente non siamo limitati a nessuna delle due / o decisioni, e quindi si riduce a una decisione in termini di costi / benefici. La generazione di codice
- può ridurre il sovraccarico di spostamento dei valori codificati nel database e in un modo che rimuove anche la mia decisione eccessivamente ingegnerizzata di elaborare un CSV nella tabella. Potenzialmente questo aggiunge anche un problema di manutenzione a lungo termine con il codice generato se i requisiti di base cambiano per il metodo di ricerca. Tutto ciò influisce solo sull'analisi costi / benefici, ed è probabile che se avessi avuto quell'automazione a disposizione non avrei nemmeno preso in considerazione l'hard-coding qualcosa del genere.
Sto marcando la risposta di @ Corbin come corretta perché cambia le mie ipotesi sui costi di sviluppo, e probabilmente aggiungerò alcuni strumenti di generazione del codice al mio arsenale nel prossimo futuro.