java - Cuándo usar assert en el cliente y código GWT común
design-by-contract (2)
Hay varias preguntas sobre StackOverflow que discuten la cuestión de cuándo se debe usar una declaración de afirmación frente a arrojar alguna excepción. (Ejemplos aquí , aquí , aquí , aquí y aquí .
Sin embargo, he llegado a sospechar que la sabiduría convencional de assert-versus-throw se basa en la suposición de que se está ejecutando dentro de una JVM. En el universo GWT, donde su Java se transcribe a JavaScript y se ejecuta en el contexto de un navegador, el conjunto de compensaciones se siente diferente: las afirmaciones siempre se compilan cuando se ejecuta en un navegador y cualquier cosa que mantenga el tamaño de su JavaScript más pequeño es una ganancia, especialmente si su aplicación web debe ejecutarse en un teléfono móvil. Las afirmaciones se ejecutan en DevMode, sin embargo, por lo que tienen utilidad allí durante el desarrollo.
Entonces mis preguntas son: ¿Alguien ha pensado en un conjunto de reglas de mejores prácticas que gobiernan cómo usar la declaración de afirmación en GWT? He tenido miembros de mi equipo que me preguntan "ya que la afirmación se compila, ¿tiene sentido tenerlos?", Y me gustaría tener una buena respuesta para ellos.
Además, ¿alguien tiene alguna idea de la filosofía que los desarrolladores de GWT en Google tienen sobre este tema? Al mirar el código fuente de GWT, parecen usarlo con frecuencia.
Las preguntas frecuentes de Google dicen
Solo use aserciones para depuración, no lógica de producción porque las aserciones solo funcionarán en el modo de desarrollo de GWT. De forma predeterminada, el compilador de GWT los compila, por lo que no tienen ningún efecto en el modo de producción a menos que los habilite explícitamente.
Esto no es diferente de las respuestas dadas a las preguntas a las que se vinculó. Ya sea que GWT compile el código Java de la manera habitual mediante javac o GWT lo compile con JavaScript, "afirmar" significa "si esto no es cierto, tengo un error". Por el contrario, código de la forma
if (condition) throw new Exception(msg);
significa "si esto es cierto, entonces tenemos una situación inesperada que el programa tendrá que manejar".
En cuanto a los miembros del equipo que no ven el punto de afirmar, explique que se supone que tienen un conjunto de pruebas unitarias que se ejecutan con aserciones habilitadas. Si las pruebas tienen una buena cobertura de código y ninguna de ellas hace que falle la aserción, se demuestra que se mantiene la suposición indicada por la declaración de aserción.
El compilador GWT los elimina de manera predeterminada, pero puede dejarlos si lo desea. Si cree que las aserciones son útiles en el código compilado, agregue el argumento de línea de comando -ea al invocar com.google.gwt.dev.Compiler. El compilador convertirá las afirmaciones de Java en JavaScript.
Google Web Toolkit 2.3.0
Compiler [-logLevel level] [-workDir dir] [-gen dir] [-style style] [-ea] [-XdisableClassMetadata] [-XdisableCastChecking] [-validateOnly] [-draftCompile] [-optimize level] [-compileReport] [-strict] [-localWorkers count] [-war dir] [-deploy dir] [-extra dir] module[s]
...
-ea Debugging: causes the compiled output to check assert statements