2010-06-05 11 views
15

¿Alguien me puede decir cuál es el mejor enfoque para la validación en WPF?IDataErrorInfo contra ValidationRule vs Exception

  1. Ejecución IDataErrorInfo
  2. Creación ReglaDeValidación
  3. excepciones Lanzar

en términos de rendimiento, pérdidas de memoria, capacidad de mantenimiento de código y re-uso.

Respuesta

20

Esto es una especie de solicitud compleja, y honestamente, probablemente variará según las preferencias más que cualquier otra cosa. Sin embargo, aquí está mi entendimiento:

  • Rendimiento: Las excepciones se pierden casi todo el tiempo a menos que las otras implementaciones son horrendas. Hay una sobrecarga significativa para el ciclo de lanzamiento/captura. (Anécdota: tuve una verificación 'debe ser un número' que fue una excepción, se "rezagó" la IU durante un tiempo notable cuando falló, pero cuando se convirtió a una ValidationRule fue efectivamente instantánea.)
  • Fugas de memoria: esto depende de cómo se realicen las reglas de validación o las implementaciones de IDataErrorInfo.
  • Mantenibilidad del código, reutilización: Esta es la parte interesante, por supuesto. Lo que realmente debería preguntarse es "¿cuándo es apropiado usar una ValidationRule en lugar de IDataErrorInfo o viceversa?"

ValidationRules son anteriores a IDataErrorInfo (creo que este último se introdujo en .Net 3.5). Basado solo en esto, parecería que el equipo de WPF prefiere IDataErrorInfo. Pero la verdad es que están hechos para cosas diferentes. Si tiene MVVM o un patrón equivalente, IDataErrorInfo es superior para los errores en el modelo (como, por ejemplo, una edad negativa) mientras que las ValidationRules son superiores para los errores en la vista (por ejemplo, una edad de ☃). Por supuesto, es posible hacer que las ValidationRules realicen comprobaciones de "lógica comercial", o que IDataErrorInfo le diga "un muñeco de nieve Unicode no tiene una antigüedad válida", pero (probablemente) obtendrá la mejor capacidad de mantenimiento si mantiene este patrón.

Pero no use excepciones para la validación más allá de la prueba inicial para ver qué condiciones exactas debe probar.

+4

Hoy estaba leyendo en IDataErrorInfo, parece que es anterior a ValidationRule, parece que la interfaz IDataErrorInfo ha estado presente desde Framework 1.1 (http://msdn.microsoft.com/en-us/library/system.componentmodel.idataerrorinfo_properties (v = VS.71) .aspx) pero ValidationRule desde Framework 3.0. No creas que fundamentalmente cambia tu respuesta – GrahamMc

3

No es buena idea usar excepciones para el manejo de errores. El uso de excepciones reducirá el rendimiento. Se trata de seleccionar e implementar IDataErrorInfo o Crear ValidationRule.

IDataErrorInfo

    lógica
  • validación tenga en vista del modelo y fácil de implementar y mantener
  • Control total sobre todos los campos en el modelo de vista

Regla de validación

  • Mantiene la regla de validación en la clase separada
  • Aumenta la capacidad de reutilización. Por ejemplo, puede implementar el campo requerido clase de validaciones reutilizarlo en toda la aplicación.

Mi opinión es que, para validación común como validaciones de campo requeridas, validación de direcciones de correo electrónico se puede usar la regla de validación. Si necesita realizar validaciones personalizadas como validaciones de rango, o cualquier validación personalizada, use IDataerrorinfo.