232
Capítulo 6 Métodos: un análisis más detallado
A las variables de tipo
Estado
se les debe asignar sólo una de las tres constantes declaradas en la enumeración
(línea 11), o se producirá un error de compilación. Cuando el jugador gana el juego, el programa asigna a la
variable local
estadoJuego
el valor
Estado.GANO
(líneas 33 y 54). Cuando el jugador pierde el juego, la aplica-
ción asigna a la variable local
estadoJuego
el valor
Estado.PERDIO
(líneas 38 y 57). En cualquier otro caso, el
programa asigna a la variable local
estadoJuego
el valor
Estado.CONTINUA
(línea 41) para indicar que el juego
no ha terminado y hay que tirar los dados otra vez.
Buena práctica de programación 6.4
El uso de constantes de enumeración (como
Estado.GANO
,
Estado.PERDIO
y
Estado.CONTINUA
) en vez de valores
enteros literales (como 0, 1 y 2) puede hacer que los programas sean más fáciles de leer y de mantener.
La línea 26 en el método
jugar
llama a
tirarDados
, el cual elige dos valores aleatorios del 1 al 6, muestra
el valor del primer dado, el del segundo y la suma de los dos dados, y devuelve esa suma. Después el método
jugar
entra a la instrucción
switch
en las líneas 29 a 45, que utiliza el valor de
sumaDeDados
de la línea 26
para determinar si el jugador ganó o perdió el juego, o si debe continuar con otro tiro. Las sumas de los dados
que ocasionan que se gane o pierda el juego en el primer tiro se declaran como constantes
public final static
int
en las líneas 14 a 18. Estos valores se utilizan en las etiquetas
case
de la instrucción
switch
. Los nombres
de los identifi cadores utilizan los términos comunes en el casino para estas sumas. Observe que estas constantes,
al igual que las constantes
enum
, se declaran todas con letras mayúsculas por convención, para que resalten en el
programa. Las líneas 31 a 34 determinan si el jugador ganó en el primer tiro con
SIETE
(
7
) u
ONCE
(
11
). Las líneas
35 a 39 determinan si el jugador perdió en el primer tiro con
DOS_UNOS
(
2
),
TRES
(
3
) o
DOCE
(
12
). Después del
primer tiro, si el juego no se ha terminado, el caso
default
(líneas 40 a 44) establece
estadoJuego
en
Estado.
CONTINUA
, guarda
sumaDeDados
en
miPunto
y muestra el punto.
Si aún estamos tratando de “hacer nuestro punto” (es decir, el juego continúa de un tiro anterior), se ejecuta
el ciclo de las líneas 48 a 58. En la línea 50 se tira el dado otra vez. Si
sumaDeDados
concuerda con
miPunto
en la
línea 53, la línea 54 establece
estadoJuego
en
Estado.GANO
y el ciclo termina, ya que el juego está terminado.
En la línea 56, si
sumaDeDados
es igual a
SIETE
(
7
), la línea 57 asigna el valor
Estado.PERDIO
a
estadoJuego
y
el ciclo termina, ya que se acabó el juego. Cuando termina el juego, las líneas 61 a 64 muestran un mensaje en el
que se indica si el jugador ganó o perdió, y el programa termina.
Observe el uso de varios mecanismos de control del programa que hemos visto antes. La clase
Craps
, en con-
junto con la clase
PruebaCraps
,
utiliza tres métodos:
main
,
jugar
(que se llama desde
main
) y
tirarDados
(que
se llama dos veces desde
jugar
), y las instrucciones de control
switch
,
while
,
if…else
e
if
anidado. Observe
también el uso de múltiples etiquetas
case
en la instrucción
switch
para ejecutar las mismas instrucciones para
las sumas de
SIETE
y
ONCE
(líneas 31 y 32), y para las sumas de
DOS_UNOS
,
TRES
y
DOCE
(líneas 35 a 37).
Tal vez se esté preguntando por qué declaramos las sumas de los dados como constantes
public final sta-
tic int
en vez de constantes
enum
. La respuesta está en el hecho de que el programa debe comparar la variable
int
llamada
sumaDeDados
(línea 26) con estas constantes para determinar el resultado de cada tiro. Suponga que
declararemos constantes que contengan
enum
Suma
(por ejemplo,
Suma.DOS_UNOS
) para representar las cinco
sumas utilizadas en el juego, y que después usaremos estas constantes en las etiquetas
case
de la instrucción
switch
(líneas 29 a 45). Hacer esto evitaría que pudiéramos usar
sumaDeDados
como la expresión de control de
la instrucción
switch
, ya que Java no permite que un
int
se compare con una constante de enumeración. Para
lograr la misma funcionalidad que el programa actual, tendríamos que utilizar una variable
sumaActual
de tipo
Suma
como expresión de control para el
switch
. Por desgracia, Java no proporciona una manera fácil de convertir
un valor
int
en una constante
enum
específi ca. Podríamos traducir un
int
en una constante
enum
mediante una
instrucción
switch
separada. Sin duda, esto sería complicado y no mejoraría la legibilidad del programa (lo cual
echaría a perder el propósito de usar una
enum
).
6.11 Alcance de las declaraciones
Ya hemos visto declaraciones de varias entidades de Java como las clases, los métodos, las variables y los paráme-
tros. Las declaraciones introducen nombres que pueden utilizarse para hacer referencia a dichas entidades de Java.
El
alcance
de una declaración es la porción del programa que puede hacer referencia a la entidad declarada por
su nombre. Se dice que dicha entidad está “dentro del alcance” para esa porción del programa. En esta sección
introduciremos varias cuestiones importantes relacionadas con el alcance. (Para obtener más información sobre
06_MAQ_CAP_06.indd232
4/19/081:22:20AM