2010-06-05 12 views
15

Qualcuno può dirmi quale è un approccio migliore per la convalida in WPF.IDataErrorInfo vs ValidationRule vs Exception

  1. esecuzione IDataErrorInfo
  2. Creazione ValidationRule
  3. eccezioni Throwing

in termini di prestazioni, perdite di memoria, codice manutenibilità e riutilizzo.

risposta

20

Questa è una specie di richiesta complessa e, onestamente, probabilmente cambierà in base alle preferenze più di ogni altra cosa. Ma, ecco la mia comprensione:

  • Prestazioni: Eccezioni perderanno quasi ogni volta a meno che le vostre altre implementazioni sono terribili. C'è un overhead significativo del ciclo throw/catch. (Aneddoto: ho avuto un controllo "deve essere un numero" che era un'eccezione, "ritardato" l'interfaccia utente per un tempo notevole quando non è riuscito, ma una volta convertito in un ValidationRule era effettivamente istantaneo.)
  • Perdite di memoria: dipende da come vengono eseguite le regole di convalida o le implementazioni IDataErrorInfo.
  • Codice manutenzione, riutilizzo: questa è la parte interessante, ovviamente. Quello che dovresti veramente chiedere è "quando è opportuno usare un ValidationRule invece di IDataErrorInfo o viceversa?"

ValidationRules sono precedenti a IDataErrorInfo (credo che quest'ultimo sia stato introdotto in .Net 3.5). Sulla base di ciò, sembrerebbe che il team WPF preferisca IDataErrorInfo. Ma la verità è che sono costruiti per cose diverse. Se hai MVVM o uno schema equivalente, IDataErrorInfo è superiore per errori nel modello (come, ad esempio, un'età negativa) mentre ValidationRules sono superiori per errori nella vista (ad esempio, un'età di ☃). Ovviamente, è possibile che ValidationRules esegua verifiche di "business logic", o che l'IDataErrorInfo indichi "un pupazzo di neve unicode non è un'età valida", ma si otterrà (probabilmente) la migliore manutenibilità mantenendo questo schema.

Tuttavia, non utilizzare eccezioni per la convalida oltre il test iniziale per vedere quali condizioni esatte si dovrebbero testare.

+4

Oggi stava leggendo su IDataErrorInfo - sembra che sia più vecchio di ValidationRule - sembra che l'interfaccia IDataErrorInfo sia presente sin dal Framework 1.1 (http://msdn.microsoft.com/en-us/library/system.componentmodel.idataerrorinfo_properties (v = VS.71) .aspx) ma ValidationRule dal Framework 3.0. Non pensare che cambi fondamentalmente la tua risposta però – GrahamMc

3

Non è consigliabile utilizzare l'eccezione per la gestione degli errori. L'uso dell'eccezione ridurrà le prestazioni. Si tratta di selezionare e implementare IDataErrorInfo o Creating ValidationRule.

IDataErrorInfo

  • convalida logica di tenere vista del modello e facile da implementare e mantenere
  • il controllo completo sopra tutti i campi di ViewModel

regola di convalida

  • Mantiene la regola di convalida nella classe separata
  • Aumentare la riutilizzabilità. Ad esempio, è possibile implementare la classe di convalida del campo richiesto riutilizzarla in tutta l'applicazione.

La mia opinione è, per convalida comune come le convalide dei campi richieste, le convalide degli indirizzi e-mail è possibile utilizzare la regola di convalida. Se è necessario eseguire convalide personalizzate come convalide di intervalli o qualsiasi altra convalida personalizzata, utilizzare IDataerrorinfo.

Problemi correlati