Pregunta

Acabo de empezar rozando 'la Depuración de MS .Net 2.0 Aplicaciones " por John Robbins, y se han vuelto confusos por su evangelización para la Depuración.Assert(...).

Él señala que, bien aplicados, Afirma almacenar el estado, en cierto modo, de una condición de error, por ejemplo:

Debug.Assert(i > 3, "i > 3", "This means I got a bad parameter");

Ahora, personalmente, parece una locura para mí que él tanto ama a la reformulación de su prueba sin un real sensible "de la lógica de negocio' comentario, quizás "me <= 3 nunca debe suceder debido a la flobittyjam widgitification proceso".

Entonces, yo creo que puedo conseguir Afirma como una especie de bajo nivel "Vamos a proteger a mis supuestos" tipo de cosas...suponiendo que uno siente que esto es una prueba sólo se debe hacer en la depuración es decir,usted está protegiendo a sí mismo en contra de su colega y el futuro de los programadores, y con la esperanza de que, efectivamente, la prueba de las cosas.

Pero lo que no entiendo es, entonces va a decir que usted debe utilizar afirmaciones además de los normales de manejo de errores;ahora lo que tengo planeado es algo como esto:

Debug.Assert(i > 3, "i must be greater than 3 because of the flibbity widgit status");
if (i <= 3)
{
    throw new ArgumentOutOfRangeException("i", "i must be > 3 because... i=" + i.ToString());
}

Lo que he ganado por la Depuración.Afirmar la repetición de la condición de error de la prueba?Creo que me gustaría conseguir es si estuviéramos hablando de depuración-sólo haga doble comprobación de un muy importante el cálculo de...

double interestAmount = loan.GetInterest();
Debug.Assert(debugInterestDoubleCheck(loan) == interestAmount, "Mismatch on interest calc");

...pero no entiendo por parámetro pruebas que son, sin duda vale la pena comprobar (en ambos DEBUG y Release genera)...o no.Lo que me estoy perdiendo?

¿Fue útil?

Solución

Afirmaciones no son para comprobación de parámetros.Comprobación de parámetros debe hacerse siempre (y precisamente de acuerdo a lo pre-condiciones se especifican en la documentación y/o especificación), y el ArgumentOutOfRangeException lanzado como sea necesario.

Afirmaciones de pruebas para "imposible" de las situaciones, es decir, las cosas que usted (en la lógica del programa) asumir son verdaderas.Las afirmaciones están allí para decirle que si estos supuestos se rompe por cualquier razón.

Espero que esto ayude!

Otros consejos

Hay un aspecto de la comunicación que afirma vs excepción de lanzamiento.

Supongamos que tenemos una clase de Usuario con un Nombre de propiedad y un método ToString.

Si ToString es implementado como este:

public string ToString()
{
     Debug.Assert(Name != null);
     return Name;
}

Se dice que el Nombre nunca debe nulo y hay un error en la clase de Usuario si es que.

Si ToString es implementar como este:

public string ToString()
{
     if ( Name == null )
     {
          throw new InvalidOperationException("Name is null");
     }

     return Name;
}

Se dice que la persona que llama está utilizando ToString incorrectamente si el Nombre es nulo y debe comprobar que antes de llamar.

La aplicación con ambos

public string ToString()
{
     Debug.Assert(Name != null);
     if ( Name == null )
     {
          throw new InvalidOperationException("Name is null");
     }

     return Name;
}

dice que si es null hay error en la clase de Usuario, pero queremos manejar, de todos modos.(El usuario no necesita Nombre de verificación antes de llamar.) Creo que este es el tipo de seguridad Robbins estaba recomendando.

He pensado acerca de este largo y duro cuando se trata de proporcionar orientación sobre la depuración vsafirmar con respecto a las pruebas de preocupaciones.

Usted debe ser capaz de poner a prueba su clase con la introducción errónea, mal estado, no es válido el orden de las operaciones y cualquier otro imaginable condición de error y una aserción debe nunca viaje.Cada aserción es la comprobación de que algo debe siempre de ser cierto, independientemente de las entradas o de los cálculos realizados.

Buenas reglas de pulgar he llegado a:

  1. Afirma que no son un reemplazo de código robusto que funciona correctamente independiente de la configuración.Son complementarios.

  2. Afirma que nunca debe ser disparado durante una unidad de ejecución de la prueba, incluso cuando la alimentación en valores no válidos o pruebas de las condiciones de error.El código debe manejar estas condiciones sin afirmar que ocurren.

  3. Si una aserción viajes (ya sea en una unidad de prueba o durante la prueba), la clase está pinchado.

Para todos los demás errores, por lo general hacia el medio ambiente (conexión de red se pierde) o mal uso (llamada pasa de un valor null); es mucho más agradable y más comprensible para el uso duro cheques y las excepciones.Si se produce una excepción, la persona que llama sabe que es probable que su culpa.Si se produce una aserción, la persona que llama sabe que es probable que un error en el código, donde la aserción se encuentra.

Con respecto a la duplicación:Estoy de acuerdo.No veo por qué iba a replicar la validación con una Depuración.Afirmar Y una excepción de verificación.No sólo añadir un poco de ruido para el código y enturbiar las aguas respecto de quién es la culpa, pero es una forma de repetición.

