Suele ser muy útil, hacer "una traza" manual del programa que hemos escrito. Es decir, con papel y lápiz mismamente, listar las variables que estamos usando y apuntamos su valor actual.
Luego ejecutamos mentalmente las líneas del programa una por una y vamos apuntando en el papel los cambios de valor de las variables y que resultado obtendríamos en pantalla.
Es entonces cuando vemos los errores
"de lógica" que estamos cometiendo.
Remarco lo
"de lógica" porque estos errores no nos los pueden detectar los compiladores (aunque de alguno nos pueden avisar alguna vez), son errores que solo podemos detectar nosotros.
Por ejemplo, centrémonos en este código:
public void setNombre (String valorNombre){
nombre = valorNombre;
System.out.println ("Ha cambiado el nombre del médico " + nombre + " a: " + nombre);
nombre = nombre;
}
No hay ningún error
"sintáctico", cualquier compilador dará por válido ese código. Sin embargo, sí hay erróres
"de lógica"..
Hagamos la traza, supongamos que llamamos a este método pasando como argumento el String "Luis".
medico.setNombre("Luis");
Bien, este método utiliza dos variables, uno es "nombre" que es atributo de la clase y el otro es "valorNombre" que es el parámetro del própio método.
Estos serían sus valores iniciales:
- nombre = ""
- valorNombre = "Luis"
El atributo "nombre" está con cadena vacía porque es como se iniciaría según el contructor de la clase.
Bien, ejecutemos mentalmente la primera línea:
nombre = valorNombre;
El atributo "nombre" ha cambiado su valor, anotemoslo. En rojo guardamos el valor que tenía previamente, para recordarlo, aunque realmente ya se ha perdido.
- nombre = "", "Luis"
- valorNombre = "Luis"
Y ahora ejecutemos la siguiente línea:
System.out.println ("Ha cambiado el nombre del médico " + nombre + " a: " + nombre);
Veamos el resultado en pantalla, según los valores actuales de las variables:
Ha cambiado el nombre del médico Luis a: Luis
Humm, no obtenemos el resultado deseado. Habría que revisar la lógica del código y buscar otra fórmula para obtener el resultado que deseamos.
Está claro que usar en una sentencia dos veces la misma variable ("nombre" en este caso), esperando que por pantalla dicha variable muestre dos valores distintos, es un error de lógica. Es imposible.Y es precisamente resolviendo estos errores que parecen tan tontos, cuando de verdad se aprende a programar.
Porque saber programar no es conocer la sintaxis y los comandos de un lenguaje. Saber programar es conseguir dar ordenes lógicas al ordenador.
Así que por ahora es mejor para tí que intentes solucionarlo tú, porque si te lo soluciona otra persona pierdes la oportunidad de aprender.
Hay varias formas de solucionarlo, unas más eficientes que otras, a ver cuál puedes encontrar tú.
Aún nos queda una línea de programa por ejecutar:
nombre = nombre;
Ha habido un cambio de valor en la variable "nombre", aunque bueno, en realidad no ha cambiado nada...
- nombre = "", "Luis", "Luis"
- valorNombre = "Luis"
Como ves, esto de apuntar a mano en un papel las variables que estamos usando, apuntar como cambia su valor tras cada línea de código ejecutada y simular qué resultado tendríamos en pantalla... es muy útil para ver si las órdenes que hemos dado, siguen o no la lógica que creíamos haber programado.
De hecho, esto mismo es lo que hacen los depuradores (debuggers) de los compiladores de programación.
Solo que cuando se trata de código sencillo, como este que son tres líneas y dos variables, es mucho más rápido e intuitivo hacerlo uno manualmente en papel (además agiliza la mente) que no ponerse a configurar y aprender a usar un debugger.
Que no es nada difícil tampoco, pero sí un poco engorroso y tiene más sentido usarlo en códigos más complejos.
Sigue publicando aquí tus dudas y no dejes de intentar resolver los errores de lógica de tu programa ya que, repito de nuevo, es aquí cuando realmente aprendes y cuando realmente desarrollas el ingenio para dar soluciones
eficientes y no solo
eficaces (eficiencia y eficacia no es lo mismo...)