So che questo è un problema banale, ma sento che questo può essere più elegante.
Quindi ho bisogno di scrivere / leggere i file di dati per il mio programma, diciamo che per il momento sono CSV. Posso implementare il formato come ritengo opportuno, ma potrei aver bisogno di cambiare quel formato in seguito. La semplice cosa da fare è qualcosa come
out.write(For.getValue()+","+bar.getMinValue()+","+fi.toString());
È facile da scrivere, ma ovviamente è colpevole di hard coding e del problema generale del "numero magico". Il formato è hardcoded, richiede l'analisi del codice per capire il formato del file e la modifica del formato richiede la modifica di più metodi.
Potrei invece avere le mie costanti che specificano la posizione in cui voglio che ciascuna variabile sia salvata nel file CSV per rimuovere alcuni dei "numeri magici"; quindi salva / carica in una matrice nella posizione specificata dalle costanti:
int FOO_LOCATION=0;
int BAR_MIN_VAL_LOCATION=1;
int FI_LOCATION=2
int NUM_ARGUMENTS=3;
String[] outputArguments=new String[NUM_ARGUMENTS];
outputArguments[FOO_LOCATION] = foo.getValue();
outputArgumetns[BAR_MIN_VAL_LOCATION] = bar.getMinValue();
outptArguments[FI_LOCATOIN==fi.toString();
writeAsCSV(outputArguments);
Ma questo è ... estremamente prolisso e ancora un po 'brutto. Rende facile vedere il formato del CSV esistente e scambiare facilmente la posizione delle variabili all'interno del file. Tuttavia, se decido di aggiungere un valore extra al csv, non devo solo aggiungere una nuova costante, ma anche modificare i metodi di lettura e scrittura per aggiungere la logica che salva / legge effettivamente l'argomento dalla matrice; Devo ancora scovare ogni metodo usando queste variabili e cambiarle a mano!
Se utilizzo le enumerazioni Java, posso tranquillamente ripulirlo, ma il vero problema è ancora presente. A parte qualche tipo di programmazione funzionale (e le classi interne di java sono troppo brutte per essere considerate funzionali) non ho ancora modo ovvio di esprimere chiaramente quale variabile è associata ad ogni costante di scrittura (e di mantenimento) nei metodi di lettura / scrittura . Ad esempio, devo ancora scrivere da qualche parte che FOO_LOCATION specifica la posizione di foo.getValue ().
Sembra che ci dovrebbe essere un modo più carino, più facile da mantenere, per avvicinarsi a questo?
Per inciso, sto lavorando in Java al momento, tuttavia, sono interessato concettualmente all'approccio progettuale indipendentemente dalla lingua. Alcune librerie in java che fanno tutto il lavoro per me sono sicuramente benvenute (anche se potrebbe rivelarsi più complicato ottenere il permesso di aggiungerlo alla base di codice, quindi semplicemente scrivere qualcosa a mano velocemente), ma quello che sto chiedendo è di più su come scrivere codice elegante se dovessi farlo a mano.