Progettazione API: dovrei usare stringhe o enum per le chiavi del dizionario

2

Sto lavorando su un'API in C #. Sto cercando di pensare al modo più semplice per esporre la mia API per i consumatori. In particolare, ho una classe nel mio modello di dati esposti che ha una proprietà di dizionario. Sto cercando di decidere se la proprietà del dizionario deve usare le stringhe come chiavi o un enum che definisco come chiavi.

Il mio interesse nell'usare stringhe come chiavi è che l'onere risiede nella documentazione per fornire ogni possibile valore di chiave stringa e gli utenti finiscono per lavorare con stringhe letterali che potrebbero causare errori di battitura o di duplicazione.

La mia preoccupazione per le enumerazioni è che se dovessimo mai cambiare l'elenco delle possibili chiavi del dizionario, questa potrebbe essere una modifica irrisolta per l'API.

Mi sto appoggiando all'enum, ma i miei colleghi pensano che una corda sarebbe la migliore. Qualcuno là fuori ha qualche pensiero o consiglio su questo?

    
posta Brian 06.06.2016 - 17:21
fonte

2 risposte

7

In che modo viene esposta l'API? Attraverso un'interfaccia .NET ordinaria o tramite REST o simili?

  • Nel primo caso, enum s è una buona scelta se hai una quantità limitata di valori accettati. Puoi controllare valori validi con Enum.IsDefined , puoi avere una documentazione XML in linea che spiega ogni valore e gli errori di battitura sono controllati dal compilatore (e vengono rilevati anche prima con un IDE abilitato).

    Assicurati che tutti utilizzino i valori in una forma MyEnum.SomeValue e non in una forma di interi sottostanti. Se qualcuno usa numeri interi, il rischio è che quando si modifica l'ordine dei valori all'interno di enum o si aggiungano i valori nel mezzo di esso o si rimuovano i valori si cambierà la corrispondenza tra alcuni valori e i numeri sottostanti.

    Nota anche l'importanza di Enum.IsDefined . Il seguente codice, e in particolare l'ultima riga, è perfettamente valido e compilerà ed eseguirà senza errori. Indovina quale sarà l'output della console?

    enum Color
    {
        Red = 1,
        Green = 2,
        Blue = 3,
    }
    
    void Demo(Color color)
    {
        Console.WriteLine(color.ToString());
    }
    
    Demo((Color)4);
    
  • Nel secondo caso, i valori da enum appariranno di solito come numeri, e ricordare che cosa significa 14 o 17 in un dato contesto non è particolarmente eccitante. Quindi, attenersi a valori di stringa significativi.

    Assicurati di utilizzare una mappa esplicita anziché un ToString semplice. Rinominare un valore all'interno di enum è una semplice attività di refactoring e non dovrebbe interrompere il codice. Se il valore della stringa corrisponde al nome del valore effettivo all'interno di enum , il codice si interromperà in un modo sottile che non sarebbe facile eseguire il debug.

    Vedi anche: È una best practice con Enum in C # e commenti di MK87 .

risposta data 06.06.2016 - 17:29
fonte
1

Se l'oggetto rappresentato dal tuo Dizionario ha un insieme di valori finiti e ben definiti che possono essere identificati in anticipo (che sembra che sia vero, altrimenti non potresti usare enum per la chiave), quindi perché stai usando un dizionario? Crea una classe dati o una struttura che ha un campo per ogni valore possibile. Questo ha diversi vantaggi:

  • Migliore integrazione di IDE: i consumatori vedranno il completamento automatico dei nomi dei campi nel proprio IDE senza dover identificare in modo specifico quale% dienum desideri estrarre dai dati. La documentazione sarà più facile da trovare di quanto non sarebbe per un enum .
  • Migliore sicurezza del tipo: a meno che tutti gli elementi dei dati non abbiano esattamente lo stesso tipo, puoi specificare i tipi esatti per i campi e assicurarti che i dati vengano utilizzati correttamente al momento della compilazione
  • Migliore efficienza: un oggetto ha un costo di ricerca e modifica praticamente zero. Utilizza la quantità minima di memoria che potrebbe essere memorizzata per i dati che è necessario conservare. Interagisce con il GC in modo molto più pulito.

Onestamente, non riesco a vedere il vantaggio di utilizzare un dizionario qui.

    
risposta data 06.06.2016 - 17:40
fonte

Leggi altre domande sui tag