Raziel84 ha scritto:
la mia richiesta era per esempio se conviene creare qualcosa del genere...
public void setNome(String nome)
{
this.nome = nome;
}
public void leggiInput()
{
System.out.println("Inserisci nome:");
nome = input.next();
}
oppure...
public void setNome()
{
Scanner input = new Scanner(System.in);
System.out.println("Inserisci nome:");
nome = input.next();
}
Entrambi fanno lo stesso lavoro, ma quale dei due è correttamente valido ai fini dell'incapsulamento?
Nessuno dei due è davvero ottimo. E NON è una questione di incapsulamento ... ma di "design".
Un input con Scanner in un setNome assolutamente NO. Tra l'altro quando Scanner è agganciato a System.in, di questo oggetto Scanner ce ne dovrebbe essere
uno solo in tutta la applicazione. Mentre invece così è ripetuto e ricreato ogni volta.
Ma il punto fondamentale è che se il nome è settabile SOLO con quel setNome, quella tua classe è legata esclusivamente all'input dall'utente. Se si volesse settare il nome preso da un file, da un componente grafico o altro, non puoi (ri)usare questa tua classe.
Il primo codice, ovvero il setNome come setter "pulito" e poi il leggiInput() separato, è solo un pelino pelino meglio. Ma la tua classe è comunque mescolata con una forma specifica di input dei dati.
Queste sono problematiche di "design" delle classi. Se fai una classe es. Persona, questa dovrebbe essere focalizzata su un solo aspetto: rappresentare una persona. Non vuol dire che deve avere pochi campi o pochi metodi. Ne può avere quanti ne vuoi e quanti ne servono. Vuol dire che la classe Persona non dovrebbe fare cose radicalmente differenti dalla sola rappresentazione di una entità persona.
Quindi: niente input dall'utente, niente output su componenti grafici o console, niente accesso a DB, niente accesso a file, ecc...
In sostanza: classe Persona, con i vari campi (possibilmente private), metodi setter e/o getter public, altro eventuale (toString(), equals(), ecc..) più altro che può essere utile per la rappresentazione della persona.
E quindi tu dirai: e l'input dove va? Da un'altra parte certamente, in un'altra classe più focalizzata all'input di una persona.
Raziel84 ha scritto:
Chiedo questo perchè ho visto in anticipo che ci sono esercizi sul mio libro dove addirittura mi viene chiesto che l'inserimento da tastiera di un valore lo vuole dentro un metodo get.
Vabbè .. discutibile (da verificare, comunque). Ma si tratta di esercizi ... non è la fine del mondo ...
Raziel84 ha scritto:
Le eccezioni da te menzionate invece non le ho ancora affrontate, ma solo semplici controlli da mettere dentro i metodi set. Tipo:
if (n < 0)
{
System.out.println("Valore non consentito");
System.exit(0);
}
Un System.exit(0) solo per questo è un po' troppo "radicale".
Raziel84 ha scritto:
while(n < 0)
{
System.out.println("Valore non consentito. Si prega di inserire un valore maggiore o uguale a zero.");
n = input.nextInt();
}
Dipende da dove lo fai ...