Ejercicio de Java para pagar

Estoy probando un poco de Java recientemente y busco alguna revisión de mi estilo. Si te gusta mirar este ejercicio colocado en la imagen, y decirme si mi estilo es lo suficientemente bueno? O tal vez no es lo suficientemente bueno, por lo que puede decirme en qué aspecto debería trabajar más, ¿puede ayudarme a mejorarlo?

ejercicio para mi pregunta

/*
 * File: MathQuiz.java
 * 
 * This program produces Math Quiz. 
 */
import acm.program.*;
import acm.util.*;

public class MathQuiz extends ConsoleProgram {

    /* Class constants for Quiz settings. */
    private static final int CHANCES = 3;
    private static final int QUESTIONS = 5;
    private static final int MIN = 0;
    private static final int MAX = 20;

    /* Start program. Number of questions to ask is assigned here. */
    public void run() {
        println("Welcome to Math Quiz");
        while(answered != QUESTIONS) {
            produceNumbers();
            askForAnswer();
        }
        println("End of program.");
    }

    /* Ask for answer, and check them. Number of chances includes
     * first one, where user is asked for reply. */
    private void askForAnswer() {
        int answer = -1;
        if(type)
            answer = readInt("What is " + x + "+" + y + "?");
        else
            answer = readInt("What is " + x + "-" + y + "?");
        for(int i = 1; i < CHANCES+1; i++) {
            if(answer != solution) {
                if(i == CHANCES) {
                    println("No. The answer is " + solution + ".");
                    break;
                }
                answer = readInt("That's incorrect - try a different answer: ");
            } else {
                println("That's the answer!");
                break;
            }
        }
        answered++;
    }

    /* Produces type and two numbers until they qualify. */
    private void produceNumbers() {
        produceType();
        produceFirst();
        produceSecond();
        if(type)
            while(x+y >= MAX) {
                produceFirst();
                produceSecond();
            }
        else
            while(x-y <= MIN) {
                produceFirst();
                produceSecond();
            }
         calculateSolution();
    }

    /* Calculates equation solution. */
    private void calculateSolution() {
        if(type) solution = x + y;
        else solution = x - y;
    }

    /* Type of the equation. True is from plus, false is for minus. */
    private void produceType() {
        type = rgen.nextBoolean();
    }

    /* Produces first number. */
    private void produceFirst() {
        x = rgen.nextInt(0, 20);
    }

    /* Produces second number. */
    private void produceSecond() {
        y = rgen.nextInt(0, 20);
    }

    /* Class variables for numbers and type of the equation. */
    private static boolean type;
    private static int x;
    private static int y;

    /* Class variables for equation solution. */
    private static int solution;

    /* Class variable counting number of answered equations,
     * so if it reaches number of provided questions, it ends */
    private static int answered = 0;

    /* Random generator constructor. */
    RandomGenerator rgen = new RandomGenerator();

}
Respuesta 1

Hay algunas cosas que debes hacer de manera diferente, y un par que puedes hacer de manera diferente.

Las cosas que debes hacer de manera diferente:

  1. Mantenga todos los campos juntos.
  2. los campos estáticos siempre deben estar en THIS_FORM
  3. ha utilizado el modificador estático para lo que claramente parecen campos de instancia. (tipo, x, y, solución, contestada). Esto significa que solo puede ejecutar un MathsQuiz a la vez por JVM. No es un gran problema en este caso, pero causará problemas para programas más complejos.
  4. produceFirsty produceSecondusar parámetros codificados en nextIntlugar de usar MAXy MINsegún lo provisto por la clase
  5. No hay necesidad aparente de answeredser un campo. Podría ser fácilmente una variable local en run.

Cosas que debes hacer de manera diferente:

  • Existe una pequeña posibilidad (por pequeña que sea) de que produceNumbersno termine. En lugar de producir dos números aleatorios y esperar que funcionen. Produzca un número aleatorio y luego restrinja el segundo para que siempre se forme una solución. p.ej. digamos que estamos haciendo una suma yx es 6 y max es 20. Sabemos que y no puede ser mayor que 14. Entonces, en lugar de intentarlo nextInt(0,20), puede hacerlo nextInt(0,14)y estar seguro de que obtendrá una pregunta factible.
  • For loop no es realmente la construcción correcta, askForAnswerya que el comportamiento deseado es pedir una respuesta CAMBIOS varias veces o hasta que se reciba una respuesta correcta, lo que ocurra primero. Un bucle for generalmente se usa cuando desea hacer algo un número determinado de veces. De hecho, el ciclo while en ejecución es un buen candidato para un ciclo for. Una muestra del bucle while podría verse así:

    int i = 1;
    boolean correct = (solution == readInt("What is " + x + "+" + y + "?"));
    while (i < CHANCES && !correct) {
        correct = (solution == readInt("Wrong, try again."));
        i++;
    }
    if (correct) {
        println("Well done!");
    } else {
        println("Nope, the answer is: "+solution);
    }
    
Respuesta: 2

Una cosa que noté fue que todos sus métodos no toman parámetros y regresan nulos.

Creo que sería más claro si usa parámetros de método y valores de retorno para mostrar el flujo de datos a través de su programa en lugar de usar el estado del objeto para almacenar todo.

Respuesta: 3

Parece un estilo de programa muy limpio. Me gustaría mover todas las variables a la parte superior en lugar de tener algunas en la parte inferior, pero aparte de eso, es muy legible.

Respuesta: 4

Aquí hay algo que mejoraría: el booleano typeque se usa para indicar si tenemos una suma o resta:

private void produceType() {
    type = rgen.nextBoolean();
}

produceTypedice que se genera algo y esperaría que se devuelva algo. Y definiría enumeraciones para representar el tipo de prueba. Aquí está mi sugerencia:

private QuizType produceType() {
   boolean type = rgen.nextBoolean();
   if (type == true)
      return QuizType.PLUS;
   else 
      return QuizType.MINUS;
}

La enumeración se define así:

public enum QuizType { PLUS, MINUS }
Respuesta: 5

Entonces tengo la siguiente estructura: HelloWorld -> Package1 -> Class1.java -> Package2 -> Class2.java Estoy tratando de compilar Class2.java desde la línea de comandos usando: ...

Tengo un cliente que puede enviar información a un servidor a través de TCP: public class IR {private String host; // dirección IP del servidor indicada aquí, la eliminé para publicar aquí int privado ...

Hola, soy muy nuevo en este campo de la criptografía. Tengo una pequeña duda con respecto a la clave y el algoritmo de firma al usar la herramienta clave para generar pares de claves público-privadas. Solo quiero saber qué es exactamente ...

En Android Studio, tengo un hilo contenido en un método como este (visto a continuación) porque me gustaría reiniciar el hilo cada vez que se llama [1], (recreando el hilo en lugar de reiniciar) público ...