Esta ha sido una semana espectacularmente intensa. El nuevo canal de YouTube que transmite el curso está lleno de suscripciones; apenas entra en su tercera semana...
El sitio web del curso ya está activo; Puedes ver el curso completo allí, aunque agrego videos todo el tiempo e hice aproximadamente 1/3 del trabajo.
Ahora mismo tiene 3 horas y 17 minutos de contenido. Tengo otra hora de contenido listo para agregar y estoy trabajando en varios más. Estoy bastante seguro de que el curso durará más de 6 horas cuando se complete.
También estoy trabajando en otros videos interesantes, como uno sobre cómo protegerse de las vulnerabilidades de serialización . Escribiré una entrada completa en el blog cubriéndolo en las próximas semanas.
Si tiene alguna pregunta, pensamiento o idea, me encantaría saber de usted. A continuación se muestra el video de esta semana y la transcripción.
¡Bienvenido de nuevo a la tercera parte de la depuración en Scale, donde aprendemos a cazar errores como los profesionales!
En esta sección, analizaremos las expresiones de observación, que son la piedra angular de la depuración. Esto es tan importante que volveré a tratar el tema más adelante.
El área de observación es el área en la parte inferior de la pantalla
En IntelliJ, también podemos incrustar expresiones de observación junto al código. El reloj es una de las capacidades más importantes de un depurador. Así es como podemos ver lo que está pasando en el depurador.
Pero voy a ir mucho más profundo que eso. Especialmente para el marcado de objetos, que es una de las mejores características del depurador.
¿Alguna vez ha regresado de un método solo para pensar, "¿qué devolvió ese método?"
Esto es muy común, especialmente cuando el valor devuelto no se almacena en una variable. Afortunadamente, el IDE tiene la opción de guardar ese valor para que podamos inspeccionarlo de inmediato.
Al habilitar esta opción, podemos ver los valores de retorno de todos los métodos futuros. Si ingresamos al método isPrime
y luego salimos, podrá ver el valor de retorno para el método en la parte inferior aquí.
Evaluar expresión es una de las características interesantes del depurador que no usamos lo suficiente.
Podemos iniciar el diálogo de evaluación de expresión desde el menú contextual y escribir cualquier expresión Java válida. Esta es una herramienta poderosa que puede invocar cualquier método, hacer operaciones aritméticas e incluso cambiar el valor de las variables como resultado.
Si necesita simular algo que es difícil de probar en el código actual, este es el lugar donde puede jugar con la plataforma y probar "teorías salvajes".
Esto es muy parecido al REPL que tenemos en las versiones más nuevas de Java, pero es mejor en muchos sentidos porque podemos ejecutar código en el contexto de nuestra aplicación.
Si tengo un método que devuelve el valor incorrecto, a menudo copio la llamada en un cuadro de diálogo de evaluación y pruebo varias combinaciones de la llamada para ver "qué funciona".
¡Simplemente probar todas las opciones sin reiniciar puede ahorrarnos mucho tiempo!
Puede iniciar este cuadro de diálogo con la combinación de teclas Alt-F8
.
La capacidad de vigilancia en IntelliJ es absolutamente espectacular.
IntelliJ nos permite incrustar el reloj directamente en el editor IDE seleccionando "Agregar reloj en línea" en el menú contextual. Esta es una característica sorprendente que, hasta donde yo sé, es exclusiva de JetBrains.
Una vez seleccionado, el reloj aparece a la derecha junto a la línea donde agregamos el reloj en línea, lo que facilita la evaluación con el código. Esto es muy conveniente cuando se regresa a la misma línea una y otra vez.
También podemos usar el reloj estándar que agregará elementos con las otras variables. Esto es útil para los objetos que queremos rastrear en grandes áreas del código. Tengo mucho que decir sobre el área de vigilancia a medida que avanzamos, pero por ahora, dejemos esto en espera.
El valor establecido es una característica que a menudo olvido usar al depurar.
Es una pena porque es muy poderoso. Podemos establecer el valor de cualquier campo haciendo clic con el botón derecho y seleccionando establecer valor.
También podemos usar F2
para acelerar esto
Puedo cambiar el valor a cualquier valor arbitrario. Esto también se puede aplicar a objetos donde puedo asignar un valor existente o invocar un método de creación, una nueva declaración o cualquier expresión que desee.
Es una función notablemente poderosa en la que podemos mutar el objeto dinámicamente para reproducir un estado que queremos probar.
Podemos combinar esta capacidad con el salto a la línea que discutimos anteriormente y probar un método a través de muchas permutaciones diferentes. Incluso aquellos que podrían no ser reproducibles normalmente. Un buen ejemplo sería el código que tengo que solo se ejecuta en Windows. Pero tengo una Mac.
Solo cambio el valor de la variable estática que indica el sistema operativo actual y pruebo ese código.
El marcado de objetos es una de las características más geniales de las que hablaremos en este curso y es casi desconocida.
Es un poco sutil; Primero, agregaremos un reloj para Thread.currentThread()
que devuelve la instancia del objeto que representa el hilo actual.
Como puede ver, puedo ver el hilo actual en el reloj.
Ahora, puedo ejecutar este método una y otra vez y ver el hilo actual; ¿El método siempre se ejecuta desde el mismo hilo?
Bueno, puedo mirar el ID del hilo, y sí. Es lo mismo. Entonces, probablemente sea seguro para subprocesos. Pero, ¿cómo puedo verificar esto?
Normalmente escribo el ID del objeto o el puntero de la variable en una hoja de papel y compruebo si es el mismo valor. Eso es un dolor y no escala. ¿Con qué frecuencia puedo presionar continuar una y otra vez?
En el menú contextual, selecciono Marcar objeto y escribo un nombre arbitrario. MyThread
en este caso, una vez que hice eso, puedo presionar OK
Esto reemplaza el valor del hilo actual en este momento con la nueva etiqueta. Entonces, podríamos asumir incorrectamente que este es solo un nombre para una expresión de reloj. no lo es Declaramos una nueva variable y le dimos el nombre MyThread
.
Copiamos el valor actual de la expresión del reloj en esa variable. Ahora podemos tratar esa variable como tratamos a la mayoría de las variables en el IDE.
Podemos evaluar el valor aquí y obtener todo lo que queremos. Observe el sufijo _DebugLabel
agregado por IntelliJ para evitar colisiones de nombres, pero aparte de eso, podemos invocar cualquier operación en este objeto, como obtener el nombre o incluso acceder al nombre del campo privado.
Pero esto se pone mucho mejor...
Agreguemos un punto de interrupción a este método, un punto de interrupción completamente estándar como lo hicimos antes.
Este será un punto de interrupción condicional estándar; pronto los discutiremos en profundidad, pero en este momento, todo lo que necesita saber es que puedo definir una condición que determinará si el punto de interrupción se detendrá o no.
Hagamos zoom.
Escribamos la condición; Puedo comparar MyThread
con el valor actual del hilo. Tenga en cuenta que esta condición se comportará en consecuencia, ya que el valor de MyThread
es independiente de la declaración de observación original de Thread.currentThread()
.
Entonces, si el hilo actual es realmente diferente, el punto de interrupción se detendrá en este punto.
Esto es inmensamente útil cuando se trata de muchos objetos. En este caso, puedo verificar literalmente si el método se verá afectado por el mismo hilo. ¡Puedo usarlo para comparar cualquier objeto en lugar de escribir sus punteros en una hoja de papel!
Sí. Literalmente me sentaba con una hoja de papel y copiaba la dirección del puntero para asegurarme de que lo hice bien si lo volvía a ver. ¡Esto es mejor de muchas maneras!
A menudo uso esto con API como JPA, donde a veces podemos tener dos instancias de objetos con la misma identidad. Esto es realmente difícil de detectar. Simplemente marque un objeto y luego podrá ver instantáneamente que es una instancia diferente.
Dado que este caso es obviamente de un solo subproceso, el punto de interrupción nunca se volverá a golpear. ¡Pero esto funciona bastante bien para casos muy elaborados y es una herramienta muy útil!
A continuación, profundizaremos en los puntos de interrupción y las cosas increíbles que pueden hacer. Este es un video de inmersión profunda que no querrá perderse.
Si tiene alguna pregunta, utilice la sección de comentarios. ¡Gracias!