Qual è la migliore pratica per leggere un gran numero di impostazioni personalizzate da un file di testo?

4

Quindi ho cercato un codice che ho scritto qualche anno fa per un programma di simulazione economica. Ogni simulazione ha un gran numero di impostazioni che possono essere salvate in un file e successivamente caricate di nuovo nel programma per ripetere la simulazione stessa / simile. Alcune delle impostazioni sono opzionali o dipendono da ciò che viene simulato.

Il codice per leggere i parametri è fondamentalmente una dichiarazione switch molto grande (con alcune istruzioni switch nidificate). Mi stavo chiedendo se c'è un modo migliore per gestire questa situazione.

Una riga del file delle impostazioni potrebbe essere simile a questa:

#RA:1,MT:DiscriminatoryPriceKDoubleAuction,OF:Demo Output.csv,QM:100,NT:5000,KP:0.5 //continues...

E parte del codice che avrebbe letto quella riga:

switch( Character.toUpperCase( s.charAt(0) ) )
{
    case 'R':
         randSeed = Integer.valueOf( s.substring(3).trim() );
         break;
    case 'M':
          marketType = s.substring(3).trim();
          System.err.println("MarketType: " + marketType);
          break;
    case 'O':
          outputFileName = s.substring(3).trim() ;
          break;
    case 'Q':
          quantityOfMarkets = Integer.valueOf( s.substring(3).trim() );
          break;
    case 'N':
          maxTradesPerRound = Integer.valueOf( s.substring(3).trim() );
          break;
    case 'K':
          kParameter = Float.valueOf( s.substring(3).trim() );
          break;
 // continues...
}
    
posta jawilmont 14.08.2011 - 21:48
fonte

3 risposte

7

Dal punto di vista del codice, il metodo più pulito sarebbe passare a Properties class . È stato creato per gestirlo, sebbene sia necessario definire tutte le impostazioni (anche quelle non utilizzate) nel file letto o avere costanti predefinite in un file sorgente che è possibile utilizzare se il file delle proprietà restituisce null per un particolare proprietà denominata.

Se non puoi cambiare lo schema, potresti seguire la strategia generale di avere un Hashtable , che è proprio ciò che fa la classe Properties - legge comodamente un file in Hashtable . Farebbe praticamente rotolare le tue proprietà. Ancora una volta, dovresti avere valori preimpostati definiti in qualche modo per gestire casi in cui un'impostazione di cui hai bisogno potrebbe non esistere nel file.

Il modo in cui useresti uno è semplicemente di interrogare la struttura dei dati ogni volta che hai bisogno di un valore. Puoi imporre che esiste nella struttura dei dati (lanciare un'eccezione e terminarla) o definire i valori predefiniti in qualche modo (probabilmente in un file sorgente).

    
risposta data 14.08.2011 - 21:57
fonte
3

Una libreria eccellente per questo tipo di lavoro è Configurazione di Apache Commons

provides a generic configuration interface which enables a Java application to read configuration data from a variety of sources. Commons Configuration provides typed access to single, and multi-valued configuration parameters as demonstrated by the following code:

    Double double = config.getDouble("number");
    Integer integer = config.getInteger("number");

Configuration parameters may be loaded from the following sources:

  • Properties files
  • XML documents
  • Windows INI files
  • Property list files (plist)
  • JNDI
  • JDBC Datasource
  • System properties
  • Applet parameters
  • Servlet parameters

Different configuration sources can be mixed using a ConfigurationFactory and a CompositeConfiguration. Additional sources of configuration parameters can be created by using custom configuration objects. This customization can be achieved by extending AbstractConfiguration or AbstractFileConfiguration.

The full Javadoc API documentation is available here...

    
risposta data 15.08.2011 - 12:52
fonte
0

Quasi tutte le applicazioni e i framework decenti che conosco utilizzano XML per archiviare le configurazioni.

Suggerirei di creare una classe di configurazione se usi java. Quindi puoi usare JAXB per annotare e serializzare questa classe. Dopodiché, leggere e scrivere il file XML tramite il modello è una cosa semplice da fare.

    
risposta data 04.06.2014 - 20:12
fonte

Leggi altre domande sui tag