2009-07-30 17 views
18

Esto no es realmente una "pregunta", así que lo estoy haciendo CW.¿Utiliza aserciones?

El

assert 

palabra clave es grande!

Debe hacer, sentirse más seguro con el código que escribió, pero hasta hoy cuando estaba creando una pequeña clase de prueba (< 20 líneas) me doy cuenta de que nunca la utilizo desde que se introdujo.

Heck! Apenas uso el registrador, lo cual es muy útil, pero hasta hoy no me doy cuenta de que no uso las aserciones.

¿Utiliza aserciones? Si no, ¿cuál es el motivo?

+2

¿La gente responde "sí" y "no"? ¿Qué tan útil es eso? Hay muchas, muchas respuestas para afirmar en SO, ¿quizás debería leer algunas de ellas? –

+4

¿Los usas Neil, en tu codificación habitual? – OscarRyz

Respuesta

2

No, nunca los use. No sé por qué, nunca me hice el hábito.

0

que tienden a no usarlos, aunque no estoy seguro de por qué tampoco.

Si haces las pruebas unitarias, por ejemplo, con nUnit, que, obviamente, ellos utilizan todo el tiempo para verificar los resultados del examen.

15

me enseñaron a usar un montón de afirmaciones en los años 90 y que hizo mucho sentido. Es una buena codificación defensiva.

Sin embargo, creo que este ha sido sustituida por la unidad de pruebas que realmente hace que el código se ejecute y le dice donde es degradado. Las afirmaciones de depuración requieren que alguien realmente esté ejecutando código de depuración y mirando la interfaz de usuario o los registros. Las pruebas unitarias pueden automatizar esto.

+3

Durante la prueba, es probable que las ratas no roen a través de un cable de comunicaciones, que alguien que esté jugando no agote la memoria y que los archivos de registro no llenen el disco duro. Estas cosas pueden suceder cuando su programa se ejecuta en un entorno de producción. [Hun 00] El programador pragmático – citn

+1

¿Así que está afirmando que las depuraciones afirman de alguna manera resolver estos problemas? ¿O está diciendo que las afirmaciones de depuración, las pruebas unitarias, etc. no pueden resolver estos problemas? ¿O que todas las pruebas son malas, por lo tanto, no lo hagas? –

+7

No estoy de acuerdo con esta respuesta. NO ha sido reemplazado, se ha complementado. Las pruebas unitarias no reemplazan las afirmaciones. Las afirmaciones son muy útiles para evitar errores de programación, como pasar null a un método que no acepta nulo. Está justo allí, para tus ojos, tu parámetro NO PUEDE ser nulo, entonces no tienes (si es param! = Null) por todos lados ... –

14

Los uso todo el tiempo. Son una buena forma de practicar la filosofía "Crash early", es mejor tener que resolver por qué falló una afirmación que tener que lidiar con una salida incorrecta/corrupta.

La cuestión es que hay que tipo de convertirlo en un hábito. Raramente veo algo de terreno intermedio, la gente no está acostumbrada a eso y casi nunca los usa o la gente los usa y están ensuciados rigurosamente en todo el código. Solo tiene que entrar en la mentalidad de darse cuenta "Oh hey, soy implicito asumiendo algo aquí, permítanme confirmarlo explícitamente 'assert (ASSUMPTION)'"

+1

Por lo que leí en su respuesta, creo que una validación sería mejor, porque después de todo, se pretende eliminar en el código de producción. El objetivo principal era realizar chequeos costosos en el producto beta. – OscarRyz

+4

Assert no debe eliminarse en el código de producción ... Son demasiado útiles para entender por qué el proceso está fallando (piense en la propagación nula en 4 o 5 capas, ¿de dónde viene este nulo?). Y no me hagas comenzar a golpear el rendimiento ... –

3

No los uso. Las pruebas unitarias deberían ser suficientes para probar tu código. Además, dado que están deshabilitados por defecto, por lo general son completamente ignorados de todos modos. Entonces solo tienden a desordenar su código con afirmaciones inútiles que podrían expresarse mejor como comentarios.

Si realmente necesita esto, sin embargo, algunas bibliotecas tienen afirmación estática métodos que puede llamar que se no se omiten - éstos son también mucho más fácil de leer, porque la palabra clave aserción es poco común y de inmediato puede producir un "wtf "momento, pero los métodos Assert.x son solo métodos que se pueden rastrear. El marco Spring, en particular, usa una biblioteca de afirmaciones.

+0

Los comentarios pueden estar desactualizados, o simplemente incorrectos, mientras que una afirmación es un contrato en el código. No estoy de acuerdo con que las afirmaciones llenen el código, y ciertamente no estoy de acuerdo con que los comentarios sean mejores para expresar la afirmación. Cualquiera que ejecute el código con el fin de depurarlo debería tener afirmaciones. Supongo que si nunca lo usa, la palabra clave assert es poco común, ¿pero ilegible? Estoy de acuerdo en que no importa qué método use para sus afirmaciones, una función incorporada o una biblioteca. – Sean

