2010-10-31 11 views
5

Ho una lunga lista di messaggi di errore che il mio codice biz può restituire in base a ciò che viene inserito. L'elenco potrebbe finire con più di mille.C'è qualche danno nell'avere molti valori enum? (molti> = 1000)

Mi piacerebbe solo enumarli tutti, usando l'attributo [Description ("")] per registrare il messaggio amichevole.

Qualcosa di simile:

public enum ErrorMessage 
{ 
    [Description("A first name is required for users.")] 
    User_FirstName_Required = 1, 
    [Description("The first name is too long. It cannot exceed 32 characters.")] 
    User_FirstName_Length = 2, 
    ... 
} 

so enumerazioni sono tipi primitivi, numeri interi in particolare. Non dovrebbero esserci problemi con quel numero di interi, giusto?

C'è qualcosa a cui non sto pensando? Sembra che questo dovrebbe essere a posto, ma ho pensato che avrei dovuto chiedere alla comunità prima di passare il tempo a farlo in questo modo.

.Net si preoccupa dei tipi di enumerazione quando hanno molti valori?

Aggiornamento

Il motivo non ho voluto utilizzare le risorse è perché

a) ho bisogno di essere in grado di fare riferimento a ogni messaggio di errore unico, con un valore intero. Il livello biz fornisce un'API, oltre ad altre cose, e deve essere restituito un elenco di valori interi che denotano gli errori. Non credo che le risorse ti consentano di indirizzare un valore di risorsa con un numero intero. Ho sbagliato?

b) Non ci sono requisiti di localizzazione.

+0

I metadati di assieme tendono a essere limitati a 65535 elementi distinti per raggruppamento. –

risposta

2

1000 non è molti, si deve solo fare in modo che il tipo integer sottostante è abbastanza grande (non utilizzare un char per la vostra enum.

Ripensandoci 1000 è tonnellate, se li stai inserendo manualmente , se sono generati da un set di dati, potrebbe avere un senso ...

7

Penso che un design che ha più di 1.000 valori in un enume ha bisogno di un po 'di riflessione. Sembra che un anti-pattern "God Enum" avrà da inventare per questo caso

+0

Ho pensato di utilizzare tipi di ErrorMessage generici sul modello, ma sembra che l'unico punto sarebbe quello di avere meno codice verticale e più codice orizzontale. Il mio piano è quello di ripetere a qualcosa di meglio quando le esigenze future diventano più chiare. – sohtimsso1970

+0

Mentre in un caso generale direi che è un segno di cattivo design penso che abbia l'unico caso legittimo per questo - un codice risultato che deve essere passato come un numero intero. –

4

L'inconveniente principale che vorrei sottolineare con l'amichevole de la descrizione in un attributo è che ciò causerà delle sfide se hai bisogno di localizzare la tua app per un'altra lingua. Se questa è una considerazione, sarebbe una buona idea mettere le stringhe in un file di risorse.

L'enum in sé non dovrebbe essere un problema, anche se avere tutti i codici di errore in un elenco principale può essere fonte di confusione. Potresti considerare la creazione di enumerazioni separate per categorie separate di codici di ritorno, in quanto ciò renderà più facile per gli sviluppatori comprendere i possibili valori di ritorno per una particolare funzione. Puoi comunque assegnare loro valori numerici distinti (specificando esplicitamente i valori numerici) se è importante che i codici siano univoci.

Nota a margine, .NET BCL non utilizza molto i codici di ritorno e i codici di ritorno sono in qualche modo scoraggiati nel moderno sviluppo .NET. Creano problemi di manutenibilità (non puoi quasi mai rimuovere vecchi codici di ritorno o rischiare di rompere la compatibilità con le versioni precedenti) e richiedono una logica di convalida speciale per gestire i ritorni per ogni chiamata. La convalida stateful può essere eseguita con IDataErrorInfo, in cui si utilizza una classe intermedia che può rappresentare stati non validi, ma che consente solo un commit delle modifiche che vengono convalidate. Questo ti permette di manipolare liberamente l'oggetto, ma anche di fornire un feedback all'utente sulla validità del suo stato.La logica equivalente con i codici di errore spesso richiede un'istruzione switch per ogni utilizzo.

+0

Sì, ho pensato alla localizzazione ma non è necessario, ed è estremamente improbabile che mai. Immagino che se quella richiesta dovesse mai emergere, avrò il team in iterazione per qualcos'altro. – sohtimsso1970

+0

Si fa un buon punto sull'utilizzo dello stato valido/non valido con un'interfaccia, ma non sono d'accordo sul fatto che l'utilizzo di tipi di ritorno sia scoraggiato. Questa enumerazione ErrorMessage non è l'unica cosa che viene restituita. Fa parte di un modello di risultato che consente al livello biz di restituire molte informazioni che non è possibile in nessun altro modo. (Almeno non che io possa comprendere). Tenete presente che questo livello di biz sta emettendo una varietà di tipi di controller, tra cui un'API REST e SOAP. – sohtimsso1970

+0

@ sohtimsso1970, sembra che il tuo caso d'uso sia un'eccezione, in quanto è necessario pacchettizzare più informazioni di un semplice codice di ritorno. Mi riferivo di più all'approccio della vecchia scuola di avere ogni metodo chiamato return un numero intero, con alcune serie di costanti per interpretare il risultato di ciascun metodo. Nel tuo caso, devi supportare più frontali di servizio, quindi un codice di errore per comunicare la convalida potrebbe essere più sensato. Anche così, sarà utile dividere i codici/risultati; Penso che avere un risultato centrale 'causerà mal di testa in seguito. –

1

Concordo pienamente con duffymo. Un enum con più di 1000 valori ha un cattivo odore dal punto di vista del design. Per non parlare del fatto che sarebbe molto spiacevole per lo sviluppatore usare l'intelligenza su un GOD ENUM :-) Farei meglio ad usare le risorse.

+0

La ragione per cui non voglio andare con le risorse è perché ho bisogno di restituire un valore intero univoco per ogni errore. Il codice biz viene utilizzato in diverse posizioni, tra cui un'API, quindi ci sono momenti in cui non posso passare il nome della risorsa, ma avrei bisogno di passare un int. Modificherò la domanda per includerla. – sohtimsso1970

+0

A proposito, leggi [Descrizione ("È richiesto un nome per gli utenti.")] In fase di esecuzione? Ciò potrebbe influire sulle prestazioni. –

+0

Sì, c'è un punto in cui viene utilizzata la reflection per ottenere la descrizione, ma ciò accade solo una volta per istanza dell'applicazione, giusto? Non appena quel colpo viene preso, non dovrebbe accadere di nuovo a meno che l'applicazione non si azzeri. – sohtimsso1970

0

Penso che sia molto brutto, per la gestione degli errori si può semplicemente utilizzare la risorsa, come vedo che si desidera fare riflessioni e recuperare la descrizione è anche male. Se non si desidera utilizzare le risorse, è possibile definire diverse enum per ciascuna delle regole aziendali, inoltre la propria attività non ha bisogno di altri messaggi di errore (e non dovrebbe essere così).

+0

Chi ha lasciato un downvote? per favore spieghi perché? –