Yo uso explícito de los cheques que lanzar excepciones en público y protegido métodos y afirmaciones sobre los métodos privados.

Generalmente, la explícita controles de la guardia de los métodos privados de ver a valores incorrectos de todos modos.Así que en realidad, la aserción es la comprobación de una enfermedad que debe ser imposible.Si una aserción hace el fuego, que me dice que el no es un defecto en la lógica de validación de contenido dentro de uno de los públicos de las rutinas de la clase.

Una excepción puede ser capturado y se tragó a cometer el error invisible para las pruebas.Eso no puede ocurrir con la Depuración.La aserción.

Nadie debe tener un controlador catch que las capturas de todas las excepciones, pero la gente lo hace de todos modos, y a veces es inevitable.Si el código es invocada por la COM, la capa de interoperabilidad de las capturas de todas las excepciones y los convierte en COM códigos de error, lo que significa que no vea sus excepciones no controladas.Afirma que no sufren de esto.

También cuando la excepción sería no controlada, una mejor práctica es tomar un mini-dump.Un área donde VB es más poderoso que el de C# es que se puede utilizar un filtro de excepción a la presión de un mini-volcado cuando la excepción se encuentra en vuelo, y dejar el resto del manejo de excepciones sin cambios. Gregg Miskelly blog sobre el filtro de excepción inyectar proporciona una manera útil de hacer esto desde c#.

Otra nota sobre los activos ...que inteact poco con la Unidad de pruebas de las condiciones de error en su código.Vale la pena tener un contenedor para desactivar la aserción de su unidad de pruebas.

IMO es una pérdida de tiempo de desarrollo solamente.Correctamente aplicado excepción le da una clara imagen de lo que sucedió.Vi demasiado aplicaciones mostrando oscuro "error de Aserción:yo < 10" los errores.Veo afirmación como una solución temporal.En mi opinión, en ningún afirmaciones deben estar en la versión final de un programa.En mi práctica he utilizado afirmaciones para la rápida y sucia de cheques.Versión Final del código debe tener errónea en cuenta la situación y actuar en consecuencia.Si algo malo sucede, usted tiene 2 opciones:manejar o salir de él.La función debe lanzar una excepción con la descripción significativa si mal parámetros pasados.Veo que no hay puntos en la duplicación de la lógica de validación.

Ejemplo de un buen uso de Afirmar:

Debug.Assert(flibbles.count() < 1000000, "too many flibbles"); // indicate something is awry
log.warning("flibble count reached " + flibbles.count()); // log in production as early warning

Yo, personalmente, creo que debe Valer sólo se utiliza cuando se sabe que algo está fuera de deseable límites, pero usted puede estar seguro de que es razonablemente seguro para continuar.En todos los demás casos (no dude señalar circunstancias no he pensado) el uso de las excepciones a fallar duro y rápido.

La clave de la solución de compromiso para mí es si quieres bajar un live/sistema de producción con una Excepción para evitar la corrupción y facilitar la solución de problemas, o si usted ha encontrado una situación que nunca se debe permitir que continúe desapercibido en prueba/versiones de depuración, pero podría ser permitido continuar en la producción (el registro de un aviso de curso).

cf. http://c2.com/cgi/wiki?FailFast copiado y modificado a partir de java pregunta: Excepción Vs Afirmación

Aquí es por 2 centavos de dólar.

Creo que la mejor manera es utilizar ambas afirmaciones y excepciones.Las principales diferencias entre los dos métodos, en mi humilde opinión, si que Afirman que las expresiones se pueden retirar fácilmente de la aplicación de texto (define, condicional de los atributos...), mientras que la Excepción son dependientes (típicamente) por un código condicional que es más difícil de quitar (multine sección con condicionales del preprocesador).

Cada solicitud de excepción deberán ser manejados correctamente, mientras que las afirmaciones deben ser satisfechos sólo durante el algoritmo de desarrollo y pruebas.

Si se pasa una referencia de objeto null como parámetro de rutina, y utilizar este valor, se obtiene una excepción de puntero nulo.En efecto:por qué usted debe escribir una afirmación?Es una pérdida de tiempo en este caso.Pero, ¿qué acerca de la privada de los miembros de la clase se utiliza en las rutinas de clase?Cuando el valor de estas se establecen en algún lugar, es mejor consultar con una afirmación si un valor null se establece.Eso es sólo porque cuando se utiliza el miembro, se obtiene una excepción de puntero nulo, pero no sabe cómo era el valor establecido.Esto causa que se reinicie el programa de romper en todos los punto de entrada se utiliza para definir el miembro privado.

Excepción son los más útiles, pero pueden ser (en mi humilde opinión) muy pesado para gestionar y hay la posibilidad de usar demasiado excepciones.Y que requiere de comprobación adicional, tal vez no deseado para optimizar el código.Personalmente yo uso las excepciones sólo cuando el código requiere un profundo capturas de control (instrucciones de captura son muy bajos en la pila de llamadas) o siempre que los parámetros de función no están codificados en el código.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top