2010-11-19 6 views
5

Actualmente estoy desarrollando un pequeño marco de IA (algoritmos genéticos/redes neuronales) en C#, para un proyecto universitario.¿Cómo se afirma en el código algorítmico en .NET?

Mi primera preocupación es desarrollar un marco reutilizable, por lo que estoy diseñando todo para que sea bastante modular. Sé que estoy pagando un precio por esto (rendimiento), pero siento que tengo más que ganar que perder con él (es preferible tener un código dos veces más lento que tener que perder el doble de tiempo tratando de encontrar imposible encuentre errores y pierda mucho tiempo tratando de agregar cosas nuevas que son difíciles de introducir en un bloque monolítico de código).

Me gustaría tener muchos controles en diferentes partes de mi código, afirmaciones, básicamente. Comprueba si al ejecutar el método X estoy realmente en un estado correcto, etc. Ese tipo de afirmaciones son útiles al desarrollarlas, pero me gustaría que se mantengan alejadas del código de publicación (es decir, cuando decida que me voy a querer ir) esto trabajando por la noche para obtener los resultados finales de mi investigación).

puedo ver varias maneras de lograr esto:

  1. familia System.Diagonists.Assert de métodos.
  2. Código Contratos
  3. Tener si (x) luego tirar InvalidStateException() rodeado de DEBUG #if/#endif

¿Cómo lo harías y por qué?

También conozco las pruebas unitarias (las estoy usando), pero también me gustaría tener algún tipo de aserciones en el código.

Respuesta

8

Se puede usar un método estático como sigue:

[Conditional("DEBUG")] 
public static void Assert(bool condition, string message) 
{ 
    if (!condition) 
     throw new InvalidStateException("Assertion failed: " + message); 
} 

y hacer valer como tal, asumiendo el método se define en una clase llamada Util:

Util.Assert(a == b, "a == b"); 

llamadas a este método sólo serán emitido por el compilador cuando se establece el símbolo DEBUG, gracias a ConditionalAttribute. Por lo tanto, no necesita envolver dichas llamadas en ninguna directiva #if. Esto conducirá a menos desorden de código.

(Tenga en cuenta que el método en sí todavía se compilará. Esto permite el uso de tales métodos en diferentes montajes!)

+1

Do not Code Contracts funcionan de manera similar? Tenía la idea de que podrías apagarlos completamente en el modo de lanzamiento, o algo así. –

+0

Quizás. Honestamente, no estoy familiarizado con eso. La técnica en mi respuesta es la que uso, así que pensé en compartirla. No puedo decir si es mejor o peor que los Contratos de Código. – cdhowie

+0

Me gustaría ir con lo que dice cdhowie. contrato de código ofrece mucho más, pero probablemente no lo que necesita en su caso. Por lo tanto, creo que la herramienta adecuada es utilizar métodos decorados con el atributo Condicional en lugar de en línea # if, # else o Debug.Asset() que desordena su código en línea. –

0

La ventaja de #if/#endif es que no sólo es la llamada a la función afirman eliminado, pero también todo el trabajo preparando sus parámetros (que afortunadamente no tienen efectos secundarios ...).

+2

Lo mismo con '[Condicional (...)]'. – cdhowie

Cuestiones relacionadas