0
votes

Comment simplifier l'entrée de l'utilisateur

Comment puis-je simplifier ce code?
Je vérifie chaque entrée pour une erreur, mais de la manière dont je le fais, le code est dupliqué.

long houseNumberOfFloors;
while (true) {
  System.out.print("Enter valid house number of floors: ");
  try {
    houseNumberOfFloors = Long.parseLong(br.readLine());
  } catch (NumberFormatException e) {
    continue;
  }
  if (FlatAttrValidator.checkHouseNumberOfFloors(houseNumberOfFloors)) {
    break;
  }
}

Integer houseNumberOfLifts;
while (true) {
  System.out.print("Enter valid house number of lifts: ");
  try {
    houseNumberOfLifts = Integer.parseInt(br.readLine());
  } catch (NumberFormatException e) {
    continue;
  }
  if (FlatAttrValidator.checkHouseNumberOfLifts(houseNumberOfLifts)) {
    break;
  }
}


3 commentaires

Modulariser. Le code dupliqué va dans une méthode. La méthode accepte l'invite de l'utilisateur et renvoie l'entrée de l'utilisateur.


différents types


Peu importe.


3 Réponses :


2
votes

Vous pouvez passer la conversion et la validation en tant que fonction (s). xxx

ici réponse -> déclare un paramètre réponse


3 commentaires

J'écris juste la même chose, mais avec un Custom

à la place, donc je vais arrêter :). Je pense que cette version boucle pour toujours si converter == null cependant.


@Beundead merci très belle remarque, ajouté un requisenonnull . Dommage, j'aurais aimé voir une meilleure réponse avec la fonction à cérémonie.


Cela n'aurait pas été meilleur. Les exemples qu'ils utilisent jettent des erreurs de runtimédies, combinés à ne pouvoir captiver les types paramétrés en font une version Messier de cela.



2
votes

J'ai créé la solution suivante pour vous, à l'aide d'interfaces fonctionnelles: xxx

Il fonctionne sur https://www.jdoodle.com/online-java-compiler/ .


0 commentaires

0
votes

Vous pouvez le faire comme suit:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Main {
    public static void main(String[] args) {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        long houseNumberOfFloors = input("Enter valid house number of floors: ", br, "checkHouseNumberOfFloors");
        Integer houseNumberOfLifts = input("Enter valid house number of lifts: ", br, "checkHouseNumberOfLifts");
    }

    static int input(String message, BufferedReader br, String methodName) {
        int value = 0;
        Method method;
        Boolean valid;
        System.out.print(message);
        try {
            value = Integer.parseInt(br.readLine());
            method = FlatAttrValidator.class.getMethod(methodName, Integer.class);
            valid = (Boolean) method.invoke(null, value);
            if (!valid) {
                input(message, br, methodName);
            }
        } catch (IOException | NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
            input(message, br, methodName);
        }
        return value;
    }
}


3 commentaires

Cela ne fonctionne pas car la valeur de retour de entrée ne va nulle part en l'appelant de manière récursive.


Cela fonctionnera @adder. Notez que appelle est appelé récursivement uniquement pour une valeur invalide ou en cas d'exception, le but de l'appel récursif est simplement de forcer l'utilisateur à re-entré. Pour une valeur valide , il n'y aura pas d'appel récursif de entrée et la valeur sera simplement renvoyé. Cependant, je viens de traverser votre réponse qui est vraiment plus élégante que la mienne.


Je maintiens mon commentaire. Vous devriez écrire une entrée de retour (message, BR, MethodName);