Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 26
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2007
    Messaggi
    42

    Ambito di visibilità delle variabili

    Salve!Mi chiedo se è possibile in un qualche modo far interagire delle variabili locali di una classe,con un'altra classe.Vi posto il codice cosi è facile da capire:
    codice:
    	//Metodo che cerca un nominativo all'interno della raccolta e mostra le sue info
    public String  cercaNome(String Nome){
    	boolean presente = false;
    	for (Persona contatto : contatti){
    		if (Nome.equals(contatto.getNome())){
    			System.out.println(Nome +" è presente nella lista,ecco i suoi dati: ");
    			System.out.println(contatto.getInfo());
    			presente = true;
    		}
    	}
    	if (presente == false){
    		System.out.println(Nome +"  non è presente nella lista");
    	}
    	return null;
    }
    La variabile che ci interessa è quella booleana,chiamata presente!

    Nel file di test,ho questo codice,che ha l'obiettivo di cercare e modificare un elemento.
    Il mio intento è il seguente:
    se "presente" è false,non modifica un tubo dato che l'elemento non esiste
    se "presente" è true,puoi modificarlo

    VI posto il codice incompleto:
    codice:
    System.out.println("Inserisci il nome dell'elemento da modificare");
    		Scanner in3 = new Scanner(System.in);
    		String modificato = in3.nextLine();
    		rubr.cercaNome(modificato);

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Le variabili locali sono appunto ... locali. E non è possibile in alcun modo accedere alle variabili locali di un metodo, se non solamente dall'interno del metodo stesso!

    Comunque il metodo cercaNome() che hai scritto segue una filosofia sbagliata. Si potrebbe riscrivere in modo molto più furbo così:

    codice:
    public Persona cercaNome (String nome)
    {
        for (Persona contatto : contatti)
        {
            if (nome.equals (contatto.getNome ()))
                return contatto;
        }
        
        return null;
    }
    Cosa ho fatto? Semplicemente appena trovo il nome ricercato, faccio ritornare il reference all'oggetto Persona che ho trovato. Altrimenti faccio ritornare null.

    Nel metodo che hai scritto, vedo che fai diverse operazioni di output con println. Dovresti iniziare a capire che è buona cosa separare ciò che è la gestione di una interfaccia utente da ciò che è la gestione di strutture dati, calcoli, ecc... o comunque logica "interna".

    Cioè non mischiare troppo logica, strutture dati, output. E se io avessi voluto usare le tue classi Rubrica/Persona in una applicazione grafica in Swing?? Che mi servivano le println di output?

    Separa bene le cose: la tua classe che gestisce l'applicazione "sa" che tipo di interfaccia utente usare e quindi come fare l'input/output. Le classi Rubrica/Persona non dovrebbero "sapere" nulla della interfaccia utente.
    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 2007
    Messaggi
    42
    Originariamente inviato da andbin
    Le variabili locali sono appunto ... locali. E non è possibile in alcun modo accedere alle variabili locali di un metodo, se non solamente dall'interno del metodo stesso!

    Comunque il metodo cercaNome() che hai scritto segue una filosofia sbagliata. Si potrebbe riscrivere in modo molto più furbo così:

    codice:
    public Persona cercaNome (String nome)
    {
        for (Persona contatto : contatti)
        {
            if (nome.equals (contatto.getNome ()))
                return contatto;
        }
        
        return null;
    }
    Cosa ho fatto? Semplicemente appena trovo il nome ricercato, faccio ritornare il reference all'oggetto Persona che ho trovato. Altrimenti faccio ritornare null.

    Nel metodo che hai scritto, vedo che fai diverse operazioni di output con println. Dovresti iniziare a capire che è buona cosa separare ciò che è la gestione di una interfaccia utente da ciò che è la gestione di strutture dati, calcoli, ecc... o comunque logica "interna".

    Cioè non mischiare troppo logica, strutture dati, output. E se io avessi voluto usare le tue classi Rubrica/Persona in una applicazione grafica in Swing?? Che mi servivano le println di output?

    Separa bene le cose: la tua classe che gestisce l'applicazione "sa" che tipo di interfaccia utente usare e quindi come fare l'input/output. Le classi Rubrica/Persona non dovrebbero "sapere" nulla della interfaccia utente.
    Si è vero.Non bisogna usare i vari System.out.println nelle classi di questo tipo per i problemi suddetti.
    Però io sto adattando il programma esclusivamente alla traccia che mi è stata fornita.
    Nel momento in cui vado a creare l file di test,che contiene unicamente il metodo main,è facile per me fare rub.cercaNome(ciccio);
    Cosi mi tornano utili i vari System.out.println in una sola riga del file di test.
    Se mi sbaglio correggimi pure!

  4. #4
    Utente di HTML.it
    Registrato dal
    Dec 2007
    Messaggi
    42
    Andbin ma mi consigli di andare a eliminare tutti i vari System.out.println che ho messo nel file Rubrica?
    Anche perchè se lo faccio,non so come interagire con l'utente.
    Prendiamo il metodo che tu hai riscritto.Se lo metto i pratica,non so come dire all'utente che esegue il programma che il nome cercato non esiste.Cioè il messaggio deve apparire per far capire all'utente che ha sbagliato.Per questo non potendo accedere alle variabili locali,come l'esempio sopra non riesco a gestire una eventuale decisione.
    Nel file Persona comunque non ho mai fatto uso di codesti metodi,proprio per le motivazioni suddette!

    p.s. grazie ai tuoi consigli sto facendo dei passi avanti GRAZIE!

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da onepiece007
    Andbin ma mi consigli di andare a eliminare tutti i vari System.out.println che ho messo nel file Rubrica?
    Io li eliminerei ... anzi, l'avessi fatto io non li avrei mai messi.

    Originariamente inviato da onepiece007
    Anche perchè se lo faccio,non so come interagire con l'utente.
    Prendiamo il metodo che tu hai riscritto.Se lo metto i pratica,non so come dire all'utente che esegue il programma che il nome cercato non esiste.
    Beh, questo lo devi fare tu nella/e classe/i che gestiscono l'interfacciamento con l'utente.

    Il cercaNome() che ho scritto io ti fornisce solo un "servizio", non iteragisce con l'utente in alcun modo. Dovrai quindi chiamare cercaNome() e se ti ritorna null vuol dire che non ha trovato il nome. A quel punto farai quello che preferisci per segnalarlo all'utente, e ciò può consistere in un semplice println() su System.out o una box fatta con JOptionPane o altro. Ma questo appunto dovrebbe essere slegato e indipendente da tutto ciò che riguarda la gestione interna di Rubrica/Persona.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    Utente di HTML.it
    Registrato dal
    Dec 2007
    Messaggi
    42
    Io li eliminerei ... anzi, l'avessi fatto io non li avrei mai messi.
    Li eliminerò dato che ho capito veramente che le cose vanno separate.ok.

    Ora usando il tuo metodo che ho temporaneamente ribattezzato come "cercaNome2":
    codice:
    public class Personatest {
    public static void main (String[]args){
    	Rubrica rub = new Rubrica();
    	rub.aggiungi("ciccio", "123", "23232");
    	rub.cercaNome2("ciccio");  //eseguendolo non mi da niente
    	
    	System.out.println(rub.cercaNome2("ciccio"));  //eseguendolo mi da [Nome=ciccio;Telefono=123;Fax=23232;]
    	
    	rub.cercaNome2("pluto");  //eseguendolo non mi da niente,il nome non esiste
    	
    	System.out.println(rub.cercaNome2("pluto"));  //eseguendolo mi da null
    
    }
    }
    ...succede questo!
    Innanzittutto non abbiamo studiato le interfacce,quindi dobbiamo fare tutto senza di esse.
    In secondo luogo qui come vedi,non riesco a comunicare bene con l'utente!
    Null non mi sembra un messaggio molto esplicito,e poi sarebbe meglio scrivere frasi più appropriate come :"l'utente cercato non è stato trovato nella lista"

    Eccco:esiste una soluzione a questo problema?

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da onepiece007
    In secondo luogo qui come vedi,non riesco a comunicare bene con l'utente!
    Null non mi sembra un messaggio molto esplicito,e poi sarebbe meglio scrivere frasi più appropriate come :"l'utente cercato non è stato trovato nella lista"

    Eccco:esiste una soluzione a questo problema?
    Certo, basta fare un banalissimo test:

    codice:
    Persona p = rub.cercaNome2("ciccio");
    
    if (p == null)
        System.out.println ("L'utente non è stato trovato in rubrica");
    else
        System.out.println ("L'utente ricercato è stato trovato e ha il numero di telefono: " + p.getTelefono());
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  8. #8
    Utente di HTML.it
    Registrato dal
    Dec 2007
    Messaggi
    42
    Quindi possiamo creare un oggetto di tipo Persona,e associarlo ad un valore di un altro oggetto di un'altra classe,a patto che sia dello stesso tipo,in questo caso persona.

    Poi ho notato un'altra cosa,che se abbiamo un metodo void come il seguente:
    codice:
    //Metodo che aggiunge un elemento (vincolo:ogni nominativo deve essere diverso da tutti gli altri)
    	public void aggiungi(String nome,String telefono,String fax){
    		boolean presente = false;
    		for (Persona contatto : contatti){
    			if (nome.equals(contatto.getNome())){
    				System.out.println("Il nome " + nome + " è già presente nella lista");
    				presente = true;
    			}
    		}
    		if (presente == false){
    		Persona contatto = new Persona(nome,telefono,fax);
    		contatti.add(contatto);
    		}
    	}
    non posso usare la classe PrintWriter perchè i void non restituiscono valori,che chiaramente non verranno scritti su un file di testo!
    Ergo,devo modificare il file Rubrica.java per 2 ragioni:
    1)per le motivazioni suddette riguardo System.out.println
    2)per togliere il void che mi impedisce di scrivere su un file di testo

    Di conseguenza ho editato il metodo cosi:
    codice:
    //Metodo che aggiunge un elemento (vincolo:ogni nominativo deve essere diverso da tutti gli altri)
    	public Persona aggiungi(String nome,String telefono,String fax){
    		boolean presente = false;
    		for (Persona contatto : contatti){
    			if (nome.equals(contatto.getNome())){
    				presente = true;
    				return null;
    			}
    		}
    		if (presente == false){
    		Persona contatto = new Persona(nome,telefono,fax);
    		contatti.add(contatto);
    		}
    		return null;
    	}
    Dovrebbe essere corretto,anche se ho qualche dubbio sulla funzionalità dell'ultimo null.
    In più,si può ulteriormente alleggerire il codice?

  9. #9
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Scusa eh .. ma il tuo ultimo post è un pochino delirante. Cioè non capisco tutti 'sti dubbi. E non capisco perché dovresti mettere che aggiungi() ritorna un valore di tipo Persona. E oltretutto hai sbagliato perché come l'hai scritto ritorna sempre null.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  10. #10
    Utente di HTML.it
    Registrato dal
    Dec 2007
    Messaggi
    42
    Originariamente inviato da andbin
    Scusa eh .. ma il tuo ultimo post è un pochino delirante. Cioè non capisco tutti 'sti dubbi. E non capisco perché dovresti mettere che aggiungi() ritorna un valore di tipo Persona. E oltretutto hai sbagliato perché come l'hai scritto ritorna sempre null.
    Ebbè ora mi tocca cambiare il metodo aggiungi(),dato che ha un System.out.println al suo interno,devo cambiarlo come tu hai cambiato il cercaNome.
    Anche cercaNOme che tu hai editato,ritorna come valore Persona,quindi penso che tutti i metodi del file Rubrica.java dovrebbero ritornare come valore persona,infondo fanno più o meno lo stesso lavoro.
    Se devo togliere il System.out.println dal metodo aggiungi,posso farlo tranquillamente,ma resta sempre il fatto di avvisare l'utente in caso di errore.Però non posso fare la stessa cosa del metodo cercaNome come hai fatto tu,se non faccio ritornare come valore Persona al metodo aggiungi.
    Spero di non essere stato contorto.

    In poche parole,il metodo aggiungi come potrebbe essere editato senza il System.out.println ?

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.