Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2006
    Messaggi
    95

    Correttezza del codice per il controllo dai dati in input

    Ho il classico menù dove ad ogni numero corrisponde al richiamo di una funzione ma va bene effettuare un controllo in questo modo? Intendo dire la porzione di codice del try-catch interno.


    codice:
    try {        
        int opzione;        
        String tmpString="";            
        int tmpInt=-1;            
        boolean test=false;        
        do{    
            System.out.println("0. Esci dal menù");
            System.out.println("1. Fai questo");
            System.out.println("2. Fai quest'altro");        
            // INIZIO CONTROLLO OPZIONE        
            do{            
                System.out.print("\nCosa vuoi fare? ");
                tmpString=tastiera.readLine();            
                try{                
                    tmpInt=Integer.parseInt(tmpString);                
                    test=true;                
                    if(tmpInt<0 || tmpInt>2){                    
                        System.out.println("\tATTENZIONE: valore non corretto!");                    
                        test=false;    
                    }    
                }    
                catch(NumberFormatException e){        
                    System.out.println("\t"+e.getMessage() + " is not a integer");
                    test=false;
                }    
            }while(!test);            
            // FINE CONTROLLO OPZIONE        
            opzione=tmpInt;
            if(opzione==1){}
            if(opzione==2){}        
        }while(opzione!=0);
        System.out.println("\nFine programma");    
    }catch(Exception e){
        System.out.println("Errore!\n"+e.getMessage());        
    }

    Adesso non guardate il codice per com'è oppure lo switch anziché la serie di if visto che ho tolto una marea di istruzioni.


    Ovviamente è molto più utile fare un metodo public int intero(inf,sup), se deve essere imitato tra due numeri (0 e 2 in questo caso), che possa essere richiamato ovunque (lo metterò all'interno di una mia classe functions) ma come faccio a farlo con le eccezioni?
    Oppure conviene modificare il setter di quel campo?
    Si possono mettere più catch per dire di che errore si tratta?
    Oppure è meglio usare opzione=scanner.nextInt()?


    Non sto chiedendo il codice, ho solo bisogno di capire il funzionamento corretto. Grazie!

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Rudie Visualizza il messaggio
    Ho il classico menù dove ad ogni numero corrisponde al richiamo di una funzione ma va bene effettuare un controllo in questo modo?
    Non sto chiedendo il codice, ho solo bisogno di capire il funzionamento corretto. Grazie!
    Il codice di per sé è tecnicamente sensato/corretto. Non vedo errori grossolani. Invece le problematiche maggiori sono a livello di "design". Questa tua parte di codice, che è per forza in un singolo metodo, fa "troppe" cose:
    - presentazione del menù
    - gestione dell'input
    - validazione dell'input
    - gestione della ripetizione in caso di input errato
    - esecuzione della opzione scelta
    - gestione delle eccezioni (parlo del try-catch) più esterno, quello interno è appropriato dove è.

    Sarebbe meglio separare e strutturare meglio tutto quanto, con metodi focalizzati su singoli aspetti e magari sfruttando più classi (ad esempio una specifica che si occupa solo dell'input e non della logica applicativa).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2006
    Messaggi
    95
    Il codice funziona, non ci sono errori.
    Quello scritto prima è ovviamente il main ma nel mio package ci sono ovviamente altre classi (senza main).
    Come conviene fare dunque in pseudo-codice?

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Rudie Visualizza il messaggio
    Il codice funziona, non ci sono errori.
    Sì, l'ho detto prima che a prima vista mi è sembrato tecnicamente sensato/corretto.

    Quote Originariamente inviata da Rudie Visualizza il messaggio
    Come conviene fare dunque in pseudo-codice?
    Puoi fare innanzitutto una classe dedicata solo alla gestione dell'input (quindi nulla a che fare con la tua logica applicativa). Potrebbe offrire metodi per leggere un intero, un intero limitato ad un certo range, ecc.. E con la possibilità di stampare un "prompt" e di richiedere l'input se errato/inappropriato.

    Poi la puoi usare nella tua classe dove hai il main e possibilmente facendo più metodi es. menu(), opzione1() ecc..
    E possibilmente sfruttando una istanza della tua classe, così il main alla fin fine potrebbe diventare

    codice:
    public class Applicazione {
        // ...
    
        public static void main(String[] args) {
            Applicazione app = new Applicazione();     // nel costruttore istanzi la classe per l'input ec..
            app.menu();
        }
    }
    Nel main puoi anche mettere un try-catch che racchiude le due righe, per catturare e mostrare una eccezione che "eccezionalmente" potrebbe capitare.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2006
    Messaggi
    95
    Ah okay, capito

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.