Come immagazzino elegantemente i dati tabulari nel codice?

0

Diciamo che voglio memorizzare la data che non può essere modificata dall'utente nel codice. Ad esempio, la mia applicazione supporta dieci tipi di rapporti e voglio memorizzarne i metadati. Di solito, userei un dizionario costante per questo:

Private Shared ReadOnly ReportConfigurations As New Dictionary(Of Reports, ReportMetadata)() From
{
    {Reports.Foo, New ReportMetadata("Foo Report", PaperSize.A4, 8, 12, ...)},
    {Reports.Bar, New ReportMetadata("Bar Report", PaperSize.A4, 8, 14, ...)},
    ...
}

(Ovviamente, utilizzerei Const se .NET supportava i campi del dizionario costante e userei ImmutableDictionary se non fossi bloccato con una versione precedente del framework.)

Funziona bene, ma diventa difficile leggere velocemente una volta che il numero di campi di metadati aumenta (non puoi vedere a cosa si riferiscono i numeri 8 e 12 a meno che tu non aggiunga parametri con nome e i campi siano allineati bene solo se tu chiama i tuoi rapporti "Foo" e "Bar", che io non conosco). Un'opzione sarebbe quella di usare XML inline e analizzarlo (che è abbastanza semplice se la tua lingua lo supporta ):

Private Shared ReadOnly ReportConfigurations As XElement =
    <Reports>
        <Report Name="Foo Report" PaperSize="A4" 
                FontSizePx="8" BarcodeWidthCm="12"
                ... />
        ...
    </Reports>

ma mi manca la struttura tabulare. Idealmente, avrei qualcosa di simile

 ReportName | PaperSize | FontSizePx | BarcodeWidthCm | ...
 ---------------------------------------------------------------
 Foo Report | A4        | 8          | 12             | ...
 Bar Report | A4        | 8          | 14             | ...
 ...

ma aggiungere un foglio di Excel come risorsa al mio progetto e analizzarlo in fase di esecuzione sembra un terribile sovraccarico, solo per un po 'di maggiore leggibilità.

C'è qualche soluzione elegante che mi è sfuggita?

Domanda correlata:

posta Heinzi 10.07.2016 - 11:42
fonte

4 risposte

4

Un formato semplice per la memorizzazione dei dati tabulari è CSV . Allegalo come risorsa, proprio come avevi pianificato di fare con il documento Excel.

In teoria puoi persino modificarlo usando il software standard spreadsheed, anche se ci saranno problemi con questo:

  • CSV non codifica i tipi, quindi Excel utilizzerà l'euristica per rilevare ad es. date, che possono danneggiare dati che sembrano un particolare tipo ma non lo sono.
  • Excel utilizza diversi separatori, formati di data, separatori decimali, ecc. a seconda delle impostazioni regionali del computer su cui viene eseguito. AFAIK non c'è sapore di CSV che funzioni con Excel indipendentemente dalla cultura.
  • Excel utilizza la codifica legacy invece della codifica UTF-8. L'utilizzo della scheda come separatore potrebbe evitare questo problema.

Un'alternativa interessante è il formato json-lines, in cui ogni riga è un valore json indipendente, ma manca il supporto software.

    
risposta data 10.07.2016 - 12:08
fonte
1

Penso che la soluzione che hai sia quella giusta. Se i metadati del rapporto sono dichiarati in un posto, sembra che sarebbe abbastanza leggibile? Tuttavia, un modo per renderlo più leggibile sarebbe creare un builder per la classe ReportMetaData . Ecco un esempio per Java (anche se dovrebbe applicarsi altrettanto bene a C #): link

    
risposta data 10.07.2016 - 18:02
fonte
0

Mi piace l'idea dell'XML per cose semplici come questa. Se si ristruttura l'XML, la leggibilità aumenta. Qualcosa di simile.

    Dim ReportConfigurations As XElement =
        <Reports>
            <Report>
                <name>Foo Report</name>
                <papaersize>A4</papaersize>
                <fontsize>8</fontsize>
                <barcodewidthcm>12</barcodewidthcm>
                <!-- etc -->
            </Report>
            <Report>
                <name>Bar Report</name>
                <papaersize>A4</papaersize>
                <fontsize>10</fontsize>
                <barcodewidthcm>14</barcodewidthcm>
                <!-- etc -->
            </Report>
        </Reports>
    '  OR
    '   ReportConfigurations = XElement.Load("path")

    Dim reportProto As XElement =
        <Report>
            <name></name>
            <papaersize></papaersize>
            <fontsize></fontsize>
            <barcodewidthcm></barcodewidthcm>
            <!-- etc -->
        </Report>

    'to add new report
    Dim newReport As New XElement(reportProto)
    newReport.<name>.Value = "new report"
    newReport.<papaersize>.Value = "Letter"
    'etc
    ReportConfigurations.Add(newReport)

    '  ReportConfigurations.Save("path")
    
risposta data 11.07.2016 - 13:33
fonte
0

L'ho visto fare con le schede dopo le virgole prima di così.

{Reports.ReallyLongFoo, New ReportMetadata("Really Long Foo Report",    PaperSize.A4,   8,  12, ...)},
{Reports.ShorterBar,    New ReportMetadata("Shorter Bar Report",        PaperSize.A4,   8,  14, ...)},

Purtroppo combatte contro qualsiasi formattazione automatica del blocco di codice.

    
risposta data 11.07.2016 - 16:20
fonte

Leggi altre domande sui tag