+0

Las afirmaciones, dado que están deshabilitadas de forma predeterminada, tienen los mismos problemas que los comentarios del código. Pueden "estar desactualizados, o simplemente incorrectos", porque tiene que activarlos explícitamente, por lo tanto, no siempre se afirman como deberían y sus fallas no se notan hasta que ellos mismos ya no sean relevantes. – MetroidFan2002

4

Respuesta corta - Sí.

Respuesta larga - No siempre, pero con bastante frecuencia. Usualmente uso aserciones para los errores que sé que no puedo hacer nada (mientras el programa se está ejecutando) y el registro no es realmente necesario. Por ejemplo, si tengo que verificar si un cierto valor está fuera de límites o si un puntero es NULL aunque debería tener algún valor.

Para otras cosas como "archivos de análisis sintáctico" y "El archivo no se puede conocer", por lo general generan excepciones.De esa forma, puedo registrar el error y utilizar algún archivo/método a prueba de fallas.

Y estoy totalmente de acuerdo con la Falaina, que realmente debe hacer un punto para notar - "Hey estoy haciendo algunas suposiciones aquí"

1

tiendo a comprobar si hay condiciones de error y lanzar excepciones en su lugar. La razón es que quiero que estas condiciones siempre se comprueben, incluso en producción, y las excepciones proporcionan un manejo más fácil de la condición fallida en lugar de aserciones.

10

Uso aserciones para asegurarme de no introducir errores en mi código. Si sé que un valor debe estar en un mapa, lo afirmo (usando la palabra clave assert). Si sé que un parámetro nunca debe ser nulo, lo afirmo. Si sé que el parámetro puede ser nulo, lo verificaré y lanzaré la excepción correspondiente.

Lo leo en Code Complete o Effective Java. Las aserciones deben usarse para detectar errores de programación; las excepciones se deben usar para manejar situaciones excepcionales pero posibles. No necesita verificar nulo en cada método en su código si sabe que el valor no será nulo (como lo define un contrato), pero no está de más afirmar si un valor no es nulo. Las aserciones solo se habilitan si especifica el parámetro -ea en la máquina virtual y no deberían afectar el rendimiento de la aplicación si está deshabilitada.

Debería usar más registros también :-). Aprenda cuándo usar trazas, depuración e información y asegúrese de registrar todo lo que hace su aplicación. Hace la vida más fácil cuando tiene que descubrir por qué algo no funciona en un entorno de producción.

+3

"las aserciones deben usarse para detectar errores de programación" ** exactamente ** +1 –

0

No, no los uso.

Me enseñaron que no debe usarse en el código de 'producción', y antes de comenzar a usar algo que tengo que eliminar de todos modos, según lo que he aprendido, me quedo con excepción para validar las condiciones.

0

Nunca solía usarlos, pero pasé un tiempo horrible depurando mi último programa, y ​​en un momento estaba registrando cuando las variables eran nulas o no contenían los valores que yo esperaba. Una vez que lo tuve todo funcionando, afirmé todo lo que mi programa necesitaba para ejecutarlo con éxito.

1

La palabra clave Java assert está medio cargada (necesita ejecutar el programa con la opción de línea de comandos -ea) por lo que me encuentro confiando en excepciones en lugar de afirmaciones.

4

El único uso real de las afirmaciones tras la introducción de la unidad de pruebas es comunicar el invariante de un método para otros programadores. Y es mucho mejor hacer esto en código real que en comentarios que ignorarán de todos modos. ¡Es difícil ignorar una afirmación!

0

No. Pero no puedo esperar. Solía ​​probarlo todo con junit, pero eso era escuela, pequeños proyectos sin presión. Ahora estoy en la vida real, supongo que debo terminar este código ayer ...

2

Si quiere afirmar, AMARÁ los contratos. Básicamente son la idea de afirmaciones extendidas a más situaciones.

2

Sí! ¡Siempre! ¡La palabra clave es mi mejor amigo en todos los idiomas!

No hay ninguna razón real no utilizar afirma, se aseguran de que los supuestos básicos que hacen en los valores de entrada y estados se cumplan.

Si falla una afirmación, significa que necesito volver a evaluar mis suposiciones y actualizar el código para manejar nuevas entradas exóticas que no pensé al escribir la revisión actual. ¿Qué no le gusta de eso?

Como es habitual en la programación, es una herramienta que solo es potente cuando se usa correctamente.

2

Sí, utilizo afirma todo el tiempo, básicamente, cuando estoy haciendo una suposición de que:

  1. se puede comprobar con una maniobra sencilla predicado.
  2. No es obviamente cierto simplemente por leer el código cercano.

Sin embargo, para afirma que es probable que tengan un impacto insignificante en el rendimiento, utilizo la función enforce en el lenguaje de programación biblioteca estándar D en lugar de assert. Esto básicamente hace lo mismo que assert, excepto que permanece en modo de lanzamiento. Para las aserciones más caras, utilizo assert, que se elimina de las compilaciones del modo de lanzamiento.

Cuestiones relacionadas